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(§ion, pkg_commands_vec)), + Some(section) => CmdPackage::from_config(§ion, 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