diff options
| author | Cara Salter <cara@devcara.com> | 2022-01-16 13:30:47 -0500 | 
|---|---|---|
| committer | Cara Salter <cara@devcara.com> | 2022-01-16 13:30:47 -0500 | 
| commit | 4c804b3a85e2eee6dffc5a2bf0545814aaa12b95 (patch) | |
| tree | fc261b2f2c4827027f9b6d19e1eef72c596e2130 | |
| parent | eb41fede91d072693b279f908976d2ebc2ba1ca3 (diff) | |
| download | glitch-ng-4c804b3a85e2eee6dffc5a2bf0545814aaa12b95.tar.gz glitch-ng-4c804b3a85e2eee6dffc5a2bf0545814aaa12b95.zip  | |
rroles: Implement add and del
Also abstract updating the menu into its own function
| -rw-r--r-- | Cargo.lock | 263 | ||||
| -rw-r--r-- | Cargo.toml | 9 | ||||
| -rw-r--r-- | src/commands/reactionroles.rs | 132 | ||||
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/models.rs | 2 | 
5 files changed, 168 insertions, 240 deletions
@@ -14,7 +14,7 @@ version = "0.7.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"  dependencies = [ - "getrandom 0.2.3", + "getrandom",   "once_cell",   "version_check",  ] @@ -41,22 +41,6 @@ dependencies = [  [[package]]  name = "async-tungstenite" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7cc5408453d37e2b1c6f01d8078af1da58b6cfa6a80fa2ede3bd2b9a6ada9c4" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project", - "tokio", - "tokio-rustls 0.22.0", - "tungstenite 0.11.1", - "webpki-roots 0.20.0", -] - -[[package]] -name = "async-tungstenite"  version = "0.16.1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "5682ea0913e5c20780fe5785abacb85a411e7437bf52a1bedb93ddb3972cb8dd" @@ -67,7 +51,7 @@ dependencies = [   "pin-project-lite",   "tokio",   "tokio-rustls 0.23.2", - "tungstenite 0.16.0", + "tungstenite",   "webpki-roots 0.22.2",  ] @@ -88,12 +72,6 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"  [[package]]  name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64"  version = "0.13.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" @@ -127,12 +105,6 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"  [[package]]  name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - -[[package]] -name = "bytes"  version = "1.1.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" @@ -164,17 +136,6 @@ dependencies = [  ]  [[package]] -name = "command_attr" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a6c3666f685cb1efc0628b8c984dbad9c372d080450736c7732089c385ed81d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]]  name = "core-foundation"  version = "0.9.2"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -491,24 +452,13 @@ dependencies = [  [[package]]  name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom"  version = "0.2.3"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"  dependencies = [   "cfg-if",   "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi",  ]  [[package]] @@ -519,11 +469,11 @@ dependencies = [   "dotenv",   "log",   "poise", - "rand 0.8.4", + "rand",   "reqwest",   "serde",   "serde_json", - "serenity 0.10.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serenity",   "sqlx",   "tokio",   "tracing", @@ -536,7 +486,7 @@ version = "0.3.10"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "0c9de88456263e249e241fcd211d3954e2c9b0ef7ccfc235a444eb367cae3689"  dependencies = [ - "bytes 1.1.0", + "bytes",   "fnv",   "futures-core",   "futures-sink", @@ -607,7 +557,7 @@ version = "0.2.6"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03"  dependencies = [ - "bytes 1.1.0", + "bytes",   "fnv",   "itoa 1.0.1",  ] @@ -618,7 +568,7 @@ version = "0.4.4"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6"  dependencies = [ - "bytes 1.1.0", + "bytes",   "http",   "pin-project-lite",  ] @@ -641,7 +591,7 @@ version = "0.14.16"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55"  dependencies = [ - "bytes 1.1.0", + "bytes",   "futures-channel",   "futures-core",   "futures-util", @@ -678,7 +628,7 @@ version = "0.5.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"  dependencies = [ - "bytes 1.1.0", + "bytes",   "hyper",   "native-tls",   "tokio", @@ -713,15 +663,6 @@ dependencies = [  ]  [[package]] -name = "input_buffer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" -dependencies = [ - "bytes 0.5.6", -] - -[[package]]  name = "instant"  version = "0.1.12"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1026,26 +967,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"  [[package]] -name = "pin-project" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]]  name = "pin-project-lite"  version = "0.2.8"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1074,7 +995,7 @@ dependencies = [   "once_cell",   "poise_macros",   "regex", - "serenity 0.10.9 (git+https://github.com/serenity-rs/serenity?branch=next)", + "serenity",   "tokio",  ] @@ -1115,37 +1036,14 @@ dependencies = [  [[package]]  name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand"  version = "0.8.4"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"  dependencies = [   "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", + "rand_hc",  ]  [[package]] @@ -1155,16 +1053,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"  dependencies = [   "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", + "rand_core",  ]  [[package]] @@ -1173,16 +1062,7 @@ version = "0.6.3"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"  dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom",  ]  [[package]] @@ -1191,7 +1071,7 @@ version = "0.3.1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"  dependencies = [ - "rand_core 0.6.3", + "rand_core",  ]  [[package]] @@ -1209,7 +1089,7 @@ version = "0.4.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"  dependencies = [ - "getrandom 0.2.3", + "getrandom",   "redox_syscall",  ] @@ -1252,8 +1132,8 @@ version = "0.11.8"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "7c4e0a76dc12a116108933f6301b95e83634e0c47b0afbed6abbaa0601e99258"  dependencies = [ - "base64 0.13.0", - "bytes 1.1.0", + "base64", + "bytes",   "encoding_rs",   "futures-core",   "futures-util", @@ -1309,7 +1189,7 @@ version = "0.19.1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7"  dependencies = [ - "base64 0.13.0", + "base64",   "log",   "ring",   "sct 0.6.1", @@ -1334,7 +1214,7 @@ version = "0.2.1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9"  dependencies = [ - "base64 0.13.0", + "base64",  ]  [[package]] @@ -1448,40 +1328,13 @@ dependencies = [  [[package]]  name = "serenity"  version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6275d443266aedf2be507a245ddc23db0c07b1b99774e16f3c879e96a78b067a" -dependencies = [ - "async-trait", - "async-tungstenite 0.11.0", - "base64 0.13.0", - "bitflags", - "bytes 1.1.0", - "chrono", - "command_attr", - "flate2", - "futures", - "percent-encoding", - "reqwest", - "serde", - "serde_json", - "static_assertions", - "tokio", - "tracing", - "typemap_rev", - "url", - "uwl", -] - -[[package]] -name = "serenity" -version = "0.10.9"  source = "git+https://github.com/serenity-rs/serenity?branch=next#81fd4cf3911fdfd59dc76ed791a6e33dac8c775b"  dependencies = [   "async-trait", - "async-tungstenite 0.16.1", - "base64 0.13.0", + "async-tungstenite", + "base64",   "bitflags", - "bytes 1.1.0", + "bytes",   "chrono",   "dashmap",   "flate2", @@ -1600,10 +1453,10 @@ checksum = "518be6f6fff5ca76f985d434f9c37f3662af279642acf730388f271dff7b9016"  dependencies = [   "ahash",   "atoi", - "base64 0.13.0", + "base64",   "bitflags",   "byteorder", - "bytes 1.1.0", + "bytes",   "chrono",   "crc",   "crossbeam-channel", @@ -1627,7 +1480,7 @@ dependencies = [   "once_cell",   "parking_lot",   "percent-encoding", - "rand 0.8.4", + "rand",   "rustls 0.19.1",   "serde",   "serde_json", @@ -1677,12 +1530,6 @@ dependencies = [  ]  [[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]]  name = "stringprep"  version = "0.1.2"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1723,7 +1570,7 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"  dependencies = [   "cfg-if",   "libc", - "rand 0.8.4", + "rand",   "redox_syscall",   "remove_dir_all",   "winapi", @@ -1765,7 +1612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"  dependencies = [   "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi",   "winapi",  ] @@ -1790,7 +1637,7 @@ version = "1.15.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838"  dependencies = [ - "bytes 1.1.0", + "bytes",   "libc",   "memchr",   "mio", @@ -1862,7 +1709,7 @@ version = "0.6.9"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0"  dependencies = [ - "bytes 1.1.0", + "bytes",   "futures-core",   "futures-sink",   "log", @@ -1960,36 +1807,17 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"  [[package]]  name = "tungstenite" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0308d80d86700c5878b9ef6321f020f29b1bb9d5ff3cab25e75e23f3a492a23" -dependencies = [ - "base64 0.12.3", - "byteorder", - "bytes 0.5.6", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.7.3", - "sha-1", - "url", - "utf-8", -] - -[[package]] -name = "tungstenite"  version = "0.16.0"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "6ad3713a14ae247f22a728a0456a545df14acf3867f905adff84be99e23b3ad1"  dependencies = [ - "base64 0.13.0", + "base64",   "byteorder", - "bytes 1.1.0", + "bytes",   "http",   "httparse",   "log", - "rand 0.8.4", + "rand",   "rustls 0.20.2",   "sha-1",   "thiserror", @@ -2084,12 +1912,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"  [[package]] -name = "uwl" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4bf03e0ca70d626ecc4ba6b0763b934b6f2976e8c744088bb3c1d646fbb1ad0" - -[[package]]  name = "vcpkg"  version = "0.2.15"  source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2113,12 +1935,6 @@ dependencies = [  [[package]]  name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi"  version = "0.10.0+wasi-snapshot-preview1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" @@ -2221,15 +2037,6 @@ dependencies = [  [[package]]  name = "webpki-roots" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f20dea7535251981a9670857150d571846545088359b28e4951d350bdaf179f" -dependencies = [ - "webpki 0.21.4", -] - -[[package]] -name = "webpki-roots"  version = "0.21.1"  source = "registry+https://github.com/rust-lang/crates.io-index"  checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" @@ -18,19 +18,22 @@ reqwest = "0.11"  chrono = { version = "0.4", features = ["serde"] }  [dependencies.serenity] -version = "0.10" +git = "https://github.com/serenity-rs/serenity" +branch = "next"  default-features = false  features = [  	"rustls_backend",  	"cache",  	"client", -	"framework",  	"gateway",  	"model", -	"standard_framework",  	"utils",  	"collector",  ] +[patch.crates-io.serenity] +git = "https://github.com/serenity-rs/serenity" +branch = "next" +  [dependencies.poise]  git = "https://github.com/kangalioo/poise" diff --git a/src/commands/reactionroles.rs b/src/commands/reactionroles.rs index 8d448ed..65de61a 100644 --- a/src/commands/reactionroles.rs +++ b/src/commands/reactionroles.rs @@ -1,8 +1,10 @@  use std::{str::FromStr, time::Duration};  use crate::{models::ReactionRole, Context, Error}; -use ::serenity::framework::standard::{Args, Delimiter}; -use poise::serenity_prelude::{self as serenity, ArgumentConvert, Emoji, ReactionType}; +use ::serenity::{ +    model::{guild::Role, id::ChannelId}, +}; +use poise::serenity_prelude::{self as serenity, ArgumentConvert, Emoji, ReactionType, RoleId};  #[cfg(debug_assertions)]  async fn allowed_to_create_roles(ctx: Context<'_>) -> Result<bool, Error> { @@ -174,11 +176,8 @@ pub async fn init(                  )                  .fetch_all(&pool)                  .await?; -                let mut rolelist_formatted = -                    String::from("Choose the appropriate reaction to gain the role!\n\n"); -                for r in reactions { -                    rolelist_formatted.push_str(&format!("{} - <@&{}>\n", r.reaction, r.role_id)); -                } + +                let rolelist_formatted = gen_reaction_list(reactions);                  let title = rolemenu_msg.clone().embeds[0]                      .title @@ -204,6 +203,95 @@ pub async fn init(      Ok(())  } +/// Adds a reaction role to the message +/// +/// Usage: +///     ~rroles add <Message ID> <emoji> <role> +#[poise::command(prefix_command, check = "allowed_to_create_roles")] +pub async fn add( +    ctx: Context<'_>, +    #[description = "The Message ID"] message_id: u64, +    #[description = "The emoji to assign to the role"] emoji: ReactionType, +    #[description = "The role to assign to the emoji"] role_name: String, +) -> Result<(), Error> { +    { +        let pool = ctx.data().pg.lock().unwrap().clone(); +        // Make sure the emoji doesn't already exist +        if let Ok(_) = sqlx::query!("SELECT * FROM reaction_roles WHERE message_id=$1 AND reaction=$2", message_id.to_string(), emoji.to_string()).fetch_one(&pool).await { +            ctx.say("Whoops! That emoji already has something assigned to it! Try either removing it or picking a different emoji").await?; +            return Ok(()); +        } +        let role_menu = sqlx::query_as!( +            ReactionRole, +            "SELECT * FROM reaction_roles WHERE message_id=$1", +            message_id.to_string() +        ) +        .fetch_one(&pool) +        .await?; +        let guild = ctx.guild().unwrap(); +        let role = guild.role_by_name(&role_name).clone(); +        if let Some(r) = role.clone() { +            let r = r.clone(); +            let channel_id = ChannelId(role_menu.channel_id.parse::<u64>()?); +            sqlx::query!("INSERT INTO reaction_roles (channel_id, message_id, guild_id, reaction, role_id) VALUES ($1, $2, $3, $4, $5)", role_menu.channel_id.to_string(), role_menu.message_id.to_string(), ctx.guild_id().unwrap().0.to_string(), emoji.to_string(), r.id.to_string()).execute(&pool).await?; +            let all_reactions = sqlx::query_as!( +                ReactionRole, +                "SELECT * FROM reaction_roles WHERE message_id=$1", +                message_id.to_string() +            ) +            .fetch_all(&pool) +            .await?; +            let channel = channel_id.to_channel(&ctx.discord()).await?; +            let mut menu_msg = channel +                .guild() +                .unwrap() +                .message(ctx.discord(), role_menu.message_id.parse::<u64>()?) +                .await?; +             +            update_menu(ctx, menu_msg).await?; + +            ctx.say("Done! I've added that to the list for you").await?; +        } else { +            ctx.say("Whoops! That role doesn't exist!").await?; +            return Ok(()); +        } +    } + +    Ok(()) +} + +/// Removes a reaction from the menu +/// +/// Usage: +///     ~rroles del <Message ID> <emoji> +#[poise::command(prefix_command, check = "allowed_to_create_roles")] +pub async fn del(ctx: Context<'_>, +                 #[description = "The Message ID of the menu"] +                 message_id: u64, +                 #[description = "The emoji you want to remove"] +                 emoji: ReactionType, +                 ) -> Result<(), Error> { +    { +        let pool = ctx.data().pg.lock().unwrap().clone(); +        let reaction_with_menu = sqlx::query_as!(ReactionRole, "SELECT * FROM reaction_roles WHERE message_id=$1 AND reaction=$2", message_id.to_string(), emoji.to_string()).fetch_one(&pool).await?; +        let channel_id = ChannelId(reaction_with_menu.channel_id.parse::<u64>()?);  +        let channel = channel_id.to_channel(ctx.discord()).await?; +        let mut message = channel.guild().unwrap().message(ctx.discord(), message_id).await?; +         +        // Delete from DB +        // We can just use `ReactionRole.id` here to avoid having to do more complex conditionals +        sqlx::query!("DELETE FROM reaction_roles WHERE id=$1", reaction_with_menu.id).execute(&pool).await?; +         +        message.delete_reaction_emoji(ctx.discord(), emoji).await?; +         +        update_menu(ctx, message).await?; +    } + +    ctx.say("Alright! I've removed that emoji from the menu.").await?; + +    Ok(()) +} +  fn get_reactiontype_display(rt: &ReactionType) -> String {      match rt {          ReactionType::Unicode(emote) => emote.clone(), @@ -217,3 +305,33 @@ fn get_reactiontype_display(rt: &ReactionType) -> String {          _ => String::new(),      }  } + +fn gen_reaction_list(reacts: Vec<ReactionRole>) -> String { +    let mut rolelist_formatted = +        String::from("Choose the appropriate reaction to gain the role!\n\n"); +    for r in reacts { +        rolelist_formatted.push_str(&format!("{} - <@&{}>\n", r.reaction, r.role_id)); +    } +    rolelist_formatted +} + +async fn update_menu(ctx: Context<'_>, mut msg: serenity::Message) -> Result<serenity::Message, Error> { +    { +        let pool = ctx.data().pg.lock().unwrap().clone(); +        let all_reactions = sqlx::query_as!(ReactionRole, "SELECT * FROM reaction_roles WHERE message_id=$1", msg.id.0.to_string()).fetch_all(&pool).await?; +        let rolelist_formatted = gen_reaction_list(all_reactions.clone()); +        let title = msg.clone().embeds[0].title.clone().unwrap(); +        msg.edit(ctx.discord(), |m| { +            m.embed(|e| { +                e.title(title); +                e.description(rolelist_formatted) +            }) +        }).await?; + +        for r in all_reactions.iter() { +            msg.react(ctx.discord(), ReactionType::from_str(&r.reaction)?).await?; +        } +    } + +    Ok(msg) +} diff --git a/src/main.rs b/src/main.rs index 4698fb1..bfd39c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,7 +70,7 @@ async fn main() {              commands::osu::osup(),              commands::osu::osubm(),              poise::Command { -                subcommands: vec![commands::reactionroles::init()], +                subcommands: vec![commands::reactionroles::init(), commands::reactionroles::add(), commands::reactionroles::del(),],                  ..commands::reactionroles::rroles()              },          ], diff --git a/src/models.rs b/src/models.rs index 4b2e7bb..431204a 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,4 +1,4 @@ -#[derive(Debug)] +#[derive(Debug, Clone)]  pub struct ReactionRole {      pub id: i32,      pub channel_id: String,  | 
