diff options
| author | seth <[email protected]> | 2023-11-16 00:33:59 -0500 |
|---|---|---|
| committer | seth <[email protected]> | 2023-11-16 05:41:54 +0000 |
| commit | fcf951b7712da947f3bc3a474b04a0b46c287ede (patch) | |
| tree | 999e69cc43f0f307d0b3ff603d5adc0251f9cbfd | |
| parent | 387b7dee5c022dab74bd7afc920b58793b8308de (diff) | |
feat: implement event handler correctly
| -rw-r--r-- | src/consts.rs | 3 | ||||
| -rw-r--r-- | src/handler/events.rs | 24 | ||||
| -rw-r--r-- | src/handler/message.rs | 35 | ||||
| -rw-r--r-- | src/handler/mod.rs | 51 | ||||
| -rw-r--r-- | src/handler/pinboard.rs (renamed from src/pinboard.rs) | 0 | ||||
| -rw-r--r-- | src/main.rs | 24 |
6 files changed, 68 insertions, 69 deletions
diff --git a/src/consts.rs b/src/consts.rs index 27a70bc..afcd499 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -1,7 +1,6 @@ -use poise::serenity_prelude::{GuildId, UserId}; +use poise::serenity_prelude::GuildId; pub const TEAWIE_GUILD: GuildId = GuildId(1055663552679137310); -pub const BOT: UserId = UserId(1056467120986271764); pub const TEAMOJIS: [&str; 15] = [ "<:teawiecry:1056438041872433303>", diff --git a/src/handler/events.rs b/src/handler/events.rs deleted file mode 100644 index d971b25..0000000 --- a/src/handler/events.rs +++ /dev/null @@ -1,24 +0,0 @@ -use crate::handler::Handler; -use log::*; -use poise::async_trait; -use poise::serenity_prelude::{ChannelPinsUpdateEvent, Context, EventHandler, Message}; - -#[async_trait] -impl EventHandler for Handler { - async fn message(&self, ctx: Context, msg: Message) { - if self.should_echo(&msg) { - let send = msg.reply(&ctx, &msg.content); - if let Err(why) = send.await { - error!("error when replying to {:?}: {:?}", msg.content, why); - } - } - } - - async fn channel_pins_update(&self, ctx: Context, pin: ChannelPinsUpdateEvent) { - let Some(pin_board) = &self.data.pin_board else { - return; - }; - - pin_board.handle_pin(&ctx, &pin).await; - } -} diff --git a/src/handler/message.rs b/src/handler/message.rs new file mode 100644 index 0000000..37a49bf --- /dev/null +++ b/src/handler/message.rs @@ -0,0 +1,35 @@ +use crate::{consts, utils, Data, Error}; +use log::*; +use poise::serenity_prelude as serenity; +use poise::{Event, FrameworkContext}; + +fn should_echo(framework: FrameworkContext<'_, Data, Error>, msg: &serenity::Message) -> bool { + let gid = msg.guild_id.unwrap_or_default(); + if msg.author.id == framework.bot_id || !utils::is_guild_allowed(gid) { + info!("not running copypasta command in {gid}"); + return false; + } + + let content = &msg.content; + + content == "🗿" + || consts::TEAMOJIS.contains(&content.as_str()) + || content.to_ascii_lowercase() == "moyai" + || content + .to_ascii_lowercase() + .contains("twitter's recommendation algorithm") +} + +pub async fn handle( + ctx: &serenity::Context, + _event: &Event<'_>, + framework: FrameworkContext<'_, Data, Error>, + _data: &Data, + msg: &serenity::Message, +) -> Result<(), Error> { + if should_echo(framework, msg) { + msg.reply(ctx, &msg.content).await?; + } + + Ok(()) +} diff --git a/src/handler/mod.rs b/src/handler/mod.rs index 7f7c881..6085617 100644 --- a/src/handler/mod.rs +++ b/src/handler/mod.rs @@ -1,34 +1,35 @@ -use crate::utils; -use crate::{consts, Data}; -use log::*; +use crate::{Data, Error}; +use poise::serenity_prelude as serenity; +use poise::Event; -use poise::serenity_prelude::Message; +mod message; +pub mod pinboard; -mod events; +pub async fn handle( + ctx: &serenity::Context, + event: &Event<'_>, + _framework: poise::FrameworkContext<'_, Data, Error>, + data: &Data, +) -> Result<(), Error> { + match event { + Event::Ready { data_about_bot } => { + log::info!("logged in as {}", data_about_bot.user.name) + } -pub struct Handler { - data: Data, -} + Event::Message { new_message } => { + message::handle(ctx, event, _framework, data, new_message).await?; + } -impl Handler { - pub fn new(data: Data) -> Self { - Self { data } - } + Event::ChannelPinsUpdate { pin } => { + let Some(pin_board) = &data.pin_board else { + return Ok(()); + }; - fn should_echo(&self, msg: &Message) -> bool { - let gid = msg.guild_id.unwrap_or_default(); - if msg.author.id == self.data.bot || !utils::is_guild_allowed(gid) { - info!("not running copypasta command in {gid}"); - return false; + pin_board.handle_pin(ctx, pin).await; } - let content = &msg.content; - - content == "🗿" - || consts::TEAMOJIS.contains(&content.as_str()) - || content.to_ascii_lowercase() == "moyai" - || content - .to_ascii_lowercase() - .contains("twitter's recommendation algorithm") + _ => {} } + + Ok(()) } diff --git a/src/pinboard.rs b/src/handler/pinboard.rs index 56f53b4..56f53b4 100644 --- a/src/pinboard.rs +++ b/src/handler/pinboard.rs diff --git a/src/main.rs b/src/main.rs index c604df6..6aa1cb4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,14 @@ use std::time::Duration; use std::{env, error}; +use handler::pinboard::PinBoard; use log::*; -use pinboard::PinBoard; use poise::serenity_prelude as serentiy; -use poise::serenity_prelude::*; mod api; mod commands; mod consts; mod handler; -mod pinboard; mod utils; type Error = Box<dyn error::Error + Send + Sync>; @@ -18,7 +16,6 @@ type Context<'a> = poise::Context<'a, Data, Error>; #[derive(Clone)] pub struct Data { - bot: serentiy::UserId, pin_board: Option<PinBoard>, } @@ -30,10 +27,9 @@ impl Default for Data { impl Data { pub fn new() -> Self { - let bot = utils::parse_snowflake_from_env("BOT", UserId).unwrap_or(consts::BOT); let pin_board = PinBoard::new(); - Self { bot, pin_board } + Self { pin_board } } } @@ -58,13 +54,8 @@ async fn main() { let options = poise::FrameworkOptions { commands: commands::to_global_commands(), - event_handler: |ctx, event, _, data| { - Box::pin(async move { - // yes this is dumb. no i don't care. - let handler = handler::Handler::new(data.clone()); - event.clone().dispatch(ctx.clone(), &handler).await; - Ok(()) - }) + event_handler: |ctx, event, framework, data| { + Box::pin(handler::handle(ctx, event, framework, data)) }, prefix_options: poise::PrefixFrameworkOptions { prefix: Some("!".into()), @@ -73,9 +64,7 @@ async fn main() { }, on_error: |error| Box::pin(on_error(error)), command_check: Some(|ctx| { - Box::pin(async move { - Ok(ctx.author().id != ctx.framework().bot_id && ctx.author().id != consts::BOT) - }) + Box::pin(async move { Ok(ctx.author().id != ctx.framework().bot_id) }) }), ..Default::default() }; @@ -86,10 +75,9 @@ async fn main() { .intents(serentiy::GatewayIntents::all()) .setup(|ctx, _ready, framework| { Box::pin(async move { - info!("logged in as {}", _ready.user.name); - poise::builtins::register_globally(ctx, &framework.options().commands).await?; info!("registered global commands!"); + poise::builtins::register_in_guild( ctx, &commands::to_guild_commands(), |
