From ceb9bb7f45c59766999920ab217b7fa093580da9 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 14 Dec 2021 21:31:45 +0100
Subject: [PATCH] WIP: Almost there

---
 src/cmd/mod.rs     | 19 ++++++++++---------
 src/cmd/package.rs |  1 +
 src/main.rs        |  2 ++
 src/matrix.rs      | 13 ++++++-------
 4 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs
index 2b64346..6512419 100644
--- a/src/cmd/mod.rs
+++ b/src/cmd/mod.rs
@@ -2,25 +2,26 @@ pub mod acl;
 pub mod package;
 
 use log::error;
-use std::{process::abort, string::String};
+use std::{process::abort, string::String, sync::Arc};
 
 #[allow(dead_code)]
+#[derive(Clone)]
 enum CmdHandler {
-    Simple(Box<dyn Fn(Vec<String>) -> bool>),
-    Echo(Box<dyn Fn(Vec<String>) -> String>),
-    MultiEcho(Box<dyn Fn(Vec<String>) -> Vec<String>>),
+    Simple(Arc<dyn Fn(Vec<String>) -> bool>),
+    Echo(Arc<dyn Fn(Vec<String>) -> String>),
+    MultiEcho(Arc<dyn Fn(Vec<String>) -> Vec<String>>),
 }
 
 #[allow(dead_code)]
+#[derive(Clone)]
 pub struct Cmd {
     name: String,
     argc: u32,
     handler: CmdHandler,
 }
 
-// unsafe impl Sync for CmdHandler {}
 unsafe impl Sync for Cmd {}
-// unsafe impl Send for Cmd {}
+unsafe impl Send for Cmd {}
 
 impl Cmd {
     #[allow(dead_code)]
@@ -51,7 +52,7 @@ impl Cmd {
     }
 
     #[allow(dead_code)]
-    pub fn new_simple(name: String, argc: u32, f: Box<dyn Fn(Vec<String>) -> bool>) -> Cmd {
+    pub fn new_simple(name: String, argc: u32, f: Arc<dyn Fn(Vec<String>) -> bool>) -> Cmd {
         Cmd {
             name: name,
             argc: argc,
@@ -60,7 +61,7 @@ impl Cmd {
     }
 
     #[allow(dead_code)]
-    pub fn new_echo(name: String, argc: u32, f: Box<dyn Fn(Vec<String>) -> String>) -> Cmd {
+    pub fn new_echo(name: String, argc: u32, f: Arc<dyn Fn(Vec<String>) -> String>) -> Cmd {
         Cmd {
             name: name,
             argc: argc,
@@ -72,7 +73,7 @@ impl Cmd {
     pub fn new_multi_echo(
         name: String,
         argc: u32,
-        f: Box<dyn Fn(Vec<String>) -> Vec<String>>,
+        f: Arc<dyn Fn(Vec<String>) -> Vec<String>>,
     ) -> Cmd {
         Cmd {
             name: name,
diff --git a/src/cmd/package.rs b/src/cmd/package.rs
index c12c056..a66d2d6 100644
--- a/src/cmd/package.rs
+++ b/src/cmd/package.rs
@@ -6,6 +6,7 @@ use ini::Properties as IniSection;
 use matrix_sdk::{room::Joined as JoinedRoom, ruma::UserId};
 use std::{convert::TryFrom, fmt};
 
+#[derive(Clone)]
 pub struct CmdPackage {
     name: String,
     acl: CmdAcl,
diff --git a/src/main.rs b/src/main.rs
index fbc01ae..6d6be28 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,5 @@
+#![feature(clone_closures)]
+
 mod cmd;
 mod config;
 mod matrix;
diff --git a/src/matrix.rs b/src/matrix.rs
index 02c1857..84d27f1 100644
--- a/src/matrix.rs
+++ b/src/matrix.rs
@@ -16,7 +16,7 @@ use matrix_sdk::{
     },
     Client, Result, SyncSettings,
 };
-use std::{convert::TryFrom, process::abort};
+use std::{convert::TryFrom, process::abort, sync::Arc};
 use tokio::time::{sleep, Duration};
 
 async fn join_room(room: &Invited) {
@@ -82,17 +82,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_commands_vec = vec![
-        Cmd::new_simple(format!("ping"), 0, Box::new(|_x| true)),
+        Cmd::new_simple(format!("ping"), 0, Arc::new(|_x| true)),
         Cmd::new_echo(
             format!("bot_name"),
             0,
-            Box::new(move |_x| username_copy.clone()),
+            Arc::new(move |_x| format!("toto")),
         ),
     ];
     let pkg = match config.section("basic") {
-        Some(section) => Box::new(CmdPackage::from_config(&section, pkg_commands_vec)),
+        Some(section) => CmdPackage::from_config(&section, pkg_commands_vec),
         None => {
             abort();
         }
@@ -123,7 +122,7 @@ pub async fn connect_and_handle(config: Config) -> Result<()> {
 
     client
         .register_event_handler(
-            |ev: SyncMessageEvent<MessageEventContent>,
+            move |ev: SyncMessageEvent<MessageEventContent>,
                   room: Room,
                   _encryption_info: Option<EncryptionInfo>| async {
                 let sender_id = ev.sender;
@@ -145,7 +144,7 @@ pub async fn connect_and_handle(config: Config) -> Result<()> {
                         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);
+                            let locked_pkg = pkg.handle(&joined, &sender_id, args);
                         }
                     }
                 }
-- 
GitLab