parent
							
								
									621e1d97ed
								
							
						
					
					
						commit
						561f88778e
					
				| @ -23,7 +23,7 @@ impl Database { | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub async fn get_logging_channel( | ||||
|     pub async fn get_logging_channels( | ||||
|         &self, | ||||
|         guild_id: GuildId, | ||||
|     ) -> Result<Vec<u64>> { | ||||
|  | ||||
| @ -1,9 +1,7 @@ | ||||
| use super::{Context, Error}; | ||||
| use super::{Context, Result}; | ||||
| 
 | ||||
| use super::utils::serenity; | ||||
| 
 | ||||
| type Result = ::std::result::Result<(), Error>; | ||||
| 
 | ||||
| #[allow(clippy::unused_async)] | ||||
| #[poise::command(
 | ||||
|     slash_command, | ||||
| @ -57,7 +55,7 @@ pub async fn list_channels(ctx: Context<'_>) -> Result { | ||||
|     let response = match ctx.guild_id() { | ||||
|         None => "Error: Could not determine the guild's ID".to_owned(), | ||||
|         Some(guild_id) => { | ||||
|             match ctx.data().database.get_logging_channel(guild_id).await { | ||||
|             match ctx.data().database.get_logging_channels(guild_id).await { | ||||
|                 Err(e) => format!("Could not retrieve loggers: {e:?}"), | ||||
|                 Ok(channels) => { | ||||
|                     if channels.is_empty() { | ||||
|  | ||||
| @ -0,0 +1,72 @@ | ||||
| use crate::db::Database; | ||||
| 
 | ||||
| use super::{utils::BotData, Error, Result}; | ||||
| 
 | ||||
| use poise::{serenity_prelude as serenity, Event}; | ||||
| use tracing::{error, info}; | ||||
| 
 | ||||
| async fn handle_everyone_mention( | ||||
|     ctx: &serenity::Context, | ||||
|     database: &Database, | ||||
|     message: &serenity::Message, | ||||
| ) -> Result { | ||||
|     use serenity::ChannelId; | ||||
|     if let Some(guild_id) = message.guild_id { | ||||
|         if message.mention_everyone { | ||||
|             let author = message.author.clone(); | ||||
|             let message_channel = message.channel_id; | ||||
|             let channels: Vec<ChannelId> = database | ||||
|                 .get_logging_channels(guild_id) | ||||
|                 .await? | ||||
|                 .iter() | ||||
|                 .map(|channel_id| serenity::ChannelId(channel_id.to_owned())) | ||||
|                 .collect(); | ||||
|             for channel in &channels { | ||||
|                 channel | ||||
|                     .send_message(&ctx, |m| { | ||||
|                         m.embed(|e| { | ||||
|                             e.title("Someone mentioned everyone!") | ||||
|                                 .field("Author", author.clone(), true) | ||||
|                                 .field( | ||||
|                                     "When", | ||||
|                                     message.timestamp.naive_local().to_string(), | ||||
|                                     true, | ||||
|                                 ) | ||||
|                                 .field( | ||||
|                                     "Channel", | ||||
|                                     format!("<#{message_channel}>"), | ||||
|                                     true, | ||||
|                                 ) | ||||
|                                 .field("Link", format!("https://discord.com/channels/{guild_id}/{}/{}", channel.0, message.id), false) | ||||
|                         }) | ||||
|                     }) | ||||
|                     .await | ||||
|                     .map_err(|e| { | ||||
|                         error!("Failed to send message: {e:?}"); | ||||
|                         e | ||||
|                     })?; | ||||
|             } | ||||
|         } | ||||
|     } else { | ||||
|         error!("Could not determine guild id of message {message:?}"); | ||||
|     } | ||||
|     Ok(()) | ||||
| } | ||||
| 
 | ||||
| pub async fn event_handler( | ||||
|     ctx: &serenity::Context, | ||||
|     event: &Event<'_>, | ||||
|     _framework: poise::FrameworkContext<'_, BotData, Error>, | ||||
|     data: &BotData, | ||||
| ) -> Result { | ||||
|     match event { | ||||
|         Event::Ready { data_about_bot } => { | ||||
|             info!("Logged in as {}", data_about_bot.user.name); | ||||
|         } | ||||
|         Event::Message { new_message } => { | ||||
|             handle_everyone_mention(ctx, &data.database, new_message).await?; | ||||
|         } | ||||
|         _ => {} | ||||
|     } | ||||
|     Ok(()) | ||||
| } | ||||
| @ -8,10 +8,17 @@ use utils::serenity; | ||||
| use commands::logging; | ||||
| use utils::{BotData, Context, Error}; | ||||
| 
 | ||||
| use self::events::event_handler; | ||||
| 
 | ||||
| pub type Result = ::std::result::Result<(), Error>; | ||||
| 
 | ||||
| pub fn make_bot() -> FrameworkBuilder<BotData, Error> { | ||||
|     poise::Framework::builder() | ||||
|         .options(poise::FrameworkOptions { | ||||
|             commands: vec![logging()], | ||||
|             event_handler: |ctx, event, framework, data| { | ||||
|                 Box::pin(event_handler(ctx, event, framework, data)) | ||||
|             }, | ||||
|             ..Default::default() | ||||
|         }) | ||||
|         .token(std::env::var("DISCORD_TOKEN").expect("missing DISCORD_TOKEN")) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user