refactor: simplify code, better organize it, and comment it
This commit is contained in:
68
src/discord/events/everyone.rs
Normal file
68
src/discord/events/everyone.rs
Normal file
@@ -0,0 +1,68 @@
|
||||
use crate::db::Database;
|
||||
|
||||
use super::super::Result;
|
||||
|
||||
use super::super::error::Error as DiscordError;
|
||||
|
||||
use poise::serenity_prelude::{self as serenity, CreateEmbed};
|
||||
use tracing::{error, info};
|
||||
|
||||
fn message_for_everyone_mention(
|
||||
embed: &mut CreateEmbed,
|
||||
message: &serenity::Message,
|
||||
guild_id: u64,
|
||||
) {
|
||||
let author = message.author.clone();
|
||||
let message_channel = message.channel_id.0;
|
||||
embed
|
||||
.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}/{message_channel}/{}",
|
||||
message.id
|
||||
),
|
||||
false,
|
||||
);
|
||||
}
|
||||
|
||||
/// Handle messages mentioning everyone.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if a message fails to be sent,
|
||||
/// if retrieving the list of channels registered as loggers fails, or
|
||||
/// if there is not guild ID that can be retrieved from the message.
|
||||
pub async fn handle_everyone_mention(
|
||||
ctx: &serenity::Context,
|
||||
database: &Database,
|
||||
message: &serenity::Message,
|
||||
) -> Result {
|
||||
info!("Message mentioning everyone: {message:?}");
|
||||
if !message.mention_everyone {
|
||||
return Ok(());
|
||||
}
|
||||
if message.guild_id.is_none() {
|
||||
error!("Message without a guild_id! {message:?}");
|
||||
return Err(DiscordError::GuildIdNotFound.boxed());
|
||||
}
|
||||
let guild_id = message.guild_id.unwrap();
|
||||
let channels: Vec<serenity::ChannelId> =
|
||||
database.get_logging_channels(guild_id).await?;
|
||||
for channel in &channels {
|
||||
// Ignore result, it'll be in the bot's logger
|
||||
let _ = channel
|
||||
.send_message(&ctx, |m| {
|
||||
m.embed(|e| {
|
||||
message_for_everyone_mention(e, message, guild_id.0);
|
||||
e
|
||||
})
|
||||
})
|
||||
.await
|
||||
.map_err(|e| error!("Failed to send message: {e:?}"));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
34
src/discord/events/mod.rs
Normal file
34
src/discord/events/mod.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
use super::{utils::BotData, Error, Result};
|
||||
|
||||
use poise::{
|
||||
serenity_prelude::{self as serenity},
|
||||
Event,
|
||||
};
|
||||
use tracing::info;
|
||||
|
||||
mod everyone;
|
||||
use everyone::handle_everyone_mention;
|
||||
|
||||
/// Function handling events the bot can see.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// This function will return an error if one of the functions error
|
||||
/// themselves.
|
||||
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(())
|
||||
}
|
||||
Reference in New Issue
Block a user