summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseth <[email protected]>2023-11-16 00:33:59 -0500
committerseth <[email protected]>2023-11-16 05:41:54 +0000
commitfcf951b7712da947f3bc3a474b04a0b46c287ede (patch)
tree999e69cc43f0f307d0b3ff603d5adc0251f9cbfd
parent387b7dee5c022dab74bd7afc920b58793b8308de (diff)
feat: implement event handler correctly
-rw-r--r--src/consts.rs3
-rw-r--r--src/handler/events.rs24
-rw-r--r--src/handler/message.rs35
-rw-r--r--src/handler/mod.rs51
-rw-r--r--src/handler/pinboard.rs (renamed from src/pinboard.rs)0
-rw-r--r--src/main.rs24
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(),