mod mattermost; use anyhow::anyhow; use tokio::{self}; use tracing::{debug, info}; struct Vav {} #[async_trait::async_trait] impl mattermost::Handler for Vav { async fn handle( &self, value: serde_json::Value, client: &mattermost::Client, ) -> Result<(), anyhow::Error> { debug!("{value:?}"); let object = value .as_object() .ok_or(anyhow!("Response from mattermost should be object"))?; if object .get("event") .ok_or(anyhow!("missing event type"))? .as_str() .ok_or(anyhow!("event type should be a string"))? != "posted" { return Ok(()); } let post: serde_json::Value = serde_json::from_str( object .get("data") .unwrap() .get("post") .ok_or(anyhow!("missing post field"))? .as_str() .ok_or(anyhow!("post should be string"))?, )?; debug!("Post field {post:?}"); let object = post .as_object() .ok_or(anyhow!("Post field should represent legit object"))?; let message = object .get("message") .ok_or(anyhow!("missing message"))? .as_str() .ok_or(anyhow!("message should be string"))?; if !message.starts_with('!') { return Ok(()); } let message = message.strip_prefix('!').unwrap(); match message{ "adres" => client.reply_to(&post, "Uniwersytet Wrocławski Instytut Informatyki; pl. Frederyka Joliot-Curie 15; 50-383 Wrocław".to_owned()).await?, _ => return Err(anyhow!("Unrecognized command {message}")), } Ok(()) } } #[tokio::main(worker_threads = 2)] async fn main() -> Result<(), Box> { tracing_subscriber::fmt::init(); let login = std::env::var("USER_MAIL")?; let password = std::env::var("USER_PASSWORD")?; let auth = mattermost::AuthData { login, password }; let mut client = mattermost::Client::new(auth, "https://mattermost.continuum.ii.uni.wroc.pl"); client.update_bearer_token().await?; client.handle_websocket_stream(Vav {}).await?; Ok(()) }