From a44f0ede7ef7e50478a376e4d13e94acd2c08d7f Mon Sep 17 00:00:00 2001 From: Aadi Desai <21363892+supleed2@users.noreply.github.com> Date: Wed, 24 Jan 2024 04:05:34 +0000 Subject: [PATCH] Update to Poise v0.6 --- Cargo.lock | 533 ++++++++++++++++++++++----------------- Cargo.toml | 18 +- src/cmds/edit_members.rs | 4 +- src/cmds/extras.rs | 14 +- src/cmds/manual.rs | 10 +- src/cmds/members.rs | 10 +- src/cmds/mod.rs | 35 ++- src/cmds/pending.rs | 10 +- src/cmds/whois.rs | 87 ++++--- src/main.rs | 121 ++++----- src/service.rs | 16 +- src/verify/login.rs | 293 +++++++++++---------- src/verify/manual.rs | 233 +++++++++-------- src/verify/membership.rs | 146 ++++++----- src/verify/mod.rs | 121 ++++----- 15 files changed, 862 insertions(+), 789 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f40a4ab..5574246 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,15 +62,18 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] [[package]] name = "async-stream" @@ -91,7 +94,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -102,23 +105,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", -] - -[[package]] -name = "async-tungstenite" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite", - "tokio", - "tokio-rustls 0.23.4", - "tungstenite", - "webpki-roots 0.22.6", + "syn 2.0.46", ] [[package]] @@ -178,18 +165,18 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202651474fe73c62d9e0a56c6133f7a0ff1dc1c8cf7a5b03381af2a26553ac9d" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core 0.4.1", + "axum-core 0.4.3", "bytes", "futures-util", "http 1.0.0", "http-body 1.0.0", "http-body-util", - "hyper 1.0.1", + "hyper 1.1.0", "hyper-util", "itoa", "matchit", @@ -207,6 +194,7 @@ dependencies = [ "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -228,9 +216,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cb22c689c44d4c07b0ab44ebc25d69d8ae601a2f28fb8d672d344178fa17aa" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", @@ -244,6 +232,7 @@ dependencies = [ "sync_wrapper", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -261,12 +250,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.5" @@ -309,6 +292,12 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "bytecount" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" + [[package]] name = "byteorder" version = "1.5.0" @@ -321,6 +310,37 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + [[package]] name = "cc" version = "1.0.83" @@ -498,9 +518,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", @@ -508,27 +528,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 1.0.109", + "syn 2.0.46", ] [[package]] name = "darling_macro" -version = "0.14.4" +version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.46", ] [[package]] @@ -545,6 +565,12 @@ dependencies = [ "serde", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "der" version = "0.7.8" @@ -635,6 +661,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + [[package]] name = "etcetera" version = "0.8.0" @@ -781,7 +816,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -814,6 +849,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -916,7 +960,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.21.5", + "base64", "bytes", "headers-core", "http 0.2.10", @@ -1082,9 +1126,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f9214f3e703236b221f1a9cd88ec8b4adfa5296de01ab96216361f4692f56" +checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" dependencies = [ "bytes", "futures-channel", @@ -1108,9 +1152,9 @@ dependencies = [ "futures-util", "http 0.2.10", "hyper 0.14.27", - "rustls 0.21.8", + "rustls", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -1140,21 +1184,19 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca339002caeb0d159cc6e023dff48e199f081e42fa039895c7c6f38b37f2e9d" +checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.0.0", "http-body 1.0.0", - "hyper 1.0.1", + "hyper 1.1.0", "pin-project-lite", "socket2 0.5.5", "tokio", - "tower", - "tower-service", "tracing", ] @@ -1268,9 +1310,9 @@ version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "155c4d7e39ad04c172c5e3a99c434ea3b4a7ba7960b38ecd562b270b097cce09" dependencies = [ - "base64 0.21.5", + "base64", "pem", - "ring 0.17.5", + "ring", "serde", "serde_json", "simple_asn1", @@ -1392,6 +1434,21 @@ dependencies = [ "unicase", ] +[[package]] +name = "mini-moka" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" +dependencies = [ + "crossbeam-channel", + "crossbeam-utils", + "dashmap", + "skeptic", + "smallvec", + "tagptr", + "triomphe", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1424,7 +1481,7 @@ name = "nano" version = "0.1.0" dependencies = [ "anyhow", - "axum 0.7.2", + "axum 0.7.4", "indoc", "poise", "reqwest", @@ -1597,7 +1654,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -1714,7 +1771,7 @@ dependencies = [ "glob", "once_cell", "opentelemetry", - "ordered-float 4.1.1", + "ordered-float", "percent-encoding", "rand", "serde_json", @@ -1723,15 +1780,6 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-float" version = "4.1.1" @@ -1782,7 +1830,7 @@ version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3163d2912b7c3b52d651a055f2c7eec9ba5cd22d26ef75b8dd3a59980b185923" dependencies = [ - "base64 0.21.5", + "base64", "serde", ] @@ -1818,7 +1866,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -1862,33 +1910,31 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "poise" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d104e4b5847283b2fbd6a7ec19fb6a8af328e2145623d056b66d750a30073fdf" +checksum = "1819d5a45e3590ef33754abce46432570c54a120798bdbf893112b4211fa09a6" dependencies = [ "async-trait", "derivative", - "futures-core", "futures-util", - "log", - "once_cell", "parking_lot", "poise_macros", "regex", "serenity", "tokio", + "tracing", ] [[package]] name = "poise_macros" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb516a8cf4e4ae4bd7ef5819d08c6ca408976461a9bea3ee3eec5138ac070c1" +checksum = "8fa2c123c961e78315cd3deac7663177f12be4460f5440dbf62a7ed37b1effea" dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.46", ] [[package]] @@ -1929,9 +1975,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" dependencies = [ "unicode-ident", ] @@ -1979,7 +2025,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -1992,10 +2038,21 @@ dependencies = [ ] [[package]] -name = "quote" -version = "1.0.33" +name = "pulldown-cmark" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2085,11 +2142,11 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ - "base64 0.21.5", + "base64", "bytes", "encoding_rs", "futures-core", @@ -2109,7 +2166,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.8", + "rustls", "rustls-pemfile", "serde", "serde_json", @@ -2117,7 +2174,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -2125,25 +2182,10 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.25.2", + "webpki-roots", "winreg", ] -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.5" @@ -2154,7 +2196,7 @@ dependencies = [ "getrandom", "libc", "spin 0.9.8", - "untrusted 0.9.0", + "untrusted", "windows-sys", ] @@ -2203,18 +2245,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.21.8" @@ -2222,7 +2252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring 0.17.5", + "ring", "rustls-webpki", "sct", ] @@ -2233,7 +2263,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64", ] [[package]] @@ -2242,8 +2272,8 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -2275,6 +2305,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.22" @@ -2296,8 +2335,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", + "ring", + "untrusted", ] [[package]] @@ -2344,32 +2383,22 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float 2.10.1", - "serde", -] - [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -2407,47 +2436,36 @@ dependencies = [ [[package]] name = "serenity" -version = "0.11.7" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7a89cef23483fc9d4caf2df41e6d3928e18aada84c56abd237439d929622c6" +checksum = "385647faa24a889929028973650a4f158fb1b4272b2fcf94feb9fcc3c009e813" dependencies = [ + "arrayvec", "async-trait", - "async-tungstenite", - "base64 0.21.5", - "bitflags 1.3.2", + "base64", + "bitflags 2.4.1", "bytes", - "cfg-if", "chrono", "dashmap", "flate2", "futures", - "mime", + "fxhash", "mime_guess", "parking_lot", "percent-encoding", "reqwest", - "rustversion", + "secrecy", "serde", - "serde-value", "serde_json", "time", "tokio", + "tokio-tungstenite", "tracing", "typemap_rev", + "typesize", "url", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha1" version = "0.10.6" @@ -2481,21 +2499,21 @@ dependencies = [ [[package]] name = "shuttle-codegen" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0aa40ce33e1b1aec9c3842ce309c2de14ee366fc94d90950881f7043005c99" +checksum = "032ec76ecb7e3698d7a9e836e3649a88faa13e53f4d13eaa314030761f4ecac9" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] name = "shuttle-common" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad586504f3453786f8994e92bb1d6497eb27f89ce5c308eedb56c62b6d698def" +checksum = "e8e3ddec998dd953743ac0e47de7ae6d65fcb1ffc45e68a4ceecd2558f8cad1b" dependencies = [ "anyhow", "async-trait", @@ -2537,9 +2555,9 @@ dependencies = [ [[package]] name = "shuttle-proto" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "007fee4c4a09cb60e2e6af3136c80ccae49e45d421677bd861815f1d264d65a1" +checksum = "1ff4e554df686fb01ce42636bf768ba902800934ba4e22f5a5d96082f608d325" dependencies = [ "futures-core", "prost 0.12.1", @@ -2550,9 +2568,9 @@ dependencies = [ [[package]] name = "shuttle-runtime" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d171a6a029eccc0c7a56a8a6de693a4d29278656a0f893207a6bf40f3a8804" +checksum = "cd4e48b0112dc1ba7ae056197810808a27948a7352340506f355da7e4bdc6cb4" dependencies = [ "anyhow", "async-trait", @@ -2574,9 +2592,9 @@ dependencies = [ [[package]] name = "shuttle-secrets" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e6313504de8df71a2c2e0e541ae6da0f49ba150de34ea0520108dd961aa2a" +checksum = "b71c9fede35b016a177a7842546d93dd27232dbbb777eafb9bdb39890cc76fb5" dependencies = [ "async-trait", "secrecy", @@ -2586,9 +2604,9 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a83831eaa185d65300efc0e3bf41e8b5a80bc2dfd2d26228cf20124770192e01" +checksum = "809db2a4b8511b07f363942737459bb4ec4f859d9adac7759c52677beabe9af4" dependencies = [ "anyhow", "async-trait", @@ -2600,9 +2618,9 @@ dependencies = [ [[package]] name = "shuttle-shared-db" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad32b120e9566a31c44321973e10be3284a7704f9fc9445e33612a042a11a4e4" +checksum = "81fbf377957afb7c9a5b74b13a897c466252e46f6e78a4ae48b9fe2282baacdd" dependencies = [ "async-trait", "serde", @@ -2662,6 +2680,21 @@ dependencies = [ "time", ] +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "slab" version = "0.4.9" @@ -2834,7 +2867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ "atoi", - "base64 0.21.5", + "base64", "bitflags 2.4.1", "byteorder", "bytes", @@ -2876,7 +2909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", - "base64 0.21.5", + "base64", "bitflags 2.4.1", "byteorder", "crc", @@ -2992,7 +3025,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -3014,9 +3047,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" dependencies = [ "proc-macro2", "quote", @@ -3050,6 +3083,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" version = "3.8.1" @@ -3080,7 +3119,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -3139,9 +3178,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -3174,7 +3213,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -3187,24 +3226,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.8", + "rustls", "tokio", ] @@ -3219,6 +3247,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + [[package]] name = "tokio-util" version = "0.7.10" @@ -3241,7 +3284,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum 0.6.20", - "base64 0.21.5", + "base64", "bytes", "futures-core", "futures-util", @@ -3270,7 +3313,7 @@ dependencies = [ "async-stream", "async-trait", "axum 0.6.20", - "base64 0.21.5", + "base64", "bytes", "h2 0.3.21", "http 0.2.10", @@ -3359,7 +3402,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] @@ -3433,6 +3476,12 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "triomphe" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" + [[package]] name = "try-lock" version = "0.2.4" @@ -3450,30 +3499,29 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" dependencies = [ - "base64 0.13.1", "byteorder", "bytes", + "data-encoding", "http 0.2.10", "httparse", "log", "rand", - "rustls 0.20.9", - "sha-1", + "rustls", + "sha1", "thiserror", "url", "utf-8", - "webpki", ] [[package]] name = "typemap_rev" -version = "0.1.5" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" +checksum = "74b08b0c1257381af16a5c3605254d529d3e7e109f3c62befc5d168968192998" [[package]] name = "typenum" @@ -3481,6 +3529,35 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typesize" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36924509726e38224322c8c90ddfbf4317324338327b7c11b7cf8672cb786da1" +dependencies = [ + "chrono", + "dashmap", + "hashbrown 0.14.2", + "mini-moka", + "parking_lot", + "secrecy", + "serde_json", + "time", + "typesize-derive", + "url", +] + +[[package]] +name = "typesize-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b122284365ba8497be951b9a21491f70c9688eb6fddc582931a0703f6a00ece" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.46", +] + [[package]] name = "unicase" version = "2.7.0" @@ -3529,12 +3606,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -3593,6 +3664,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -3629,7 +3710,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", "wasm-bindgen-shared", ] @@ -3663,7 +3744,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3707,25 +3788,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.5", - "untrusted 0.9.0", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - [[package]] name = "webpki-roots" version = "0.25.2" @@ -3754,6 +3816,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3862,7 +3933,7 @@ checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.46", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6614ccf..462f6b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,21 +11,21 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0.75" -axum = "0.7.2" +anyhow = "1.0.79" +axum = "0.7.4" indoc = "2.0.4" -poise = "0.5.7" -reqwest = { version = "0.11.22", features = ["json"] } -serde = { version = "1.0.193", features = ["derive"] } -shuttle-runtime = { version = "0.35.0", default-features = false } -shuttle-secrets = "0.35.0" -shuttle-shared-db = { version = "0.35.0", features = ["postgres"] } +poise = "0.6.1" +reqwest = { version = "0.11.23", features = ["json"] } +serde = { version = "1.0.195", features = ["derive"] } +shuttle-runtime = { version = "0.36.0", default-features = false } +shuttle-secrets = "0.36.0" +shuttle-shared-db = { version = "0.36.0", features = ["postgres"] } sqlx = { version = "0.7.3", features = [ "macros", "postgres", "runtime-tokio-native-tls", ] } -tokio = "1.34.0" +tokio = "1.35.1" tracing = "0.1.40" tracing-subscriber = { version = "0.3.18", features = ["time"] } url = "2.5.0" diff --git a/src/cmds/edit_members.rs b/src/cmds/edit_members.rs index 90aab84..93ac434 100644 --- a/src/cmds/edit_members.rs +++ b/src/cmds/edit_members.rs @@ -97,7 +97,7 @@ pub(crate) async fn refresh_non_members(ctx: ACtx<'_>) -> Result<(), Error> { ctx.defer().await?; let mut members = ctx.data().server.members_iter(ctx.http()).boxed(); let mut cnt = 0; - while let Some(Ok(mut m)) = members.next().await { + while let Some(Ok(m)) = members.next().await { if m.roles.is_empty() { m.add_role(ctx.http(), ctx.data().non_member).await?; cnt += 1; @@ -122,7 +122,7 @@ pub(crate) async fn set_members_non_fresher(ctx: ACtx<'_>) -> Result<(), Error> ctx.say(format!("{updated} updated to non-fresher, removing roles")) .await?; let mut members = ctx.data().server.members_iter(ctx.http()).boxed(); - while let Some(Ok(mut m)) = members.next().await { + while let Some(Ok(m)) = members.next().await { let _ = m.remove_role(ctx.http(), ctx.data().fresher).await; } ctx.say("Roles removed").await?; diff --git a/src/cmds/extras.rs b/src/cmds/extras.rs index 06eee24..b2727a1 100644 --- a/src/cmds/extras.rs +++ b/src/cmds/extras.rs @@ -1,6 +1,8 @@ use crate::{db, ACtx, Error, Gaijin}; -use poise::serenity_prelude as serenity; -use poise::Modal; +use poise::{ + serenity_prelude::{self as serenity, CreateAttachment, CreateMessage}, + Modal, +}; use std::fmt::Write; /// Get the number of entries in the gaijin table @@ -57,9 +59,11 @@ pub(crate) async fn get_all_gaijin(ctx: ACtx<'_>) -> Result<(), Error> { ctx.say("Sending gaijin db data in followup message") .await?; ctx.channel_id() - .send_files(&ctx.http(), vec!["gaijin.rs"], |cm| { - cm.content("File: gaijin db") - }) + .send_files( + &ctx.http(), + vec![CreateAttachment::path("gaijin.rs").await?], + CreateMessage::new().content("File: gaijin db"), + ) .await?; } Err(e) => { diff --git a/src/cmds/manual.rs b/src/cmds/manual.rs index 2e71408..b7776e2 100644 --- a/src/cmds/manual.rs +++ b/src/cmds/manual.rs @@ -1,5 +1,5 @@ use crate::{db, ACtx, Error, ManualMember}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, CreateAttachment, CreateMessage}; use poise::Modal; /// Get the number of manual members in the manual table @@ -49,9 +49,11 @@ pub(crate) async fn get_all_manual(ctx: ACtx<'_>) -> Result<(), Error> { ctx.say("Sending manual db data in followup message") .await?; ctx.channel_id() - .send_files(&ctx.http(), vec!["manual.rs"], |cm| { - cm.content("File: manual db") - }) + .send_files( + &ctx.http(), + vec![CreateAttachment::path("manual.rs").await?], + CreateMessage::new().content("File: manual db"), + ) .await?; } Err(e) => { diff --git a/src/cmds/members.rs b/src/cmds/members.rs index d02fc56..a94f51c 100644 --- a/src/cmds/members.rs +++ b/src/cmds/members.rs @@ -1,5 +1,5 @@ use crate::{db, ACtx, Error, Member}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, CreateAttachment, CreateMessage}; use poise::Modal; /// Get the number of members in the members table @@ -57,9 +57,11 @@ pub(crate) async fn get_all_members(ctx: ACtx<'_>) -> Result<(), Error> { ctx.say("Sending members db data in followup message") .await?; ctx.channel_id() - .send_files(&ctx.http(), vec!["members.rs"], |cm| { - cm.content("File: members db") - }) + .send_files( + &ctx.http(), + vec![CreateAttachment::path("members.rs").await?], + CreateMessage::new().content("File: members db"), + ) .await?; } Err(e) => { diff --git a/src/cmds/mod.rs b/src/cmds/mod.rs index b840316..dd9e180 100644 --- a/src/cmds/mod.rs +++ b/src/cmds/mod.rs @@ -1,5 +1,5 @@ use crate::{ACtx, Data, Error}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, CreateActionRow, CreateButton, CreateMessage}; use poise::Modal; pub(crate) mod members; @@ -67,24 +67,21 @@ pub(crate) async fn setup( .await?; let emoji = emoji.unwrap_or_default().chars().next().unwrap_or('🚀'); channel - .send_message(ctx.http(), |m| { - m.content(message).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Secondary) - .emoji('📖') - .label("More info") - .custom_id("info") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji(emoji) - .label(text.unwrap_or("Begin".to_string())) - .custom_id("start") - }) - }) - }) - }) + .send_message( + ctx.http(), + CreateMessage::new() + .content(message) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("info") + .style(serenity::ButtonStyle::Secondary) + .emoji('📖') + .label("More info"), + CreateButton::new("start") + .style(serenity::ButtonStyle::Primary) + .emoji(emoji) + .label(text.unwrap_or("Begin".to_string())), + ])]), + ) .await?; } else { ctx.say("Modal timed out, try again...").await?; diff --git a/src/cmds/pending.rs b/src/cmds/pending.rs index 6a3e767..200d2bd 100644 --- a/src/cmds/pending.rs +++ b/src/cmds/pending.rs @@ -1,5 +1,5 @@ use crate::{db, ACtx, Error, PendingMember}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, CreateAttachment, CreateMessage}; use poise::Modal; /// Get the number of pending members in the pending table @@ -49,9 +49,11 @@ pub(crate) async fn get_all_pending(ctx: ACtx<'_>) -> Result<(), Error> { ctx.say("Sending pending db data in followup message") .await?; ctx.channel_id() - .send_files(&ctx.http(), vec!["pending.rs"], |cm| { - cm.content("File: pending db") - }) + .send_files( + &ctx.http(), + vec![CreateAttachment::path("pending.rs").await?], + CreateMessage::new().content("File: pending db"), + ) .await?; } Err(e) => { diff --git a/src/cmds/whois.rs b/src/cmds/whois.rs index 7f2ab56..82fc9f4 100644 --- a/src/cmds/whois.rs +++ b/src/cmds/whois.rs @@ -1,5 +1,5 @@ use crate::{db, ACtx, Error}; -use poise::serenity_prelude as serenity; +use poise::{serenity_prelude as serenity, CreateReply}; use std::fmt::Write; /// Unreachable, used to create whois command folder @@ -19,14 +19,19 @@ pub(crate) async fn whois_by_id(ctx: ACtx<'_>, id: serenity::Member) -> Result<( tracing::info!("{} {}", ctx.author().name, id.user.name); match db::get_member_by_id(&ctx.data().db, id.user.id.into()).await? { Some(m) => { - ctx.send(|c| c.content(format!("{id}: {}", m.nickname)).ephemeral(true)) - .await? + ctx.send( + CreateReply::default() + .content(format!("{id}: {}", m.nickname)) + .ephemeral(true), + ) + .await? } None => { - ctx.send(|c| { - c.content(format!("No member entry found for {id}")) - .ephemeral(true) - }) + ctx.send( + CreateReply::default() + .content(format!("No member entry found for {id}")) + .ephemeral(true), + ) .await? } }; @@ -39,29 +44,29 @@ pub(crate) async fn whois_by_id(ctx: ACtx<'_>, id: serenity::Member) -> Result<( pub(crate) async fn whois_by_nickname(ctx: ACtx<'_>, nickname: String) -> Result<(), Error> { tracing::info!("{} {nickname}", ctx.author().name); if let Some(m) = db::get_member_by_nickname(&ctx.data().db, &nickname).await? { - ctx.send(|c| { - c.content(format!("{nickname}: <@{}>", m.discord_id)) - .ephemeral(true) - }) + ctx.send( + CreateReply::default() + .content(format!("{nickname}: <@{}>", m.discord_id)) + .ephemeral(true), + ) .await?; } else { let members = db::get_member_by_nickname_fuzzy(&ctx.data().db, &nickname, 3).await?; if members.is_empty() { - ctx.send(|c| { - c.content(format!("No member entry found for nickname {nickname}")) - .ephemeral(true) - }) + ctx.send( + CreateReply::default() + .content(format!("No member entry found for nickname {nickname}")) + .ephemeral(true), + ) .await?; } else { - ctx.send(|c| { - c.ephemeral(true).content(format!( - "Possible matches for {nickname}: {}", - members.iter().fold(String::new(), |mut s, g| { - write!(s, " <@{}>", g.discord_id).expect("String write! is infallible"); - s - }) - )) - }) + ctx.send(CreateReply::default().ephemeral(true).content(format!( + "Possible matches for {nickname}: {}", + members.iter().fold(String::new(), |mut s, g| { + write!(s, " <@{}>", g.discord_id).expect("String write! is infallible"); + s + }) + ))) .await?; } } @@ -74,29 +79,29 @@ pub(crate) async fn whois_by_nickname(ctx: ACtx<'_>, nickname: String) -> Result pub(crate) async fn whois_by_realname(ctx: ACtx<'_>, realname: String) -> Result<(), Error> { tracing::info!("{} {realname}", ctx.author().name); if let Some(m) = db::get_member_by_realname(&ctx.data().db, &realname).await? { - ctx.send(|c| { - c.content(format!("{realname}: <@{}>", m.discord_id)) - .ephemeral(true) - }) + ctx.send( + CreateReply::default() + .content(format!("{realname}: <@{}>", m.discord_id)) + .ephemeral(true), + ) .await?; } else { let members = db::get_member_by_realname_fuzzy(&ctx.data().db, &realname, 3).await?; if members.is_empty() { - ctx.send(|c| { - c.content(format!("No member entry found for realname {realname}")) - .ephemeral(true) - }) + ctx.send( + CreateReply::default() + .content(format!("No member entry found for realname {realname}")) + .ephemeral(true), + ) .await?; } else { - ctx.send(|c| { - c.ephemeral(true).content(format!( - "Possible matches for {realname}: {}", - members.iter().fold(String::new(), |mut s, g| { - write!(s, " <@{}>", g.discord_id).expect("String write! is infallible"); - s - }) - )) - }) + ctx.send(CreateReply::default().ephemeral(true).content(format!( + "Possible matches for {realname}: {}", + members.iter().fold(String::new(), |mut s, g| { + write!(s, " <@{}>", g.discord_id).expect("String write! is infallible"); + s + }) + ))) .await?; } }; diff --git a/src/main.rs b/src/main.rs index 8278d6b..861ec86 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #![warn(clippy::pedantic)] use anyhow::Context as _; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{self as serenity, FullEvent}; mod cmds; mod db; @@ -59,14 +59,24 @@ struct Gaijin { university: String, } +macro_rules! secret { + ($s: literal, $ss: ident) => { + $ss.get($s).context(format!("{} not found", $s))? + }; + ($s: literal, $ss: ident, $t: ty) => { + secret!($s, $ss) + .parse::<$t>() + .context(format!("{} not valid {}", $s, stringify!($t)))? + }; +} + #[shuttle_runtime::main] -async fn poise( +async fn nanobot( #[shuttle_secrets::Secrets] secret_store: shuttle_secrets::SecretStore, #[shuttle_shared_db::Postgres] pool: sqlx::PgPool, ) -> Result { // Set Up Tracing Subscriber init_tracing_subscriber(); - tracing::info!("Tracing Subscriber Set Up"); // Run SQLx Migrations sqlx::migrate!() @@ -74,58 +84,8 @@ async fn poise( .await .map_err(shuttle_runtime::CustomError::new)?; - // Load secrets - let au_ch_id = secret_store - .get("AU_CHANNEL_ID") - .expect("AU_CHANNEL_ID not found") - .parse() - .expect("AU_CHANNEL_ID not valid u64"); - let ea_key = secret_store - .get("EA_API_KEY") - .expect("EA_API_KEY not found"); - let ea_url = secret_store - .get("EA_API_URL") - .expect("EA_API_URL not found"); - let token = secret_store - .get("DISCORD_TOKEN") - .expect("DISCORD_TOKEN not found"); - let fresher = secret_store - .get("FRESHER_ID") - .expect("FRESHER_ID not found") - .parse() - .expect("FRESHER_ID not valid u64"); - let gaijin = secret_store - .get("GAIJIN_ID") - .expect("GAIJIN_ID not found") - .parse() - .expect("GAIJIN_ID not valid u64"); - let gn_ch_id = secret_store - .get("GN_CHANNEL_ID") - .expect("GN_CHANNEL_ID not found") - .parse() - .expect("GN_CHANNEL_ID not valid u64"); - let member = secret_store - .get("MEMBER_ID") - .expect("MEMBER_ID not found") - .parse() - .expect("MEMBER_ID not valid u64"); - let non_member = secret_store - .get("NON_MEMBER_ID") - .expect("NON_MEMBER_ID not found") - .parse() - .expect("NON_MEMBER_ID not valid u64"); - let old_member = secret_store - .get("OLD_MEMBER_ID") - .expect("OLD_MEMBER_ID not found") - .parse() - .expect("OLD_MEMBER_ID not valid u64"); - let server = secret_store - .get("SERVER_ID") - .expect("SERVER_ID not found") - .parse::() - .expect("SERVER_ID not valid u64") - .into(); - tracing::info!("Secrets loaded"); + // Load token + let token = secret!("DISCORD_TOKEN", secret_store); // Build Axum Router let router = axum::Router::new() @@ -142,33 +102,40 @@ async fn poise( ); // Build Poise Instance - let discord = poise::Framework::builder() + let framework = poise::Framework::builder() .options(poise::FrameworkOptions { commands: all_commands(), event_handler: { |c, e, f, d| Box::pin(event_handler(c, e, f, d)) }, ..Default::default() }) - .token(token) - .intents(serenity::GatewayIntents::non_privileged()) .setup(move |ctx, _, _| { Box::pin(async move { - ctx.set_activity(serenity::Activity::competing("autoverification")) - .await; + ctx.set_activity(Some(serenity::ActivityData::custom( + "Verifying members since 2023", + ))); Ok(Data { - au_ch_id, + au_ch_id: secret!("AU_CHANNEL_ID", secret_store, _), db: pool, - ea_key, - ea_url, - fresher, - gaijin, - gn_ch_id, - member, - non_member, - old_member, - server, + ea_key: secret!("EA_API_KEY", secret_store), + ea_url: secret!("EA_API_URL", secret_store), + fresher: secret!("FRESHER_ID", secret_store, _), + gaijin: secret!("GAIJIN_ID", secret_store, _), + gn_ch_id: secret!("GN_CHANNEL_ID", secret_store, _), + member: secret!("MEMBER_ID", secret_store, _), + non_member: secret!("NON_MEMBER_ID", secret_store, _), + old_member: secret!("OLD_MEMBER_ID", secret_store, _), + server: secret!("SERVER_ID", secret_store, _), }) }) - }); + }) + .build(); + + // Build Discord struct + let discord = service::Discord { + framework, + token, + intents: serenity::GatewayIntents::non_privileged(), + }; // Return NanoBot Ok(service::NanoBot { discord, router }) @@ -176,16 +143,16 @@ async fn poise( async fn event_handler( ctx: &serenity::Context, - event: &poise::Event<'_>, + event: &FullEvent, _framework: poise::FrameworkContext<'_, Data, Error>, data: &Data, ) -> Result<(), Error> { match event { - poise::Event::GuildMemberAddition { new_member } => { + FullEvent::GuildMemberAddition { new_member } => { tracing::info!("Member joined: {}", new_member.user.name); } - poise::Event::InteractionCreate { - interaction: serenity::Interaction::MessageComponent(m), + FullEvent::InteractionCreate { + interaction: serenity::Interaction::Component(m), } => { tracing::info!("Interaction: {} by {}", m.data.custom_id, m.user.name); match m.data.custom_id.as_str() { @@ -214,8 +181,8 @@ async fn event_handler( } } } - poise::Event::InteractionCreate { - interaction: serenity::Interaction::ModalSubmit(m), + FullEvent::InteractionCreate { + interaction: serenity::Interaction::Modal(m), } => { tracing::info!("Modal submit: {} by {}", m.data.custom_id, m.user.name); match m.data.custom_id.as_str() { diff --git a/src/service.rs b/src/service.rs index 02690e8..a8c4a3b 100644 --- a/src/service.rs +++ b/src/service.rs @@ -1,10 +1,17 @@ use crate::{Data, Error}; +use poise::serenity_prelude as serenity; pub(crate) struct NanoBot { - pub discord: poise::FrameworkBuilder, + pub discord: Discord, pub router: axum::Router, } +pub(crate) struct Discord { + pub framework: poise::Framework, + pub token: String, + pub intents: serenity::GatewayIntents, +} + #[shuttle_runtime::async_trait] impl shuttle_runtime::Service for NanoBot { async fn bind(mut self, addr: std::net::SocketAddr) -> Result<(), shuttle_runtime::Error> { @@ -18,8 +25,13 @@ impl shuttle_runtime::Service for NanoBot { ) .into_future(); + let mut client = serenity::ClientBuilder::new(self.discord.token, self.discord.intents) + .framework(self.discord.framework) + .await + .map_err(shuttle_runtime::CustomError::new)?; + tokio::select! { - _ = self.discord.run_autosharded() => {}, + _ = client.start_autosharded() => {}, _ = serve => {}, }; diff --git a/src/verify/login.rs b/src/verify/login.rs index 1b00529..3d2cdc0 100644 --- a/src/verify/login.rs +++ b/src/verify/login.rs @@ -1,5 +1,8 @@ use crate::{Data, Error}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{ + self as serenity, CreateActionRow, CreateButton, CreateEmbed, CreateInteractionResponse, + CreateInteractionResponseMessage, CreateMessage, +}; use poise::Modal; const LOGIN_INTRO: &str = indoc::indoc! {" @@ -14,34 +17,28 @@ const LOGIN_INTRO: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn login_1( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(LOGIN_INTRO).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("restart") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Link) - .emoji('🚀') - .label("Login Here") - .url(format!("https://icas.8bitsqu.id/verify?id={}", m.user.id.0)) - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Secondary) - .emoji('👉') - .label("Then continue") - .custom_id("login_2") - }) - }) - }) - }) - }) + let verify_url = format!("https://icas.8bitsqu.id/verify?id={}", m.user.id.get()); + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(LOGIN_INTRO) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("restart") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new_link(verify_url) + .emoji('🚀') + .label("Login Here"), + CreateButton::new("login_2") + .style(serenity::ButtonStyle::Secondary) + .emoji('👉') + .label("Then continue"), + ])]), + ), + ) .await?; Ok(()) } @@ -55,52 +52,50 @@ const LOGIN_FORM: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn login_2( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, data: &Data, ) -> Result<(), Error> { match crate::db::get_pending_by_id(&data.db, m.user.id.into()).await { Err(e) => { tracing::error!("{e}"); - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, something went wrong. Please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Sorry, something went wrong. Please try again") + .ephemeral(true), + ), + ) .await?; } Ok(None) => { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Error, have you completed login verification via the link?") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Error, have you completed login verification via the link?") + .ephemeral(true), + ), + ) .await?; } Ok(Some(_)) => { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(LOGIN_FORM).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("login_1") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('📑') - .label("Form") - .custom_id("login_3") - }) - }) - }) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(LOGIN_FORM) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("login_1") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new("login_3") + .style(serenity::ButtonStyle::Primary) + .emoji('📑') + .label("Form"), + ])]), + ), + ) .await?; } }; @@ -110,34 +105,28 @@ pub(crate) async fn login_2( #[tracing::instrument(skip_all)] pub(crate) async fn login_3( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content("Are you a fresher?").components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("login_2") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Success) - .emoji('✅') - .label("Fresher") - .custom_id("login_4f") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('❌') - .label("Non-fresher") - .custom_id("login_4n") - }) - }) - }) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content("Are you a fresher?") + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("login_2") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new("login_4f") + .style(serenity::ButtonStyle::Success) + .emoji('✅') + .label("Fresher"), + CreateButton::new("login_4n") + .style(serenity::ButtonStyle::Primary) + .emoji('❌') + .label("Non-fresher"), + ])]), + ), + ) .await?; Ok(()) } @@ -145,30 +134,25 @@ pub(crate) async fn login_3( #[tracing::instrument(skip_all)] pub(crate) async fn login_4( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, fresher: bool, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content("And a preferred name for Nano whois commands") - .components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("login_3") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('💬') - .label("Name") - .custom_id(if fresher { "login_5f" } else { "login_5n" }) - }) - }) - }) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content("And a preferred name for Nano whois commands") + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("login_3") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new(if fresher { "login_5f" } else { "login_5n" }) + .style(serenity::ButtonStyle::Primary) + .emoji('💬') + .label("Name"), + ])]), + ), + ) .await?; Ok(()) } @@ -184,20 +168,20 @@ struct Nickname { #[tracing::instrument(skip_all)] pub(crate) async fn login_5( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, fresher: bool, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - *i = Nickname::create( + m.create_response( + &ctx.http, + Nickname::create( None, if fresher { "login_6f".to_string() } else { "login_6n".to_string() }, - ); - i - }) + ), + ) .await?; Ok(()) } @@ -205,7 +189,7 @@ pub(crate) async fn login_5( #[tracing::instrument(skip_all)] pub(crate) async fn login_6( ctx: &serenity::Context, - m: &serenity::ModalSubmitInteraction, + m: &serenity::ModalInteraction, data: &Data, fresher: bool, ) -> Result<(), Error> { @@ -234,34 +218,38 @@ pub(crate) async fn login_6( if fresher { crate::verify::apply_role(ctx, &mut mm, data.fresher).await?; } - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(if fresher { - "Congratulations, you have completed verification and now \ - have access to the ICAS Discord and freshers thread" - } else { - "Congratulations, you have completed verification and now \ - have access to the ICAS Discord" - }) - .components(|c| c) - }) - }) + let msg = if fresher { + "Congratulations, you have completed verification and now \ + have access to the ICAS Discord and freshers thread" + } else { + "Congratulations, you have completed verification and now \ + have access to the ICAS Discord" + }; + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(msg) + .components(vec![]), + ), + ) .await?; data.au_ch_id - .send_message(&ctx.http, |cm| { - cm.add_embed(|e| { - e.thumbnail( - m.user.avatar_url().unwrap_or(super::AVATAR.to_string()), - ) - .title("Member verified via login") - .description(&m.user) - .field("Fresher", fresher, true) - .field("Nickname", nickname, true) - .field("Name", p.realname, true) - .timestamp(serenity::Timestamp::now()) - }) - }) + .send_message( + &ctx.http, + CreateMessage::new().embed( + CreateEmbed::new() + .thumbnail( + m.user.avatar_url().unwrap_or(super::AVATAR.to_string()), + ) + .title("Member verified via login") + .description(m.user.to_string()) + .field("Fresher", fresher.to_string(), true) + .field("Nickname", nickname, true) + .field("Name", p.realname, true) + .timestamp(serenity::Timestamp::now()), + ), + ) .await?; let _ = mm.remove_role(&ctx.http, data.non_member).await; if mm.roles.contains(&data.old_member) { @@ -273,13 +261,14 @@ pub(crate) async fn login_6( } Err(e) => { tracing::error!("Error: {e}"); - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, something went wrong. Please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Sorry, something went wrong. Please try again") + .ephemeral(true), + ), + ) .await?; } } diff --git a/src/verify/manual.rs b/src/verify/manual.rs index 91ec0b4..5082c18 100644 --- a/src/verify/manual.rs +++ b/src/verify/manual.rs @@ -1,5 +1,8 @@ use crate::{Data, Error}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{ + self as serenity, CreateActionRow, CreateButton, CreateEmbed, CreateInteractionResponse, + CreateInteractionResponseMessage, CreateMessage, +}; use poise::Modal; const MANUAL_INTRO: &str = indoc::indoc! {" @@ -19,34 +22,28 @@ const MANUAL_INTRO: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn manual_1( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(MANUAL_INTRO).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("restart") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Success) - .emoji('✅') - .label("Fresher") - .custom_id("manual_2f") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('❌') - .label("Non-fresher") - .custom_id("manual_2n") - }) - }) - }) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(MANUAL_INTRO) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("restart") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new("manual_2f") + .style(serenity::ButtonStyle::Success) + .emoji('✅') + .label("Fresher"), + CreateButton::new("manual_2n") + .style(serenity::ButtonStyle::Primary) + .emoji('❌') + .label("Non-fresher"), + ])]), + ), + ) .await?; Ok(()) } @@ -72,24 +69,24 @@ struct Manual { #[tracing::instrument(skip_all)] pub(crate) async fn manual_2( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, data: &Data, fresher: bool, ) -> Result<(), Error> { // Delete from manual if exists let _ = crate::db::delete_manual_by_id(&data.db, m.user.id.into()).await; - m.create_interaction_response(&ctx.http, |i| { - *i = Manual::create( + m.create_response( + &ctx.http, + Manual::create( None, if fresher { "manual_3f".to_string() } else { "manual_3n".to_string() }, - ); - i - }) + ), + ) .await?; Ok(()) } @@ -97,7 +94,7 @@ pub(crate) async fn manual_2( #[tracing::instrument(skip_all)] pub(crate) async fn manual_3( ctx: &serenity::Context, - m: &serenity::ModalSubmitInteraction, + m: &serenity::ModalInteraction, data: &Data, fresher: bool, ) -> Result<(), Error> { @@ -109,13 +106,14 @@ pub(crate) async fn manual_3( nickname, }) => { if ::url::Url::parse(&url).is_err() { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("The url provided is invalid, please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("The url provided is invalid, please try again") + .ephemeral(true), + ), + ) .await?; return Ok(()); } @@ -125,36 +123,33 @@ pub(crate) async fn manual_3( let prompt_sent = data .au_ch_id - .send_message(&ctx.http, |cm| { - cm.add_embed(|e| { - e.title("New verification request from") - .thumbnail(m.user.avatar_url().unwrap_or(super::AVATAR.to_string())) - .description(&m.user) - .field("Real Name (To be checked)", &realname, true) - .field("Imperial Shortcode (To be checked", &shortcode, true) - .field("Fresher (To be checked)", fresher, true) - .field("Nickname (Nano whois commands)", &nickname, true) - .field("Verification URL (Also displayed below)", &url, true) - .image(&url) - .timestamp(serenity::Timestamp::now()) - }) - .components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Success) - .emoji('✅') - .label("Accept") - .custom_id(format!("verify-y-{}", m.user.id)) - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('❎') - .label("Deny") - .custom_id(format!("verify-n-{}", m.user.id)) - }) - }) - }) - }) + .send_message( + &ctx.http, + CreateMessage::new() + .embed( + CreateEmbed::new() + .title("New verification request from") + .thumbnail(m.user.avatar_url().unwrap_or(super::AVATAR.to_string())) + .description(m.user.to_string()) + .field("Real Name (To be checked)", &realname, true) + .field("Imperial Shortcode (To be checked", &shortcode, true) + .field("Fresher (To be checked)", fresher.to_string(), true) + .field("Nickname (Nano whois commands)", &nickname, true) + .field("Verification URL (Also displayed below)", &url, true) + .image(&url) + .timestamp(serenity::Timestamp::now()), + ) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new(format!("verify-y-{}", m.user.id)) + .style(serenity::ButtonStyle::Success) + .emoji('✅') + .label("Accept"), + CreateButton::new(format!("verify-n-{}", m.user.id)) + .style(serenity::ButtonStyle::Danger) + .emoji('❎') + .label("Deny"), + ])]), + ) .await .is_ok(); @@ -181,22 +176,27 @@ pub(crate) async fn manual_3( "Sending your verification request failed, please try again." }; - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| d.content(msg).components(|c| c)) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(msg) + .components(vec![]), + ), + ) .await?; return Ok(()); } Err(e) => tracing::error!("{e}"), }; - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, something went wrong. Please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Sorry, something went wrong. Please try again") + .ephemeral(true), + ), + ) .await?; Ok(()) } @@ -204,7 +204,7 @@ pub(crate) async fn manual_3( #[tracing::instrument(skip_all)] pub(crate) async fn manual_4( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, data: &Data, id: &str, ) -> Result<(), Error> { @@ -214,7 +214,7 @@ pub(crate) async fn manual_4( .skip(9) .collect::() .parse::() - .map(serenity::UserId) + .map(serenity::UserId::new) .unwrap_or_default() .to_user(ctx) .await @@ -239,20 +239,25 @@ pub(crate) async fn manual_4( if fresher { crate::verify::apply_role(ctx, &mut member, data.fresher).await?; } - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.components(|c| c).embed(|e| { - e.thumbnail(user.avatar_url().unwrap_or(super::AVATAR.to_string())) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .components(vec![]) + .embed( + CreateEmbed::new() + .thumbnail( + user.avatar_url().unwrap_or(super::AVATAR.to_string()), + ) .title("Member verified via manual") - .description(&user) - .field("Fresher", fresher, true) + .description(user.to_string()) + .field("Fresher", fresher.to_string(), true) .field("Nickname", mm.nickname, true) .field("Name", mm.realname, true) - .timestamp(serenity::Timestamp::now()) - }) - }) - }) + .timestamp(serenity::Timestamp::now()), + ), + ), + ) .await?; let _ = member.remove_role(&ctx.http, data.non_member).await; if member.roles.contains(&data.old_member) { @@ -263,29 +268,33 @@ pub(crate) async fn manual_4( } Err(e) => { tracing::error!("{e}"); - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content(format!("Failed to add user {user} to member database")) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content(format!("Failed to add user {user} to member database")), + ), + ) .await?; } } } else { crate::db::delete_manual_by_id(&data.db, user.id.into()).await?; tracing::info!("{} ({}) denied via manual", user.name, user.id); - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.components(|c| c).embed(|e| { - e.title("Member denied via manual") - .description(&user) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .components(vec![]) + .embed( + CreateEmbed::new() + .title("Member denied via manual") + .description(user.to_string()) .thumbnail(user.avatar_url().unwrap_or(super::AVATAR.to_string())) - .timestamp(serenity::Timestamp::now()) - }) - }) - }) + .timestamp(serenity::Timestamp::now()), + ), + ), + ) .await?; } diff --git a/src/verify/membership.rs b/src/verify/membership.rs index 0bcce09..7c15e57 100644 --- a/src/verify/membership.rs +++ b/src/verify/membership.rs @@ -1,5 +1,8 @@ use crate::{Data, Error}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{ + self as serenity, CreateActionRow, CreateButton, CreateEmbed, CreateInteractionResponse, + CreateInteractionResponseMessage, CreateMessage, +}; use poise::Modal; const MEMBERSHIP_INTRO: &str = indoc::indoc! {" @@ -17,34 +20,28 @@ const MEMBERSHIP_INTRO: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn membership_1( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(MEMBERSHIP_INTRO).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Danger) - .emoji('🔙') - .custom_id("restart") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Success) - .emoji('✅') - .label("Fresher") - .custom_id("membership_2f") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('❌') - .label("Non-fresher") - .custom_id("membership_2n") - }) - }) - }) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(MEMBERSHIP_INTRO) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("restart") + .style(serenity::ButtonStyle::Danger) + .emoji('🔙'), + CreateButton::new("membership_2f") + .style(serenity::ButtonStyle::Success) + .emoji('✅') + .label("Fresher"), + CreateButton::new("membership_2n") + .style(serenity::ButtonStyle::Primary) + .emoji('❌') + .label("Non-fresher"), + ])]), + ), + ) .await?; Ok(()) } @@ -66,7 +63,7 @@ struct Membership { #[tracing::instrument(skip_all)] pub(crate) async fn membership_2( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, data: &Data, fresher: bool, ) -> Result<(), Error> { @@ -76,17 +73,17 @@ pub(crate) async fn membership_2( // Delete from manual if exists let _ = crate::db::delete_manual_by_id(&data.db, m.user.id.into()).await; - m.create_interaction_response(&ctx.http, |i| { - *i = Membership::create( + m.create_response( + &ctx.http, + Membership::create( None, if fresher { "membership_3f".to_string() } else { "membership_3n".to_string() }, - ); - i - }) + ), + ) .await?; Ok(()) } @@ -94,7 +91,7 @@ pub(crate) async fn membership_2( #[tracing::instrument(skip_all)] pub(crate) async fn membership_3( ctx: &serenity::Context, - m: &serenity::ModalSubmitInteraction, + m: &serenity::ModalInteraction, data: &Data, fresher: bool, ) -> Result<(), Error> { @@ -108,13 +105,14 @@ pub(crate) async fn membership_3( Ok(v) => v, Err(e) => { tracing::error!("{e}"); - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, getting membership data failed. Please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Sorry, getting membership data failed. Please try again") + .ephemeral(true), + ), + ) .await?; return Ok(()); } @@ -123,12 +121,16 @@ pub(crate) async fn membership_3( ((member.login.is_empty() && member.cid == shortcode) || member.login == shortcode) && member.order_no.to_string() == order }) else { - m.create_interaction_response(&ctx.http, |i| { - let msg = "Sorry, your order was not found, please check the \ - order number and that it is for your current year's membership"; - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| d.content(msg).ephemeral(true)) - }) + let msg = "Sorry, your order was not found, please check the \ + order number and that it is for your current year's membership"; + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content(msg) + .ephemeral(true), + ), + ) .await?; return Ok(()); }; @@ -157,32 +159,35 @@ pub(crate) async fn membership_3( if fresher { crate::verify::apply_role(ctx, &mut mm, data.fresher).await?; } - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::UpdateMessage) - .interaction_response_data(|d| { - d.content(if fresher { + m.create_response( + &ctx.http, + CreateInteractionResponse::UpdateMessage( + CreateInteractionResponseMessage::new() + .content(if fresher { "Congratulations, you have completed verification and now \ have access to the ICAS Discord and freshers thread" } else { "Congratulations, you have completed verification and now \ have access to the ICAS Discord" }) - .components(|c| c) - }) - }) + .components(vec![]), + ), + ) .await?; data.au_ch_id - .send_message(&ctx.http, |cm| { - cm.add_embed(|e| { - e.thumbnail(m.user.avatar_url().unwrap_or(super::AVATAR.to_string())) + .send_message( + &ctx.http, + CreateMessage::new().embed( + CreateEmbed::new() + .thumbnail(m.user.avatar_url().unwrap_or(super::AVATAR.to_string())) .title("Member verified via membership") - .description(&m.user) - .field("Fresher", fresher, true) + .description(m.user.to_string()) + .field("Fresher", fresher.to_string(), true) .field("Nickname", nickname, true) .field("Name", realname, true) - .timestamp(serenity::Timestamp::now()) - }) - }) + .timestamp(serenity::Timestamp::now()), + ), + ) .await?; let _ = mm.remove_role(&ctx.http, data.non_member).await; if mm.roles.contains(&data.old_member) { @@ -196,13 +201,14 @@ pub(crate) async fn membership_3( } Err(e) => tracing::error!("{e}"), }; - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, something went wrong. Please try again") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Sorry, something went wrong. Please try again") + .ephemeral(true), + ), + ) .await?; Ok(()) } diff --git a/src/verify/mod.rs b/src/verify/mod.rs index 0022fc7..0a597f6 100644 --- a/src/verify/mod.rs +++ b/src/verify/mod.rs @@ -1,5 +1,8 @@ use crate::{Data, Error}; -use poise::serenity_prelude as serenity; +use poise::serenity_prelude::{ + self as serenity, CacheHttp, CreateActionRow, CreateButton, CreateInteractionResponse, + CreateInteractionResponseMessage, CreateMessage, +}; pub(crate) mod login; pub(crate) use login::*; @@ -23,12 +26,16 @@ const INFO_MSG: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn info( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| d.content(INFO_MSG).ephemeral(true)) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content(INFO_MSG) + .ephemeral(true), + ), + ) .await?; Ok(()) } @@ -36,15 +43,19 @@ pub(crate) async fn info( #[tracing::instrument(skip_all)] pub(crate) async fn unknown( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, ) -> Result<(), Error> { - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Sorry, something went wrong. Please try again or message <@99217900254035968> for help") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content( + "Sorry, something went wrong. Please try again \ + or message <@99217900254035968> for help", + ) + .ephemeral(true), + ), + ) .await?; Ok(()) } @@ -59,7 +70,7 @@ const START_MSG: &str = indoc::indoc! {" #[tracing::instrument(skip_all)] pub(crate) async fn start( ctx: &serenity::Context, - m: &serenity::MessageComponentInteraction, + m: &serenity::ComponentInteraction, data: &Data, init: bool, ) -> Result<(), Error> { @@ -70,46 +81,41 @@ pub(crate) async fn start( if member.fresher { apply_role(ctx, &mut mm, data.fresher).await?; } - m.create_interaction_response(&ctx.http, |i| { - i.kind(serenity::InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|d| { - d.content("Welcome, you're already verified, re-applied your roles!") - .ephemeral(true) - }) - }) + m.create_response( + &ctx.http, + CreateInteractionResponse::Message( + CreateInteractionResponseMessage::new() + .content("Welcome, you're already verified, re-applied your roles!") + .ephemeral(true), + ), + ) .await?; } else { - m.create_interaction_response(&ctx.http, |i| { - i.kind(if init { - serenity::InteractionResponseType::ChannelMessageWithSource + let irm = CreateInteractionResponseMessage::new() + .content(START_MSG) + .ephemeral(true) + .components(vec![CreateActionRow::Buttons(vec![ + CreateButton::new("login_1") + .style(serenity::ButtonStyle::Primary) + .emoji('🚀') + .label("Login"), + CreateButton::new("membership_1") + .style(serenity::ButtonStyle::Secondary) + .emoji(serenity::ReactionType::Unicode("✈️".to_string())) + .label("Membership"), + CreateButton::new("manual_1") + .style(serenity::ButtonStyle::Secondary) + .emoji('🚗') + .label("Manual"), + ])]); + m.create_response( + &ctx.http, + if init { + CreateInteractionResponse::Message(irm) } else { - serenity::InteractionResponseType::UpdateMessage - }) - .interaction_response_data(|d| { - d.content(START_MSG).ephemeral(true).components(|c| { - c.create_action_row(|a| { - a.create_button(|b| { - b.style(serenity::ButtonStyle::Primary) - .emoji('🚀') - .label("Login") - .custom_id("login_1") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Secondary) - .emoji(serenity::ReactionType::Unicode("✈️".to_string())) - .label("Membership") - .custom_id("membership_1") - }) - .create_button(|b| { - b.style(serenity::ButtonStyle::Secondary) - .emoji('🚗') - .label("Manual") - .custom_id("manual_1") - }) - }) - }) - }) - }) + CreateInteractionResponse::UpdateMessage(irm) + }, + ) .await?; }; Ok(()) @@ -135,14 +141,15 @@ pub(crate) async fn remove_role( #[tracing::instrument(skip_all)] pub(crate) async fn welcome_user( - http: impl AsRef, + http: impl CacheHttp, channel: &serenity::ChannelId, user: &serenity::User, fresher: bool, ) -> Result<(), Error> { channel - .send_message(http, |m| { - m.content(format!( + .send_message( + http, + CreateMessage::new().content(format!( "Welcome to ICAS {user}, if you have any questions, \ feel free to ping a committee member{}!", if fresher { @@ -150,8 +157,8 @@ pub(crate) async fn welcome_user( } else { "" } - )) - }) + )), + ) .await?; Ok(()) }