From 7b6e967a5d48f982d731bd035e0c6cd78f8e5bac Mon Sep 17 00:00:00 2001 From: jude Date: Fri, 29 Jul 2022 19:22:15 +0100 Subject: [PATCH] Block/allow DM reminders Only affects slash commands but this is sort of a non-issue post September --- Cargo.lock | 138 ++++++++------------------------ Cargo.toml | 2 +- postman/src/lib.rs | 2 +- src/commands/info_cmds.rs | 1 + src/commands/moderation_cmds.rs | 46 +++++++++++ src/commands/reminder_cmds.rs | 1 + src/main.rs | 7 ++ src/models/reminder/builder.rs | 4 + src/models/reminder/errors.rs | 4 + src/models/user_data.rs | 8 +- 10 files changed, 102 insertions(+), 111 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57eec88..b95929a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" dependencies = [ - "generic-array 0.14.5", + "generic-array", ] [[package]] @@ -26,7 +26,7 @@ dependencies = [ "cfg-if 1.0.0", "cipher", "cpufeatures", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -190,34 +190,13 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -238,12 +217,6 @@ version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.4.3" @@ -327,7 +300,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" dependencies = [ - "generic-array 0.14.5", + "generic-array", ] [[package]] @@ -428,7 +401,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" dependencies = [ - "generic-array 0.14.5", + "generic-array", "subtle", ] @@ -438,7 +411,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.5", + "generic-array", "typenum", ] @@ -582,22 +555,13 @@ dependencies = [ "syn", ] -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "crypto-common", "subtle", ] @@ -642,12 +606,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fastrand" version = "1.8.0" @@ -848,15 +806,6 @@ dependencies = [ "windows", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.5" @@ -897,7 +846,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" dependencies = [ - "opaque-debug 0.3.0", + "opaque-debug", "polyval", ] @@ -1013,7 +962,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest", ] [[package]] @@ -1315,12 +1264,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "matchers" version = "0.1.0" @@ -1618,12 +1561,6 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "opaque-debug" version = "0.3.0" @@ -1787,18 +1724,19 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pest" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "69486e2b8c2d2aeb9762db7b4e00b0331156393555cff467f4163ff06821eef8" dependencies = [ + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "b13570633aff33c6d22ce47dd566b10a3b9122c2fe9d8e7501895905be532b91" dependencies = [ "pest", "pest_generator", @@ -1806,9 +1744,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +checksum = "b3c567e5702efdc79fb18859ea74c3eb36e14c43da7b8c1f098a4ed6514ec7a0" dependencies = [ "pest", "pest_meta", @@ -1819,13 +1757,13 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.1.3" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +checksum = "5eb32be5ee3bbdafa8c7a18b0a8a8d962b66cfa2ceee4037f49267a50ee821fe" dependencies = [ - "maplit", + "once_cell", "pest", - "sha-1 0.8.2", + "sha-1", ] [[package]] @@ -1945,7 +1883,7 @@ checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "opaque-debug 0.3.0", + "opaque-debug", "universal-hash", ] @@ -2130,7 +2068,7 @@ checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "reminder_rs" -version = "1.6.1" +version = "1.6.2" dependencies = [ "base64", "chrono", @@ -2366,7 +2304,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cf22754c49613d2b3b119f0e5d46e34a2c628a937e3024b8762de4e7d8c710b" dependencies = [ "byteorder", - "digest 0.10.3", + "digest", "num-bigint-dig", "num-integer", "num-iter", @@ -2574,9 +2512,9 @@ dependencies = [ [[package]] name = "serenity" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1a6cef5e72d4e5787c96413ec0a45f9317c59f0099e2ff2038b73cb352fefd" +checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788" dependencies = [ "async-trait", "async-tungstenite", @@ -2604,18 +2542,6 @@ dependencies = [ "url", ] -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha-1" version = "0.10.0" @@ -2624,7 +2550,7 @@ checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] @@ -2635,7 +2561,7 @@ checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if 1.0.0", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] @@ -2754,14 +2680,14 @@ dependencies = [ "chrono", "crc", "crossbeam-queue", - "digest 0.10.3", + "digest", "either", "event-listener", "futures-channel", "futures-core", "futures-intrusive", "futures-util", - "generic-array 0.14.5", + "generic-array", "hashlink", "hex", "indexmap", @@ -2778,7 +2704,7 @@ dependencies = [ "rustls 0.19.1", "serde", "serde_json", - "sha-1 0.10.0", + "sha-1", "sha2", "smallvec", "sqlformat", @@ -3179,7 +3105,7 @@ dependencies = [ "log", "rand 0.8.5", "rustls 0.20.6", - "sha-1 0.10.0", + "sha-1", "thiserror", "url", "utf-8", @@ -3327,7 +3253,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ - "generic-array 0.14.5", + "generic-array", "subtle", ] diff --git a/Cargo.toml b/Cargo.toml index 6dc6a42..699190e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "reminder_rs" -version = "1.6.1" +version = "1.6.2" authors = ["jellywx "] edition = "2018" diff --git a/postman/src/lib.rs b/postman/src/lib.rs index f63b604..a378dcf 100644 --- a/postman/src/lib.rs +++ b/postman/src/lib.rs @@ -38,7 +38,7 @@ async fn _initialize(ctx: Context, pool: impl Executor<'_, Database = Database> let reminders = sender::Reminder::fetch_reminders(pool).await; if reminders.len() > 0 { - println!("Preparing to send {} reminders.", reminders.len()); + info!("Preparing to send {} reminders.", reminders.len()); for reminder in reminders { reminder.send(pool, ctx.clone()).await; diff --git a/src/commands/info_cmds.rs b/src/commands/info_cmds.rs index 15af5ce..ce70016 100644 --- a/src/commands/info_cmds.rs +++ b/src/commands/info_cmds.rs @@ -49,6 +49,7 @@ __Todo Commands__ __Setup Commands__ `/timezone` - Set your timezone (necessary for `/remind` to work properly) +`/dm allow/block` - Change your DM settings for reminders. __Advanced Commands__ `/macro` - Record and replay command sequences diff --git a/src/commands/moderation_cmds.rs b/src/commands/moderation_cmds.rs index e1eb48a..266216c 100644 --- a/src/commands/moderation_cmds.rs +++ b/src/commands/moderation_cmds.rs @@ -124,6 +124,52 @@ You may want to use one of the popular timezones below, otherwise click [here](h Ok(()) } +/// Configure whether other users can set reminders to your direct messages +#[poise::command(slash_command, rename = "dm", identifying_name = "allowed_dm")] +pub async fn allowed_dm(_ctx: Context<'_>) -> Result<(), Error> { + Ok(()) +} + +/// Allow other users to set reminders in your direct messages +#[poise::command(slash_command, rename = "allow", identifying_name = "allowed_dm")] +pub async fn set_allowed_dm(ctx: Context<'_>) -> Result<(), Error> { + let mut user_data = ctx.author_data().await?; + user_data.allowed_dm = true; + user_data.commit_changes(&ctx.data().database).await; + + ctx.send(|r| { + r.ephemeral(true).embed(|e| { + e.title("DMs permitted") + .description("You will receive a message if a user sets a DM reminder for you.") + .color(*THEME_COLOR) + }) + }) + .await?; + + Ok(()) +} + +/// Block other users from setting reminders in your direct messages +#[poise::command(slash_command, rename = "block", identifying_name = "allowed_dm")] +pub async fn unset_allowed_dm(ctx: Context<'_>) -> Result<(), Error> { + let mut user_data = ctx.author_data().await?; + user_data.allowed_dm = false; + user_data.commit_changes(&ctx.data().database).await; + + ctx.send(|r| { + r.ephemeral(true).embed(|e| { + e.title("DMs blocked") + .description( + "You can still set DM reminders for yourself or for users with DMs enabled.", + ) + .color(*THEME_COLOR) + }) + }) + .await?; + + Ok(()) +} + /// View the webhook being used to send reminders to this channel #[poise::command( slash_command, diff --git a/src/commands/reminder_cmds.rs b/src/commands/reminder_cmds.rs index 639d625..5984c73 100644 --- a/src/commands/reminder_cmds.rs +++ b/src/commands/reminder_cmds.rs @@ -694,6 +694,7 @@ pub async fn remind( } } } + None => { ctx.say("Time could not be processed").await?; } diff --git a/src/main.rs b/src/main.rs index 6a9d9bf..6c1893b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -101,6 +101,13 @@ async fn _main(tx: Sender<()>) -> Result<(), Box> { info_cmds::clock_context_menu(), info_cmds::dashboard(), moderation_cmds::timezone(), + poise::Command { + subcommands: vec![ + moderation_cmds::set_allowed_dm(), + moderation_cmds::unset_allowed_dm(), + ], + ..moderation_cmds::allowed_dm() + }, moderation_cmds::webhook(), poise::Command { subcommands: vec![ diff --git a/src/models/reminder/builder.rs b/src/models/reminder/builder.rs index 8ddfb4a..2fb2282 100644 --- a/src/models/reminder/builder.rs +++ b/src/models/reminder/builder.rs @@ -233,6 +233,10 @@ impl<'a> MultiReminderBuilder<'a> { if let Some(guild_id) = self.guild_id { if guild_id.member(&self.ctx.discord(), user).await.is_err() { Err(ReminderError::InvalidTag) + } else if self.set_by.map_or(true, |i| i != user_data.id) + && !user_data.allowed_dm + { + Err(ReminderError::UserBlockedDm) } else { Ok(user_data.dm_channel) } diff --git a/src/models/reminder/errors.rs b/src/models/reminder/errors.rs index fbd54fd..2902131 100644 --- a/src/models/reminder/errors.rs +++ b/src/models/reminder/errors.rs @@ -7,6 +7,7 @@ pub enum ReminderError { PastTime, ShortInterval, InvalidTag, + UserBlockedDm, DiscordError(String), } @@ -30,6 +31,9 @@ impl ToString for ReminderError { ReminderError::InvalidTag => { "Couldn't find a location by your tag. Your tag must be either a channel or a user (not a role)".to_string() } + ReminderError::UserBlockedDm => { + "User has DM reminders disabled".to_string() + } ReminderError::DiscordError(s) => format!("A Discord error occurred: **{}**", s), } } diff --git a/src/models/user_data.rs b/src/models/user_data.rs index be85370..8ba68f9 100644 --- a/src/models/user_data.rs +++ b/src/models/user_data.rs @@ -10,6 +10,7 @@ pub struct UserData { pub user: u64, pub dm_channel: u32, pub timezone: String, + pub allowed_dm: bool, } impl UserData { @@ -46,7 +47,7 @@ SELECT timezone FROM users WHERE user = ? match sqlx::query_as_unchecked!( Self, " -SELECT id, user, dm_channel, IF(timezone IS NULL, ?, timezone) AS timezone FROM users WHERE user = ? +SELECT id, user, dm_channel, IF(timezone IS NULL, ?, timezone) AS timezone, allowed_dm FROM users WHERE user = ? ", *LOCAL_TIMEZONE, user_id.0 @@ -83,7 +84,7 @@ INSERT INTO users (name, user, dm_channel, timezone) VALUES ('', ?, (SELECT id F Ok(sqlx::query_as_unchecked!( Self, " -SELECT id, user, dm_channel, timezone FROM users WHERE user = ? +SELECT id, user, dm_channel, timezone, allowed_dm FROM users WHERE user = ? ", user_id.0 ) @@ -102,9 +103,10 @@ SELECT id, user, dm_channel, timezone FROM users WHERE user = ? pub async fn commit_changes(&self, pool: &MySqlPool) { sqlx::query!( " -UPDATE users SET timezone = ? WHERE id = ? +UPDATE users SET timezone = ?, allowed_dm = ? WHERE id = ? ", self.timezone, + self.allowed_dm, self.id ) .execute(pool)