diff --git a/Cargo.lock b/Cargo.lock index 9bfd848..d8a51ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991984e3fd003e7ba02eb724f87a0f997b78677c46c0e91f8424ad7394c9886a" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ "getrandom 0.2.3", "once_cell", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" [[package]] name = "byteorder" @@ -177,6 +177,7 @@ dependencies = [ [[package]] name = "command_attr" version = "0.3.7" +source = "git+https://github.com/serenity-rs/serenity?branch=next#29dd43adeae81861613930e6d6385cd2497018de" dependencies = [ "proc-macro2", "quote", @@ -185,9 +186,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" dependencies = [ "core-foundation-sys", "libc", @@ -195,9 +196,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "cpufeatures" @@ -296,9 +297,9 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" dependencies = [ "cfg-if", ] @@ -486,9 +487,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c06815895acec637cd6ed6e9662c935b866d20a106f8361892893a7d9234964" +checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" dependencies = [ "bytes", "fnv", @@ -558,9 +559,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ "bytes", "http", @@ -587,9 +588,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.13" +version = "0.14.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593" +checksum = "2b91bb1f221b6ea1f1e4371216b70f40748774c2fb5971b450c07773fb92d26b" dependencies = [ "bytes", "futures-channel", @@ -660,9 +661,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] @@ -714,9 +715,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.103" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" +checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" [[package]] name = "libm" @@ -788,9 +789,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", "log", @@ -1037,15 +1038,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" +checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" [[package]] name = "ppv-lite86" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "proc-macro-hack" @@ -1061,9 +1062,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.30" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc3358ebc67bc8b7fa0c007f945b0b18226f78437d61bec735a9eb96b61ee70" +checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" dependencies = [ "unicode-xid", ] @@ -1232,9 +1233,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c732d463dd300362ffb44b7b125f299c23d2990411a4253824630ebc7467fb" +checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" dependencies = [ "base64", "bytes", @@ -1451,6 +1452,7 @@ dependencies = [ [[package]] name = "serenity" version = "0.10.9" +source = "git+https://github.com/serenity-rs/serenity?branch=next#29dd43adeae81861613930e6d6385cd2497018de" dependencies = [ "async-trait", "async-tungstenite", @@ -1526,9 +1528,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" @@ -1680,9 +1682,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194" +checksum = "f2afee18b8beb5a596ecb4a2dce128c719b4ba399d34126b9e4396e3f9860966" dependencies = [ "proc-macro2", "quote", @@ -1791,9 +1793,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" +checksum = "b2dd85aeaba7b68df939bd357c6afb36c87951be9e80bf9c859f2fc3e9fca0fd" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 6ae6bd9..cdfdd61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,8 +22,8 @@ serde_repr = "0.1" rmp-serde = "0.15" rand = "0.7" levenshtein = "1.0" -serenity = { path = "/home/jude/serenity", features = ["collector", "unstable_discord_api"] } -# serenity = { git = "https://github.com/serenity-rs/serenity", branch = "next", features = ["collector", "unstable_discord_api"] } +# serenity = { path = "/home/jude/serenity", features = ["collector", "unstable_discord_api"] } +serenity = { git = "https://github.com/serenity-rs/serenity", branch = "next", features = ["collector", "unstable_discord_api"] } sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "bigdecimal", "chrono"]} base64 = "0.13.0" diff --git a/README.md b/README.md index 0847c08..890fb89 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,6 @@ __Required Variables__ __Other Variables__ * `MIN_INTERVAL` - default `600`, defines the shortest interval the bot should accept * `LOCAL_TIMEZONE` - default `UTC`, necessary for calculations in the natural language processor -* `DEFAULT_PREFIX` - default `$`, used for the default prefix on new guilds * `SUBSCRIPTION_ROLES` - default `None`, accepts a list of Discord role IDs that are given to subscribed users * `CNC_GUILD` - default `None`, accepts a single Discord guild ID for the server that the subscription roles belong to * `IGNORE_BOTS` - default `1`, if `1`, Reminder Bot will ignore all other bots diff --git a/migration/02-macro.sql b/migration/02-macro.sql index 9a99d2c..f5b3d5b 100644 --- a/migration/02-macro.sql +++ b/migration/02-macro.sql @@ -9,3 +9,25 @@ CREATE TABLE macro ( FOREIGN KEY (guild_id) REFERENCES guilds(guild) ON DELETE CASCADE, PRIMARY KEY (id) ); + +DROP TABLE IF EXISTS events; + +CREATE TABLE reminders.todos_new ( + id INT UNSIGNED AUTO_INCREMENT UNIQUE NOT NULL, + user_id BIGINT UNSIGNED, + guild_id BIGINT UNSIGNED, + channel_id BIGINT UNSIGNED, + value VARCHAR(2000) NOT NULL, + + PRIMARY KEY (id), + INDEX (user_id), + INDEX (guild_id), + INDEX (channel_id) +); + +INSERT INTO reminders.todos_new (user_id, guild_id, channel_id, value) + SELECT users.user, guilds.guild, channels.channel, todos.value + FROM todos + INNER JOIN users ON users.id = todos.user_id + INNER JOIN guilds ON guilds.id = todos.guild_id + INNER JOIN channels ON channels.id = todos.channel_id; diff --git a/src/component_models/mod.rs b/src/component_models/mod.rs index 29188d0..681cc9c 100644 --- a/src/component_models/mod.rs +++ b/src/component_models/mod.rs @@ -92,7 +92,17 @@ INSERT IGNORE INTO roles (role, name, guild_id) VALUES (?, \"Role\", (SELECT id .await .unwrap(); } else { - // tell them they cant do this + let _ = component + .create_interaction_response(&ctx, |r| { + r.kind(InteractionResponseType::ChannelMessageWithSource) + .interaction_response_data(|d| { + d.flags( + InteractionApplicationCommandCallbackDataFlags::EPHEMERAL, + ) + .content("Only the user who performed the command can use these components") + }) + }) + .await; } } ComponentDataModel::LookPager(pager) => { @@ -199,9 +209,10 @@ INSERT IGNORE INTO roles (role, name, guild_id) VALUES (?, \"Role\", (SELECT id let _ = invoke.respond(&ctx, resp).await; } ComponentDataModel::TodoPager(pager) => { - let pool = ctx.data.read().await.get::().cloned().unwrap(); + if Some(component.user.id.0) == pager.user_id || pager.user_id.is_none() { + let pool = ctx.data.read().await.get::().cloned().unwrap(); - let values = sqlx::query!( + let values = sqlx::query!( // fucking braindead mysql use <=> instead of = for null comparison "SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?", pager.user_id, @@ -215,29 +226,43 @@ INSERT IGNORE INTO roles (role, name, guild_id) VALUES (?, \"Role\", (SELECT id .map(|row| (row.id as usize, row.value.clone())) .collect::>(); - let max_pages = max_todo_page(&values); + let max_pages = max_todo_page(&values); - let resp = show_todo_page( - &values, - pager.next_page(max_pages), - pager.user_id, - pager.channel_id, - pager.guild_id, - ); + let resp = show_todo_page( + &values, + pager.next_page(max_pages), + pager.user_id, + pager.channel_id, + pager.guild_id, + ); - let mut invoke = CommandInvoke::component(component); - let _ = invoke.respond(&ctx, resp).await; + let mut invoke = CommandInvoke::component(component); + let _ = invoke.respond(&ctx, resp).await; + } else { + let _ = component + .create_interaction_response(&ctx, |r| { + r.kind(InteractionResponseType::ChannelMessageWithSource) + .interaction_response_data(|d| { + d.flags( + InteractionApplicationCommandCallbackDataFlags::EPHEMERAL, + ) + .content("Only the user who performed the command can use these components") + }) + }) + .await; + } } ComponentDataModel::TodoSelector(selector) => { - let pool = ctx.data.read().await.get::().cloned().unwrap(); - let selected_id = component.data.values.join(","); + if Some(component.user.id.0) == selector.user_id || selector.user_id.is_none() { + let pool = ctx.data.read().await.get::().cloned().unwrap(); + let selected_id = component.data.values.join(","); - sqlx::query!("DELETE FROM todos WHERE FIND_IN_SET(id, ?)", selected_id) - .execute(&pool) - .await - .unwrap(); + sqlx::query!("DELETE FROM todos WHERE FIND_IN_SET(id, ?)", selected_id) + .execute(&pool) + .await + .unwrap(); - let values = sqlx::query!( + let values = sqlx::query!( // fucking braindead mysql use <=> instead of = for null comparison "SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?", selector.user_id, @@ -251,16 +276,29 @@ INSERT IGNORE INTO roles (role, name, guild_id) VALUES (?, \"Role\", (SELECT id .map(|row| (row.id as usize, row.value.clone())) .collect::>(); - let resp = show_todo_page( - &values, - selector.page, - selector.user_id, - selector.channel_id, - selector.guild_id, - ); + let resp = show_todo_page( + &values, + selector.page, + selector.user_id, + selector.channel_id, + selector.guild_id, + ); - let mut invoke = CommandInvoke::component(component); - let _ = invoke.respond(&ctx, resp).await; + let mut invoke = CommandInvoke::component(component); + let _ = invoke.respond(&ctx, resp).await; + } else { + let _ = component + .create_interaction_response(&ctx, |r| { + r.kind(InteractionResponseType::ChannelMessageWithSource) + .interaction_response_data(|d| { + d.flags( + InteractionApplicationCommandCallbackDataFlags::EPHEMERAL, + ) + .content("Only the user who performed the command can use these components") + }) + }) + .await; + } } ComponentDataModel::MacroPager(pager) => { let mut invoke = CommandInvoke::component(component);