Added initial logic to parse command
parent
eb710a0efe
commit
9e71cfcf94
55
src/bot.rs
55
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<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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue