Compare commits
No commits in common. '176bde9d016137ca918dd2f9992707c8f1185429' and '80e0fce32a0f1971b89719abc330c3961a426833' have entirely different histories.
176bde9d01
...
80e0fce32a
@ -1,88 +0,0 @@ |
|||||||
//! Mastodon API types and functions building on elefren
|
|
||||||
|
|
||||||
use serde::Deserialize; |
|
||||||
use serde::Serialize; |
|
||||||
use crate::store::Store; |
|
||||||
use crate::Config; |
|
||||||
use elefren::{Registration, Mastodon}; |
|
||||||
use elefren::http_send::HttpSender; |
|
||||||
use elefren::helpers::cli; |
|
||||||
use elefren::scopes::Scopes; |
|
||||||
use std::str::FromStr; |
|
||||||
use failure::Fallible; |
|
||||||
|
|
||||||
const KEY_OAUTH_REGISTRATION: &str = "oauth.registration"; |
|
||||||
const KEY_OAUTH_SESSION: &str = "oauth.session"; |
|
||||||
|
|
||||||
pub type EleRegistratered = elefren::registration::Registered<HttpSender>; |
|
||||||
pub type EleSession = elefren::Mastodon<HttpSender>; |
|
||||||
pub type EleStreamSocket = websocket::sync::Client<native_tls::TlsStream<std::net::TcpStream>>; |
|
||||||
|
|
||||||
/// Wrapper for the long tuple with Registration state
|
|
||||||
#[derive(Serialize,Deserialize,Debug)] |
|
||||||
pub struct ElefrenRegistration { |
|
||||||
pub parts: (String, String, String, String, Scopes, bool), |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/// Register "app" in the server software
|
|
||||||
pub fn register(store : &mut Store, config : &Config) -> EleRegistratered { |
|
||||||
match store.get::<ElefrenRegistration>(KEY_OAUTH_REGISTRATION) { |
|
||||||
Some(reg) => { |
|
||||||
info!("Loaded registration from store"); |
|
||||||
|
|
||||||
EleRegistratered::from_parts( |
|
||||||
// this sucks
|
|
||||||
®.parts.0, ®.parts.1, ®.parts.2, ®.parts.3, reg.parts.4, reg.parts.5 |
|
||||||
) |
|
||||||
} |
|
||||||
None => { |
|
||||||
info!("Creating a new registration"); |
|
||||||
|
|
||||||
let registered = Registration::new(&format!("https://{}", config.instance)) |
|
||||||
.client_name("manabu") |
|
||||||
.scopes(Scopes::from_str("read write").expect("err parse scopes")) |
|
||||||
.build().expect("error register"); |
|
||||||
store.put(KEY_OAUTH_REGISTRATION, ElefrenRegistration { parts : registered.clone().into_parts() }); |
|
||||||
registered |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// Open mastodon API session (get access token)
|
|
||||||
pub fn open_session(store : &mut Store, registered: EleRegistratered) -> EleSession { |
|
||||||
match store.get::<elefren::Data>(KEY_OAUTH_SESSION) { |
|
||||||
Some(data) => { |
|
||||||
info!("Reusing saved authorization."); |
|
||||||
|
|
||||||
let cli = Mastodon::from(data); |
|
||||||
// TODO check if the session is live, somehow
|
|
||||||
cli |
|
||||||
} |
|
||||||
None => { |
|
||||||
info!("Creating new authorization."); |
|
||||||
|
|
||||||
let cli = cli::authenticate(registered).expect("error auth"); |
|
||||||
store.put(KEY_OAUTH_SESSION, cli.data.clone()); |
|
||||||
cli |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// Open streaming api websocket
|
|
||||||
pub fn open_stream_websocket(session : &EleSession, stream_name : &str) -> Fallible<EleStreamSocket> { |
|
||||||
let connector = native_tls::TlsConnector::new()?; |
|
||||||
|
|
||||||
let hostname = &session.data.base[session.data.base.find("://").unwrap()+3..]; |
|
||||||
|
|
||||||
let url = format!("wss://{host}/api/v1/streaming/?stream={sname}&access_token={token}", |
|
||||||
host=hostname, |
|
||||||
sname=stream_name, |
|
||||||
token=session.data.token); |
|
||||||
|
|
||||||
debug!("WS url = {}", &url); |
|
||||||
|
|
||||||
Ok(websocket::ClientBuilder::new(&url) |
|
||||||
.expect("Error create ClientBuilder") |
|
||||||
.connect_secure(Some(connector))?) |
|
||||||
} |
|
Loading…
Reference in new issue