Compare commits
2 Commits
80e0fce32a
...
176bde9d01
Author | SHA1 | Date |
---|---|---|
Ondřej Hruška | 176bde9d01 | 5 years ago |
Ondřej Hruška | dc88755e7b | 5 years ago |
@ -0,0 +1,88 @@ |
|||||||
|
//! 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