diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs index db7fd496898d35aea79a763c5b72cdd304d111be..69632304036831b8c366c8b66dd4e11ba795bba0 100644 --- a/src/cmd/acl.rs +++ b/src/cmd/acl.rs @@ -1,10 +1,11 @@ use crate::bool_to_result; use log::{error, warn}; -use matrix_sdk::{room::Room, ruma::UserId}; +use matrix_sdk::{room::Joined as JoinedRoom, ruma::UserId}; use std::fmt; use std::{process::abort, result::Result}; #[allow(dead_code)] +#[derive(Clone)] pub enum CmdAcl { RoomOnly(String), AdminOnly, @@ -12,6 +13,7 @@ pub enum CmdAcl { } #[allow(dead_code)] +#[derive(Clone)] pub struct CmdAdminRegister { admins: Vec<UserId>, } @@ -91,7 +93,7 @@ impl CmdAcl { pub fn action_permited( cmd_admin_register: &CmdAdminRegister, acls: &CmdAcl, - room: &Room, + room: &JoinedRoom, user_id: &UserId, ) -> Result<(), String> { return match acls { diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index c818e495b36db3c32448daafda39d11fc4ad1213..2b64346bdf1fb4c665fa0bd33fc88d7c7e77fcc3 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -18,6 +18,10 @@ pub struct Cmd { handler: CmdHandler, } +// unsafe impl Sync for CmdHandler {} +unsafe impl Sync for Cmd {} +// unsafe impl Send for Cmd {} + impl Cmd { #[allow(dead_code)] pub fn matches(&self, name: &String, args: &Vec<String>) -> bool { diff --git a/src/cmd/package.rs b/src/cmd/package.rs index 437f993b63721adf24be65a60d845424d543290a..c12c05686cd8404158b46f0469afbc43a714191e 100644 --- a/src/cmd/package.rs +++ b/src/cmd/package.rs @@ -3,7 +3,7 @@ use crate::cmd::{ Cmd, }; use ini::Properties as IniSection; -use matrix_sdk::{room::Room, ruma::UserId}; +use matrix_sdk::{room::Joined as JoinedRoom, ruma::UserId}; use std::{convert::TryFrom, fmt}; pub struct CmdPackage { @@ -16,7 +16,7 @@ pub struct CmdPackage { impl CmdPackage { #[allow(dead_code)] - pub fn handle(&self, room: &Room, user_id: &UserId, user_cmd: Vec<String>) -> String { + pub fn handle(&self, room: &JoinedRoom, user_id: &UserId, user_cmd: Vec<String>) -> String { match CmdAcl::action_permited(&self.admin_register, &self.acl, room, user_id) { Err(string) => "Action not permited: ".to_string() + &string, Ok(()) => match user_cmd.split_first() { diff --git a/src/matrix.rs b/src/matrix.rs index 371832b666811fff8b4cdfa584513444da553ebe..02c18575c6882a007994e88c0700b3d4371e8464 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -67,53 +67,6 @@ async fn on_state_member( }; } -async fn on_room_message( - ev: SyncMessageEvent<MessageEventContent>, - room: Room, - _encryption_info: Option<EncryptionInfo>, -) { - let sender_id = ev.sender; - let own_id = room.own_user_id(); - if sender_id.as_str() == own_id.as_str() { - return; - } - - let room_name = match room.name() { - Some(n) => "<".to_string() + &n + ">", - None => "<--none-->".to_string(), - }; - - match room { - Room::Joined(room) => { - let _body = match ev.content.msgtype { - MessageType::Text(TextMessageEventContent { body, .. }) => { - "Text: ".to_string() + &body - } - _ => "Unsupported type".to_string(), - }; - info!( - "Got message from {} in {} a.k.a. {}", - sender_id, - room.room_id(), - room_name - ); - // room.send( - // AnyMessageEventContent::RoomMessage(MessageEventContent::text_plain("Hello world")), - // None, - // ) - // .await - // .unwrap(); - } - Room::Invited(room) => warn!( - "Bot was invited by {} to room {} a.k.a. {}", - sender_id, - room.room_id(), - room_name - ), - Room::Left(room) => error!("Bot left room {} a.k.a. {}", room.room_id(), room_name), - } -} - async fn startup_and_log_rooms(client: &Client) { for room in client.joined_rooms() { info!("Got joined room: <{}>", room.name().unwrap()); @@ -130,18 +83,16 @@ async fn startup_and_log_rooms(client: &Client) { pub async fn connect_and_handle(config: Config) -> Result<()> { // TODO: Refactor let username_copy = config.user_name.clone(); - let _pkg = match config.section("basic") { - Some(section) => CmdPackage::from_config( - §ion, - vec![ - Cmd::new_simple(format!("ping"), 0, Box::new(|_x| true)), - Cmd::new_echo( - format!("bot_name"), - 0, - Box::new(move |_x| username_copy.clone()), - ), - ], + let pkg_commands_vec = vec![ + Cmd::new_simple(format!("ping"), 0, Box::new(|_x| true)), + Cmd::new_echo( + format!("bot_name"), + 0, + Box::new(move |_x| username_copy.clone()), ), + ]; + let pkg = match config.section("basic") { + Some(section) => Box::new(CmdPackage::from_config(§ion, pkg_commands_vec)), None => { abort(); } @@ -170,12 +121,45 @@ pub async fn connect_and_handle(config: Config) -> Result<()> { warn!("Ignore state member events"); } - if config.handle_room_message { - info!("Handle room message events"); - client.register_event_handler(on_room_message).await; - } else { - error!("Ignore room message events! The bot won't answer to any message"); - } + client + .register_event_handler( + |ev: SyncMessageEvent<MessageEventContent>, + room: Room, + _encryption_info: Option<EncryptionInfo>| async { + let sender_id = ev.sender; + if sender_id.as_str() == room.own_user_id().as_str() { + return; + } + + if room.name().is_none() { + warn!("Unsupported rooms without names"); + return; + } + + if let Room::Joined(joined) = room { + let room_id = joined.room_id(); + let room_name = joined.name().unwrap(); + if let MessageType::Text(TextMessageEventContent { body, .. }) = + ev.content.msgtype + { + if body.starts_with("%") { + info!("Got message from {sender_id} in {room_id} a.k.a. {room_name}"); + let args = vec![]; + let ret = &pkg.handle(&joined, &sender_id, args); + } + } + } + + // if let Room::Invited(_) = room { + // warn!("Bot was invited by {sender_id} to room {room_id} a.k.a. {room_name}",); + // } + + // if let Room::Left(_) = room { + // error!("Bot left room {room_id} a.k.a. {room_name}") + // } + }, + ) + .await; info!("Entering sync loop"); let token = client.sync_token().await.unwrap();