Skip to content
This repository has been archived by the owner on Aug 7, 2024. It is now read-only.

Commit

Permalink
feat: handle mute when rejoining the server
Browse files Browse the repository at this point in the history
  • Loading branch information
oSumAtrIX committed Aug 25, 2022
1 parent 23bc1aa commit 042fc8c
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 16 deletions.
7 changes: 4 additions & 3 deletions src/commands/moderation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,22 @@ pub async fn mute(
if let Err(add_role_result) = member.add_role(&ctx.discord().http, mute_role_id).await {
Some(Error::from(add_role_result))
} else {
// accumulate all roles to take from the member
let removed_roles = member
.roles
.iter()
.filter(|r| take.contains(&r.0))
.map(|r| r.to_string())
.collect::<Vec<_>>();

let removed = member
// take them from the member, get remaining roles
let remaining_roles = member
.remove_roles(
&ctx.discord().http,
&take.iter().map(|&r| RoleId::from(r)).collect::<Vec<_>>(),
)
.await;

if let Err(remove_role_result) = removed {
if let Err(remove_role_result) = remaining_roles {
Some(Error::from(remove_role_result))
} else {
// Roles which were removed from the user
Expand Down
5 changes: 4 additions & 1 deletion src/events/guild_member_addition.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
use super::*;
use crate::utils::decancer::cure;
use crate::utils::moderation::mute_on_join;

pub async fn guild_member_addition(ctx: &serenity::Context, new_member: &mut serenity::Member) {
mute_on_join(ctx, new_member).await;

pub async fn guild_member_addition(ctx: &serenity::Context, new_member: &serenity::Member) {
cure(ctx, &None, new_member).await;
}
19 changes: 10 additions & 9 deletions src/events/message_create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ use super::*;
use crate::utils::bot::get_data_lock;
use crate::utils::ocr;

fn contains_match(regex: &Vec<Regex>, text: &str) -> bool {
fn contains_match(regex: &[Regex], text: &str) -> bool {
regex.iter().any(|r| r.is_match(text))
}

async fn attachments_contains(attachments: &Vec<Attachment>, regex: &Vec<Regex>) -> bool {
async fn attachments_contains(attachments: &[Attachment], regex: &[Regex]) -> bool {
for attachment in attachments {
debug!("Checking attachment {}", &attachment.url);

Expand All @@ -31,7 +31,7 @@ async fn attachments_contains(attachments: &Vec<Attachment>, regex: &Vec<Regex>)

pub async fn message_create(ctx: &serenity::Context, new_message: &serenity::Message) {
debug!("Received message: {}", new_message.content);

if new_message.guild_id.is_none() || new_message.author.bot {
return;
}
Expand Down Expand Up @@ -64,18 +64,19 @@ pub async fn message_create(ctx: &serenity::Context, new_message: &serenity::Mes
let contains_attachments = !new_message.attachments.is_empty();

// check if the message does not match any of the excludes
if contains_match(&excludes.match_field.text, &message) {
if contains_match(&excludes.match_field.text, message) {
continue;
}

if contains_attachments && !excludes.match_field.ocr.is_empty() {
if attachments_contains(&new_message.attachments, &excludes.match_field.ocr).await {
continue;
}
if contains_attachments
&& !excludes.match_field.ocr.is_empty()
&& attachments_contains(&new_message.attachments, &excludes.match_field.ocr).await
{
continue;
}

// check if the message does match any of the includes
if !(contains_match(&response.includes.match_field.text, &message)
if !(contains_match(&response.includes.match_field.text, message)
|| (contains_attachments
&& !response.includes.match_field.ocr.is_empty()
&& attachments_contains(
Expand Down
4 changes: 2 additions & 2 deletions src/events/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ impl serenity::EventHandler for Handler<Arc<RwLock<Data>>> {
thread_create::thread_create(&ctx, &thread).await;
}

async fn guild_member_addition(&self, ctx: serenity::Context, new_member: serenity::Member) {
guild_member_addition::guild_member_addition(&ctx, &new_member).await;
async fn guild_member_addition(&self, ctx: serenity::Context, mut new_member: serenity::Member) {
guild_member_addition::guild_member_addition(&ctx, &mut new_member).await;
}

async fn guild_member_update(
Expand Down
43 changes: 43 additions & 0 deletions src/utils/moderation.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use std::sync::Arc;

use mongodb::options::FindOptions;
use poise::serenity_prelude::Http;
use tokio::task::JoinHandle;
use tracing::{debug, error, trace};

use super::bot::get_data_lock;
use super::*;
use crate::db::database::Database;
use crate::db::model::Muted;
Expand All @@ -13,6 +16,46 @@ pub enum ModerationKind {
Unmute(Option<Error>), // Error
}

pub async fn mute_on_join(ctx: &serenity::Context, new_member: &mut serenity::Member) {
let data = get_data_lock(ctx).await;
let data = data.read().await;

if let Ok(mut cursor) = data
.database
.find::<Muted>(
"muted",
Muted {
user_id: Some(new_member.user.id.to_string()),
..Default::default()
}
.into(),
Some(FindOptions::builder().limit(1).build()),
)
.await
{
if cursor.advance().await.is_ok() {
trace!("Muted member {} rejoined the server", new_member.user.tag());
if new_member
.add_role(&ctx.http, RoleId(data.configuration.general.mute.role))
.await
.is_ok()
{
debug!(
"Muted member {} was successfully muted",
new_member.user.tag()
);
} else {
error!(
"Failed to mute member {} after rejoining the server",
new_member.user.tag()
);
}
}
} else {
error!("Failed to query database for muted users");
}
}

pub fn queue_unmute_member(
http: &Arc<Http>,
database: &Arc<Database>,
Expand Down
2 changes: 1 addition & 1 deletion src/utils/ocr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pub async fn get_text_from_image_url(url: &str) -> Result<String, Error> {
let image = &reqwest::get(url).await?.bytes().await.unwrap().to_vec();
Ok(Tesseract::new(None, None)
.unwrap()
.set_image_from_mem(&image)
.set_image_from_mem(image)
.unwrap()
.get_text()
.unwrap())
Expand Down

0 comments on commit 042fc8c

Please sign in to comment.