From 6f2b15493d04704ab3d3000ffb5126bde7fed434 Mon Sep 17 00:00:00 2001 From: Maxime Leriche Date: Mon, 22 Jan 2024 21:33:46 +0000 Subject: [PATCH] feat: include ping and help --- .vscode/extensions.json | 3 ++- Cargo.lock | 12 ++++++++++++ Cargo.toml | 1 + resources/config.toml | 3 +++ resources/test_config.toml | 5 ++++- src/bot/cmd/help.rs | 27 +++++++++++++++++++++++++++ src/bot/cmd/mod.rs | 2 ++ src/bot/cmd/ping.rs | 14 ++++++++++++++ src/bot/handler.rs | 2 +- src/bot/init.rs | 30 +++++++++++++++++++++++++++--- src/bot/mod.rs | 1 + src/config.rs | 11 +++++++++++ src/main.rs | 2 +- 13 files changed, 106 insertions(+), 7 deletions(-) create mode 100644 src/bot/cmd/help.rs create mode 100644 src/bot/cmd/mod.rs create mode 100644 src/bot/cmd/ping.rs diff --git a/.vscode/extensions.json b/.vscode/extensions.json index a81896e..632665f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -12,6 +12,7 @@ "helixquar.randomeverything", "shardulm94.trailing-spaces", "tamasfe.even-better-toml", - "edwinkofler.vscode-hyperupcall-pack-markdown" + "edwinkofler.vscode-hyperupcall-pack-markdown", + "proxzima.sweetdracula" ] } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 7ab53dc..4e41041 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -570,6 +570,7 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", + "serde", ] [[package]] @@ -846,6 +847,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1858,8 +1868,10 @@ dependencies = [ "bitflags 2.4.1", "bytes", "command_attr", + "dashmap", "flate2", "futures", + "fxhash", "levenshtein", "mime_guess", "parking_lot", diff --git a/Cargo.toml b/Cargo.toml index 8876b1a..37926ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ serenity = { version = "0.12", default-features = false, features = [ "model", "framework", "standard_framework", + "cache", ] } tokio = { version = "1.35", features = ["macros", "rt-multi-thread"] } diff --git a/resources/config.toml b/resources/config.toml index bc097f9..665b2fb 100644 --- a/resources/config.toml +++ b/resources/config.toml @@ -12,3 +12,6 @@ password = "postgres" database = "postgres" tls = false tls_insecure = false + +[image] +path = "/projects/base-image" diff --git a/resources/test_config.toml b/resources/test_config.toml index 143519f..659e21e 100644 --- a/resources/test_config.toml +++ b/resources/test_config.toml @@ -2,7 +2,7 @@ bot_name = "AGAU_DEV" env = "test" port = 5437 token = "" -prefix= "&" +prefix = "&" [persistence] host = "localhost" @@ -12,3 +12,6 @@ password = "1OLlRZo1tnNluvx" database = "1pNkVsX3FgFeiQdga" tls = false tls_insecure = false + +[image] +path = "/projects/base-image" diff --git a/src/bot/cmd/help.rs b/src/bot/cmd/help.rs new file mode 100644 index 0000000..98d2153 --- /dev/null +++ b/src/bot/cmd/help.rs @@ -0,0 +1,27 @@ +use serenity::client::Context; +use serenity::framework::standard::macros::help; +use serenity::framework::standard::{ + help_commands, Args, CommandGroup, CommandResult, HelpOptions, +}; +use serenity::model::prelude::{Message, UserId}; +use std::collections::HashSet; +#[help] +#[individual_command_tip = "Hello! Pour plus d'information sur une commande, passer la en argument."] +#[command_not_found_text = "La commande `{}` n'a pas été trouver."] +#[max_levenshtein_distance(3)] +#[wrong_channel = "Strike"] +#[lacking_role = "Hide"] +#[lacking_permissions = "Hide"] +#[strikethrough_commands_tip_in_guild("")] +#[embed_success_colour = "#5F021F"] +async fn help( + context: &Context, + msg: &Message, + args: Args, + help_options: &'static HelpOptions, + groups: &[&'static CommandGroup], + owners: HashSet, +) -> CommandResult { + let _ = help_commands::with_embeds(context, msg, args, help_options, groups, owners).await; + Ok(()) +} diff --git a/src/bot/cmd/mod.rs b/src/bot/cmd/mod.rs new file mode 100644 index 0000000..11709c0 --- /dev/null +++ b/src/bot/cmd/mod.rs @@ -0,0 +1,2 @@ +pub mod help; +pub mod ping; diff --git a/src/bot/cmd/ping.rs b/src/bot/cmd/ping.rs new file mode 100644 index 0000000..5cd1de2 --- /dev/null +++ b/src/bot/cmd/ping.rs @@ -0,0 +1,14 @@ +use serenity::{ + all::Message, + client::Context, + framework::standard::{macros::command, CommandResult}, +}; + +#[command] +#[description = "Pong!"] +pub async fn ping(ctx: &Context, msg: &Message) -> CommandResult { + if let Err(why) = msg.channel_id.say(&ctx.http, "Pong from framework!").await { + println!("Error sending message: {:?}", why) + } + Ok(()) +} diff --git a/src/bot/handler.rs b/src/bot/handler.rs index 8453d69..9489485 100644 --- a/src/bot/handler.rs +++ b/src/bot/handler.rs @@ -12,7 +12,7 @@ impl EventHandler for Handler { if msg.author.bot { return; } - if msg.content == "!ping" { + if msg.content == "&ping" { if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { println!("Error sending message: {:?}", why); } diff --git a/src/bot/init.rs b/src/bot/init.rs index d08075d..fc6cce9 100644 --- a/src/bot/init.rs +++ b/src/bot/init.rs @@ -1,9 +1,20 @@ +use super::cmd::{help::HELP, ping::PING_COMMAND}; use super::handler::Handler; use crate::config::Config; -use serenity::{all::GatewayIntents, http::Http, Client}; +use serenity::framework::standard::Configuration; +use serenity::{ + all::GatewayIntents, + framework::{standard::macros::group, StandardFramework}, + http::Http, + Client, +}; use std::collections::HashSet; use tokio::task::spawn_blocking; +#[group] +#[commands(ping)] +struct General; + pub fn start_bot(config: Config) { if config.token != "" { spawn_blocking(move || { @@ -17,9 +28,11 @@ pub fn start_bot(config: Config) { | GatewayIntents::MESSAGE_CONTENT | GatewayIntents::GUILD_VOICE_STATES | GatewayIntents::GUILDS - | GatewayIntents::GUILD_MEMBERS; + | GatewayIntents::GUILD_MEMBERS + | GatewayIntents::GUILD_PRESENCES + | GatewayIntents::GUILD_MESSAGE_REACTIONS; let http = Http::new(&config.token); - let (_owners, _bot_id) = match http.get_current_application_info().await { + let (owners, _bot_id) = match http.get_current_application_info().await { Ok(info) => { let mut owners = HashSet::new(); match info.owner { @@ -34,8 +47,19 @@ pub fn start_bot(config: Config) { } Err(why) => panic!("Could not access application info: {:?}", why), }; + + let framework = StandardFramework::new().help(&HELP).group(&GENERAL_GROUP); + + framework.configure( + Configuration::new() + .with_whitespace(true) + .prefix(config.prefix) + .owners(owners), + ); + let mut client = Client::builder(&config.token, intents) .event_handler(Handler) + .framework(framework) .await .expect("Err creating client"); if let Err(why) = client.start().await { diff --git a/src/bot/mod.rs b/src/bot/mod.rs index abbb294..15832b0 100644 --- a/src/bot/mod.rs +++ b/src/bot/mod.rs @@ -1,2 +1,3 @@ +pub mod cmd; pub mod handler; pub mod init; diff --git a/src/config.rs b/src/config.rs index 664edf7..5d3dee6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -16,6 +16,8 @@ const BOT_NAME: &str = "BOT_NAME"; const BOT_TOKEN: &str = "BOT_TOKEN"; const BOT_PREFIX: &str = "BOT_PREFIX"; +const IMAGE_PATH: &str = "IMAGE_PATH"; + const RUST_ENV: &str = "RUST_ENV"; const PORT: &str = "PORT"; @@ -28,6 +30,12 @@ pub struct Config { pub port: u16, pub token: String, pub prefix: String, + pub image: ImageConfig, +} + +#[derive(Deserialize, Clone)] +pub struct ImageConfig { + pub path: String, } #[derive(Deserialize, Clone)] @@ -108,6 +116,9 @@ fn override_config_with_env_vars(config: Config) -> Config { .ok() .or(pers.tls_insecure), }, + image: ImageConfig { + path: env::var(IMAGE_PATH).unwrap_or(config.image.path), + }, } } diff --git a/src/main.rs b/src/main.rs index e100a47..815928b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ use actix_web::{App, HttpServer}; use bot::init::start_bot; use config::parse_local_config; -#[actix_web::main] // or #[tokio::main] +#[tokio::main] // or #[actix_web::main] async fn main() -> std::io::Result<()> { let config = parse_local_config(); let port = config.port;