From 268fcab8c59ab9aae30d32e5dc24fae32387dd91 Mon Sep 17 00:00:00 2001 From: jellywx Date: Mon, 30 Nov 2020 16:06:05 +0000 Subject: [PATCH] help command rework started --- Cargo.lock | 7 --- Cargo.toml | 1 - src/commands/info_cmds.rs | 119 +++++++++++++++++++++++++++++++------- src/consts.rs | 28 ++++++++- 4 files changed, 125 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e058d8..e96eda0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -292,12 +292,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "custom_error" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ac5e99a7fea3ee8a03fa4721a47e2efd3fbb38358fc61192a54d4c6f866c12" - [[package]] name = "digest" version = "0.9.0" @@ -1348,7 +1342,6 @@ dependencies = [ "async-trait", "chrono", "chrono-tz", - "custom_error", "dotenv", "env_logger", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 2155169..8f80187 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,6 @@ chrono-tz = "0.5" lazy_static = "1.4" num-integer = "0.1" num-traits = "0.2" -custom_error = "1.7" serde = "1.0" serde_json = "1.0" rand = "0.7" diff --git a/src/commands/info_cmds.rs b/src/commands/info_cmds.rs index a089a4f..73454fd 100644 --- a/src/commands/info_cmds.rs +++ b/src/commands/info_cmds.rs @@ -5,12 +5,15 @@ use serenity::{client::Context, model::channel::Message}; use chrono::offset::Utc; use crate::{ - consts::DEFAULT_PREFIX, + consts::{DEFAULT_PREFIX, HELP_STRINGS}, + language_manager::LanguageManager, models::{GuildData, UserData}, SQLPool, THEME_COLOR, }; -use crate::language_manager::LanguageManager; +use levenshtein::levenshtein; + +use inflector::Inflector; use std::time::{SystemTime, UNIX_EPOCH}; #[command] @@ -31,7 +34,66 @@ async fn ping(ctx: &Context, msg: &Message, _args: String) { #[command] #[can_blacklist(false)] -async fn help(ctx: &Context, msg: &Message, _args: String) { +async fn help(ctx: &Context, msg: &Message, args: String) { + async fn default_help( + ctx: &Context, + msg: &Message, + lm: &LanguageManager, + prefix: &str, + language: &str, + ) { + let desc = lm.get(language, "help/desc").replace("{prefix}", prefix); + + let _ = msg + .channel_id + .send_message(ctx, |m| { + m.embed(move |e| { + e.title("Help Menu") + .description(desc) + .field( + lm.get(language, "help/setup_title"), + "`lang` `timezone`", + true, + ) + .field( + lm.get(language, "help/mod_title"), + "`prefix` `blacklist` `restrict` `alias`", + true, + ) + .field( + lm.get(language, "help/reminder_title"), + "`remind` `interval` `natural` `look`", + true, + ) + .field( + lm.get(language, "help/reminder_mod_title"), + "`del` `offset` `pause` `nudge`", + true, + ) + .field( + lm.get(language, "help/info_title"), + "`help` `info` `donate` `clock`", + true, + ) + .field( + lm.get(language, "help/todo_title"), + "`todo` `todos` `todoc`", + true, + ) + .field(lm.get(language, "help/other_title"), "`timer`", true) + .footer(|f| { + f.text(concat!( + env!("CARGO_PKG_NAME"), + " ver ", + env!("CARGO_PKG_VERSION") + )) + }) + .color(*THEME_COLOR) + }) + }) + .await; + } + let data = ctx.data.read().await; let pool = data @@ -42,26 +104,43 @@ async fn help(ctx: &Context, msg: &Message, _args: String) { let lm = data.get::().unwrap(); let language = UserData::language_of(&msg.author, &pool).await; + let prefix = GuildData::prefix_from_id(msg.guild_id, &pool).await; - let desc = lm.get(&language, "help"); + if !args.is_empty() { + let closest_match = HELP_STRINGS + .iter() + .map(|h| (levenshtein(h.split_at(5).1, &args), h)) + .filter(|(dist, _)| dist < &3) + .min_by(|(dist_a, _), (dist_b, _)| dist_a.cmp(dist_b)) + .map(|(_, string)| string); - let _ = msg - .channel_id - .send_message(ctx, |m| { - m.embed(move |e| { - e.title("Help Menu") - .description(desc) - .footer(|f| { - f.text(concat!( - env!("CARGO_PKG_NAME"), - " ver ", - env!("CARGO_PKG_VERSION") - )) + if let Some(help_str) = closest_match { + let desc = lm.get(&language, help_str); + let command_name = help_str.split_at(5).1; + + let _ = msg + .channel_id + .send_message(ctx, |m| { + m.embed(move |e| { + e.title(format!("{} Help", command_name.to_title_case())) + .description(desc.replace("{prefix}", &prefix)) + .footer(|f| { + f.text(concat!( + env!("CARGO_PKG_NAME"), + " ver ", + env!("CARGO_PKG_VERSION") + )) + }) + .color(*THEME_COLOR) }) - .color(*THEME_COLOR) - }) - }) - .await; + }) + .await; + } else { + default_help(ctx, msg, lm, &prefix, &language).await; + } + } else { + default_help(ctx, msg, lm, &prefix, &language).await; + } } #[command] diff --git a/src/consts.rs b/src/consts.rs index 7b8c5f1..b257754 100644 --- a/src/consts.rs +++ b/src/consts.rs @@ -1,6 +1,29 @@ pub const DAY: u64 = 86_400; pub const HOUR: u64 = 3_600; pub const MINUTE: u64 = 60; +pub const HELP_STRINGS: [&'static str; 21] = [ + "help/lang", + "help/timezone", + "help/prefix", + "help/blacklist", + "help/restrict", + "help/alias", + "help/remind", + "help/interval", + "help/natural", + "help/look", + "help/del", + "help/offset", + "help/pause", + "help/nudge", + "help/info", + "help/help", + "help/donate", + "help/clock", + "help/todo", + "help/todos", + "help/todoc", +]; pub const CHARACTERS: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; @@ -26,11 +49,11 @@ lazy_static! { pub static ref REGEX_REMIND_COMMAND: Regex = Regex::new( r#"(?P(?:<@\d+>\s|<@!\d+>\s|<#\d+>\s)*)(?P