diff options
| author | seth <[email protected]> | 2024-08-16 22:14:16 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-17 02:14:16 +0000 |
| commit | bbc00edc6508ea1910c4d9e6a272f7859900950d (patch) | |
| tree | 538fe23940cb6bca8afa48059e502bfa7d5608cd /crates/bot-client/src/handler.rs | |
| parent | 66ea6f8c225cc2273cfbfb1b948604c170a78e8c (diff) | |
end of summer refactor (#31)
* crates: `bot-*` -> `discord-bot`
I didn't really need all these crates to be split :/
* discord-bot: revamp http impl
also handles the new errors reported by teawieAPI
* crates: split http backend
this can be reused easily
* git-tracker: short-circuit boolean logic
We don't need to check if the commit is a descendant of the HEAD of the
branch if it *is* the HEAD
* nix: fenix -> nixpkgs
* treefmt: add actionlint
* nix: use docker arch names for containers
* ci: use actions-rust-lang actions
* nix: drop ci dev shell
* git-tracker: init ManagedRepository
this logic can be shared
* ci: use nix for clippy scan
* discord-bot: better handle unmerged PRs
* ci: fix treefmt check
* nix: fix clippy check
* .env.template: update crate names
* git-tracker: use remote name for remote name
i was half asleep
* discord-bot: handle merged PRs that aren't found in any tracked branches
* git-tracker: make collect_statuses_in() return a Vec
* discord-bot: add more PR info with response
fixes #18
Diffstat (limited to 'crates/bot-client/src/handler.rs')
| -rw-r--r-- | crates/bot-client/src/handler.rs | 112 |
1 files changed, 0 insertions, 112 deletions
diff --git a/crates/bot-client/src/handler.rs b/crates/bot-client/src/handler.rs deleted file mode 100644 index 2cd0082..0000000 --- a/crates/bot-client/src/handler.rs +++ /dev/null @@ -1,112 +0,0 @@ -use crate::{SharedConfig, SharedHttp}; -use bot_error::Error; - -use log::{debug, error, info, trace, warn}; -use serenity::all::CreateBotAuthParameters; -use serenity::async_trait; -use serenity::builder::{ - CreateEmbed, CreateInteractionResponse, CreateInteractionResponseFollowup, - CreateInteractionResponseMessage, -}; -use serenity::model::{ - application::{Command, CommandInteraction, Interaction}, - colour::Colour, - gateway::Ready, -}; -use serenity::prelude::{Context, EventHandler}; - -#[derive(Clone, Copy, Debug)] -pub struct Handler; - -impl Handler { - async fn register_commands(&self, ctx: &Context) -> Result<(), Error> { - let commands = bot_commands::to_vec(); - let commands_len = commands.len(); - for command in commands { - Command::create_global_command(&ctx.http, command).await?; - } - - debug!("Registered {} commands", commands_len); - Ok(()) - } - - /// Dispatch our commands from a [`CommandInteraction`] - async fn dispatch_command(ctx: &Context, command: &CommandInteraction) -> Result<(), Error> { - let command_name = command.data.name.as_str(); - - // grab our configuration & http client from the aether - let (http, config) = { - let read = ctx.data.read().await; - let http = read - .get::<SharedHttp>() - .ok_or("Couldn't get shared HTTP client! WHY??????")? - .clone(); - let config = read - .get::<SharedConfig>() - .ok_or("Couldn't get shared bot configuration!")? - .clone(); - (http, config) - }; - - match command_name { - "about" => bot_commands::about::respond(ctx, &http, command).await?, - "ping" => bot_commands::ping::respond(ctx, command).await?, - "track" => bot_commands::track::respond(ctx, &http, &config, command).await?, - _ => { - let message = CreateInteractionResponseMessage::new().content(format!( - "It doesn't look like you can use `{command_name}`. Sorry :(" - )); - let response = CreateInteractionResponse::Message(message); - command.create_response(&ctx, response).await?; - } - }; - - Ok(()) - } - - async fn invite_link(ctx: &Context) { - if let Ok(invite_link) = CreateBotAuthParameters::new().auto_client_id(ctx).await { - let link = invite_link.build(); - info!("You can install me as an app at {link}"); - } else { - warn!("Couldn't figure out our own client ID! Something might be wrong"); - } - } -} - -#[async_trait] -impl EventHandler for Handler { - /// Dispatch our commands and try to handle errors from them - async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - if let Interaction::Command(command) = interaction { - let command_name = &command.data.name; - trace!("Received command: {}", command_name); - - if let Err(why) = Handler::dispatch_command(&ctx, &command).await { - error!( - "Ran into an error while dispatching command {}:\n{why:?}", - command_name - ); - - let embed = CreateEmbed::new() - .title("An error occurred") - .description("Sorry about that!") - .color(Colour::RED); - let response = CreateInteractionResponseFollowup::new().embed(embed); - - if let Err(why) = command.create_followup(&ctx.http, response).await { - error!("Ran into an error while trying to recover from an error!\n{why:?}"); - } - } - } - } - - async fn ready(&self, ctx: Context, ready: Ready) { - info!("Connected as {}!", ready.user.name); - Handler::invite_link(&ctx).await; - - if let Err(why) = self.register_commands(&ctx).await { - error!("Couldn't register commands!\n{why:?}"); - }; - } -} |
