Added initial logic to parse command

main
David 2023-01-07 10:35:48 +01:00
parent eb710a0efe
commit 9e71cfcf94
1 changed files with 47 additions and 8 deletions

View File

@ -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<String>,
database_handle: sled::Db,
spam_info: SpamInfo
spam_info: SpamInfo,
members_list: Vec<RoomMember>
}
impl Bot {
@ -103,7 +104,7 @@ pub mod bot {
let utc: DateTime<Utc> = 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<Bot>) {
async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room, Ctx(mut bot): Ctx<Bot>) {
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;
}
}
}
}
}
}
}