mirror of
https://github.com/Noratrieb/discord-court-bot.git
synced 2026-01-16 10:55:01 +01:00
thing
This commit is contained in:
parent
886c97a4c7
commit
d6ed409c9b
7 changed files with 746 additions and 8 deletions
185
src/handler.rs
Normal file
185
src/handler.rs
Normal file
|
|
@ -0,0 +1,185 @@
|
|||
use serenity::{async_trait, framework::standard::Command, model::prelude::*, prelude::*};
|
||||
use tracing::debug;
|
||||
|
||||
pub struct Handler {
|
||||
pub dev_guild_id: Option<GuildId>,
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl EventHandler for Handler {
|
||||
async fn ready(&self, ctx: Context, ready: Ready) {
|
||||
println!("{} is connected!", ready.user.name);
|
||||
|
||||
if let Some(guild_id) = self.dev_guild_id {
|
||||
let commands = GuildId::set_application_commands(&guild_id, &ctx.http, |commands| {
|
||||
commands
|
||||
.create_application_command(|command| {
|
||||
command.name("ping").description("A ping command")
|
||||
})
|
||||
.create_application_command(|command| {
|
||||
command.name("id").description("Get a user id").create_option(|option| {
|
||||
option
|
||||
.name("id")
|
||||
.description("The user to lookup")
|
||||
.kind(CommandOptionType::User)
|
||||
.required(true)
|
||||
})
|
||||
})
|
||||
.create_application_command(|command| {
|
||||
command
|
||||
.name("welcome")
|
||||
.name_localized("de", "begrüßen")
|
||||
.description("Welcome a user")
|
||||
.description_localized("de", "Einen Nutzer begrüßen")
|
||||
.create_option(|option| {
|
||||
option
|
||||
.name("user")
|
||||
.name_localized("de", "nutzer")
|
||||
.description("The user to welcome")
|
||||
.description_localized("de", "Der zu begrüßende Nutzer")
|
||||
.kind(CommandOptionType::User)
|
||||
.required(true)
|
||||
})
|
||||
.create_option(|option| {
|
||||
option
|
||||
.name("message")
|
||||
.name_localized("de", "nachricht")
|
||||
.description("The message to send")
|
||||
.description_localized("de", "Die versendete Nachricht")
|
||||
.kind(CommandOptionType::String)
|
||||
.required(true)
|
||||
.add_string_choice_localized(
|
||||
"Welcome to our cool server! Ask me if you need help",
|
||||
"pizza",
|
||||
[("de", "Willkommen auf unserem coolen Server! Frag mich, falls du Hilfe brauchst")]
|
||||
)
|
||||
.add_string_choice_localized(
|
||||
"Hey, do you want a coffee?",
|
||||
"coffee",
|
||||
[("de", "Hey, willst du einen Kaffee?")],
|
||||
)
|
||||
.add_string_choice_localized(
|
||||
"Welcome to the club, you're now a good person. Well, I hope.",
|
||||
"club",
|
||||
[("de", "Willkommen im Club, du bist jetzt ein guter Mensch. Naja, hoffentlich.")],
|
||||
)
|
||||
.add_string_choice_localized(
|
||||
"I hope that you brought a controller to play together!",
|
||||
"game",
|
||||
[("de", "Ich hoffe du hast einen Controller zum Spielen mitgebracht!")],
|
||||
)
|
||||
})
|
||||
})
|
||||
.create_application_command(|command| {
|
||||
command
|
||||
.name("numberinput")
|
||||
.description("Test command for number input")
|
||||
.create_option(|option| {
|
||||
option
|
||||
.name("int")
|
||||
.description("An integer from 5 to 10")
|
||||
.kind(CommandOptionType::Integer)
|
||||
.min_int_value(5)
|
||||
.max_int_value(10)
|
||||
.required(true)
|
||||
})
|
||||
.create_option(|option| {
|
||||
option
|
||||
.name("number")
|
||||
.description("A float from -3.3 to 234.5")
|
||||
.kind(CommandOptionType::Number)
|
||||
.min_number_value(-3.3)
|
||||
.max_number_value(234.5)
|
||||
.required(true)
|
||||
})
|
||||
})
|
||||
.create_application_command(|command| {
|
||||
command
|
||||
.name("attachmentinput")
|
||||
.description("Test command for attachment input")
|
||||
.create_option(|option| {
|
||||
option
|
||||
.name("attachment")
|
||||
.description("A file")
|
||||
.kind(CommandOptionType::Attachment)
|
||||
.required(true)
|
||||
})
|
||||
})
|
||||
})
|
||||
.await;
|
||||
|
||||
debug!(?commands, "I now have the following guild slash commands",);
|
||||
}
|
||||
|
||||
/*
|
||||
let guild_command = Command::create_global_application_command(&ctx.http, |command| {
|
||||
command
|
||||
.name("wonderful_command")
|
||||
.description("An amazing command")
|
||||
})
|
||||
.await;
|
||||
*/
|
||||
|
||||
println!(
|
||||
"I created the following global slash command: {:#?}",
|
||||
guild_command
|
||||
);
|
||||
}
|
||||
|
||||
async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
|
||||
if let Interaction::ApplicationCommand(command) = interaction {
|
||||
println!("Received command interaction: {:#?}", command);
|
||||
|
||||
let content = match command.data.name.as_str() {
|
||||
"ping" => "Hey, I'm alive!".to_string(),
|
||||
"id" => {
|
||||
let options = command
|
||||
.data
|
||||
.options
|
||||
.get(0)
|
||||
.expect("Expected user option")
|
||||
.resolved
|
||||
.as_ref()
|
||||
.expect("Expected user object");
|
||||
|
||||
if let CommandDataOptionValue::User(user, _member) = options {
|
||||
format!("{}'s id is {}", user.tag(), user.id)
|
||||
} else {
|
||||
"Please provide a valid user".to_string()
|
||||
}
|
||||
}
|
||||
"attachmentinput" => {
|
||||
let options = command
|
||||
.data
|
||||
.options
|
||||
.get(0)
|
||||
.expect("Expected attachment option")
|
||||
.resolved
|
||||
.as_ref()
|
||||
.expect("Expected attachment object");
|
||||
|
||||
if let CommandDataOptionValue::Attachment(attachment) = options {
|
||||
format!(
|
||||
"Attachment name: {}, attachment size: {}",
|
||||
attachment.filename, attachment.size
|
||||
)
|
||||
} else {
|
||||
"Please provide a valid attachment".to_string()
|
||||
}
|
||||
}
|
||||
_ => "not implemented :(".to_string(),
|
||||
};
|
||||
|
||||
if let Err(why) = command
|
||||
.create_interaction_response(&ctx.http, |response| {
|
||||
response
|
||||
.kind(InteractionResponseType::ChannelMessageWithSource)
|
||||
.interaction_response_data(|message| message.content(content))
|
||||
})
|
||||
.await
|
||||
{
|
||||
println!("Cannot respond to slash command: {}", why);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
34
src/main.rs
34
src/main.rs
|
|
@ -1,3 +1,33 @@
|
|||
fn main() {
|
||||
println!("Hello, world!");
|
||||
mod handler;
|
||||
|
||||
use std::env;
|
||||
|
||||
use color_eyre::{eyre::WrapErr, Result};
|
||||
use serenity::{model::prelude::*, prelude::*};
|
||||
|
||||
use crate::handler::Handler;
|
||||
|
||||
#[tokio::main]
|
||||
fn main() -> Result<()> {
|
||||
color_eyre::install()?;
|
||||
|
||||
let _ = dotenv::dotenv();
|
||||
|
||||
let token = env::var("DISCORD_TOKEN").wrap_err("DISCORD_TOKEN not found in environment")?;
|
||||
let guild_id = if let Ok(_) = env::var("DEV") {
|
||||
SOme( GuildId(
|
||||
env::var("GUILD_ID")
|
||||
.wrap_err("GUILD_ID not found in environment, must be set when DEV is set")?
|
||||
.parse()
|
||||
.wrap_err("GUILD_ID must be an integer")?,
|
||||
))
|
||||
})
|
||||
} else {None};
|
||||
|
||||
let mut client = Client::builder(token, GatewayIntents::empty())
|
||||
.event_handler(Handler { dev_guild_id })
|
||||
.await
|
||||
.wrap_err("failed to create discord client")?;
|
||||
|
||||
client.start().await.wrap_err("running client")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue