From 28a19c41204c6334e085bb52ca21d52b54ccd178 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 9 Aug 2022 18:02:52 +0200 Subject: [PATCH] feat: decancer user names --- src/commands/configuration.rs | 4 ++- src/events/guild_member_addition.rs | 5 +++ src/events/guild_member_update.rs | 9 ++++++ src/events/mod.rs | 50 +++++++++++++++++++---------- src/main.rs | 12 ++++--- src/utils.rs | 27 +++++++++++++++- 6 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 src/events/guild_member_addition.rs create mode 100644 src/events/guild_member_update.rs diff --git a/src/commands/configuration.rs b/src/commands/configuration.rs index 4689925..eab6c6e 100644 --- a/src/commands/configuration.rs +++ b/src/commands/configuration.rs @@ -1,6 +1,8 @@ -use crate::{utils::load_configuration, Context, Error}; use tracing::debug; +use crate::utils::load_configuration; +use crate::{Context, Error}; + #[poise::command(slash_command, prefix_command)] pub async fn reload(ctx: Context<'_>) -> Result<(), Error> { // Update the configuration diff --git a/src/events/guild_member_addition.rs b/src/events/guild_member_addition.rs new file mode 100644 index 0000000..610a48f --- /dev/null +++ b/src/events/guild_member_addition.rs @@ -0,0 +1,5 @@ +use super::*; + +pub async fn guild_member_addition(ctx: &serenity::Context, new_member: &serenity::Member) { + crate::utils::cure(ctx, new_member).await; +} \ No newline at end of file diff --git a/src/events/guild_member_update.rs b/src/events/guild_member_update.rs new file mode 100644 index 0000000..ab553db --- /dev/null +++ b/src/events/guild_member_update.rs @@ -0,0 +1,9 @@ +use super::*; + +pub async fn guild_member_update( + ctx: &serenity::Context, + _old_if_available: &Option, + new: &serenity::Member, +) { + crate::utils::cure(ctx, new).await; +} \ No newline at end of file diff --git a/src/events/mod.rs b/src/events/mod.rs index dccb1a7..db1dba9 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -1,8 +1,12 @@ -use poise::serenity_prelude::{self as serenity, Mutex, RwLock, ShardManager, UserId}; use std::sync::Arc; -use crate::{model::application::Configuration, Error}; +use poise::serenity_prelude::{self as serenity, Mutex, RwLock, ShardManager, UserId}; +use crate::model::application::Configuration; +use crate::Error; + +mod guild_member_addition; +mod guild_member_update; mod message_create; mod thread_create; @@ -43,7 +47,7 @@ impl Handler { bot_id: self.bot_id.read().await.unwrap(), options: &self.options, user_data: &self.data, - shard_manager: &(*self.shard_manager.read().await).clone().unwrap(), // Shard manager can be read between all poise events without locks + shard_manager: &(*self.shard_manager.read().await).clone().unwrap(), /* Shard manager can be read between all poise events without locks */ }; poise::dispatch_event(framework_data, ctx, event).await; } @@ -59,13 +63,17 @@ impl serenity::EventHandler for Handler>> { async fn message(&self, ctx: serenity::Context, new_message: serenity::Message) { message_create::message_create(&ctx, &new_message).await; - self.dispatch_poise_event(&ctx, &poise::Event::Message { new_message }) - .await; + self.dispatch_poise_event(&ctx, &poise::Event::Message { + new_message, + }) + .await; } async fn interaction_create(&self, ctx: serenity::Context, interaction: serenity::Interaction) { - self.dispatch_poise_event(&ctx, &poise::Event::InteractionCreate { interaction }) - .await; + self.dispatch_poise_event(&ctx, &poise::Event::InteractionCreate { + interaction, + }) + .await; } async fn message_update( @@ -75,20 +83,28 @@ impl serenity::EventHandler for Handler>> { new: Option, event: serenity::MessageUpdateEvent, ) { - self.dispatch_poise_event( - &ctx, - &poise::Event::MessageUpdate { - old_if_available, - new, - event, - }, - ) + self.dispatch_poise_event(&ctx, &poise::Event::MessageUpdate { + old_if_available, + new, + event, + }) .await; } async fn thread_create(&self, ctx: serenity::Context, thread: serenity::GuildChannel) { thread_create::thread_create(&ctx, &thread).await; - self.dispatch_poise_event(&ctx, &poise::Event::ThreadCreate { 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_update( + &self, + ctx: serenity::Context, + old_if_available: Option, + new: serenity::Member, + ) { + guild_member_update::guild_member_update(&ctx, &old_if_available, &new).await; } } diff --git a/src/main.rs b/src/main.rs index 4da69aa..4f22e34 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,13 @@ -use crate::model::application::Configuration; -use std::{env, sync::Arc}; +use std::env; +use std::sync::Arc; use commands::configuration; use events::Handler; use poise::serenity_prelude::{self as serenity, RwLock}; use utils::load_configuration; +use crate::model::application::Configuration; + mod commands; mod events; mod logger; @@ -87,7 +89,9 @@ async fn main() { let mut client = serenity::Client::builder( env::var("DISCORD_AUTHORIZATION_TOKEN") .expect("Could not load Discord authorization token"), - serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT, + serenity::GatewayIntents::non_privileged() + | serenity::GatewayIntents::MESSAGE_CONTENT + | serenity::GatewayIntents::GUILD_MEMBERS, ) .event_handler_arc(handler.clone()) .await @@ -104,4 +108,4 @@ async fn main() { .await; client.start().await.unwrap(); -} +} \ No newline at end of file diff --git a/src/utils.rs b/src/utils.rs index 8fc6dbc..157c808 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,7 +1,11 @@ -use poise::serenity_prelude::CreateEmbed; +use decancer::Decancer; +use poise::serenity_prelude::{self as serenity, CreateEmbed, RwLock}; +use tracing::info; use crate::model::application::Configuration; +const DECANCER: Decancer = Decancer::new(); + pub(crate) fn load_configuration() -> Configuration { Configuration::load().expect("Failed to load configuration") } @@ -29,4 +33,25 @@ impl PoiseEmbed for crate::model::application::Embed { .image(self.image.url) .author(|a| a.name(self.author.name).icon_url(self.author.icon_url)) } +} + +pub async fn cure(ctx: &serenity::Context, member: &serenity::Member) { + let display_name = member.display_name(); + let name = display_name.to_string(); + + let cured_user_name = DECANCER.cure(&name); + + if name == cured_user_name { + return; // username is already cured + } + + info!("Cured user {}", name); + + member + .guild_id + .edit_member(&ctx.http, member.user.id, |edit_member| { + edit_member.nickname(cured_user_name) + }) + .await + .unwrap(); } \ No newline at end of file