From 162a1420dbc74a90b1f41f28cee99945e9af19e0 Mon Sep 17 00:00:00 2001 From: DJMrTV Date: Sat, 15 Feb 2025 01:44:17 +0100 Subject: [PATCH] feat(emergency-report): add emergency report --- Cargo.toml | 1 - src/emergency_report.rs | 78 +++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/emergency_report.rs diff --git a/Cargo.toml b/Cargo.toml index c8f7a5e..14abdcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,6 @@ debug = "none" debug-assertions = false strip = true panic = "abort" -lto="fat" diff --git a/src/emergency_report.rs b/src/emergency_report.rs new file mode 100644 index 0000000..208716c --- /dev/null +++ b/src/emergency_report.rs @@ -0,0 +1,78 @@ +use serenity::all::{ChannelId, Colour, Command, CommandId, Context, CreateCommand, CreateEmbed, CreateEmbedAuthor, CreateInputText, CreateInteractionResponse, CreateInteractionResponseFollowup, CreateInteractionResponseMessage, CreateMessage, CreateQuickModal, EventHandler, InputTextStyle, Interaction, Message, Ready, Timestamp}; +use serenity::all::Change::Color; +use serenity::async_trait; +use tokio::sync::OnceCell; + +#[derive(Default)] +pub struct EmergencyReportHandler{ + command_id: OnceCell +} + +#[async_trait] +impl EventHandler for EmergencyReportHandler { + async fn ready(&self, ctx: Context, data_about_bot: Ready) { + let command = CreateCommand::new("emergency-report") + .description("Report an emergency (e.g. server down) ONLY if its happening for everyone not if its just for you."); + + let cmd = Command::create_global_command(&ctx.http, command).await.expect("unable to register command"); + + self.command_id.set(cmd.id).ok(); + } + + async fn interaction_create(&self, ctx: Context, interaction: Interaction) { + let Interaction::Command(cmd) = interaction else { + return; + }; + + let Some(id) = self.command_id.get() else { + return; + }; + + if cmd.data.id != *id{ + return; + } + + let main_field = CreateInputText::new( + InputTextStyle::Paragraph, + "What is happening", + "MAIN_CONTENT" + ).required(true).min_length(10); + + let modal = CreateQuickModal::new("Emergency Report Form") + .field(main_field); + + let response = match cmd.quick_modal(&ctx, modal).await{ + Ok(v) => v, + Err(e) => { eprintln!("{}", e); return } + }; + + let Some(response) = response else { + return + }; + + response.interaction.create_response(&ctx.http, CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .ephemeral(true) + .content("report has been sent to the admins") + )).await.ok(); + + let text = &response.inputs[0]; + + let emergency_channel = ChannelId::new(1286724627413864562); + + let mut author = CreateEmbedAuthor::from(response.interaction.user); + + let embed = CreateEmbed::new() + .title("AN EMERGENCY HAS BEEN REPORTED") + .description(text) + .timestamp(Timestamp::now()) + .author(author) + .color(Colour::RED); + + let message = CreateMessage::new() + .content("@everyone") + .add_embed(embed); + + emergency_channel.send_message(&ctx.http, message).await.ok(); + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f7955a9..c0638e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod cheeseburger; mod ayy; mod miiverse_mod_application; mod too_fat; +mod emergency_report; use std::env; use once_cell::sync::Lazy; @@ -28,6 +29,7 @@ async fn main() { .event_handler(ayy::AyyHandler) .event_handler(cheeseburger::CheeseburgerHandler) .event_handler(too_fat::TooFatHandler) + .event_handler(emergency_report::EmergencyReportHandler::default()) //.event_handler(miiverse_mod_application::MiiverseModApplicationHandler::default()) .await.expect("unable to create client");