mirror of
https://github.com/natsukagami/youmubot.git
synced 2025-04-20 01:08:55 +00:00
Update youmubot-core
This commit is contained in:
parent
3f115eaab0
commit
08d639944e
10 changed files with 167 additions and 354 deletions
255
Cargo.lock
generated
255
Cargo.lock
generated
|
@ -107,22 +107,6 @@ dependencies = [
|
||||||
"syn 2.0.48",
|
"syn 2.0.48",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[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 0.17.3",
|
|
||||||
"webpki-roots 0.22.6",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atoi"
|
name = "atoi"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
|
@ -174,12 +158,6 @@ dependencies = [
|
||||||
"rustc-demangle",
|
"rustc-demangle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "base64"
|
|
||||||
version = "0.13.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
version = "0.21.7"
|
version = "0.21.7"
|
||||||
|
@ -356,17 +334,6 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "command_attr"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "07b787d19b9806dd4c9c34b2b4147d1a61d6120d93ee289521ab9b0294d198e4"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn 1.0.109",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "command_attr"
|
name = "command_attr"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
@ -1004,10 +971,10 @@ dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http",
|
"http",
|
||||||
"hyper",
|
"hyper",
|
||||||
"rustls 0.21.10",
|
"rustls",
|
||||||
"rustls-native-certs",
|
"rustls-native-certs",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls 0.24.1",
|
"tokio-rustls",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1442,15 +1409,6 @@ dependencies = [
|
||||||
"vcpkg",
|
"vcpkg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ordered-float"
|
|
||||||
version = "2.10.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "osuparse"
|
name = "osuparse"
|
||||||
version = "2.0.1"
|
version = "2.0.1"
|
||||||
|
@ -1700,7 +1658,7 @@ version = "0.11.24"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
|
checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.21.7",
|
"base64",
|
||||||
"bytes",
|
"bytes",
|
||||||
"encoding_rs",
|
"encoding_rs",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
|
@ -1720,7 +1678,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustls 0.21.10",
|
"rustls",
|
||||||
"rustls-pemfile",
|
"rustls-pemfile",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -1729,7 +1687,7 @@ dependencies = [
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-native-tls",
|
"tokio-native-tls",
|
||||||
"tokio-rustls 0.24.1",
|
"tokio-rustls",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"url",
|
"url",
|
||||||
|
@ -1737,25 +1695,10 @@ dependencies = [
|
||||||
"wasm-bindgen-futures",
|
"wasm-bindgen-futures",
|
||||||
"wasm-streams",
|
"wasm-streams",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"webpki-roots 0.25.4",
|
"webpki-roots",
|
||||||
"winreg",
|
"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]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.17.7"
|
version = "0.17.7"
|
||||||
|
@ -1766,7 +1709,7 @@ dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"libc",
|
"libc",
|
||||||
"spin 0.9.8",
|
"spin 0.9.8",
|
||||||
"untrusted 0.9.0",
|
"untrusted",
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1851,18 +1794,6 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[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]]
|
[[package]]
|
||||||
name = "rustls"
|
name = "rustls"
|
||||||
version = "0.21.10"
|
version = "0.21.10"
|
||||||
|
@ -1870,7 +1801,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
|
checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"ring 0.17.7",
|
"ring",
|
||||||
"rustls-webpki",
|
"rustls-webpki",
|
||||||
"sct",
|
"sct",
|
||||||
]
|
]
|
||||||
|
@ -1893,7 +1824,7 @@ version = "1.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
|
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.21.7",
|
"base64",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1902,16 +1833,10 @@ version = "0.101.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
|
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ring 0.17.7",
|
"ring",
|
||||||
"untrusted 0.9.0",
|
"untrusted",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustversion"
|
|
||||||
version = "1.0.14"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.16"
|
version = "1.0.16"
|
||||||
|
@ -1948,8 +1873,8 @@ version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
|
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ring 0.17.7",
|
"ring",
|
||||||
"untrusted 0.9.0",
|
"untrusted",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2003,16 +1928,6 @@ dependencies = [
|
||||||
"serde_derive",
|
"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",
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.196"
|
version = "1.0.196"
|
||||||
|
@ -2059,42 +1974,6 @@ dependencies = [
|
||||||
"yaml-rust",
|
"yaml-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serenity"
|
|
||||||
version = "0.11.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a7a89cef23483fc9d4caf2df41e6d3928e18aada84c56abd237439d929622c6"
|
|
||||||
dependencies = [
|
|
||||||
"async-trait",
|
|
||||||
"async-tungstenite",
|
|
||||||
"base64 0.21.7",
|
|
||||||
"bitflags 1.3.2",
|
|
||||||
"bytes",
|
|
||||||
"cfg-if",
|
|
||||||
"chrono",
|
|
||||||
"command_attr 0.4.2",
|
|
||||||
"dashmap",
|
|
||||||
"flate2",
|
|
||||||
"futures",
|
|
||||||
"levenshtein",
|
|
||||||
"mime",
|
|
||||||
"mime_guess",
|
|
||||||
"parking_lot",
|
|
||||||
"percent-encoding",
|
|
||||||
"reqwest",
|
|
||||||
"rustversion",
|
|
||||||
"serde",
|
|
||||||
"serde-value",
|
|
||||||
"serde_json",
|
|
||||||
"static_assertions",
|
|
||||||
"time",
|
|
||||||
"tokio",
|
|
||||||
"tracing",
|
|
||||||
"typemap_rev 0.1.5",
|
|
||||||
"url",
|
|
||||||
"uwl",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serenity"
|
name = "serenity"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
|
@ -2103,11 +1982,11 @@ checksum = "385647faa24a889929028973650a4f158fb1b4272b2fcf94feb9fcc3c009e813"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64 0.21.7",
|
"base64",
|
||||||
"bitflags 2.4.2",
|
"bitflags 2.4.2",
|
||||||
"bytes",
|
"bytes",
|
||||||
"chrono",
|
"chrono",
|
||||||
"command_attr 0.5.1",
|
"command_attr",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
"flate2",
|
"flate2",
|
||||||
"futures",
|
"futures",
|
||||||
|
@ -2125,23 +2004,12 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-tungstenite",
|
"tokio-tungstenite",
|
||||||
"tracing",
|
"tracing",
|
||||||
"typemap_rev 0.3.0",
|
"typemap_rev",
|
||||||
"typesize",
|
"typesize",
|
||||||
"url",
|
"url",
|
||||||
"uwl",
|
"uwl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[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]]
|
[[package]]
|
||||||
name = "sha1"
|
name = "sha1"
|
||||||
version = "0.10.6"
|
version = "0.10.6"
|
||||||
|
@ -2361,7 +2229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
|
checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.21.7",
|
"base64",
|
||||||
"bitflags 2.4.2",
|
"bitflags 2.4.2",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
@ -2404,7 +2272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
|
checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.21.7",
|
"base64",
|
||||||
"bitflags 2.4.2",
|
"bitflags 2.4.2",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
@ -2664,24 +2532,13 @@ dependencies = [
|
||||||
"tokio",
|
"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]]
|
[[package]]
|
||||||
name = "tokio-rustls"
|
name = "tokio-rustls"
|
||||||
version = "0.24.1"
|
version = "0.24.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustls 0.21.10",
|
"rustls",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2704,11 +2561,11 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"log",
|
"log",
|
||||||
"rustls 0.21.10",
|
"rustls",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls 0.24.1",
|
"tokio-rustls",
|
||||||
"tungstenite 0.20.1",
|
"tungstenite",
|
||||||
"webpki-roots 0.25.4",
|
"webpki-roots",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2775,27 +2632,6 @@ version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tungstenite"
|
|
||||||
version = "0.17.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0"
|
|
||||||
dependencies = [
|
|
||||||
"base64 0.13.1",
|
|
||||||
"byteorder",
|
|
||||||
"bytes",
|
|
||||||
"http",
|
|
||||||
"httparse",
|
|
||||||
"log",
|
|
||||||
"rand",
|
|
||||||
"rustls 0.20.9",
|
|
||||||
"sha-1",
|
|
||||||
"thiserror",
|
|
||||||
"url",
|
|
||||||
"utf-8",
|
|
||||||
"webpki",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tungstenite"
|
name = "tungstenite"
|
||||||
version = "0.20.1"
|
version = "0.20.1"
|
||||||
|
@ -2809,19 +2645,13 @@ dependencies = [
|
||||||
"httparse",
|
"httparse",
|
||||||
"log",
|
"log",
|
||||||
"rand",
|
"rand",
|
||||||
"rustls 0.21.10",
|
"rustls",
|
||||||
"sha1",
|
"sha1",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"url",
|
"url",
|
||||||
"utf-8",
|
"utf-8",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "typemap_rev"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typemap_rev"
|
name = "typemap_rev"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
@ -2905,12 +2735,6 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
|
checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "untrusted"
|
|
||||||
version = "0.7.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "untrusted"
|
name = "untrusted"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
|
@ -3073,25 +2897,6 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"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.7",
|
|
||||||
"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]]
|
[[package]]
|
||||||
name = "webpki-roots"
|
name = "webpki-roots"
|
||||||
version = "0.25.4"
|
version = "0.25.4"
|
||||||
|
@ -3301,7 +3106,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"serenity 0.12.0",
|
"serenity",
|
||||||
"tokio",
|
"tokio",
|
||||||
"youmubot-cf",
|
"youmubot-cf",
|
||||||
"youmubot-core",
|
"youmubot-core",
|
||||||
|
@ -3323,7 +3128,7 @@ dependencies = [
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"serenity 0.12.0",
|
"serenity",
|
||||||
"tokio",
|
"tokio",
|
||||||
"youmubot-db",
|
"youmubot-db",
|
||||||
"youmubot-prelude",
|
"youmubot-prelude",
|
||||||
|
@ -3339,7 +3144,7 @@ dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"rand",
|
"rand",
|
||||||
"serde",
|
"serde",
|
||||||
"serenity 0.11.7",
|
"serenity",
|
||||||
"static_assertions",
|
"static_assertions",
|
||||||
"tokio",
|
"tokio",
|
||||||
"youmubot-db",
|
"youmubot-db",
|
||||||
|
@ -3354,7 +3159,7 @@ dependencies = [
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"rustbreak",
|
"rustbreak",
|
||||||
"serde",
|
"serde",
|
||||||
"serenity 0.12.0",
|
"serenity",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3385,7 +3190,7 @@ dependencies = [
|
||||||
"rosu-v2",
|
"rosu-v2",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serenity 0.12.0",
|
"serenity",
|
||||||
"time",
|
"time",
|
||||||
"youmubot-db",
|
"youmubot-db",
|
||||||
"youmubot-db-sql",
|
"youmubot-db-sql",
|
||||||
|
@ -3404,7 +3209,7 @@ dependencies = [
|
||||||
"flume 0.10.14",
|
"flume 0.10.14",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serenity 0.12.0",
|
"serenity",
|
||||||
"tokio",
|
"tokio",
|
||||||
"youmubot-db",
|
"youmubot-db",
|
||||||
"youmubot-db-sql",
|
"youmubot-db-sql",
|
||||||
|
|
|
@ -7,7 +7,7 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serenity = { version = "0.11.2", features = ["collector"] }
|
serenity = { version = "0.12", features = ["collector"] }
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
serde = { version = "1.0.137", features = ["derive"] }
|
serde = { version = "1.0.137", features = ["derive"] }
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use futures_util::{stream, TryStreamExt};
|
use futures_util::{stream, TryStreamExt};
|
||||||
use serenity::{
|
use serenity::{
|
||||||
|
builder::GetMessages,
|
||||||
framework::standard::{
|
framework::standard::{
|
||||||
macros::{command, group},
|
macros::{command, group},
|
||||||
Args, CommandResult,
|
Args, CommandResult,
|
||||||
|
@ -31,7 +32,7 @@ async fn clean(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||||
let limit = args.single().unwrap_or(10);
|
let limit = args.single().unwrap_or(10);
|
||||||
let messages = msg
|
let messages = msg
|
||||||
.channel_id
|
.channel_id
|
||||||
.messages(&ctx.http, |b| b.before(msg.id).limit(limit))
|
.messages(&ctx.http, GetMessages::new().before(msg.id).limit(limit))
|
||||||
.await?;
|
.await?;
|
||||||
let channel = msg.channel_id.to_channel(&ctx).await?;
|
let channel = msg.channel_id.to_channel(&ctx).await?;
|
||||||
match &channel {
|
match &channel {
|
||||||
|
|
|
@ -7,9 +7,7 @@ use serenity::{
|
||||||
channel::Message,
|
channel::Message,
|
||||||
id::{GuildId, RoleId, UserId},
|
id::{GuildId, RoleId, UserId},
|
||||||
},
|
},
|
||||||
CacheAndHttp,
|
|
||||||
};
|
};
|
||||||
use std::sync::Arc;
|
|
||||||
use youmubot_prelude::*;
|
use youmubot_prelude::*;
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
|
@ -45,7 +43,7 @@ pub async fn soft_ban(ctx: &Context, msg: &Message, mut args: Args) -> CommandRe
|
||||||
Some(v) => v,
|
Some(v) => v,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut member = guild.member(&ctx, &user).await?;
|
let member = guild.member(&ctx, &user).await?;
|
||||||
match duration {
|
match duration {
|
||||||
None if member.roles.contains(&role) => {
|
None if member.roles.contains(&role) => {
|
||||||
msg.reply(&ctx, format!("⛓ Lifting soft-ban for user {}.", user.tag()))
|
msg.reply(&ctx, format!("⛓ Lifting soft-ban for user {}.", user.tag()))
|
||||||
|
@ -85,7 +83,7 @@ pub async fn soft_ban(ctx: &Context, msg: &Message, mut args: Args) -> CommandRe
|
||||||
pub async fn soft_ban_init(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
|
pub async fn soft_ban_init(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||||
let role_id = args.single::<RoleId>()?;
|
let role_id = args.single::<RoleId>()?;
|
||||||
let data = ctx.data.read().await;
|
let data = ctx.data.read().await;
|
||||||
let guild = msg.guild(ctx).unwrap();
|
let guild = msg.guild_id.unwrap().to_partial_guild(&ctx).await?;
|
||||||
// Check whether the role_id is the one we wanted
|
// Check whether the role_id is the one we wanted
|
||||||
if !guild.roles.contains_key(&role_id) {
|
if !guild.roles.contains_key(&role_id) {
|
||||||
return Err(Error::msg(format!("{} is not a role in this server.", role_id)).into());
|
return Err(Error::msg(format!("{} is not a role in this server.", role_id)).into());
|
||||||
|
@ -105,7 +103,7 @@ pub async fn soft_ban_init(ctx: &Context, msg: &Message, mut args: Args) -> Comm
|
||||||
}
|
}
|
||||||
|
|
||||||
// Watch the soft bans. Blocks forever.
|
// Watch the soft bans. Blocks forever.
|
||||||
pub async fn watch_soft_bans(cache_http: Arc<CacheAndHttp>, data: AppData) {
|
pub async fn watch_soft_bans(cache_http: impl CacheHttp, data: AppData) {
|
||||||
loop {
|
loop {
|
||||||
// Scope so that locks are released
|
// Scope so that locks are released
|
||||||
{
|
{
|
||||||
|
@ -115,7 +113,7 @@ pub async fn watch_soft_bans(cache_http: Arc<CacheAndHttp>, data: AppData) {
|
||||||
let mut db = data.borrow().unwrap().clone();
|
let mut db = data.borrow().unwrap().clone();
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
for (server_id, bans) in db.iter_mut() {
|
for (server_id, bans) in db.iter_mut() {
|
||||||
let server_name: String = match server_id.to_partial_guild(&*cache_http.http).await
|
let server_name: String = match server_id.to_partial_guild(cache_http.http()).await
|
||||||
{
|
{
|
||||||
Err(_) => continue,
|
Err(_) => continue,
|
||||||
Ok(v) => v.name,
|
Ok(v) => v.name,
|
||||||
|
@ -153,17 +151,17 @@ pub async fn watch_soft_bans(cache_http: Arc<CacheAndHttp>, data: AppData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn lift_soft_ban_for(
|
async fn lift_soft_ban_for(
|
||||||
cache_http: &CacheAndHttp,
|
cache_http: impl CacheHttp,
|
||||||
server_id: GuildId,
|
server_id: GuildId,
|
||||||
server_name: &str,
|
server_name: &str,
|
||||||
ban_role: RoleId,
|
ban_role: RoleId,
|
||||||
user_id: UserId,
|
user_id: UserId,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut m = server_id.member(cache_http, user_id).await?;
|
let m = server_id.member(&cache_http, user_id).await?;
|
||||||
println!(
|
println!(
|
||||||
"Soft-ban for `{}` in server `{}` unlifted.",
|
"Soft-ban for `{}` in server `{}` unlifted.",
|
||||||
m.user.name, server_name
|
m.user.name, server_name
|
||||||
);
|
);
|
||||||
m.remove_role(&cache_http.http, ban_role).await?;
|
m.remove_role(cache_http.http(), ban_role).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ use rand::{
|
||||||
thread_rng,
|
thread_rng,
|
||||||
};
|
};
|
||||||
use serenity::{
|
use serenity::{
|
||||||
|
builder::CreateMessage,
|
||||||
framework::standard::{
|
framework::standard::{
|
||||||
macros::{command, group},
|
macros::{command, group},
|
||||||
Args, CommandError as Error, CommandResult,
|
Args, CommandError as Error, CommandResult,
|
||||||
|
@ -62,13 +63,11 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult
|
||||||
let online_only = !flags.contains("everyone");
|
let online_only = !flags.contains("everyone");
|
||||||
|
|
||||||
let users: Result<Vec<_>, Error> = {
|
let users: Result<Vec<_>, Error> = {
|
||||||
let guild = m.guild(ctx).unwrap();
|
let presences = m.guild(&ctx.cache).unwrap().presences.clone();
|
||||||
let presences = &guild.presences;
|
|
||||||
let channel = m.channel_id.to_channel(&ctx).await?;
|
let channel = m.channel_id.to_channel(&ctx).await?;
|
||||||
if let Channel::Guild(channel) = channel {
|
if let Channel::Guild(channel) = channel {
|
||||||
Ok(channel
|
Ok(channel
|
||||||
.members(&ctx)
|
.members(&ctx)?
|
||||||
.await?
|
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|v| !v.user.bot) // Filter out bots
|
.filter(|v| !v.user.bot) // Filter out bots
|
||||||
.filter(|v| {
|
.filter(|v| {
|
||||||
|
@ -84,9 +83,7 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult
|
||||||
})
|
})
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
})
|
})
|
||||||
.map(future::ready)
|
.filter_map(|member| {
|
||||||
.collect::<stream::FuturesUnordered<_>>()
|
|
||||||
.filter_map(|member| async move {
|
|
||||||
// Filter by role if provided
|
// Filter by role if provided
|
||||||
match role {
|
match role {
|
||||||
Some(role) if member.roles.iter().any(|r| role == *r) => Some(member),
|
Some(role) if member.roles.iter().any(|r| role == *r) => Some(member),
|
||||||
|
@ -94,8 +91,7 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect()
|
.collect())
|
||||||
.await)
|
|
||||||
} else {
|
} else {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
|
@ -118,8 +114,10 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult
|
||||||
};
|
};
|
||||||
|
|
||||||
m.channel_id
|
m.channel_id
|
||||||
.send_message(&ctx, |c| {
|
.send_message(
|
||||||
c.content(
|
&ctx,
|
||||||
|
CreateMessage::new()
|
||||||
|
.content(
|
||||||
MessageBuilder::new()
|
MessageBuilder::new()
|
||||||
.push("👑 The Gensokyo gods have gathered around and decided, out of ")
|
.push("👑 The Gensokyo gods have gathered around and decided, out of ")
|
||||||
.push_bold(format!("{}", users.len()))
|
.push_bold(format!("{}", users.len()))
|
||||||
|
@ -129,14 +127,14 @@ pub async fn choose(ctx: &Context, m: &Message, mut args: Args) -> CommandResult
|
||||||
.unwrap_or_else(|| "potential prayers".to_owned()),
|
.unwrap_or_else(|| "potential prayers".to_owned()),
|
||||||
)
|
)
|
||||||
.push(", ")
|
.push(", ")
|
||||||
.push(winner.mention())
|
.push(winner.mention().to_string())
|
||||||
.push(" will be ")
|
.push(" will be ")
|
||||||
.push_bold_safe(title)
|
.push_bold_safe(title)
|
||||||
.push(". Congrats! 🎉 🎊 🥳")
|
.push(". Congrats! 🎉 🎊 🥳")
|
||||||
.build(),
|
.build(),
|
||||||
)
|
)
|
||||||
.reference_message(m)
|
.reference_message(m),
|
||||||
})
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::db::Roles as DB;
|
use crate::db::Roles as DB;
|
||||||
use serenity::{
|
use serenity::{
|
||||||
|
builder::EditMessage,
|
||||||
framework::standard::{macros::command, Args, CommandResult},
|
framework::standard::{macros::command, Args, CommandResult},
|
||||||
model::{
|
model::{
|
||||||
channel::{Message, ReactionType},
|
channel::{Message, ReactionType},
|
||||||
|
@ -100,7 +101,8 @@ async fn list(ctx: &Context, m: &Message, _: Args) -> CommandResult {
|
||||||
m.push_line("```");
|
m.push_line("```");
|
||||||
m.push(format!("Page **{}/{}**", page + 1, pages));
|
m.push(format!("Page **{}/{}**", page + 1, pages));
|
||||||
|
|
||||||
msg.edit(ctx, |f| f.content(m.to_string())).await?;
|
msg.edit(ctx, EditMessage::new().content(m.to_string()))
|
||||||
|
.await?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -140,7 +142,7 @@ async fn toggle(ctx: &Context, m: &Message, mut args: Args) -> CommandResult {
|
||||||
m.reply(&ctx, "This role is not self-assignable. Check the `listroles` command to see which role can be assigned.").await?;
|
m.reply(&ctx, "This role is not self-assignable. Check the `listroles` command to see which role can be assigned.").await?;
|
||||||
}
|
}
|
||||||
Some(role) => {
|
Some(role) => {
|
||||||
let mut member = guild.member(&ctx, m.author.id).await.unwrap();
|
let member = guild.member(&ctx, m.author.id).await.unwrap();
|
||||||
if member.roles.contains(&role.id) {
|
if member.roles.contains(&role.id) {
|
||||||
member.remove_role(&ctx, &role).await?;
|
member.remove_role(&ctx, &role).await?;
|
||||||
m.reply(&ctx, format!("Role `{}` has been removed.", role.name))
|
m.reply(&ctx, format!("Role `{}` has been removed.", role.name))
|
||||||
|
@ -252,7 +254,7 @@ async fn remove(ctx: &Context, m: &Message, mut args: Args) -> CommandResult {
|
||||||
/// Parse a string as a role.
|
/// Parse a string as a role.
|
||||||
fn role_from_string(role: &str, roles: &std::collections::HashMap<RoleId, Role>) -> Option<Role> {
|
fn role_from_string(role: &str, roles: &std::collections::HashMap<RoleId, Role>) -> Option<Role> {
|
||||||
match role.parse::<u64>() {
|
match role.parse::<u64>() {
|
||||||
Ok(id) if roles.contains_key(&RoleId(id)) => roles.get(&RoleId(id)).cloned(),
|
Ok(id) if roles.contains_key(&RoleId::new(id)) => roles.get(&RoleId::new(id)).cloned(),
|
||||||
_ => roles
|
_ => roles
|
||||||
.iter()
|
.iter()
|
||||||
.find_map(|(_, r)| if r.name == role { Some(r) } else { None })
|
.find_map(|(_, r)| if r.name == role { Some(r) } else { None })
|
||||||
|
@ -417,7 +419,8 @@ mod reaction_watcher {
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use flume::{Receiver, Sender};
|
use flume::{Receiver, Sender};
|
||||||
use serenity::{
|
use serenity::{
|
||||||
collector::ReactionAction,
|
all::Reaction,
|
||||||
|
builder::{CreateMessage, EditMessage},
|
||||||
model::{
|
model::{
|
||||||
channel::{Message, ReactionType},
|
channel::{Message, ReactionType},
|
||||||
guild::Role as DiscordRole,
|
guild::Role as DiscordRole,
|
||||||
|
@ -468,7 +471,10 @@ mod reaction_watcher {
|
||||||
roles: Vec<(Role, DiscordRole, ReactionType)>,
|
roles: Vec<(Role, DiscordRole, ReactionType)>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut msg = channel
|
let mut msg = channel
|
||||||
.send_message(&ctx, |c| c.content("Youmu is setting up the message..."))
|
.send_message(
|
||||||
|
&ctx,
|
||||||
|
CreateMessage::new().content("Youmu is setting up the message..."),
|
||||||
|
)
|
||||||
.await?;
|
.await?;
|
||||||
self.setup(&mut msg, ctx, guild, title, roles).await
|
self.setup(&mut msg, ctx, guild, title, roles).await
|
||||||
}
|
}
|
||||||
|
@ -481,8 +487,9 @@ mod reaction_watcher {
|
||||||
roles: Vec<(Role, DiscordRole, ReactionType)>,
|
roles: Vec<(Role, DiscordRole, ReactionType)>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
// Send a message
|
// Send a message
|
||||||
msg.edit(&ctx, |m| {
|
msg.edit(
|
||||||
m.content({
|
&ctx,
|
||||||
|
EditMessage::new().content({
|
||||||
let mut builder = serenity::utils::MessageBuilder::new();
|
let mut builder = serenity::utils::MessageBuilder::new();
|
||||||
builder
|
builder
|
||||||
.push_bold("Role Menu:")
|
.push_bold("Role Menu:")
|
||||||
|
@ -492,16 +499,16 @@ mod reaction_watcher {
|
||||||
.push_line("");
|
.push_line("");
|
||||||
for (role, discord_role, emoji) in &roles {
|
for (role, discord_role, emoji) in &roles {
|
||||||
builder
|
builder
|
||||||
.push(emoji)
|
.push(emoji.to_string())
|
||||||
.push(" ")
|
.push(" ")
|
||||||
.push_bold_safe(&discord_role.name)
|
.push_bold_safe(&discord_role.name)
|
||||||
.push(": ")
|
.push(": ")
|
||||||
.push_line_safe(&role.description)
|
.push_line_safe(&role.description)
|
||||||
.push_line("");
|
.push_line("");
|
||||||
}
|
}
|
||||||
builder
|
builder.build()
|
||||||
})
|
}),
|
||||||
})
|
)
|
||||||
.await?;
|
.await?;
|
||||||
// Do reactions
|
// Do reactions
|
||||||
for (_, _, emoji) in &roles {
|
for (_, _, emoji) in &roles {
|
||||||
|
@ -566,13 +573,19 @@ mod reaction_watcher {
|
||||||
|
|
||||||
async fn handle(ctx: Context, recv: Receiver<()>, guild: GuildId, message: MessageId) {
|
async fn handle(ctx: Context, recv: Receiver<()>, guild: GuildId, message: MessageId) {
|
||||||
let mut recv = recv.into_recv_async();
|
let mut recv = recv.into_recv_async();
|
||||||
let collect = || {
|
let mut collect = serenity::collector::collect(&ctx.shard, move |event| {
|
||||||
serenity::collector::CollectReaction::new(&ctx)
|
match event {
|
||||||
.message_id(message)
|
serenity::all::Event::ReactionAdd(r) => Some((r.reaction.clone(), true)),
|
||||||
.removed(true)
|
serenity::all::Event::ReactionRemove(r) => Some((r.reaction.clone(), false)),
|
||||||
};
|
_ => None,
|
||||||
|
}
|
||||||
|
.filter(|(r, _)| r.message_id == message)
|
||||||
|
});
|
||||||
|
// serenity::collector::CollectReaction::new(&ctx)
|
||||||
|
// .message_id(message)
|
||||||
|
// .removed(true)
|
||||||
loop {
|
loop {
|
||||||
let reaction = match future::select(recv, collect()).await {
|
let (reaction, is_add) = match future::select(recv, collect.next()).await {
|
||||||
future::Either::Left(_) => break,
|
future::Either::Left(_) => break,
|
||||||
future::Either::Right((r, new_recv)) => {
|
future::Either::Right((r, new_recv)) => {
|
||||||
recv = new_recv;
|
recv = new_recv;
|
||||||
|
@ -582,8 +595,9 @@ mod reaction_watcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
eprintln!("{:?}", reaction);
|
eprintln!("{:?} {}", reaction, is_add);
|
||||||
if let Err(e) = Self::handle_reaction(&ctx, guild, message, &reaction).await {
|
if let Err(e) = Self::handle_reaction(&ctx, guild, message, &reaction, is_add).await
|
||||||
|
{
|
||||||
eprintln!("Handling {:?}: {}", reaction, e);
|
eprintln!("Handling {:?}: {}", reaction, e);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -594,15 +608,16 @@ mod reaction_watcher {
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
guild: GuildId,
|
guild: GuildId,
|
||||||
message: MessageId,
|
message: MessageId,
|
||||||
reaction: &ReactionAction,
|
reaction: &Reaction,
|
||||||
|
is_add: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let data = ctx.data.read().await;
|
let data = ctx.data.read().await;
|
||||||
// Collect user
|
// Collect user
|
||||||
let user_id = match reaction.as_inner_ref().user_id {
|
let user_id = match reaction.user_id {
|
||||||
Some(id) => id,
|
Some(id) => id,
|
||||||
None => return Ok(()),
|
None => return Ok(()),
|
||||||
};
|
};
|
||||||
let mut member = match guild.member(ctx, user_id).await.ok() {
|
let member = match guild.member(ctx, user_id).await.ok() {
|
||||||
Some(m) => m,
|
Some(m) => m,
|
||||||
None => return Ok(()),
|
None => return Ok(()),
|
||||||
};
|
};
|
||||||
|
@ -620,7 +635,7 @@ mod reaction_watcher {
|
||||||
.ok_or_else(|| Error::msg("message is no longer a role list handler"))?
|
.ok_or_else(|| Error::msg("message is no longer a role list handler"))?
|
||||||
.iter()
|
.iter()
|
||||||
.find_map(|(role, role_reaction)| {
|
.find_map(|(role, role_reaction)| {
|
||||||
if &reaction.as_inner_ref().emoji == role_reaction {
|
if &reaction.emoji == role_reaction {
|
||||||
Some(role.id)
|
Some(role.id)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -631,9 +646,10 @@ mod reaction_watcher {
|
||||||
None => return Ok(()),
|
None => return Ok(()),
|
||||||
};
|
};
|
||||||
|
|
||||||
match reaction {
|
if is_add {
|
||||||
ReactionAction::Added(_) => member.add_role(&ctx, role).await.pls_ok(),
|
member.add_role(&ctx, role).await.pls_ok();
|
||||||
ReactionAction::Removed(_) => member.remove_role(&ctx, role).await.pls_ok(),
|
} else {
|
||||||
|
member.remove_role(&ctx, role).await.pls_ok();
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,10 @@
|
||||||
use serenity::framework::standard::CommandError as Error;
|
use serenity::all::{Message, ReactionType, UserId};
|
||||||
use serenity::{
|
use serenity::builder::{CreateEmbed, CreateEmbedAuthor, CreateMessage};
|
||||||
collector::ReactionAction,
|
use serenity::framework::standard::macros::command;
|
||||||
framework::standard::{macros::command, Args, CommandResult},
|
use serenity::framework::standard::{Args, CommandError as Error, CommandResult};
|
||||||
model::{
|
use serenity::{self, collector, utils::MessageBuilder};
|
||||||
channel::{Message, ReactionType},
|
use std::collections::{HashMap as Map, HashSet as Set};
|
||||||
id::UserId,
|
|
||||||
},
|
|
||||||
utils::MessageBuilder,
|
|
||||||
};
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{
|
|
||||||
collections::{HashMap as Map, HashSet as Set},
|
|
||||||
convert::TryFrom,
|
|
||||||
};
|
|
||||||
use youmubot_prelude::{Duration as ParseDuration, *};
|
use youmubot_prelude::{Duration as ParseDuration, *};
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
|
@ -86,18 +78,18 @@ pub async fn vote(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||||
let author = msg.author.clone();
|
let author = msg.author.clone();
|
||||||
let asked = msg.timestamp;
|
let asked = msg.timestamp;
|
||||||
let until = *asked + (chrono::Duration::from_std(*duration).unwrap());
|
let until = *asked + (chrono::Duration::from_std(*duration).unwrap());
|
||||||
let panel = channel.send_message(&ctx, |c| {
|
let panel = channel.send_message(&ctx,
|
||||||
c.content("@here").embed(|e| {
|
CreateMessage::new().content("@here").embed(
|
||||||
e.author(|au| {
|
CreateEmbed::new().author( {
|
||||||
au.icon_url(author.avatar_url().unwrap_or_else(|| "".to_owned()))
|
CreateEmbedAuthor::new(&author.name).icon_url(author.avatar_url().unwrap_or_else(|| "".to_owned()))
|
||||||
.name(&author.name)
|
|
||||||
})
|
})
|
||||||
.title(format!("Please vote! Poll ends {}", until.format("<t:%s:R>")))
|
.title(format!("Please vote! Poll ends {}", until.format("<t:%s:R>")))
|
||||||
.thumbnail("https://images-ext-2.discordapp.net/external/BK7injOyt4XT8yNfbCDV4mAkwoRy49YPfq-3IwCc_9M/http/cdn.i.ntere.st/p/9197498/image")
|
.thumbnail("https://images-ext-2.discordapp.net/external/BK7injOyt4XT8yNfbCDV4mAkwoRy49YPfq-3IwCc_9M/http/cdn.i.ntere.st/p/9197498/image")
|
||||||
.description(MessageBuilder::new().push_bold_line_safe(&question).push("\nThis question was asked by ").push(author.mention()))
|
.description(
|
||||||
|
MessageBuilder::new().push_bold_line_safe(&question).push("\nThis question was asked by ").push(author.mention().to_string()).build())
|
||||||
.fields(fields.into_iter())
|
.fields(fields.into_iter())
|
||||||
})
|
)
|
||||||
}).await?;
|
).await?;
|
||||||
msg.delete(&ctx).await?;
|
msg.delete(&ctx).await?;
|
||||||
|
|
||||||
// React on all the choices
|
// React on all the choices
|
||||||
|
@ -115,16 +107,17 @@ pub async fn vote(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// Collect reactions...
|
// Collect reactions...
|
||||||
let user_reactions = panel
|
let message_id = panel.id;
|
||||||
.await_reactions(ctx)
|
let user_reactions = collector::collect(&ctx.shard, move |event| {
|
||||||
.removed(true)
|
match event {
|
||||||
.timeout(*duration)
|
serenity::all::Event::ReactionAdd(r) => Some((r.reaction.clone(), true)),
|
||||||
.build()
|
serenity::all::Event::ReactionRemove(r) => Some((r.reaction.clone(), false)),
|
||||||
.fold(user_reactions, |mut set, reaction| async move {
|
_ => None,
|
||||||
let (reaction, is_add) = match &*reaction {
|
}
|
||||||
ReactionAction::Added(r) => (r, true),
|
.filter(|(r, _)| r.message_id == message_id)
|
||||||
ReactionAction::Removed(r) => (r, false),
|
})
|
||||||
};
|
.take_until(tokio::time::timeout(*duration, future::ready(())))
|
||||||
|
.fold(user_reactions, |mut set, (reaction, is_add)| async move {
|
||||||
let users = if let ReactionType::Unicode(ref s) = reaction.emoji {
|
let users = if let ReactionType::Unicode(ref s) = reaction.emoji {
|
||||||
if let Some(users) = set.get_mut(s.as_str()) {
|
if let Some(users) = set.get_mut(s.as_str()) {
|
||||||
users
|
users
|
||||||
|
@ -171,13 +164,14 @@ pub async fn vote(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||||
}
|
}
|
||||||
|
|
||||||
channel
|
channel
|
||||||
.send_message(&ctx, |c| {
|
.send_message(
|
||||||
c.content({
|
&ctx,
|
||||||
|
CreateMessage::new().content({
|
||||||
let mut content = MessageBuilder::new();
|
let mut content = MessageBuilder::new();
|
||||||
content
|
content
|
||||||
.push("@here, ")
|
.push("@here, ")
|
||||||
.push(asked.format("<t:%s:R>, "))
|
.push(asked.format("<t:%s:R>, ").to_string())
|
||||||
.push(author.mention())
|
.push(author.mention().to_string())
|
||||||
.push(" asked ")
|
.push(" asked ")
|
||||||
.push_bold_safe(&question)
|
.push_bold_safe(&question)
|
||||||
.push(", and here are the results!");
|
.push(", and here are the results!");
|
||||||
|
@ -199,8 +193,8 @@ pub async fn vote(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
content.build()
|
content.build()
|
||||||
})
|
}),
|
||||||
})
|
)
|
||||||
.await?;
|
.await?;
|
||||||
panel.delete(&ctx).await?;
|
panel.delete(&ctx).await?;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
use serenity::builder::EditMessage;
|
||||||
use serenity::framework::standard::CommandError as Error;
|
use serenity::framework::standard::CommandError as Error;
|
||||||
use serenity::{
|
use serenity::{
|
||||||
framework::standard::{
|
framework::standard::{
|
||||||
|
@ -72,14 +73,15 @@ async fn message_command(
|
||||||
if page >= images.len() {
|
if page >= images.len() {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
} else {
|
} else {
|
||||||
msg.edit(ctx, |f| {
|
msg.edit(
|
||||||
f.content(format!(
|
ctx,
|
||||||
|
EditMessage::new().content(format!(
|
||||||
"[🖼️ **{}/{}**] Here's the image you requested!\n\n{}",
|
"[🖼️ **{}/{}**] Here's the image you requested!\n\n{}",
|
||||||
page + 1,
|
page + 1,
|
||||||
images.len(),
|
images.len(),
|
||||||
images[page]
|
images[page]
|
||||||
))
|
)),
|
||||||
})
|
)
|
||||||
.await
|
.await
|
||||||
.map(|_| true)
|
.map(|_| true)
|
||||||
.map_err(|e| e.into())
|
.map_err(|e| e.into())
|
||||||
|
@ -110,7 +112,6 @@ async fn get_image(
|
||||||
))
|
))
|
||||||
.query(&[("limit", "50"), ("random", "true")])
|
.query(&[("limit", "50"), ("random", "true")])
|
||||||
.build()?;
|
.build()?;
|
||||||
println!("{:?}", req.url());
|
|
||||||
let response: Vec<PostResponse> = client.execute(req).await?.json().await?;
|
let response: Vec<PostResponse> = client.execute(req).await?.json().await?;
|
||||||
Ok(response
|
Ok(response
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
|
@ -3,7 +3,7 @@ use serenity::model::id::UserId;
|
||||||
const ALL_NAMES: usize = FIRST_NAMES.len() * LAST_NAMES.len();
|
const ALL_NAMES: usize = FIRST_NAMES.len() * LAST_NAMES.len();
|
||||||
// Get a name from the user's id.
|
// Get a name from the user's id.
|
||||||
pub fn name_from_userid(u: UserId) -> (&'static str, &'static str) {
|
pub fn name_from_userid(u: UserId) -> (&'static str, &'static str) {
|
||||||
let u = u.0 as usize % ALL_NAMES;
|
let u = u.get() as usize % ALL_NAMES;
|
||||||
(
|
(
|
||||||
FIRST_NAMES[u / LAST_NAMES.len()], // Not your standard mod
|
FIRST_NAMES[u / LAST_NAMES.len()], // Not your standard mod
|
||||||
LAST_NAMES[u % LAST_NAMES.len()],
|
LAST_NAMES[u % LAST_NAMES.len()],
|
||||||
|
|
|
@ -5,7 +5,7 @@ use serenity::{
|
||||||
model::{channel::Message, id::UserId},
|
model::{channel::Message, id::UserId},
|
||||||
};
|
};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use youmubot_prelude::*;
|
use youmubot_prelude::{announcer::CacheAndHttp, *};
|
||||||
|
|
||||||
pub mod admin;
|
pub mod admin;
|
||||||
pub mod community;
|
pub mod community;
|
||||||
|
@ -31,7 +31,7 @@ pub fn setup(
|
||||||
|
|
||||||
// Create handler threads
|
// Create handler threads
|
||||||
tokio::spawn(admin::watch_soft_bans(
|
tokio::spawn(admin::watch_soft_bans(
|
||||||
client.cache_and_http.clone(),
|
CacheAndHttp::from_client(client),
|
||||||
client.data.clone(),
|
client.data.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue