From cc286d6066de03118f2eca934ea3f03dd36b19cb Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Mon, 13 Dec 2021 11:10:09 +0100
Subject: [PATCH] Add config to set if the bot should handle events

---
 mgb.yml       |  6 +++++-
 src/config.rs | 18 +++++++++++++++++-
 src/matrix.rs | 18 ++++++++++++++----
 3 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/mgb.yml b/mgb.yml
index 49a475c..05480b9 100644
--- a/mgb.yml
+++ b/mgb.yml
@@ -1,4 +1,8 @@
 [user]
-id=@some_id:matrix.org
+id=@some_id\:matrix.org
 password=no-password
 display_name=MGB-Hitagi
+
+[handler]
+state_member=true
+room_message=true
diff --git a/src/config.rs b/src/config.rs
index 520e633..fcdef0e 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -2,7 +2,7 @@
 
 use ini::{Error::Io as IniErrIo, Error::Parse as IniErrParse, Ini};
 use log::{error, info, warn, LevelFilter};
-use std::{env, path::Path, process::abort};
+use std::{env, path::Path, process::abort, str::FromStr};
 use url::Url;
 
 pub struct Config {
@@ -10,6 +10,9 @@ pub struct Config {
     pub homeserver_url: Url,   // The url of the home server, like https://matrix.iiens.net
     pub user_name: String,     // The true user name
     pub user_password: String, // The true user name
+
+    pub handle_state_member: bool, // Install handler for state memver changes
+    pub handle_room_message: bool, // Install handler for room messages
 }
 
 pub fn setup_logging() {
@@ -36,6 +39,12 @@ pub fn from_file(file_name: &String) -> Result<Config, String> {
         Err(IniErrParse(e)) => Err(e.to_string()),
         Ok(conf) => {
             let hs_url_str = conf.get_from_or(Some("user"), "homeserver", "https://matrix.org");
+            let handle_room_message_str = conf
+                .get_from_or(Some("handler"), "room_message", "true")
+                .to_string();
+            let handle_state_member_str = conf
+                .get_from_or(Some("handler"), "state_member", "true")
+                .to_string();
             return match Url::parse(hs_url_str) {
                 Err(e) => Err(e.to_string()),
                 Ok(hs_url) => Ok(Config {
@@ -49,6 +58,10 @@ pub fn from_file(file_name: &String) -> Result<Config, String> {
                         .get_from_or(Some("user"), "display_name", "MGB-Hitagi")
                         .to_string(),
                     homeserver_url: hs_url,
+                    handle_room_message: <bool as FromStr>::from_str(&handle_room_message_str)
+                        .unwrap_or(false),
+                    handle_state_member: <bool as FromStr>::from_str(&handle_state_member_str)
+                        .unwrap_or(false),
                 }),
             };
         }
@@ -61,6 +74,9 @@ pub fn write_default(file_name: &String) -> Result<(), String> {
         .set("id", "@some_id:matrix.org")
         .set("password", "no-password")
         .set("display_name", "MGB-Hitagi");
+    conf.with_section(Some("handler"))
+        .set("state_member", "true")
+        .set("room_message", "true");
     match conf.write_to_file_policy(file_name, ini::EscapePolicy::Everything) {
         Ok(()) => {
             info!("Default config file written to {}", file_name);
diff --git a/src/matrix.rs b/src/matrix.rs
index f0b31ce..bd364e7 100644
--- a/src/matrix.rs
+++ b/src/matrix.rs
@@ -1,5 +1,5 @@
 use crate::config::Config;
-use futures::{join, future::join_all};
+use futures::future::join_all;
 use log::{error, info, warn};
 use matrix_sdk::{
     deserialized_responses::EncryptionInfo,
@@ -144,9 +144,19 @@ pub async fn connect_and_handle(config: Config) -> Result<()> {
     client.sync_once(SyncSettings::default()).await?;
 
     startup_and_log_rooms(&client).await;
-    let register_handle_state = client.register_event_handler(on_state_member);
-    let register_handle_message = client.register_event_handler(on_room_message);
-    join!(register_handle_message, register_handle_state);
+    if config.handle_state_member {
+        info!("Handle state member events");
+        client.register_event_handler(on_state_member).await;
+    } else {
+        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");
+    }
 
     info!("Entering sync loop");
     let token = client.sync_token().await.unwrap();
-- 
GitLab