From ec076200f65bdab7bf66ec37bd822e6af7f47bab Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 14 Dec 2021 20:57:16 +0100
Subject: [PATCH] WIP: Use the pkg inside the message handler

---
 src/cmd/acl.rs     |   6 ++-
 src/cmd/mod.rs     |   4 ++
 src/cmd/package.rs |   4 +-
 src/matrix.rs      | 112 +++++++++++++++++++--------------------------
 4 files changed, 58 insertions(+), 68 deletions(-)

diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs
index db7fd49..6963230 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 c818e49..2b64346 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 437f993..c12c056 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 371832b..02c1857 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(
-            &section,
-            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(&section, 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();
-- 
GitLab