diff options
author | Paweł Dybiec <pawel@dybiec.info> | 2022-12-24 00:22:21 +0000 |
---|---|---|
committer | Paweł Dybiec <pawel@dybiec.info> | 2022-12-24 00:22:21 +0000 |
commit | 86f5bb9301a169d7b8d22c3165b05db4727415e5 (patch) | |
tree | e61027adb19e2fc443b434e47fe1f7413cd029c7 /src/mattermost.rs |
Initial commit
Diffstat (limited to 'src/mattermost.rs')
-rw-r--r-- | src/mattermost.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/mattermost.rs b/src/mattermost.rs new file mode 100644 index 0000000..7742e3e --- /dev/null +++ b/src/mattermost.rs @@ -0,0 +1,63 @@ +use anyhow::anyhow; +use async_tungstenite::{tokio::connect_async, tungstenite::Message}; +use futures_util::{SinkExt, StreamExt}; +use serde_json::json; +use tracing::debug; +pub struct AuthData { + pub(crate) login: String, + pub(crate) password: String, +} +pub struct Client { + pub(crate) auth: AuthData, + pub(crate) url: String, + bearer_token: Option<String>, + client: reqwest::Client, +} +impl Client { + pub(crate) fn new(auth: AuthData, url: &str) -> Self { + Self { + auth, + url: url.to_owned(), + bearer_token: None, + client: reqwest::Client::new(), + } + } + pub(crate) async fn update_bearer_token(&mut self) -> Result<(), anyhow::Error> { + debug!("Fetching bearer token from api"); + let response = self + .client + .post(format!("{}/api/v4/users/login", self.url)) + .json(&json!({ + "login_id":self.auth.login, + "password":self.auth.password, + })) + .send() + .await?; + let token = response + .headers() + .get("token") + .ok_or(anyhow!("Haven't received bearer token in headers"))? + .to_str()?; + self.bearer_token = Some(token.to_owned()); + debug!("Successfully updated bearer token"); + Ok(()) + } + pub(crate) async fn handle_websocket_stream(&self) -> Result<(), anyhow::Error> { + let url = format!("{}/api/v4/websocket", self.url.replacen("http", "ws", 1)); + let (mut ws_stream, _) = connect_async(url).await?; + let token = self + .bearer_token + .clone() + .ok_or(anyhow!("Missing bearer token"))?; + ws_stream + .send(Message::Text( + json!({"seq":1,"action":"authentication_challenge","data":{"token":token}}) + .to_string(), + )) + .await?; + while let Some(message) = ws_stream.next().await { + debug!("{:?}", message); + } + Ok(()) + } +} |