diff --git a/src/bot.rs b/src/bot.rs index 1d606c8..64b16b2 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -1,7 +1,7 @@ #[allow(clippy::module_inception, dead_code)] pub mod bot { - use std::result; + use std::ops::Deref; use log::{info, debug}; use matrix_sdk::{ @@ -28,7 +28,8 @@ pub mod bot { joined_room: Joined, swear_list: Vec, database_handle: sled::Db, - spam_info: SpamInfo + spam_info: SpamInfo, + members_list: Vec } impl Bot { @@ -103,7 +104,7 @@ pub mod bot { let utc: DateTime = Utc::now(); let timestamp: i64 = utc.timestamp(); let bytes = convert_to_bytes_sled(timestamp, default_reputation); - for member in members_list { + for member in members_list.clone() { dbg!( db.insert(member.user_id().as_str(), &bytes).unwrap() ); @@ -115,7 +116,8 @@ pub mod bot { joined_room, swear_list, database_handle: db, - spam_info: SpamInfo::new() + spam_info: SpamInfo::new(), + members_list: members_list.clone() }; bot.send_message("Sucessfully started Matrix-Modbot").await; @@ -129,7 +131,7 @@ pub mod bot { bot } - async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room, Ctx(bot): Ctx) { + async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room, Ctx(mut bot): Ctx) { if let Room::Joined(_joined) = &room { // Standard text message if let Some(text) = get_message_event_text(&event) { @@ -140,6 +142,7 @@ pub mod bot { bot.delete_message_from_room(id, "Swearing").await; bot.update_reputation_for_member(&member, -1).await.expect("Failed to subtract reputation from member"); }; + bot.detect_spam(&event).await; } } @@ -150,6 +153,7 @@ pub mod bot { bot.delete_message_from_room(&edited_msg_event_id, "Swearing").await; bot.update_reputation_for_member(&member, -1).await.expect("Failed to subtract reputation from member"); }; + bot.detect_spam(&event).await; } } @@ -161,6 +165,16 @@ pub mod bot { self.send_message(&format!("{} is not permitted on this server", reason)).await; } + fn check_if_member_exists(&self, user_id: &str) -> bool { + let user_id_list: Vec<&str> = self.members_list.iter().map(|x| x.user_id().as_str()).collect(); + if user_id_list.contains(&user_id) { + true + } + else { + false + } + } + async fn update_reputation_for_member(&self, member: &RoomMember, rep_change: i64) -> sled::Result<()> { let member_id: &str = member.user_id().as_str(); let user_data = dbg!(self.database_handle.get(member_id)?); @@ -224,13 +238,38 @@ pub mod bot { if i64::try_from(self.spam_info.author_msg_times.get(&author_name).unwrap().len()).unwrap() > self.spam_info.max_msg_per_window { self.delete_message_from_room(&event.event_id, "Spamming").await; + self.update_reputation_for_member(&author, -1).await.unwrap(); } } - async fn detect_command(&self, event_id: &OwnedEventId) { - todo!() + async fn detect_command(&self, message: &str) { + let words: Vec<&str> = message.split_whitespace().collect(); + if words.first().unwrap().deref() == "!modbot" { + if words[1] == "award" { + let result = dbg!(self.database_handle.get(words[2])); + match result { + Ok(_) => { + let (timestamp, _) = convert_from_bytes_sled(&result.unwrap().unwrap()); + let curr_utc = Utc::now().timestamp(); + if self.check_if_member_exists(words[2]) { + if curr_utc - timestamp > 86400 { + let user_data = dbg!(self.database_handle.get(words[2]).unwrap()); + let (timestamp, mut reputation) = convert_from_bytes_sled(&user_data.unwrap()); + reputation += 1; + let new_data = convert_to_bytes_sled(timestamp, reputation); + dbg!(self.database_handle.remove(words[2]).unwrap()); + dbg!(self.database_handle.insert(words[2], &new_data).unwrap()); + self.send_message(&format!("{}'s current reputation is {}", words[2], reputation)).await; + } + } + }, + Err(_) => { + self.send_message("Cannot add reputation. Check if the User ID provided is correct").await; + } + } + } + } } - } }