From 5230101a8d956fad1bcace8c1e49e3bd2d6d1ec6 Mon Sep 17 00:00:00 2001 From: jellywx Date: Sat, 13 Nov 2021 14:12:37 +0000 Subject: [PATCH] beta0 --- Cargo.lock | 70 +++++++++++++++---------------- Cargo.toml | 2 +- README.md | 1 - src/commands/info_cmds.rs | 44 ++++++++++++++++++- src/commands/reminder_cmds.rs | 79 +++++++++++++++++++++++------------ src/main.rs | 29 +++++++------ 6 files changed, 148 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78dea7a..9156770 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,9 +139,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cc" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" [[package]] name = "cfg-if" @@ -201,9 +201,9 @@ dependencies = [ [[package]] name = "crc" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c2722795460108a7872e1cd933a85d6ec38abc4baecad51028f702da28889f" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" dependencies = [ "crc-catalog", ] @@ -705,9 +705,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.105" +version = "0.2.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" +checksum = "fbe5e23404da5b4f555ef85ebed98fb4083e55a00c317800bc2a50ede9f3d219" [[package]] name = "libm" @@ -763,9 +763,9 @@ dependencies = [ [[package]] name = "minimal-lexical" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c64630dcdd71f1a64c435f54885086a0de5d6a12d104d69b165fb7d5286d677" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" @@ -819,9 +819,9 @@ dependencies = [ [[package]] name = "nom" -version = "7.0.0" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffd9d26838a953b4af82cbeb9f1592c6798916983959be223a7124e992742c1" +checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" dependencies = [ "memchr", "minimal-lexical", @@ -850,9 +850,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74e768dff5fb39a41b3bcd30bb25cf989706c90d028d1ad71971987aa309d535" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" dependencies = [ "autocfg 1.0.1", "num-integer", @@ -932,9 +932,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.36" +version = "0.10.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" dependencies = [ "bitflags", "cfg-if", @@ -952,9 +952,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.67" +version = "0.9.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69df2d8dfc6ce3aaf44b40dec6f487d5a886516cf6879c49e98e0710f310a058" +checksum = "c6517987b3f8226b5da3661dad65ff7f300cc59fb5ea8333ca191fc65fde3edf" dependencies = [ "autocfg 1.0.1", "cc", @@ -1187,7 +1187,7 @@ dependencies = [ [[package]] name = "reminder_rs" -version = "1.5.1" +version = "1.6.0-beta0" dependencies = [ "base64", "chrono", @@ -1407,9 +1407,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" dependencies = [ "itoa", "ryu", @@ -1442,7 +1442,7 @@ dependencies = [ [[package]] name = "serenity" version = "0.10.9" -source = "git+https://github.com/serenity-rs/serenity?branch=next#d1f944b0729a83d60925ce49b7d83eeaed83bd73" +source = "git+https://github.com/serenity-rs/serenity?branch=next#8d331b33171739ccecdc902faeefbcc7d32aa0eb" dependencies = [ "async-trait", "async-tungstenite", @@ -1508,7 +1508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80" dependencies = [ "chrono", - "num-bigint 0.4.2", + "num-bigint 0.4.3", "num-traits", "thiserror", ] @@ -1739,9 +1739,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" dependencies = [ "tinyvec_macros", ] @@ -1754,9 +1754,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +checksum = "588b2d10a336da58d877567cd8fb8a14b463e2104910f8132cd054b4b96e29ee" dependencies = [ "autocfg 1.0.1", "bytes", @@ -1774,9 +1774,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dd85aeaba7b68df939bd357c6afb36c87951be9e80bf9c859f2fc3e9fca0fd" +checksum = "114383b041aa6212c579467afa0075fbbdd0718de036100bc0ba7961d8cb9095" dependencies = [ "proc-macro2", "quote", @@ -1806,9 +1806,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" dependencies = [ "futures-core", "pin-project-lite", @@ -1817,9 +1817,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" dependencies = [ "bytes", "futures-core", @@ -2114,9 +2114,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.1.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483a59fee1a93fec90eb08bc2eb4315ef10f4ebc478b3a5fadc969819cb66117" +checksum = "c33ac5ee236a4efbf2c98967e12c6cc0c51d93a744159a52957ba206ae6ef5f7" dependencies = [ "wasm-bindgen", "web-sys", @@ -2173,9 +2173,9 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7" +checksum = "65f1a51723ec88c66d5d1fe80c841f17f63587d6691901d66be9bec6c3b51f73" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 804d720..eefe802 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "reminder_rs" -version = "1.5.1" +version = "1.6.0-beta0" authors = ["jellywx "] edition = "2018" diff --git a/README.md b/README.md index 2eb20a2..bb8e49e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,6 @@ __Other Variables__ * `IGNORE_BOTS` - default `1`, if `1`, Reminder Bot will ignore all other bots * `PYTHON_LOCATION` - default `venv/bin/python3`. Can be changed if your Python executable is located somewhere else * `THEME_COLOR` - default `8fb677`. Specifies the hex value of the color to use on info message embeds -* `CASE_INSENSITIVE` - default `1`, if `1`, commands will be treated with case insensitivity (so both `$help` and `$HELP` will work) * `SHARD_COUNT` - default `None`, accepts the number of shards that are being ran * `SHARD_RANGE` - default `None`, if `SHARD_COUNT` is specified, specifies what range of shards to start on this process * `DM_ENABLED` - default `1`, if `1`, Reminder Bot will respond to direct messages diff --git a/src/commands/info_cmds.rs b/src/commands/info_cmds.rs index d3ad491..f6232f5 100644 --- a/src/commands/info_cmds.rs +++ b/src/commands/info_cmds.rs @@ -22,10 +22,52 @@ fn footer(ctx: &Context) -> impl FnOnce(&mut CreateEmbedFooter) -> &mut CreateEm } } +#[command] +#[description("Get an overview of the bot commands")] +async fn help(ctx: &Context, invoke: &mut CommandInvoke) { + let footer = footer(ctx); + + let _ = invoke + .respond( + &ctx, + CreateGenericResponse::new().embed(|e| { + e.title("Help") + .color(*THEME_COLOR) + .description( + "__Info Commands__ +`/help` `/info` `/donate` `/dashboard` `/clock` +*run these commands with no options* + +__Reminder Commands__ +`/remind` - Create a new reminder that will send a message at a certain time +`/timer` - Start a timer from now, that will count time passed. Also used to view and remove timers + +__Reminder Management__ +`/del` - Delete reminders +`/look` - View reminders +`/pause` - Pause all reminders on the channel +`/offset` - Move all reminders by a certain time +`/nudge` - Move all new reminders on this channel by a certain time + +__Todo Commands__ +`/todo` - Add, view and manage the server, channel or user todo lists + +__Setup Commands__ +`/timezone` - Set your timezone (necessary for `/remind` to work properly) + +__Advanced Commands__ +`/macro` - Record and replay command sequences + ", + ) + .footer(footer) + }), + ) + .await; +} + #[command] #[aliases("invite")] #[description("Get information about the bot")] -#[group("Info")] async fn info(ctx: &Context, invoke: &mut CommandInvoke) { let footer = footer(ctx); diff --git a/src/commands/reminder_cmds.rs b/src/commands/reminder_cmds.rs index 94c3d26..30475ae 100644 --- a/src/commands/reminder_cmds.rs +++ b/src/commands/reminder_cmds.rs @@ -11,7 +11,7 @@ use regex_command_attr::command; use serenity::{builder::CreateEmbed, client::Context, model::channel::Channel}; use crate::{ - check_subscription, + check_guild_subscription, check_subscription, component_models::{ pager::{DelPager, LookPager, Pager}, ComponentDataModel, DelSelector, @@ -164,7 +164,7 @@ async fn offset(ctx: &Context, invoke: &mut CommandInvoke, args: CommandOptions) UPDATE reminders INNER JOIN `channels` ON `channels`.id = reminders.channel_id -SET reminders.`utc_time` = reminders.`utc_time` + ? +SET reminders.`utc_time` = DATE_ADD(reminders.`utc_time`, INTERVAL ? SECOND) WHERE FIND_IN_SET(channels.`channel`, ?)", combined_time, channels @@ -647,7 +647,7 @@ DELETE FROM timers WHERE owner = ? AND name = ? required = false )] #[arg( - name = "repeat", + name = "interval", description = "(Patreon only) Time to wait before repeating the reminder. Leave blank for one-shot reminder", kind = "String", required = false @@ -666,11 +666,11 @@ DELETE FROM timers WHERE owner = ? AND name = ? )] #[hook(CHECK_GUILD_PERMISSIONS_HOOK)] async fn remind(ctx: &Context, invoke: &mut CommandInvoke, args: CommandOptions) { - if args.get("repeat").is_none() && args.get("expires").is_some() { + if args.get("interval").is_none() && args.get("expires").is_some() { let _ = invoke .respond( &ctx, - CreateGenericResponse::new().content("`expires` can only be used with `repeat`"), + CreateGenericResponse::new().content("`expires` can only be used with `interval`"), ) .await; @@ -704,14 +704,21 @@ async fn remind(ctx: &Context, invoke: &mut CommandInvoke, args: CommandOptions) .unwrap_or_default(); if list.is_empty() { - vec![ReminderScope::Channel(invoke.channel_id().0)] + if invoke.guild_id().is_some() { + vec![ReminderScope::Channel(invoke.channel_id().0)] + } else { + vec![ReminderScope::User(invoke.author_id().0)] + } } else { list } }; - let (interval, expires) = if let Some(repeat) = args.get("repeat") { - if check_subscription(&ctx, invoke.author_id()).await { + let (interval, expires) = if let Some(repeat) = args.get("interval") { + if check_subscription(&ctx, invoke.author_id()).await + || (invoke.guild_id().is_some() + && check_guild_subscription(&ctx, invoke.guild_id().unwrap()).await) + { ( humantime::parse_duration(&repeat.to_string()) .or_else(|_| { @@ -739,28 +746,48 @@ async fn remind(ctx: &Context, invoke: &mut CommandInvoke, args: CommandOptions) (None, None) }; - let mut builder = MultiReminderBuilder::new(ctx, invoke.guild_id()) - .author(user_data) - .content(content) - .time(time) - .expires(expires) - .interval(interval); + if interval.is_none() && args.get("interval").is_some() { + let _ = invoke + .respond( + &ctx, + CreateGenericResponse::new().content( + "Repeat interval could not be processed. Try and format the repetition similar to `1 hour` or `4 days`", + ), + ) + .await; + } else if expires.is_none() && args.get("expires").is_some() { + let _ = invoke + .respond( + &ctx, + CreateGenericResponse::new().content( + "Expiry time failed to process. Please make it as clear as possible", + ), + ) + .await; + } else { + let mut builder = MultiReminderBuilder::new(ctx, invoke.guild_id()) + .author(user_data) + .content(content) + .time(time) + .expires(expires) + .interval(interval); - builder.set_scopes(scopes); + builder.set_scopes(scopes); - let (errors, successes) = builder.build().await; + let (errors, successes) = builder.build().await; - let embed = create_response(successes, errors, time); + let embed = create_response(successes, errors, time); - let _ = invoke - .respond( - &ctx, - CreateGenericResponse::new().embed(|c| { - *c = embed; - c - }), - ) - .await; + let _ = invoke + .respond( + &ctx, + CreateGenericResponse::new().embed(|c| { + *c = embed; + c + }), + ) + .await; + } } None => { let _ = invoke diff --git a/src/main.rs b/src/main.rs index 57329e9..2a23a58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,18 +68,6 @@ struct Handler; #[async_trait] impl EventHandler for Handler { - async fn cache_ready(&self, ctx: Context, _: Vec) { - let framework = ctx - .data - .read() - .await - .get::() - .cloned() - .expect("RegexFramework not found in context"); - - framework.build_slash(ctx).await; - } - async fn channel_delete(&self, ctx: Context, channel: &GuildChannel) { let pool = ctx .data @@ -210,7 +198,7 @@ async fn main() -> Result<(), Box> { })) .dm_enabled(dm_enabled) // info commands - //.add_command("help", &info_cmds::HELP_COMMAND) + .add_command(&info_cmds::HELP_COMMAND) .add_command(&info_cmds::INFO_COMMAND) .add_command(&info_cmds::DONATE_COMMAND) .add_command(&info_cmds::DASHBOARD_COMMAND) @@ -267,6 +255,8 @@ async fn main() -> Result<(), Box> { data.insert::(Arc::new(RwLock::new(HashMap::new()))); } + framework_arc.build_slash(&client.cache_and_http.http).await; + if let Ok((Some(lower), Some(upper))) = env::var("SHARD_RANGE").map(|sr| { let mut split = sr.split(',').map(|val| val.parse::().expect("SHARD_RANGE not an integer")); @@ -316,3 +306,16 @@ pub async fn check_subscription(cache_http: impl CacheHttp, user_id: impl Into, +) -> bool { + if let Some(guild) = cache_http.cache().unwrap().guild(guild_id) { + let owner = guild.owner_id; + + check_subscription(&cache_http, owner).await + } else { + false + } +}