Start work on spam detection

main
David 2023-01-04 15:41:32 +01:00
parent c66381b08f
commit 29b0ee97bb
2 changed files with 32 additions and 10 deletions

View File

@ -24,7 +24,8 @@ pub mod bot {
info: BotUserInfo, info: BotUserInfo,
joined_room: Joined, joined_room: Joined,
swear_list: Vec<String>, swear_list: Vec<String>,
database_handle: sled::Db database_handle: sled::Db,
spam_info: SpamInfo
} }
impl Bot { impl Bot {
@ -110,7 +111,8 @@ pub mod bot {
info: creds, info: creds,
joined_room, joined_room,
swear_list, swear_list,
database_handle: db database_handle: db,
spam_info: SpamInfo::new()
}; };
bot.send_message("Sucessfully started Matrix-Modbot").await; bot.send_message("Sucessfully started Matrix-Modbot").await;
@ -132,7 +134,7 @@ pub mod bot {
let id = &event.event_id; let id = &event.event_id;
if bot.info.allow_swear && detect_swear_from_message(&bot.swear_list, &text) { if bot.info.allow_swear && detect_swear_from_message(&bot.swear_list, &text) {
bot.delete_swear_from_room(id, &member).await; bot.delete_message_from_room(id, &member, "Swearing").await;
}; };
} }
} }
@ -141,19 +143,19 @@ pub mod bot {
if let Some((edited_msg_event_id, text)) = get_edited_message_event_text(&event){ if let Some((edited_msg_event_id, text)) = get_edited_message_event_text(&event){
if bot.info.allow_swear && detect_swear_from_message(&bot.swear_list, &text) { if bot.info.allow_swear && detect_swear_from_message(&bot.swear_list, &text) {
let member = room.get_member(&event.sender).await.unwrap().unwrap(); let member = room.get_member(&event.sender).await.unwrap().unwrap();
bot.delete_swear_from_room(&edited_msg_event_id, &member).await; bot.delete_message_from_room(&edited_msg_event_id, &member, "Swearing").await;
}; };
} }
} }
async fn delete_swear_from_room(&self, event_id: &OwnedEventId, member: &RoomMember) { async fn delete_message_from_room(&self, event_id: &OwnedEventId, member: &RoomMember, reason: &str) {
let result = self.joined_room.redact(event_id, Some("Swearing"), None).await; let result = self.joined_room.redact(event_id, Some(reason), None).await;
if result.is_err() { if result.is_err() {
self.send_message("Error deleting message").await; self.send_message("Error deleting message").await;
}; };
self.send_message("Swearing is not permitted on this server").await; self.send_message(&format!("{} is not permitted on this server", reason)).await;
self.subtract_reputation_from_member(member).await.expect("Failed to subtract reputation from member"); self.subtract_reputation_from_member(member).await.expect("Failed to subtract reputation from member");
} }
@ -162,23 +164,30 @@ pub mod bot {
let member_id: &str = member.user_id().as_str(); let member_id: &str = member.user_id().as_str();
let mut current_reputation = dbg!(self.database_handle.get(member_id).unwrap().unwrap().first().unwrap().to_owned()); let mut current_reputation = dbg!(self.database_handle.get(member_id).unwrap().unwrap().first().unwrap().to_owned());
if current_reputation == 0 { if current_reputation == 0 {
self.joined_room.kick_user(member.user_id(), Some("Reputation lower than zero")).await.expect("Cannot kick user"); if let Some(_) = self.joined_room.kick_user(member.user_id(), Some("Reputation lower than zero")).await.ok() {
dbg!(self.database_handle.remove(member_id).unwrap());
self.send_message(&format!("Member {} has been kicked.", member_id)).await;
};
return Ok(()) return Ok(())
} }
else { else {
current_reputation -= 1; current_reputation -= 1;
dbg!(self.database_handle.insert(member_id, &current_reputation.to_be_bytes()).unwrap()); dbg!(self.database_handle.insert(member_id, &current_reputation.to_be_bytes()).unwrap());
self.send_message(&format!("{}'s current reputation is {}", member_id, current_reputation)).await;
return Ok(()) return Ok(())
} }
} }
pub async fn send_message(&self, message: &str) { async fn send_message(&self, message: &str) {
debug!("Send message ({:?}): {}", &self.joined_room, message); debug!("Send message ({:?}): {}", &self.joined_room, message);
let content = RoomMessageEventContent::text_plain(message); let content = RoomMessageEventContent::text_plain(message);
let _ = &self.joined_room.send(content, None) let _ = &self.joined_room.send(content, None)
.await .await
.expect("Unable to send message"); .expect("Unable to send message");
}
async fn detect_spam(&self, event_id: &OwnedEventId) -> bool {
todo!()
} }
} }

View File

@ -7,10 +7,23 @@ pub mod utils {
use matrix_sdk::ruma::OwnedEventId; use matrix_sdk::ruma::OwnedEventId;
use std::{ use std::{
fs::File, fs::File,
io::{copy, BufReader, BufRead, Result}, io::{copy, BufReader, BufRead, Result}, collections::HashMap,
}; };
use reqwest; use reqwest;
#[derive(Clone)]
pub struct SpamInfo {
pub detection_window: i32,
pub max_msg_per_window: i32,
pub author_msg_times: HashMap<String, Vec<i32>>,
}
impl SpamInfo {
pub fn new() -> Self {
SpamInfo { detection_window: 7, max_msg_per_window: 5, author_msg_times: HashMap::new() }
}
}
pub fn get_message_event_text(event: &OriginalSyncRoomMessageEvent) -> Option<String> { pub fn get_message_event_text(event: &OriginalSyncRoomMessageEvent) -> Option<String> {
if let MessageType::Text(TextMessageEventContent { body, .. }) = &event.content.msgtype { if let MessageType::Text(TextMessageEventContent { body, .. }) = &event.content.msgtype {
Some(body.to_owned()) Some(body.to_owned())