diff --git a/.gitignore b/.gitignore index 908ac31d..b406cea7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ ljconfig .DS_Store /**/target /**/.DS_Store + .idea semver cmd/nursery/ban_possibilities \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index a2145c49..482dd719 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2612,7 +2612,6 @@ name = "permission_checks" version = "0.1.0" dependencies = [ "botox", - "config", "dashmap 6.1.0", "kittycat", "log", diff --git a/Cargo.toml b/Cargo.toml index c8b849ee..cd88448d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "core/rust/*", "core/rust.*", "services/rust.*" ] diff --git a/core/rust b/core/rust index a4d913d3..1ab683a5 160000 --- a/core/rust +++ b/core/rust @@ -1 +1 @@ -Subproject commit a4d913d316ce4f250463902c91b660c905905e25 +Subproject commit 1ab683a553f437e530f22f725c64955cf18c83f9 diff --git a/core/rust.binutils/Cargo.lock b/core/rust.binutils/Cargo.lock deleted file mode 100644 index e5331f0d..00000000 --- a/core/rust.binutils/Cargo.lock +++ /dev/null @@ -1,4521 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "base_data" -version = "0.1.0" -dependencies = [ - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "calendrical_calculations" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe3bc6a50b4667fafdb6d9cf26731c5418c457e317d8166c972014facf9a5d" -dependencies = [ - "core_maths", - "displaydoc", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core_maths" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" -dependencies = [ - "libm", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_filter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fancy-regex" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7493d4c459da9f84325ad297371a6b2b8a162800873a22e3b6b6512e61d18c05" -dependencies = [ - "bit-set", - "regex", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "fixed_decimal" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc7fdec9d7f6671a3ebb3282c969962aba67c49f6abac5311959b65cafabc10" -dependencies = [ - "displaydoc", - "smallvec", - "writeable", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gwevent" -version = "0.0.1" -dependencies = [ - "chrono", - "extract_map", - "indexmap", - "log", - "serde", - "serde_json", - "serenity", - "small-fixed-array", - "strum", - "strum_macros", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21be1c98fbdb29fff7e34b2939a4f30dad330d4cc20f7be1b3956e21032f67ba" -dependencies = [ - "icu_calendar", - "icu_casemap", - "icu_collator", - "icu_collections", - "icu_compactdecimal", - "icu_datetime", - "icu_decimal", - "icu_displaynames", - "icu_list", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_plurals", - "icu_properties", - "icu_provider", - "icu_relativetime", - "icu_segmenter", - "icu_timezone", -] - -[[package]] -name = "icu_calendar" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb932a690c92f87955e923106181ee0d5682e688ff37fb5c7b296e1fe806edb" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22aec7d032735d9acb256eeef72adcac43c3b7572f19b51576a63d664b524ca2" - -[[package]] -name = "icu_casemap" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7988d4f2655012592ac5b027722a93fbe12ff2a86d3e0f9ae686aedba0984f5e" -dependencies = [ - "displaydoc", - "icu_casemap_data", - "icu_collections", - "icu_locid", - "icu_properties", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_casemap_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36409fb8ce6f87c408310d87396ac471cc7320e007e648814c607c60fe77cc5" - -[[package]] -name = "icu_collator" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a45056e541cffde068f5c81ac1c0503b9ee2a4b967546422e509c5c653750" -dependencies = [ - "displaydoc", - "icu_collator_data", - "icu_collections", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39774016c5b9ad006941f3196fea83ade662d9167eb573111c8f4cc9593e2999" - -[[package]] -name = "icu_collections" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3c22da90659121ae1e38bd0fb378d15179c820f56a0c278032fb4eb5a0ca60" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_compactdecimal_data", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eaf4902ee2e804f2583611722f6961fe85f31eab7ec790f47dde2d1cd494fb" - -[[package]] -name = "icu_datetime" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508c7ed627cc0b031c81203eb98f34433e24b32b39d5b2c0238e4962a00957d" -dependencies = [ - "displaydoc", - "either", - "fixed_decimal", - "icu_calendar", - "icu_datetime_data", - "icu_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_timezone", - "smallvec", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_datetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6abc569cb4ee80b30707566f05c5c9ed4bed765f91ce41e7f5a37c5e6a75b3f" - -[[package]] -name = "icu_decimal" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf994f9ed8061c17bb313f28fba6cffc736f0a16c7fab827efc9b73fd3f7778" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "writeable", -] - -[[package]] -name = "icu_decimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2de3548316b697c70f30dec1395c9212db09df1d86a27624ee24872b71326c" - -[[package]] -name = "icu_displaynames" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726c0d83ff52f05907275f39e5bb7949a92fa3d09538de60cf73ccf8ee89a613" -dependencies = [ - "icu_displaynames_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_displaynames_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af40e6b723e5e6d9359cf0bb4e4ed6dfb9d6ab16b73b5c82b61f947e88bb30f6" - -[[package]] -name = "icu_list" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6c04ec71ad1bacdbfb47164d4801f80a0533d9340f94f1a880f521eff59f54" -dependencies = [ - "displaydoc", - "icu_list_data", - "icu_locid_transform", - "icu_provider", - "regex-automata 0.2.0", - "writeable", -] - -[[package]] -name = "icu_list_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6afcf7a9a7fedece70b7f17d7a7ecdfb8df145d37ae46d0277cd1e3932532" - -[[package]] -name = "icu_locid" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" - -[[package]] -name = "icu_normalizer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c183e31ed700f1ecd6b032d104c52fe8b15d028956b73727c97ec176b170e187" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22026918a80e6a9a330cb01b60f950e2b4e5284c59528fd0c6150076ef4c8522" - -[[package]] -name = "icu_plurals" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d807b123eb2a9ae8f12080fb8cce479f5c8a761fba0bb5ab52da6dd5e31a03" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals_data", - "icu_provider", - "zerovec", -] - -[[package]] -name = "icu_plurals_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3acd5f1f2f988ed2dae9316c3d3560dfe4e03a7516d142b4b89b92252ada41a" - -[[package]] -name = "icu_properties" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e296217453af983efa25f287a4c1da04b9a63bf1ed63719455068e4453eb5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a86c0e384532b06b6c104814f9c1b13bcd5b64409001c0d05713a1f3529d99" - -[[package]] -name = "icu_provider" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "icu_relativetime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47825312a5eb0790bad7b718fa8d41a8ea1e0ba597b4f7bb84bcfe97d7fc5aba" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_relativetime_data", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_relativetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b55cc15ea8981fbba78e9347d0c4003d4490c85f76e9adc7f270290046cae8" - -[[package]] -name = "icu_segmenter" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dc1e8f4ba33a6a4956770ac5c08570f255d6605519fb3a859a0c0a270a2f8f" -dependencies = [ - "core_maths", - "displaydoc", - "icu_collections", - "icu_locid", - "icu_provider", - "icu_segmenter_data", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_segmenter_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673d6698dcffce08cfe8fc5da3c11c3f2c663d5d6137fd58ab2cbf44235ab46" - -[[package]] -name = "icu_timezone" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35aabe571a7c653c0f543ff1512b8a1b2ad481cfa24b3d25115298d2ff3b50f" -dependencies = [ - "displaydoc", - "icu_calendar", - "icu_locid", - "icu_provider", - "icu_timezone_data", - "tinystr", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_timezone_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceee21e181cce2ab44e95923da6b3418df75369f570df82264c29c51ca398d4" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "kittycat" -version = "0.2.0" -source = "git+https://github.com/infinitybotlist/kittycat?branch=main#9656e5216715e7a79b21563304443f42b7594b8c" -dependencies = [ - "indexmap", - "serde", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "litemap" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "settings" -version = "6.0.0" -dependencies = [ - "async-recursion", - "base_data", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "modules" -version = "6.0.0" -dependencies = [ - "async-recursion", - "base_data", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "env_logger", - "extract_map", - "fred", - "futures", - "futures-util", - "gwevent", - "indexmap", - "kittycat", - "log", - "settings", - "moka", - "once_cell", - "plsfix", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_repr", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "text-diff", - "tokio", - "url", -] - -[[package]] -name = "moka" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" -dependencies = [ - "async-lock", - "async-trait", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener 5.3.0", - "futures-util", - "once_cell", - "parking_lot", - "quanta", - "rustc_version", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oem_cp" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330138902ab4dab09a86e6b7ab7ddeffb5f8435d52fe0df1bce8b06a17b10ee4" -dependencies = [ - "phf", - "phf_codegen", - "serde", - "serde_json", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plsfix" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d4fe3ff2c8c5fa4d86ee54d75ea27fe6aa93eb43209374eb1b56261e5eaf2e" -dependencies = [ - "encoding", - "encoding_rs", - "fancy-regex", - "html-escape", - "icu", - "lazy_static", - "oem_cp", - "regex", - "rustc-hash", - "unicode-normalization", -] - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "raw-cpuid" -version = "11.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" -dependencies = [ - "memchr", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "chrono", - "dashmap", - "futures", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "serenity", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 2.5.3", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "term" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "text-diff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309238dd66f8bf11a20d015b727b926f294a13fcb8d56770bb984e7a22c43897" -dependencies = [ - "getopts", - "term", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-width" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" - -[[package]] -name = "yoke" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zerofrom" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zerotrie" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0594125a0574fb93059c92c588ab209cc036a23d1baeb3410fa9181bea551a0" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff4439ae91fb5c72b8abc12f3f2dbf51bd27e6eadb9f8a5bc8898dddb0e27ea" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4e5997cbf58990550ef1f0e5124a05e47e1ebd33a84af25739be6031a62c20" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] diff --git a/core/rust.binutils/Cargo.toml b/core/rust.binutils/Cargo.toml deleted file mode 100644 index 277f48aa..00000000 --- a/core/rust.binutils/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "bot_binutils" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -poise = { git = "https://github.com/Anti-Raid/poise", branch = "serenity-next" } -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -log = "0.4" -silverpelt = { path = "../rust.silverpelt" } -permission_checks = { path = "../rust.permissions.checks" } -config = { path = "../rust.config" } -templating = { path = "../rust.templating" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" diff --git a/core/rust.binutils/src/lib.rs b/core/rust.binutils/src/lib.rs deleted file mode 100644 index aaf069c2..00000000 --- a/core/rust.binutils/src/lib.rs +++ /dev/null @@ -1,388 +0,0 @@ -use log::{error, info}; -use silverpelt::{data::Data, Context, Error}; - -/// Code to call on startup -pub async fn on_startup(ctx: serenity::all::Context) -> Result<(), crate::Error> { - let data = ctx.data::(); - // For every GuildId with templates, fire a OnStartup event - let guilds = sqlx::query!("SELECT guild_id FROM guild_templates") - .fetch_all(&data.pool) - .await?; - - for guild in guilds { - let Ok(guild_id) = guild.guild_id.parse::() else { - continue; - }; - - templating::cache::clear_cache(guild_id).await; - - match silverpelt::ar_event::dispatch_event_to_modules( - &silverpelt::ar_event::EventHandlerContext { - guild_id, - data: data.clone(), - event: silverpelt::ar_event::AntiraidEvent::OnStartup(vec![]), - serenity_context: ctx.clone(), - }, - ) - .await - .map_err(|e| { - format!("Failed to dispatch event: {}", { - let mut strs = String::new(); - - for err in e { - strs.push_str(&format!("{}\n", err)); - } - - strs - }) - }) { - Ok(_) => {} - Err(e) => { - error!("Failed to dispatch OnStartup event: {}", e); - } - } - } - - Ok(()) -} - -/// Standard error handler for Anti-Raid -pub async fn on_error(error: poise::FrameworkError<'_, Data, Error>) { - match error { - poise::FrameworkError::Command { error, ctx, .. } => { - error!("Error in command `{}`: {:?}", ctx.command().name, error,); - - let err = ctx - .send( - poise::CreateReply::new() - .embed( - serenity::all::CreateEmbed::new() - .color(serenity::all::Color::RED) - .title("An error has occurred") - .description(error.to_string()), - ) - .components(vec![serenity::all::CreateActionRow::Buttons( - vec![serenity::all::CreateButton::new_link( - &config::CONFIG.meta.support_server_invite, - ) - .label("Support Server")] - .into(), - )]), - ) - .await; - - if let Err(e) = err { - error!("Message send error for FrameworkError::Command: {}", e); - } - } - poise::FrameworkError::CommandCheckFailed { error, ctx, .. } => { - error!( - "[Possible] error in command `{}`: {:?}", - ctx.command().qualified_name, - error, - ); - - if let Some(error) = error { - error!("Error in command `{}`: {:?}", ctx.command().name, error,); - - let err = ctx - .send( - poise::CreateReply::new() - .embed( - serenity::all::CreateEmbed::new() - .color(serenity::all::Color::RED) - .title("Command Check Failed") - .description(error.to_string()), - ) - .components(vec![serenity::all::CreateActionRow::Buttons( - vec![serenity::all::CreateButton::new_link( - &config::CONFIG.meta.support_server_invite, - ) - .label("Support Server")] - .into(), - )]), - ) - .await; - - if let Err(e) = err { - error!( - "Message send error for FrameworkError::CommandCheckFailed: {}", - e - ); - } - } - } - poise::FrameworkError::CommandPanic { payload, ctx, .. } => { - error!( - "Command `{}` panicked: {:?}", - ctx.command().qualified_name, - payload, - ); - - let err = ctx - .send( - poise::CreateReply::new() - .embed( - serenity::all::CreateEmbed::new() - .color(serenity::all::Color::RED) - .title("Command Panic") - .description(format!("The command panicked. Please report this on our support server.\n\n```{}`", payload.unwrap_or("No payload provided".to_string()))), - ) - .components(vec![serenity::all::CreateActionRow::Buttons(vec![ - serenity::all::CreateButton::new_link( - &config::CONFIG.meta.support_server_invite, - ) - .label("Support Server"), - ].into())]), - ) - .await; - - if let Err(e) = err { - error!("Message send error for FrameworkError::CommandPanic: {}", e); - } - } - error => { - if let Err(e) = poise::builtins::on_error(error).await { - error!("Error while handling error: {}", e); - } - } - } -} - -pub fn setup_message<'a>() -> poise::CreateReply<'a> { - poise::CreateReply::new() - .embed( - serenity::all::CreateEmbed::new() - .title("Thank you for adding AntiRaid") - .description(r#"While you have successfully added AntiRaid to your server, it won't do much until you take some time to configure it to your needs. - -Please check out the `User Guide` and use the `Website` to tailor AntiRaid to the needs of your server! And, if you need help, feel free to join our `Support Server`! - -*Note: Feel free to rerun the command you were trying to run once you're content with your AntiRaid configuration* - "#) - ) - .components( - vec![ - serenity::all::CreateActionRow::Buttons( - vec![ - serenity::all::CreateButton::new_link( - config::CONFIG.sites.docs.clone(), - ) - .label("User Guide"), - serenity::all::CreateButton::new_link( - config::CONFIG.sites.frontend.clone(), - ) - .label("Website"), - serenity::all::CreateButton::new_link( - config::CONFIG.meta.support_server_invite.clone(), - ) - .label("Support Server") - ].into() - ) - ] - ) -} - -pub async fn command_check(ctx: Context<'_>) -> Result { - let guild_id = ctx.guild_id(); - - let Some(guild_id) = guild_id else { - return Err("This command can only be run from servers".into()); - }; - - let data = ctx.data(); - - let guild_onboarding_status = sqlx::query!( - "SELECT finished_onboarding FROM guilds WHERE id = $1", - guild_id.to_string() - ) - .fetch_optional(&data.pool) - .await?; - - if let Some(guild_onboarding_status) = guild_onboarding_status { - if !guild_onboarding_status.finished_onboarding { - // Send setup message instead - ctx.send(setup_message()).await?; - - // Set onboarding status to true - sqlx::query!( - "UPDATE guilds SET finished_onboarding = true WHERE id = $1", - guild_id.to_string() - ) - .execute(&data.pool) - .await?; - - return Ok(false); - } - } else { - // Guild not found, create it - sqlx::query!( - "INSERT INTO guilds (id, finished_onboarding) VALUES ($1, true)", - guild_id.to_string() - ) - .execute(&data.pool) - .await?; - - // Send setup message instead - ctx.send(setup_message()).await?; - return Ok(false); - } - - let user = sqlx::query!( - "SELECT COUNT(*) FROM users WHERE user_id = $1", - guild_id.to_string() - ) - .fetch_one(&data.pool) - .await?; - - if user.count.unwrap_or_default() == 0 { - // User not found, create it - sqlx::query!( - "INSERT INTO users (user_id) VALUES ($1)", - guild_id.to_string() - ) - .execute(&data.pool) - .await?; - } - - let command = ctx.command(); - - let res = permission_checks::check_command( - &data.silverpelt_cache, - &command.qualified_name, - guild_id, - ctx.author().id, - &data.pool, - ctx.serenity_context(), - &data.reqwest, - &Some(ctx), - permission_checks::CheckCommandOptions { - channel_id: Some(ctx.channel_id()), - ..Default::default() - }, - ) - .await; - - if res.is_ok() { - return Ok(true); - } - - ctx.send( - poise::CreateReply::new().embed( - serenity::all::CreateEmbed::new() - .color(serenity::all::Color::RED) - .title("You don't have permission to use this command?") - .description(res.to_markdown()) - .field("Code", format!("`{}`", res.code()), false), - ), - ) - .await?; - - Ok(false) -} - -pub fn get_commands( - silverpelt_cache: &silverpelt::cache::SilverpeltCache, -) -> Vec> { - let mut cmds = Vec::new(); - - let mut _cmd_names = Vec::new(); - for module in silverpelt_cache.module_cache.iter() { - log::info!("Loading module {}", module.id()); - - match module.validate() { - Ok(_) => {} - Err(e) => { - panic!("Error validating module {}: {}", module.id(), e); - } - } - - if module.virtual_module() { - continue; - } - - for (mut cmd, extended_data) in module.raw_commands() { - let root_is_virtual = match extended_data.get("") { - Some(root) => root.virtual_command, - None => false, - }; - - if root_is_virtual { - continue; - } - - cmd.category = Some(module.id().into()); - - let mut subcommands = Vec::new(); - // Ensure subcommands are also linked to a category - for subcommand in cmd.subcommands { - let ext_data = extended_data.get(&*subcommand.name).unwrap_or_else(|| { - panic!("Subcommand {} does not have extended data", subcommand.name) - }); - - if ext_data.virtual_command { - continue; - } - - subcommands.push(poise::Command { - category: Some(module.id().into()), - ..subcommand - }); - } - - cmd.subcommands = subcommands; - - // Check for duplicate command names - if _cmd_names.contains(&cmd.name) { - error!("Duplicate command name: {:#?}", cmd); - panic!("Duplicate command name: {}", cmd.qualified_name); - } - - _cmd_names.push(cmd.name.clone()); - - // Check for duplicate command aliases - for alias in cmd.aliases.iter() { - if _cmd_names.contains(alias) { - panic!( - "Duplicate command alias: {} from command {}", - alias, cmd.name - ); - } - - _cmd_names.push(alias.clone()); - } - - // Good to go - cmds.push(cmd); - } - } - - cmds -} - -pub fn get_tasks(ctx: &serenity::all::Context, data: &Data) -> Vec { - // Get all tasks - let mut tasks = Vec::new(); - for module in data.silverpelt_cache.module_cache.iter() { - let module = module.value(); - for (task, confirm_task) in module.background_tasks() { - let (confirmed, reason) = (confirm_task)(ctx); - if confirmed { - info!( - "Adding task {} with confirm_task reason: {}", - task.name, reason - ); - } else { - info!( - "Skipping task {} as it is disabled for reason: {}", - task.name, reason - ); - continue; - } - - tasks.push(task); - } - } - - tasks -} diff --git a/core/rust.bot_modules.core/Cargo.toml b/core/rust.bot_modules.core/Cargo.toml index 5e258b89..9a82055e 100644 --- a/core/rust.bot_modules.core/Cargo.toml +++ b/core/rust.bot_modules.core/Cargo.toml @@ -15,16 +15,16 @@ serde_json = "1.0" indexmap = { version = "2", features = ["serde"] } # Anti-Raid specific -silverpelt = { path = "../rust.silverpelt" } -permissions = { path = "../rust.permissions" } -permission_checks = { path = "../rust.permissions.checks" } -config = { path = "../rust.config" } -sandwich_driver = { path = "../rust.sandwich_driver" } +silverpelt = { path = "../rust/rust.silverpelt" } +permissions = { path = "../rust/rust.permissions" } +permission_checks = { path = "../rust/rust.permissions.checks" } +config = { path = "../rust/rust.config" } +sandwich_driver = { path = "../rust/rust.sandwich_driver" } rust_buildstats = { path = "../rust.buildstats" } -ar_settings = { path = "../rust.settings" } -splashcore_rs = { path = "../rust.std" } -templating = { path = "../rust.templating" } -gwevent = { path = "../rust.gwevent" } +ar_settings = { path = "../rust/rust.settings" } +splashcore_rs = { path = "../rust/rust.std" } +templating = { path = "../rust/rust.templating" } +gwevent = { path = "../rust/rust.gwevent" } log = "0.4" [dependencies.serenity] diff --git a/core/rust.bot_modules.lockdown/Cargo.toml b/core/rust.bot_modules.lockdown/Cargo.toml index 43e1add7..97e88a5a 100644 --- a/core/rust.bot_modules.lockdown/Cargo.toml +++ b/core/rust.bot_modules.lockdown/Cargo.toml @@ -14,11 +14,11 @@ indexmap = { version = "2", features = ["serde"] } async-trait = "0.1.80" # Anti-Raid specific -silverpelt = { path = "../rust.silverpelt" } -splashcore_rs = { path = "../rust.std" } -ar_settings = { path = "../rust.settings" } -lockdowns = { path = "../rust.lockdowns" } -permission_checks = { path = "../rust.permissions.checks" } +silverpelt = { path = "../rust/rust.silverpelt" } +splashcore_rs = { path = "../rust/rust.std" } +ar_settings = { path = "../rust/rust.settings" } +lockdowns = { path = "../rust/rust.lockdowns" } +permission_checks = { path = "../rust/rust.permissions.checks" } [dependencies.serenity] git = "https://github.com/Anti-Raid/serenity" diff --git a/core/rust.bot_modules.moderation/Cargo.toml b/core/rust.bot_modules.moderation/Cargo.toml index 5eb33ca0..0e01f011 100644 --- a/core/rust.bot_modules.moderation/Cargo.toml +++ b/core/rust.bot_modules.moderation/Cargo.toml @@ -13,12 +13,12 @@ indexmap = { version = "2", features = ["serde"] } futures-util = "0.3" # Anti-Raid specific -splashcore_rs = { path = "../rust.std" } -silverpelt = { path = "../rust.silverpelt" } -permissions = { path = "../rust.permissions" } -config = { path = "../rust.config" } -sandwich_driver = { path = "../rust.sandwich_driver" } -jobserver = { path = "../rust.jobserver" } +splashcore_rs = { path = "../rust/rust.std" } +silverpelt = { path = "../rust/rust.silverpelt" } +permissions = { path = "../rust/rust.permissions" } +config = { path = "../rust/rust.config" } +sandwich_driver = { path = "../rust/rust.sandwich_driver" } +jobserver = { path = "../rust/rust.jobserver" } [dependencies.serenity] git = "https://github.com/Anti-Raid/serenity" diff --git a/core/rust.bot_modules.server_backups/Cargo.toml b/core/rust.bot_modules.server_backups/Cargo.toml index 5d658c67..6a627956 100644 --- a/core/rust.bot_modules.server_backups/Cargo.toml +++ b/core/rust.bot_modules.server_backups/Cargo.toml @@ -14,11 +14,11 @@ futures-util = "0.3" indexmap = { version = "2", features = ["serde"] } # Anti-Raid specific -silverpelt = { path = "../rust.silverpelt" } -permission_checks = { path = "../rust.permissions.checks" } -splashcore_rs = { path = "../rust.std" } -config = { path = "../rust.config" } -jobserver = { path = "../rust.jobserver" } +silverpelt = { path = "../rust/rust.silverpelt" } +permission_checks = { path = "../rust/rust.permissions.checks" } +splashcore_rs = { path = "../rust/rust.std" } +config = { path = "../rust/rust.config" } +jobserver = { path = "../rust/rust.jobserver" } [dependencies.serenity] git = "https://github.com/Anti-Raid/serenity" diff --git a/core/rust.bot_modules.temporary_punishments/Cargo.toml b/core/rust.bot_modules.temporary_punishments/Cargo.toml index 37de6935..cde13ca7 100644 --- a/core/rust.bot_modules.temporary_punishments/Cargo.toml +++ b/core/rust.bot_modules.temporary_punishments/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -silverpelt = { path = "../rust.silverpelt" } -sandwich_driver = { path = "../rust.sandwich_driver" } -splashcore_rs = { path = "../rust.std" } +silverpelt = { path = "../rust/rust.silverpelt" } +sandwich_driver = { path = "../rust/rust.sandwich_driver" } +splashcore_rs = { path = "../rust/rust.std" } async-trait = "0.1.80" [dependencies.serenity] diff --git a/core/rust.bot_modules_default/Cargo.toml b/core/rust.bot_modules_default/Cargo.toml index aa860cab..3dbf910f 100644 --- a/core/rust.bot_modules_default/Cargo.toml +++ b/core/rust.bot_modules_default/Cargo.toml @@ -7,11 +7,11 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -silverpelt = { path = "../rust.silverpelt" } +silverpelt = { path = "../rust/rust.silverpelt" } # Modules -bot_modules_core = { path = "../../core/rust.bot_modules.core" } -bot_modules_lockdown = { path = "../../core/rust.bot_modules.lockdown" } -bot_modules_moderation = { path = "../../core/rust.bot_modules.moderation" } -bot_modules_server_backups = { path = "../../core/rust.bot_modules.server_backups" } -bot_modules_temporary_punishments = { path = "../../core/rust.bot_modules.temporary_punishments" } \ No newline at end of file +bot_modules_core = { path = "../rust.bot_modules.core" } +bot_modules_lockdown = { path = "../rust.bot_modules.lockdown" } +bot_modules_moderation = { path = "../rust.bot_modules.moderation" } +bot_modules_server_backups = { path = "../rust.bot_modules.server_backups" } +bot_modules_temporary_punishments = { path = "../rust.bot_modules.temporary_punishments" } \ No newline at end of file diff --git a/core/rust.config/Cargo.lock b/core/rust.config/Cargo.lock deleted file mode 100644 index 32026701..00000000 --- a/core/rust.config/Cargo.lock +++ /dev/null @@ -1,3333 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "base_data" -version = "0.1.0" -dependencies = [ - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "chrono", - "dashmap", - "futures", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "serenity", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/core/rust.config/Cargo.toml b/core/rust.config/Cargo.toml deleted file mode 100644 index c05146d7..00000000 --- a/core/rust.config/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "config" -version = "0.1.0" -edition = "2021" - -[dependencies] -serde = "1.0" -chrono = { version = "0.4", features = ["serde"]} -serde_yaml = "0.9" -rusty-s3 = "0.5" - -# Anti-Raid specific -splashcore_rs = { path = "../rust.std" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] diff --git a/core/rust.config/src/lib.rs b/core/rust.config/src/lib.rs deleted file mode 100644 index fe8971ab..00000000 --- a/core/rust.config/src/lib.rs +++ /dev/null @@ -1,151 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serenity::all::UserId; -use splashcore_rs::objectstore::ObjectStore; -use std::fs::File; -use std::sync::LazyLock; - -type Error = Box; - -/// Global config object -pub static CONFIG: LazyLock = - LazyLock::new(|| Config::load().expect("Failed to load config")); - -#[derive(Serialize, Deserialize, Default)] -pub struct DiscordAuth { - pub token: String, - pub client_id: String, - pub client_secret: String, - pub root_users: Vec, -} - -// Object storage code -#[derive(Serialize, Deserialize)] -pub enum ObjectStorageType { - #[serde(rename = "s3-like")] - S3Like, - #[serde(rename = "local")] - Local, -} - -#[derive(Serialize, Deserialize)] -pub struct ObjectStorage { - #[serde(rename = "type")] - pub object_storage_type: ObjectStorageType, - pub path: String, - pub endpoint: Option, - pub secure: Option, - pub cdn_secure: Option, - pub cdn_endpoint: String, - pub access_key: Option, - pub secret_key: Option, -} - -impl ObjectStorage { - pub fn build(&self) -> Result { - match self.object_storage_type { - ObjectStorageType::S3Like => { - let access_key = self.access_key.as_ref().ok_or("Missing access key")?; - let secret_key = self.secret_key.as_ref().ok_or("Missing secret key")?; - let endpoint = self.endpoint.as_ref().ok_or("Missing endpoint")?; - - let bucket = rusty_s3::Bucket::new( - format!( - "{}://{}", - if self.secure.unwrap_or(false) { - "https" - } else { - "http" - }, - endpoint - ) - .parse() - .map_err(|e| format!("Failed to parse cdn endpoint: {}", e))?, - rusty_s3::UrlStyle::Path, - self.path.clone(), - "us-east-1", - )?; - - let credentials = rusty_s3::Credentials::new(access_key, secret_key); - Ok(ObjectStore::S3 { - credentials, - bucket, - }) - } - ObjectStorageType::Local => Ok(ObjectStore::Local { - prefix: self.path.clone(), - }), - } - } -} - -#[derive(Serialize, Deserialize, Default)] -pub struct Meta { - pub postgres_url: String, - pub redis_url: String, - pub proxy: String, - pub support_server_invite: String, - pub sandwich_http_api: String, -} - -#[derive(Serialize, Deserialize)] -pub struct Sites { - pub api: String, - pub frontend: String, - pub docs: String, -} - -#[derive(Serialize, Deserialize)] -pub struct Servers { - pub main: serenity::all::GuildId, -} - -#[derive(Serialize, Deserialize)] -#[allow(dead_code)] -pub struct BasePorts { - pub jobserver: u16, - pub bot: u16, - pub jobserver_base_addr: String, - pub jobserver_bind_addr: String, - pub bot_base_addr: String, - pub bot_bind_addr: String, -} - -#[derive(Serialize, Deserialize)] -pub struct Config { - pub discord_auth: DiscordAuth, - pub meta: Meta, - pub sites: Sites, - pub servers: Servers, - pub object_storage: ObjectStorage, - pub base_ports: BasePorts, - - #[serde(skip)] - /// Setup by load() for statistics - pub start_time: i64, -} - -impl Config { - pub fn load() -> Result { - // Open config.yaml from parent directory - let file = File::open("config.yaml"); - - match file { - Ok(file) => { - // Parse config.yaml - let mut cfg: Config = serde_yaml::from_reader(file)?; - - cfg.start_time = chrono::Utc::now().timestamp(); - - // Return config - Ok(cfg) - } - Err(e) => { - // Print error - println!("config.yaml could not be loaded: {}", e); - - // Exit - std::process::exit(1); - } - } - } -} diff --git a/core/rust.gwevent/Cargo.lock b/core/rust.gwevent/Cargo.lock deleted file mode 100644 index fbf64f62..00000000 --- a/core/rust.gwevent/Cargo.lock +++ /dev/null @@ -1,1990 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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 = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gwevent" -version = "0.0.1" -dependencies = [ - "chrono", - "extract_map", - "indexmap", - "log", - "serde", - "serde_json", - "serenity", - "small-fixed-array", - "strum", - "strum_macros", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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 = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags", -] - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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 = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/core/rust.gwevent/Cargo.toml b/core/rust.gwevent/Cargo.toml deleted file mode 100644 index ec2e914d..00000000 --- a/core/rust.gwevent/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "gwevent" -version = "0.0.1" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -log = "0.4" -strum = "0.26" - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[build-dependencies] -glob = "0.3.1" -walkdir = "2" -indexmap = { version = "2", features = ["serde"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1" - -[build-dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] diff --git a/core/rust.gwevent/README.md b/core/rust.gwevent/README.md deleted file mode 100644 index d28de422..00000000 --- a/core/rust.gwevent/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# gwevent - -``gwevent`` contains utilities to manage serenity gateway events in a single centralized location. This is a seperate crate to try reducing compilation time slightly and to seperate out common code that doesn't depend on the rest of the bot. \ No newline at end of file diff --git a/core/rust.gwevent/src/core.rs b/core/rust.gwevent/src/core.rs deleted file mode 100644 index 5d1944fb..00000000 --- a/core/rust.gwevent/src/core.rs +++ /dev/null @@ -1,354 +0,0 @@ -use log::warn; -use serenity::all::{FullEvent, GuildId, UserId}; -use strum::VariantNames; - -/// Returns all events -pub const fn event_list() -> &'static [&'static str] { - FullEvent::VARIANTS -} - -/// Given an event and a module, return its guild id (for filtering etc.) -pub fn get_event_guild_id(event: &FullEvent) -> Option { - let guild_id = match event { - FullEvent::AutoModActionExecution { execution } => execution.guild_id, - FullEvent::AutoModRuleCreate { rule, .. } => rule.guild_id, - FullEvent::AutoModRuleDelete { rule, .. } => rule.guild_id, - FullEvent::AutoModRuleUpdate { rule, .. } => rule.guild_id, - FullEvent::CacheReady { .. } => return None, // We don't want this to be propogated anyways and it's not a guild event - FullEvent::CategoryCreate { category, .. } => category.guild_id, - FullEvent::CategoryDelete { category, .. } => category.guild_id, - FullEvent::ChannelCreate { channel, .. } => channel.guild_id, - FullEvent::ChannelDelete { channel, .. } => channel.guild_id, - FullEvent::ChannelPinsUpdate { pin } => { - if let Some(guild_id) = pin.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::ChannelUpdate { new, .. } => new.guild_id, - FullEvent::CommandPermissionsUpdate { permission, .. } => permission.guild_id, - FullEvent::EntitlementCreate { entitlement, .. } => { - if let Some(guild_id) = entitlement.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::EntitlementDelete { entitlement, .. } => { - if let Some(guild_id) = entitlement.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::EntitlementUpdate { entitlement, .. } => { - if let Some(guild_id) = entitlement.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::GuildAuditLogEntryCreate { guild_id, .. } => *guild_id, - FullEvent::GuildBanAddition { guild_id, .. } => *guild_id, - FullEvent::GuildBanRemoval { guild_id, .. } => *guild_id, - FullEvent::GuildCreate { guild, .. } => guild.id, - FullEvent::GuildDelete { incomplete, .. } => incomplete.id, - FullEvent::GuildEmojisUpdate { guild_id, .. } => *guild_id, - FullEvent::GuildIntegrationsUpdate { guild_id, .. } => *guild_id, - FullEvent::GuildMemberAddition { new_member, .. } => new_member.guild_id, - FullEvent::GuildMemberRemoval { guild_id, .. } => *guild_id, - FullEvent::GuildMemberUpdate { event, .. } => event.guild_id, - FullEvent::GuildMembersChunk { chunk, .. } => chunk.guild_id, - FullEvent::GuildRoleCreate { new, .. } => new.guild_id, - FullEvent::GuildRoleDelete { guild_id, .. } => *guild_id, - FullEvent::GuildRoleUpdate { new, .. } => new.guild_id, - FullEvent::GuildScheduledEventCreate { event, .. } => event.guild_id, - FullEvent::GuildScheduledEventDelete { event, .. } => event.guild_id, - FullEvent::GuildScheduledEventUpdate { event, .. } => event.guild_id, - FullEvent::GuildScheduledEventUserAdd { subscribed, .. } => subscribed.guild_id, - FullEvent::GuildScheduledEventUserRemove { unsubscribed, .. } => unsubscribed.guild_id, - FullEvent::GuildStickersUpdate { guild_id, .. } => *guild_id, - FullEvent::GuildUpdate { new_data, .. } => new_data.id, - FullEvent::IntegrationCreate { integration, .. } => { - if let Some(guild_id) = integration.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::IntegrationDelete { guild_id, .. } => *guild_id, - FullEvent::IntegrationUpdate { integration, .. } => { - if let Some(guild_id) = integration.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::InteractionCreate { .. } => return None, // We dont handle interactions create events in event handlers - FullEvent::InviteCreate { data, .. } => { - if let Some(guild_id) = data.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::InviteDelete { data, .. } => { - if let Some(guild_id) = data.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::Message { new_message, .. } => { - if let Some(guild_id) = &new_message.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::MessageDelete { guild_id, .. } => { - if let Some(guild_id) = guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::MessageDeleteBulk { guild_id, .. } => { - if let Some(guild_id) = guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::MessagePollVoteAdd { event } => { - if let Some(guild_id) = &event.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::MessagePollVoteRemove { event } => { - if let Some(guild_id) = &event.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::MessageUpdate { event, .. } => { - if let Some(guild_id) = &event.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::PresenceUpdate { .. } => return None, // We dont handle precenses - FullEvent::Ratelimit { data, .. } => { - // Warn i guess - warn!("Ratelimit event recieved: {:?}", data); - return None; - } - FullEvent::ReactionAdd { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemove { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemoveAll { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemoveEmoji { .. } => return None, // We dont handle reactions right now - FullEvent::Ready { .. } => return None, // We dont handle ready events - FullEvent::Resume { .. } => return None, // We dont handle resume events - FullEvent::ShardStageUpdate { .. } => return None, // We dont handle shard stage updates - FullEvent::ShardsReady { .. } => return None, // We dont handle shards ready - FullEvent::StageInstanceCreate { .. } => return None, // We dont handle stage instances right now - FullEvent::StageInstanceDelete { .. } => return None, // We dont handle stage instances right now - FullEvent::StageInstanceUpdate { .. } => return None, // We dont handle stage instances right now - FullEvent::ThreadCreate { thread, .. } => thread.guild_id, - FullEvent::ThreadDelete { thread, .. } => thread.guild_id, - FullEvent::ThreadListSync { - thread_list_sync, .. - } => thread_list_sync.guild_id, - FullEvent::ThreadMemberUpdate { thread_member, .. } => { - if let Some(guild_id) = thread_member.guild_id { - guild_id.to_owned() - } else { - return None; - } - } - FullEvent::ThreadMembersUpdate { - thread_members_update, - .. - } => thread_members_update.guild_id, - FullEvent::ThreadUpdate { new, .. } => new.guild_id, - FullEvent::TypingStart { .. } => return None, // We dont handle typing start - FullEvent::UserUpdate { .. } => return None, // We dont handle user updates - FullEvent::VoiceChannelStatusUpdate { guild_id, .. } => *guild_id, - FullEvent::VoiceServerUpdate { .. } => return None, // We dont handle voice right now - FullEvent::VoiceStateUpdate { .. } => return None, // We dont handle voice right now - FullEvent::WebhookUpdate { guild_id, .. } => *guild_id, - }; - - Some(guild_id) -} - -/// Given an event and a module, return its user id -pub fn get_event_user_id(event: &FullEvent) -> Option { - let user_id = match event { - FullEvent::AutoModActionExecution { execution } => execution.user_id, - FullEvent::AutoModRuleCreate { rule, .. } => rule.creator_id, - FullEvent::AutoModRuleDelete { rule, .. } => rule.creator_id, - FullEvent::AutoModRuleUpdate { rule, .. } => rule.creator_id, - FullEvent::CacheReady { .. } => return None, // We don't want this to be propogated anyways and it's not a guild event - FullEvent::CategoryCreate { .. } => return None, // Doesn't have a known user just from event - FullEvent::CategoryDelete { .. } => return None, // Doesn't have a known user just from event - FullEvent::ChannelCreate { .. } => return None, // Doesn't have a known user just from event - FullEvent::ChannelDelete { .. } => return None, // Doesn't have a known user just from event - FullEvent::ChannelPinsUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::ChannelUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::CommandPermissionsUpdate { .. } => return None, // Doesn't have a known user just from event, - FullEvent::EntitlementCreate { entitlement, .. } => { - if let Some(user_id) = entitlement.user_id { - user_id.to_owned() - } else { - return None; - } - } - FullEvent::EntitlementDelete { entitlement, .. } => { - if let Some(user_id) = entitlement.user_id { - user_id.to_owned() - } else { - return None; - } - } - FullEvent::EntitlementUpdate { entitlement, .. } => { - if let Some(user_id) = entitlement.user_id { - user_id.to_owned() - } else { - return None; - } - } - FullEvent::GuildAuditLogEntryCreate { entry, .. } => { - if let Some(user_id) = entry.user_id { - user_id.to_owned() - } else { - return None; - } - } - FullEvent::GuildBanAddition { banned_user, .. } => banned_user.id, - FullEvent::GuildBanRemoval { unbanned_user, .. } => unbanned_user.id, - FullEvent::GuildCreate { guild, .. } => guild.owner_id, - FullEvent::GuildDelete { .. } => return None, // Doesn't have a known user just from event - FullEvent::GuildEmojisUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::GuildIntegrationsUpdate { .. } => return None, // Doesn't have a known user just from event, - FullEvent::GuildMemberAddition { new_member, .. } => new_member.user.id, - FullEvent::GuildMemberRemoval { user, .. } => user.id, - FullEvent::GuildMemberUpdate { event, .. } => event.user.id, - FullEvent::GuildMembersChunk { .. } => return None, // Doesn't have a known user just from event, - FullEvent::GuildRoleCreate { .. } => return None, // Doesn't have a known user just from event - FullEvent::GuildRoleDelete { .. } => return None, // Doesn't have a known user just from event, - FullEvent::GuildRoleUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::GuildScheduledEventCreate { event, .. } => { - if let Some(ref creator) = event.creator { - creator.id.to_owned() - } else { - return None; - } - } - FullEvent::GuildScheduledEventDelete { event, .. } => { - if let Some(ref creator) = event.creator { - creator.id.to_owned() - } else { - return None; - } - } - FullEvent::GuildScheduledEventUpdate { event, .. } => { - if let Some(ref creator) = event.creator { - creator.id.to_owned() - } else { - return None; - } - } - FullEvent::GuildScheduledEventUserAdd { subscribed, .. } => subscribed.user_id, - FullEvent::GuildScheduledEventUserRemove { unsubscribed, .. } => unsubscribed.user_id, - FullEvent::GuildStickersUpdate { .. } => return None, // Doesn't have a known user just from event, - FullEvent::GuildUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::IntegrationCreate { integration, .. } => { - if let Some(ref user) = integration.user { - user.id.to_owned() - } else { - return None; - } - } - FullEvent::IntegrationDelete { .. } => return None, // Doesn't have a known user just from event, - FullEvent::IntegrationUpdate { integration, .. } => { - if let Some(ref user) = integration.user { - user.id.to_owned() - } else { - return None; - } - } - FullEvent::InteractionCreate { .. } => return None, // We dont handle interactions create events in event handlers - FullEvent::InviteCreate { data, .. } => { - if let Some(ref inviter) = data.inviter { - inviter.id.to_owned() - } else { - return None; - } - } - FullEvent::InviteDelete { .. } => return None, // Doesn't have a known user just from event - FullEvent::Message { new_message, .. } => new_message.author.id, - FullEvent::MessageDelete { .. } => return None, // Doesn't have a known user just from event - FullEvent::MessageDeleteBulk { .. } => return None, // Doesn't have a known user just from event - FullEvent::MessagePollVoteAdd { event } => event.user_id, - FullEvent::MessagePollVoteRemove { event } => event.user_id, - FullEvent::MessageUpdate { event, new, .. } => { - if let Some(new) = new { - new.author.id.to_owned() - } else if let Some(author) = &event.author { - author.id.to_owned() - } else { - warn!("No author found in message update event: {:?}", event); - return None; - } - } - FullEvent::PresenceUpdate { .. } => return None, // We dont handle precenses - FullEvent::Ratelimit { data, .. } => { - // Warn i guess - warn!("Ratelimit event recieved: {:?}", data); - return None; - } - FullEvent::ReactionAdd { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemove { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemoveAll { .. } => return None, // We dont handle reactions right now - FullEvent::ReactionRemoveEmoji { .. } => return None, // We dont handle reactions right now - FullEvent::Ready { .. } => return None, // We dont handle ready events - FullEvent::Resume { .. } => return None, // We dont handle resume events - FullEvent::ShardStageUpdate { .. } => return None, // We dont handle shard stage updates - FullEvent::ShardsReady { .. } => return None, // We dont handle shards ready - FullEvent::StageInstanceCreate { .. } => return None, // We dont handle stage instances right now - FullEvent::StageInstanceDelete { .. } => return None, // We dont handle stage instances right now - FullEvent::StageInstanceUpdate { .. } => return None, // We dont handle stage instances right now - FullEvent::ThreadCreate { thread, .. } => { - if let Some(opener) = thread.owner_id { - opener.to_owned() - } else { - return None; - } - } - FullEvent::ThreadDelete { .. } => return None, // Doesn't have a known user just from event, - FullEvent::ThreadListSync { .. } => return None, // Doesn't have a known user just from event - FullEvent::ThreadMemberUpdate { thread_member, .. } => thread_member.user_id, - FullEvent::ThreadMembersUpdate { .. } => return None, // Doesn't have a known user just from event - FullEvent::ThreadUpdate { new, .. } => { - if let Some(opener) = new.owner_id { - opener.to_owned() - } else { - return None; - } - } - FullEvent::TypingStart { .. } => return None, // We dont handle typing start - FullEvent::UserUpdate { .. } => return None, // We dont handle user updates - FullEvent::VoiceChannelStatusUpdate { .. } => return None, // We dont handle voice right now - FullEvent::VoiceServerUpdate { .. } => return None, // We dont handle voice right now - FullEvent::VoiceStateUpdate { .. } => return None, // We dont handle voice right now - FullEvent::WebhookUpdate { .. } => return None, // Doesn't have a known user just from event - }; - - Some(user_id) -} diff --git a/core/rust.gwevent/src/lib.rs b/core/rust.gwevent/src/lib.rs deleted file mode 100644 index 5a7ca06a..00000000 --- a/core/rust.gwevent/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod core; diff --git a/core/rust.jobserver/Cargo.toml b/core/rust.jobserver/Cargo.toml deleted file mode 100644 index 548801ba..00000000 --- a/core/rust.jobserver/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "jobserver" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -poise = { git = "https://github.com/Anti-Raid/poise", branch = "serenity-next" } -chrono = { version = "0.4", features = ["serde"]} -indexmap = { version = "2", features = ["serde"] } -futures-util = "0.3" -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -config = { path = "../rust.config" } -splashcore_rs = { path = "../rust.std" } - -[dependencies.tokio] -version = "1" -features = ["sync", "macros", "rt-multi-thread"] - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] diff --git a/core/rust.jobserver/src/embed.rs b/core/rust.jobserver/src/embed.rs deleted file mode 100644 index fdd418df..00000000 --- a/core/rust.jobserver/src/embed.rs +++ /dev/null @@ -1,99 +0,0 @@ -use crate::Job; -use serenity::all::{CreateActionRow, CreateButton, CreateEmbed}; -use splashcore_rs::Error; - -pub fn get_icon_of_state(state: &str) -> String { - match state { - "pending" => ":hourglass:", - "running" => ":hourglass_flowing_sand:", - "completed" => ":white_check_mark:", - "failed" => ":x:", - _ => ":question:", - } - .to_string() -} - -pub fn embed<'a>( - base_api_url: &str, - job: &Job, - pre_embeds: Vec>, - show_status: bool, -) -> Result, Error> { - let mut job_statuses: Vec = Vec::new(); - let mut job_statuses_length = 0; - let mut components = Vec::new(); - - let job_state = &job.state; - - if show_status { - for status in &job.statuses { - if job_statuses_length > 2500 { - // Keep removing elements from start of array until we are under 2500 characters - while job_statuses_length > 2500 { - let removed = job_statuses.remove(0); - job_statuses_length -= removed.len(); - } - } - - let mut add = format!("`{}` {}", status.level, status.msg); - - let mut vs = Vec::new(); - - let bdi = status.bot_display_ignore.clone().unwrap_or_default(); - - for (k, v) in status.extra_info.iter() { - if bdi.contains(k) { - continue; - } - - vs.push(format!("{}={}", k, serde_json::to_string(v)?)); - } - - if !vs.is_empty() { - add += &format!(" {}", vs.join(", ")); - } - - add = add.chars().take(500).collect::() - + if add.len() > 500 { "..." } else { "" }; - - add += &format!(" | ", status.ts.round()); - - job_statuses_length += if add.len() > 500 { 500 } else { add.len() }; - job_statuses.push(add); - } - } - - let mut description = format!( - "{} Job state: {}\nJob ID: {}\n\n{}", - get_icon_of_state(job_state.as_str()), - job_state, - job.id, - job_statuses.join("\n") - ); - - if job.state == "completed" { - if let Some(ref output) = job.output { - let furl = format!("{}/jobs/{}/ioauth/download-link", base_api_url, job.id); - description += &format!("\n\n:link: [Download {}]({})", output.filename, &furl); - - components.push(CreateActionRow::Buttons( - vec![CreateButton::new_link(furl).label("Download").emoji('📥')].into(), - )); - } - } - - let embed = CreateEmbed::default() - .title("Status") - .description(description) - .color(serenity::all::Colour::DARK_GREEN); - - let mut msg = poise::CreateReply::default(); - - for pre_embed in pre_embeds { - msg = msg.embed(pre_embed); - } - - msg = msg.embed(embed).components(components); - - Ok(msg) -} diff --git a/core/rust.jobserver/src/lib.rs b/core/rust.jobserver/src/lib.rs deleted file mode 100644 index b8fade1f..00000000 --- a/core/rust.jobserver/src/lib.rs +++ /dev/null @@ -1,340 +0,0 @@ -pub mod embed; -pub mod poll; -pub mod spawn; - -use indexmap::IndexMap; -use splashcore_rs::objectstore::ObjectStore; -use sqlx::{types::uuid::Uuid, PgPool}; -use std::str::FromStr; -use std::time::Duration; - -#[derive(serde::Deserialize, serde::Serialize)] -pub struct SpawnResponse { - pub id: String, -} - -#[derive(serde::Deserialize, serde::Serialize)] -pub struct Spawn { - pub name: String, - pub data: serde_json::Value, - pub create: bool, - pub execute: bool, - pub id: Option, // If create is false, this is required - pub user_id: String, -} - -/// Rust internal/special type to better serialize/speed up embed creation -#[derive(serde::Deserialize, serde::Serialize, Clone, PartialEq)] -pub struct Statuses { - pub level: String, - pub msg: String, - pub ts: f64, - #[serde(rename = "botDisplayIgnore")] - pub bot_display_ignore: Option>, - - #[serde(flatten)] - pub extra_info: IndexMap, -} - -pub struct Job { - pub id: Uuid, - pub name: String, - pub output: Option, - pub fields: IndexMap, - pub statuses: Vec, - pub owner: Owner, - pub expiry: Option, - pub state: String, - pub resumable: bool, - pub created_at: chrono::NaiveDateTime, -} - -#[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct Owner { - pub id: String, - pub target_type: String, -} - -impl FromStr for Owner { - type Err = splashcore_rs::Error; - - fn from_str(s: &str) -> Result { - let mut split = s.splitn(2, '/'); - let target_type = split.next().ok_or("Invalid owner.target_type")?; - let id = split.next().ok_or("Invalid owner.id")?; - - Ok(Self { - id: id.to_string(), - target_type: target_type.to_string(), - }) - } -} - -impl From for Owner { - fn from(s: String) -> Self { - Self::from_str(&s).unwrap() - } -} - -#[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct Output { - pub filename: String, - pub segregated: bool, -} - -/// JobCreateResponse is the response upon creation of a job -#[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct JobCreateResponse { - /// The ID of the newly created task - pub id: String, -} - -impl Job { - /// Fetches a task from the database based on id - pub async fn from_id(id: Uuid, pool: &PgPool) -> Result { - let rec = sqlx::query!( - "SELECT id, name, output, statuses, owner, expiry, state, created_at, fields, resumable FROM jobs WHERE id = $1 ORDER BY created_at DESC", - id, - ) - .fetch_one(pool) - .await?; - - let mut statuses = Vec::new(); - - for status in &rec.statuses { - let status = serde_json::from_value::(status.clone())?; - statuses.push(status); - } - - let task = Job { - id: rec.id, - name: rec.name, - output: rec - .output - .map(serde_json::from_value::) - .transpose()?, - fields: serde_json::from_value::>(rec.fields)?, - statuses, - owner: rec.owner.into(), - expiry: { - if let Some(expiry) = rec.expiry { - let t = expiry.microseconds - + 60 * 1_000_000 - + (expiry.days as i64) * 24 * 60 * 60 * 1_000_000 - + (expiry.months as i64) * 30 * 24 * 60 * 60 * 1_000_000; - Some(chrono::Duration::microseconds(t)) - } else { - None - } - }, - state: rec.state, - created_at: rec.created_at, - resumable: rec.resumable, - }; - - Ok(task) - } - - /// Fetches all jobs of a guild given guild id - #[allow(dead_code)] // Will be used in the near future - pub async fn from_guild( - guild_id: serenity::all::GuildId, - pool: &sqlx::PgPool, - ) -> Result, splashcore_rs::Error> { - let recs = sqlx::query!( - "SELECT id, name, output, statuses, owner, expiry, state, created_at, fields, resumable FROM jobs WHERE owner = $1", - format!("g/{}", guild_id) - ) - .fetch_all(pool) - .await?; - - let mut jobs = Vec::new(); - - for rec in recs { - let mut statuses = Vec::new(); - - for status in &rec.statuses { - let status = serde_json::from_value::(status.clone())?; - statuses.push(status); - } - - let job = Job { - id: rec.id, - name: rec.name, - output: rec - .output - .map(serde_json::from_value::) - .transpose()?, - fields: serde_json::from_value::>(rec.fields)?, - statuses, - owner: rec.owner.into(), - expiry: { - if let Some(expiry) = rec.expiry { - let t = expiry.microseconds - + 60 * 1_000_000 - + (expiry.days as i64) * 24 * 60 * 60 * 1_000_000 - + (expiry.months as i64) * 30 * 24 * 60 * 60 * 1_000_000; - Some(chrono::Duration::microseconds(t)) - } else { - None - } - }, - state: rec.state, - created_at: rec.created_at, - resumable: rec.resumable, - }; - - jobs.push(job); - } - - Ok(jobs) - } - - /// Returns all jobs with a specific guild ID and a specific task name - pub async fn from_guild_and_name( - guild_id: serenity::all::GuildId, - name: &str, - pool: &sqlx::PgPool, - ) -> Result, splashcore_rs::Error> { - let recs = sqlx::query!( - "SELECT id, name, output, statuses, owner, expiry, state, created_at, fields, resumable FROM jobs WHERE owner = $1 AND name = $2", - format!("g/{}", guild_id), - name, - ) - .fetch_all(pool) - .await?; - - let mut jobs = Vec::new(); - - for rec in recs { - let mut statuses = Vec::new(); - - for status in &rec.statuses { - let status = serde_json::from_value::(status.clone())?; - statuses.push(status); - } - - let job = Job { - id: rec.id, - name: rec.name, - output: rec - .output - .map(serde_json::from_value::) - .transpose()?, - fields: serde_json::from_value::>(rec.fields)?, - statuses, - owner: rec.owner.into(), - expiry: { - if let Some(expiry) = rec.expiry { - let t = expiry.microseconds - + 60 * 1_000_000 - + (expiry.days as i64) * 24 * 60 * 60 * 1_000_000 - + (expiry.months as i64) * 30 * 24 * 60 * 60 * 1_000_000; - Some(chrono::Duration::microseconds(t)) - } else { - None - } - }, - state: rec.state, - created_at: rec.created_at, - resumable: rec.resumable, - }; - - jobs.push(job); - } - - Ok(jobs) - } - - pub fn format_owner_simplex(&self) -> String { - format!( - "{}/{}", - self.owner.target_type.to_lowercase(), - self.owner.id - ) - } - - pub fn get_path(&self) -> Option { - if let Some(output) = &self.output { - if output.segregated { - Some(format!( - "{}/{}/{}", - self.format_owner_simplex(), - self.name, - self.id, - )) - } else { - Some(format!("jobs/{}", self.id)) - } - } else { - None - } - } - - pub fn get_file_path(&self) -> Option { - let path = self.get_path()?; - - self.output - .as_ref() - .map(|output| format!("{}/{}", path, output.filename)) - } - - #[allow(dead_code)] - pub async fn get_url( - &self, - object_store: &ObjectStore, - ) -> Result { - // Check if the job has an output - let Some(path) = &self.get_file_path() else { - return Err("Job has no output".into()); - }; - - Ok(object_store.get_url(path, Duration::from_secs(600))) - } - - /// Deletes the job from the object storage - pub async fn delete_from_storage( - &self, - client: &reqwest::Client, - object_store: &ObjectStore, - ) -> Result<(), splashcore_rs::Error> { - // Check if the job has an output - let Some(path) = self.get_path() else { - return Err("Job has no output".into()); - }; - - let Some(outp) = &self.output else { - return Err("Job has no output".into()); - }; - - object_store - .delete(client, &format!("{}/{}", path, outp.filename)) - .await?; - - Ok(()) - } - - /// Delete the job from the database, this also consumes the job dropping it from memory - pub async fn delete_from_db(self, pool: &PgPool) -> Result<(), splashcore_rs::Error> { - sqlx::query!("DELETE FROM jobs WHERE id = $1", self.id,) - .execute(pool) - .await?; - - Ok(()) - } - - /// Deletes the job entirely, this includes deleting it from the object storage and the database - /// This also consumes the job dropping it from memory - #[allow(dead_code)] // Will be used in the near future - pub async fn delete( - self, - pool: &PgPool, - client: &reqwest::Client, - object_store: &ObjectStore, - ) -> Result<(), splashcore_rs::Error> { - self.delete_from_storage(client, object_store).await?; - self.delete_from_db(pool).await?; - - Ok(()) - } -} diff --git a/core/rust.jobserver/src/poll.rs b/core/rust.jobserver/src/poll.rs deleted file mode 100644 index 3485fa0a..00000000 --- a/core/rust.jobserver/src/poll.rs +++ /dev/null @@ -1,103 +0,0 @@ -use crate::Job; -use futures_util::Stream; -use std::sync::Arc; - -pub struct PollTaskOptions { - /// The interval at which to update/poll at in seconds - pub interval: u64, - - /// The timeout in seconds to wait for the task to change in status - pub timeout_nostatuschange: u64, -} - -impl Default for PollTaskOptions { - fn default() -> Self { - PollTaskOptions { - interval: 1, - timeout_nostatuschange: 300, - } - } -} - -pub fn reactive( - pool: &sqlx::PgPool, - id: &str, - to: PollTaskOptions, -) -> Result>, splashcore_rs::Error>>, splashcore_rs::Error> -{ - let interval = to.interval; - let timeout_nostatuschange = to.timeout_nostatuschange; - let duration = std::time::Duration::from_secs(interval); - let interval = tokio::time::interval(duration); - let id = sqlx::types::uuid::Uuid::parse_str(id)?; - let last_statuschange = tokio::time::Instant::now(); - - Ok(futures_util::stream::unfold( - JobserverStreamState { - pool: pool.clone(), - id, - timeout_nostatuschange, - prev_job: None, - interval, - last_statuschange, - at_end: false, - }, - |state| async move { - let mut state = state; - - if let Some(ref prev_job) = state.prev_job { - if prev_job.state == "completed" { - if state.at_end { - return None; - } else { - state.at_end = true; - } - } else { - state.at_end = false; - } - } - - state.interval.tick().await; - - if state.timeout_nostatuschange > 0 - && tokio::time::Instant::now() - state.last_statuschange - > tokio::time::Duration::from_secs(state.timeout_nostatuschange) - { - return Some(( - Err(format!( - "Job poll timeout of {} seconds reached without status change", - state.timeout_nostatuschange - ) - .into()), - state, - )); - } - - let job = match super::Job::from_id(state.id, &state.pool).await { - Ok(job) => Arc::new(job), - Err(e) => return Some((Err(e), state)), - }; - - if let Some(ref prev_job) = state.prev_job { - if prev_job.state == job.state && job.statuses == prev_job.statuses { - return Some((Ok(None), state)); - } - } - - state.prev_job = Some(job.clone()); - state.last_statuschange = tokio::time::Instant::now(); - - return Some((Ok(Some(job.clone())), state)); - }, - )) -} - -pub struct JobserverStreamState { - pool: sqlx::PgPool, - id: sqlx::types::Uuid, - timeout_nostatuschange: u64, - prev_job: Option>, - interval: tokio::time::Interval, - last_statuschange: tokio::time::Instant, - at_end: bool, -} diff --git a/core/rust.jobserver/src/spawn.rs b/core/rust.jobserver/src/spawn.rs deleted file mode 100644 index 52da7bd4..00000000 --- a/core/rust.jobserver/src/spawn.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub async fn spawn_task( - reqwest_client: &reqwest::Client, - spawn: &super::Spawn, -) -> Result { - let resp = reqwest_client - .post(format!( - "{}:{}/spawn", - config::CONFIG.base_ports.jobserver_base_addr, - config::CONFIG.base_ports.jobserver - )) - .json(spawn) - .send() - .await - .map_err(|e| format!("Failed to initiate task: {}", e))?; - - if resp.status().is_success() { - Ok(resp.json::().await?) - } else { - let err_text = resp.text().await?; - - Err(format!("Failed to initiate task: {}", err_text).into()) - } -} diff --git a/core/rust.limits/Cargo.toml b/core/rust.limits/Cargo.toml deleted file mode 100644 index 6013d6a4..00000000 --- a/core/rust.limits/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "limits" -version = "0.1.0" -edition = "2021" - -[dependencies] - diff --git a/core/rust.limits/src/lib.rs b/core/rust.limits/src/lib.rs deleted file mode 100644 index fa01e279..00000000 --- a/core/rust.limits/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -pub mod embed_limits { - pub const EMBED_TITLE_LIMIT: usize = 256; - pub const EMBED_DESCRIPTION_LIMIT: usize = 4096; - pub const EMBED_MAX_COUNT: usize = 10; - pub const EMBED_FIELDS_MAX_COUNT: usize = 25; - pub const EMBED_FIELD_NAME_LIMIT: usize = 256; - pub const EMBED_FIELD_VALUE_LIMIT: usize = 1024; - pub const EMBED_FOOTER_TEXT_LIMIT: usize = 2048; - pub const EMBED_AUTHOR_NAME_LIMIT: usize = 256; - pub const EMBED_TOTAL_LIMIT: usize = 6000; -} - -pub mod message_limits { - pub const MESSAGE_CONTENT_LIMIT: usize = 2000; - pub const MESSAGE_ATTACHMENT_DESCRIPTION_LIMIT: usize = 1024; - pub const MESSAGE_ATTACHMENT_CONTENT_BYTES_LIMIT: usize = 8 * 1024 * 1024; // 8 MB - pub const MESSAGE_MAX_ATTACHMENT_COUNT: usize = 3; -} diff --git a/core/rust.lockdowns/Cargo.toml b/core/rust.lockdowns/Cargo.toml deleted file mode 100644 index 77b68d61..00000000 --- a/core/rust.lockdowns/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "lockdowns" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -log = "0.4" -serde = "1.0" -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -uuid = { version = "1", features = ["serde"] } -chrono = { version = "0.4", features = ["serde"]} -serde_json = "1.0" -indexmap = { version = "2", features = ["serde"] } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -async-trait = "0.1.80" -dashmap = { version = "6", features = ["serde", "inline", "rayon"] } - -# Anti-Raid specific -silverpelt = { path = "../rust.silverpelt" } -splashcore_rs = { path = "../rust.std" } -sandwich_driver = { path = "../rust.sandwich_driver" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" - -[package.metadata.cargo-machete] -ignored = ["uuid"] \ No newline at end of file diff --git a/core/rust.lockdowns/src/lib.rs b/core/rust.lockdowns/src/lib.rs deleted file mode 100644 index 774b3987..00000000 --- a/core/rust.lockdowns/src/lib.rs +++ /dev/null @@ -1,1962 +0,0 @@ -use async_trait::async_trait; -use dashmap::DashMap; -use serde::{Deserialize, Serialize}; -use splashcore_rs::priorityset::PrioritySet; -use std::collections::{HashMap, HashSet}; -use std::sync::{Arc, LazyLock}; - -pub static CREATE_LOCKDOWN_MODES: LazyLock>> = - LazyLock::new(|| { - let map: DashMap> = DashMap::new(); - - map.insert("qsl".to_string(), Box::new(qsl::CreateQuickServerLockdown)); - map.insert( - "tsl".to_string(), - Box::new(tsl::CreateTraditionalServerLockdown), - ); - map.insert( - "scl".to_string(), - Box::new(scl::CreateSingleChannelLockdown), - ); - map.insert("role".to_string(), Box::new(role::CreateRoleLockdown)); - - map - }); - -/// Given a string, returns the lockdown mode -pub fn from_lockdown_mode_string(s: &str) -> Result, silverpelt::Error> { - for pair in CREATE_LOCKDOWN_MODES.iter() { - let creator = pair.value(); - if let Some(m) = creator.to_lockdown_mode(s)? { - return Ok(m); - } - } - - Err("Unknown lockdown mode".into()) -} - -/// Change operation, commonly used in lockdown modes -#[derive(Debug, Serialize, Deserialize, Clone, Copy, Hash, PartialEq)] -pub enum ChangeOp { - Add, - Remove, -} - -impl std::fmt::Display for ChangeOp { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ChangeOp::Add => write!(f, "Add"), - ChangeOp::Remove => write!(f, "Remove"), - } - } -} - -/// Returns the critical roles for a [PartialGuild](`serenity::all::PartialGuild`) -/// -/// The ``set_member_roles`` here are the pre-defined roles set by the server that should be locked down -/// If ``set_member_roles`` is empty (no overrides), the @everyone role is returned -pub fn get_critical_roles( - pg: &serenity::all::PartialGuild, - set_critical_roles: &HashSet, -) -> Result, silverpelt::Error> { - if set_critical_roles.is_empty() { - // Find the everyone role - let everyone_role = pg - .roles - .iter() - .find(|r| r.id.get() == pg.id.get()) - .ok_or_else(|| silverpelt::Error::from("No @everyone role found"))?; - - Ok(std::iter::once(everyone_role.id).collect()) - } else { - Ok(set_critical_roles.clone()) - } -} - -pub struct LockdownData { - pub cache_http: botox::cache::CacheHttpImpl, - pub pool: sqlx::PgPool, - pub reqwest: reqwest::Client, - pub object_store: Arc, -} - -pub trait LockdownTestResult -where - Self: Send + Sync, -{ - /// Returns whether the lockdown can be applied perfectly with the current server layout - fn can_apply_perfectly(&self) -> bool; - - /// Returns a string representation of the result - fn display_result(&self, pg: &serenity::all::PartialGuild) -> String; -} - -/// To ensure two lockdowns don't conflict with each other, we need some information about what all lockdowns are handling -/// along with what specificity they have -pub struct LockdownModeHandle { - pub roles: HashSet, - pub channels: HashSet, -} - -/// To ensure two lockdowns don't conflict with each other, we need some information about what all lockdowns are handling -/// along with what specificity they have -pub struct LockdownModeHandles { - pub roles: PrioritySet, - pub channels: PrioritySet, -} - -impl LockdownModeHandles { - /// `add_handle` adds a handle to the set given the specificity of the handle - pub fn add_handle(&mut self, handle: LockdownModeHandle, specificity: usize) { - for role in handle.roles { - self.roles.add(role, specificity); - } - - for channel in handle.channels { - self.channels.add(channel, specificity); - } - } - - pub fn remove_handle(&mut self, handle: &LockdownModeHandle, specificity: usize) { - for role in handle.roles.iter() { - self.roles.remove(*role, specificity); - } - - for channel in handle.channels.iter() { - self.channels.remove(*channel, specificity); - } - } - - // A role is locked if it contains all roles of the current *with a lower specificity* - pub fn is_role_locked( - &self, - role: serenity::all::RoleId, - specificity: usize, - ) -> Option<(serenity::all::RoleId, usize)> { - if let Some(current_spec) = self.roles.highest_priority(&role) { - if current_spec >= specificity { - return Some((role, current_spec)); - } - } - - None - } - - // A channel is locked if it contains all channels of the current *with a lower specificity* - pub fn is_channel_locked( - &self, - channel: serenity::all::ChannelId, - specificity: usize, - ) -> Option<(serenity::all::ChannelId, usize)> { - if let Some(current_spec) = self.channels.highest_priority(&channel) { - if current_spec >= specificity { - return Some((channel, current_spec)); - } - } - - None - } - - // A handle is redundant if it contains all roles and channels of the current *with a lower specificity* - pub fn is_redundant(&self, other: &LockdownModeHandle, other_spec: usize) -> bool { - for role in other.roles.iter() { - if let Some(current_spec) = self.roles.highest_priority(role) { - if current_spec >= other_spec { - return false; - } - } else { - return false; - } - } - - for channel in other.channels.iter() { - if let Some(current_spec) = self.channels.highest_priority(channel) { - if current_spec >= other_spec { - return false; - } - } else { - return false; - } - } - - true - } -} - -/// To allow lockdowns to have access to the low-level data of other lockdowns, -/// this struct contains the roles and channels each lockdown knows about -pub struct LockdownSharableData { - pub role_permissions: HashMap, - pub channel_permissions: - HashMap>, -} - -/// Trait for creating a lockdown mode -#[async_trait] -pub trait CreateLockdownMode -where - Self: Send + Sync, -{ - /// Returns the syntax for the lockdown mode - /// - /// E.g. `qsl` for Quick Server Lockdown, `scl/{channel_id}` for Single Channel Lockdown - fn syntax(&self) -> &'static str; - - /// Given the string form of the lockdown mode, returns the lockdown mode - fn to_lockdown_mode(&self, s: &str) - -> Result>, silverpelt::Error>; -} - -/// Trait for a lockdown mode -#[async_trait] -pub trait LockdownMode -where - Self: Send + Sync, -{ - /// Returns the creator for the lockdown mode - fn creator(&self) -> Box; - - /// Returns the string form of the lockdown mode - fn string_form(&self) -> String; - - /// The specificity of the lockdown mode. More specific lockdowns should have higher specificity - /// - /// The specificity is used to determine which lockdowns should be applied/reverted in the event of multiple lockdowns - /// handling the same roles/channels - fn specificity(&self) -> usize; - - async fn test( - &self, - lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - critical_roles: &HashSet, - lockdowns: &[Lockdown], - ) -> Result, silverpelt::Error>; - - /// Sets up the lockdown mode, returning any data to be stored in database - async fn setup( - &self, - lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - critical_roles: &HashSet, - lockdowns: &[Lockdown], - ) -> Result; - - /// Returns the sharable lockdown data - async fn shareable( - &self, - data: &serde_json::Value, - ) -> Result; - - #[allow(clippy::too_many_arguments)] - async fn create( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error>; - - #[allow(clippy::too_many_arguments)] - async fn revert( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error>; - - async fn handles( - &self, - lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - critical_roles: &HashSet, - data: &serde_json::Value, - lockdowns: &[Lockdown], - ) -> Result; -} - -/// Serde serialization for LockdownMode -impl Serialize for Box { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - self.string_form().serialize(serializer) - } -} - -/// Serde deserialization for LockdownMode -impl<'de> Deserialize<'de> for Box { - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: serde::Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - - // Call `from_lockdown_mode_string` to get the lockdown mode - from_lockdown_mode_string(&s).map_err(serde::de::Error::custom) - } -} - -pub struct GuildLockdownSettings { - pub member_roles: HashSet, - pub require_correct_layout: bool, -} - -impl Default for GuildLockdownSettings { - fn default() -> Self { - Self { - member_roles: HashSet::new(), - require_correct_layout: true, - } - } -} - -pub async fn get_guild_lockdown_settings( - pool: &sqlx::PgPool, - guild_id: serenity::all::GuildId, -) -> Result { - match sqlx::query!( - "SELECT member_roles, require_correct_layout FROM lockdown__guilds WHERE guild_id = $1", - guild_id.to_string(), - ) - .fetch_optional(pool) - .await? - { - Some(settings) => { - let member_roles = settings - .member_roles - .iter() - .map(|r| r.parse().unwrap()) - .collect(); - - let settings = GuildLockdownSettings { - member_roles, - require_correct_layout: settings.require_correct_layout, - }; - - Ok(settings) - } - None => Ok(GuildLockdownSettings::default()), - } -} - -/// Represents a lockdown -#[derive(serde::Serialize, serde::Deserialize)] -pub struct Lockdown { - pub id: sqlx::types::Uuid, - pub reason: String, - pub r#type: Box, - pub data: serde_json::Value, - pub created_at: chrono::DateTime, -} - -impl Lockdown { - pub fn to_map(&self) -> indexmap::IndexMap { - indexmap::indexmap! { - "id".to_string() => splashcore_rs::value::Value::Uuid(self.id), - "reason".to_string() => splashcore_rs::value::Value::String(self.reason.clone()), - "type".to_string() => splashcore_rs::value::Value::String(self.r#type.string_form()), - "data".to_string() => splashcore_rs::value::Value::from_json(&self.data), - } - } - - /// Merges a set of lockdown sharable data's assuming that least recent lockdowns are first - fn merge_lsd(lsd: Vec) -> LockdownSharableData { - let mut new_channel_perms = std::collections::HashMap::new(); - - // Add all new/unique permission overwrites of users/roles - // - // If said users overwrites are already present in the map, new overwrites will be ignored. - // - // This works because the least recent lockdowns are checked first - let mut per_channel_done_roles = std::collections::HashMap::new(); - let mut per_channel_done_users = std::collections::HashMap::new(); - for data in lsd.iter() { - for (channel_id, overwrites) in data.channel_permissions.iter() { - let done_roles = per_channel_done_roles - .entry(channel_id) - .or_insert_with(|| std::collections::HashSet::new()); - let done_users = per_channel_done_users - .entry(channel_id) - .or_insert_with(|| std::collections::HashSet::new()); - let channel_pos = new_channel_perms - .entry(*channel_id) - .or_insert_with(|| Vec::new()); - - for overwrite in overwrites.iter() { - match overwrite.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => { - if !done_roles.contains(&role_id) { - channel_pos.push(overwrite.clone()); - done_roles.insert(role_id); - } - } - serenity::all::PermissionOverwriteType::Member(user_id) => { - if !done_users.contains(&user_id) { - channel_pos.push(overwrite.clone()); - done_users.insert(user_id); - } - } - _ => {} - } - } - } - } - - // Merge role permissions, taking only the first found entry - let mut new_role_perms = std::collections::HashMap::new(); - - for data in lsd { - for (role_id, perms) in data.role_permissions.iter() { - if !new_role_perms.contains_key(role_id) { - new_role_perms.insert(*role_id, perms.clone()); - } - } - } - - LockdownSharableData { - role_permissions: new_role_perms, - channel_permissions: new_channel_perms, - } - } - - pub async fn get_underlying( - lockdowns: &[Self], - state: T, - f: fn(&LockdownSharableData, &T) -> Option, - ) -> Option { - // Sort lockdown indexes by creation date with least recent first (reverse) - let mut lockdown_idxs: Vec = (0..lockdowns.len()).collect(); - - lockdown_idxs.sort_by(|a, b| { - lockdowns[*a] - .created_at - .cmp(&lockdowns[*b].created_at) - .reverse() - }); - - // Now loop over all lockdowns - // - // Because we sorted by creation date, the least recent lockdowns will be checked first - // hence ensuring the permissions we get are from before lockdowns - let mut unmerged_lsds = Vec::new(); - for idx in lockdown_idxs { - let lockdown = &lockdowns[idx]; - - match lockdown.r#type.shareable(&lockdown.data).await { - Ok(data) => { - unmerged_lsds.push(data); - } - Err(e) => { - log::error!("Error while getting shareable data: {}", e); - continue; - } - } - } - - let merged_lsd = Self::merge_lsd(unmerged_lsds); - - f(&merged_lsd, &state) - } - - pub async fn get_underlying_role_permissions( - lockdowns: &[Self], - role_id: serenity::all::RoleId, - ) -> Option { - Self::get_underlying(lockdowns, role_id, |data, role_id| { - data.role_permissions.get(role_id).cloned() - }) - .await - } - - pub async fn get_underlying_channel_permissions( - lockdowns: &[Self], - channel_id: serenity::all::ChannelId, - ) -> Option> { - Self::get_underlying(lockdowns, channel_id, |data, channel_id| { - data.channel_permissions.get(channel_id).cloned() - }) - .await - } -} - -/// Represents a list of lockdowns -pub struct LockdownSet { - pub lockdowns: Vec, - pub settings: GuildLockdownSettings, - pub guild_id: serenity::all::GuildId, -} - -impl LockdownSet { - pub async fn guild( - guild_id: serenity::all::GuildId, - pool: &sqlx::PgPool, - ) -> Result { - let data = sqlx::query!( - "SELECT id, type, data, reason, created_at FROM lockdown__guild_lockdowns WHERE guild_id = $1", - guild_id.to_string(), - ) - .fetch_all(pool) - .await?; - - let mut lockdowns = Vec::new(); - - for row in data { - let id = row.id; - let r#type = row.r#type; - let data = row.data; - let reason = row.reason; - let created_at = row.created_at; - - let lockdown_mode = from_lockdown_mode_string(&r#type)?; - - let lockdown = Lockdown { - id, - r#type: lockdown_mode, - data, - reason, - created_at, - }; - - lockdowns.push(lockdown); - } - - let settings = get_guild_lockdown_settings(pool, guild_id).await?; - - Ok(LockdownSet { - lockdowns, - settings, - guild_id, - }) - } - - /// Sorts the lockdowns by specificity in descending order - pub fn sort(&mut self) { - self.lockdowns - .sort_by(|a, b| b.r#type.specificity().cmp(&a.r#type.specificity())); - } - - pub async fn get_handles( - &self, - lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - ) -> Result { - let mut handles = LockdownModeHandles { - roles: PrioritySet::default(), - channels: PrioritySet::default(), - }; - - for lockdown in self.lockdowns.iter() { - let handle = lockdown - .r#type - .handles( - lockdown_data, - pg, - pgc, - &self.settings.member_roles, - &lockdown.data, - &self.lockdowns, - ) - .await?; - - // Extend roles and channels - handles.add_handle(handle, lockdown.r#type.specificity()); - } - - Ok(handles) - } - - /// Helper method to apply a lockdown without needing to manually perform fetches - pub async fn easy_apply( - &mut self, - lockdown_type: Box, - lockdown_data: &LockdownData, - reason: &str, - ) -> Result { - let mut pg = sandwich_driver::guild( - &lockdown_data.cache_http, - &lockdown_data.reqwest, - self.guild_id, - ) - .await - .map_err(|e| format!("Error while creating proxy guild: {}", e))?; - - let mut pgc = sandwich_driver::guild_channels( - &lockdown_data.cache_http, - &lockdown_data.reqwest, - self.guild_id, - ) - .await - .map_err(|e| format!("Error while fetching guild channels from proxy: {}", e))?; - - self.apply(lockdown_type, lockdown_data, reason, &mut pg, &mut pgc) - .await - } - - /// Adds a lockdown to the set returning the id of the created entry - pub async fn apply( - &mut self, - lockdown_type: Box, - lockdown_data: &LockdownData, - reason: &str, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - ) -> Result { - let critical_roles = get_critical_roles(pg, &self.settings.member_roles)?; - - // Test new lockdown if required - if self.settings.require_correct_layout { - let test_results = lockdown_type - .test(lockdown_data, pg, pgc, &critical_roles, &self.lockdowns) - .await?; - - if !test_results.can_apply_perfectly() { - return Err(test_results.display_result(pg).into()); - } - } - - // Setup the lockdown - let data = lockdown_type - .setup(lockdown_data, pg, pgc, &critical_roles, &self.lockdowns) - .await?; - - let current_handles = self.get_handles(lockdown_data, pg, pgc).await?; - - let created_at = chrono::Utc::now(); - - let id = sqlx::query!( - "INSERT INTO lockdown__guild_lockdowns (guild_id, type, data, reason, created_at) VALUES ($1, $2, $3, $4, $5) RETURNING id", - self.guild_id.to_string(), - lockdown_type.string_form(), - &data, - reason, - created_at, - ) - .fetch_one(&lockdown_data.pool) - .await?; - - // Apply the lockdown - lockdown_type - .create( - lockdown_data, - pg, - pgc, - &critical_roles, - &data, - ¤t_handles, - &self.lockdowns, - ) - .await?; - - // Update self.lockdowns - self.lockdowns.push(Lockdown { - id: id.id, - r#type: lockdown_type, - data, - reason: reason.to_string(), - created_at, - }); - - Ok(id.id) - } - - /// Helper method to apply a lockdown without needing to manually perform fetches - pub async fn easy_remove( - &mut self, - id: sqlx::types::Uuid, - lockdown_data: &LockdownData, - ) -> Result<(), silverpelt::Error> { - let mut pg = sandwich_driver::guild( - &lockdown_data.cache_http, - &lockdown_data.reqwest, - self.guild_id, - ) - .await - .map_err(|e| format!("Error while creating proxy guild: {}", e))?; - - let mut pgc = sandwich_driver::guild_channels( - &lockdown_data.cache_http, - &lockdown_data.reqwest, - self.guild_id, - ) - .await - .map_err(|e| format!("Error while fetching guild channels from proxy: {}", e))?; - - self.remove(id, lockdown_data, &mut pg, &mut pgc).await - } - - /// Removes a lockdown from the set - pub async fn remove( - &mut self, - id: sqlx::types::Uuid, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - ) -> Result<(), silverpelt::Error> { - let (index, lockdown) = self - .lockdowns - .iter() - .enumerate() - .find(|l| l.1.id == id) - .ok_or("Lockdown not found")?; - - let critical_roles = get_critical_roles(pg, &self.settings.member_roles)?; - - let mut current_handles = self.get_handles(lockdown_data, pg, pgc).await?; - - // Remove handle from the set - let handle = lockdown - .r#type - .handles( - lockdown_data, - pg, - pgc, - &critical_roles, - &lockdown.data, - &self.lockdowns, - ) - .await?; - - current_handles.remove_handle(&handle, lockdown.r#type.specificity()); - - // Revert the lockdown - lockdown - .r#type - .revert( - lockdown_data, - pg, - pgc, - &critical_roles, - &lockdown.data, - ¤t_handles, - &self.lockdowns, - ) - .await?; - - // Remove the lockdown from the database - sqlx::query!( - "DELETE FROM lockdown__guild_lockdowns WHERE guild_id = $1 AND id = $2", - self.guild_id.to_string(), - lockdown.id, - ) - .execute(&lockdown_data.pool) - .await?; - - // Update self.lockdowns - self.lockdowns.remove(index); - - Ok(()) - } - - /// Remove all lockdowns in order of specificity - pub async fn remove_all( - &mut self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - ) -> Result<(), silverpelt::Error> { - self.sort(); - - let ids = self.lockdowns.iter().map(|l| l.id).collect::>(); - - for id in ids { - self.remove(id, lockdown_data, pg, pgc).await?; - } - - // Update self.lockdowns - self.lockdowns.clear(); - - Ok(()) - } -} - -/// Quick server lockdown -pub mod qsl { - use super::*; - use serde::{Deserialize, Serialize}; - - /// The base permissions for quick lockdown - /// - /// If any of these permissions are provided, quick lockdown cannot proceed - static BASE_PERMS: [serenity::all::Permissions; 2] = [ - serenity::all::Permissions::VIEW_CHANNEL, - serenity::all::Permissions::SEND_MESSAGES, - ]; - - static LOCKDOWN_PERMS: std::sync::LazyLock = - std::sync::LazyLock::new(|| serenity::all::Permissions::VIEW_CHANNEL); - - /// The result of a `test_quick_lockdown` call - #[derive(Debug, Serialize, Deserialize, Clone)] - pub struct QuickLockdownTestResult { - /// Which roles need to be changed/fixed combined with the target perms - pub changes_needed: std::collections::HashMap< - serenity::all::RoleId, - (ChangeOp, serenity::all::Permissions), - >, - /// The critical roles - pub critical_roles: HashSet, - } - - impl LockdownTestResult for QuickLockdownTestResult { - /// Returns whether the guild is in a state where quick lockdown can be applied perfectly - fn can_apply_perfectly(&self) -> bool { - self.changes_needed.is_empty() - } - - fn display_result(&self, pg: &serenity::all::PartialGuild) -> String { - let mut needed_changes = String::new(); - - needed_changes.push_str("The following roles need to be changed:\n"); - for (role_id, perms) in self.changes_needed.iter() { - let role_name = pg - .roles - .get(role_id) - .map(|r| r.name.to_string()) - .unwrap_or_else(|| "Unknown".to_string()); - - needed_changes.push_str(&format!("Role: {} ({})\n", role_name, role_id)); - needed_changes.push_str(&format!("Permissions: {} {}\n", perms.0, perms.1)); - needed_changes.push('\n'); - } - - needed_changes - } - } - - pub struct CreateQuickServerLockdown; - - #[async_trait] - impl CreateLockdownMode for CreateQuickServerLockdown { - fn syntax(&self) -> &'static str { - "qsl" - } - - fn to_lockdown_mode( - &self, - s: &str, - ) -> Result>, silverpelt::Error> { - if s == "qsl" { - Ok(Some(Box::new(QuickServerLockdown))) - } else { - Ok(None) - } - } - } - - pub struct QuickServerLockdown; - - impl QuickServerLockdown { - pub fn from_data( - data: &serde_json::Value, - ) -> Result< - std::collections::HashMap, - silverpelt::Error, - > { - let v: std::collections::HashMap = - serde_json::from_value(data.clone()) - .map_err(|e| format!("Error while deserializing permissions: {}", e))?; - - Ok(v) - } - } - - #[async_trait] - impl LockdownMode for QuickServerLockdown { - fn creator(&self) -> Box { - Box::new(CreateQuickServerLockdown) - } - - fn string_form(&self) -> String { - "qsl".to_string() - } - - // Lowest specificity - fn specificity(&self) -> usize { - 0 - } - - async fn test( - &self, - _lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - critical_roles: &HashSet, - _lockdowns: &[Lockdown], // We dont need to care about other lockdowns - ) -> Result, silverpelt::Error> { - let mut changes_needed = std::collections::HashMap::new(); - - // From here on out, we only need to care about critical and non critical roles - for role in pg.roles.iter() { - if critical_roles.contains(&role.id) { - let mut needed_perms = serenity::all::Permissions::empty(); - - let mut missing = false; - for perm in BASE_PERMS { - if !role.permissions.contains(perm) { - needed_perms |= perm; - missing = true; - } - } - - if missing { - changes_needed.insert(role.id, (ChangeOp::Add, needed_perms)); - } - } else { - let mut perms_to_remove = serenity::all::Permissions::empty(); - - let mut needs_perms_removed = false; - for perm in BASE_PERMS { - if role.permissions.contains(perm) { - perms_to_remove |= perm; - needs_perms_removed = true; - } - } - - if needs_perms_removed { - changes_needed.insert(role.id, (ChangeOp::Remove, perms_to_remove)); - } - } - } - - Ok(Box::new(QuickLockdownTestResult { - changes_needed, - critical_roles: critical_roles.clone(), - })) - } - - async fn setup( - &self, - _lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - lockdowns: &[Lockdown], // We dont need to care about other lockdowns - ) -> Result { - let mut map = serde_json::Map::new(); - - for role in pg.roles.iter() { - let mut permissions = role.permissions; - - // Check for an underlying permission overwrite to the channel - if let Some(underlying_permissions) = - Lockdown::get_underlying_role_permissions(lockdowns, role.id).await - { - permissions = underlying_permissions; // Overwrite the permissions - } - - map.insert( - role.id.to_string(), - serde_json::Value::String(permissions.bits().to_string()), - ); - } - - Ok(serde_json::Value::Object(map)) - } - - async fn shareable( - &self, - data: &serde_json::Value, - ) -> Result { - let data = Self::from_data(data)?; - Ok(LockdownSharableData { - role_permissions: data, - channel_permissions: HashMap::new(), - }) - } - - async fn create( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - _pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - _data: &serde_json::Value, - _all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], // We dont need to care about other lockdowns - ) -> Result<(), silverpelt::Error> { - let mut new_roles = Vec::new(); - for role in pg.roles.iter() { - // If critical, lock it down - if critical_roles.contains(&role.id) { - new_roles.push( - pg.id - .edit_role( - &lockdown_data.cache_http.http, - role.id, - serenity::all::EditRole::new().permissions(*LOCKDOWN_PERMS), - ) - .await?, - ); - } - } - - for role in new_roles { - pg.roles.insert(role); - } - - Ok(()) - } - - async fn revert( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - _pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - data: &serde_json::Value, - _all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], // We dont need to care about other lockdowns - ) -> Result<(), silverpelt::Error> { - let old_permissions = Self::from_data(data)?; - - let mut new_roles = Vec::new(); - for role in pg.roles.iter() { - if critical_roles.contains(&role.id) { - let perms = old_permissions.get(&role.id).copied().unwrap_or( - BASE_PERMS - .iter() - .copied() - .fold(serenity::all::Permissions::empty(), |acc, perm| acc | perm), - ); - - new_roles.push( - pg.id - .edit_role( - &lockdown_data.cache_http.http, - role.id, - serenity::all::EditRole::new().permissions(perms), - ) - .await?, - ); - } - } - - for role in new_roles { - pg.roles.insert(role); - } - - Ok(()) - } - - async fn handles( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - critical_roles: &HashSet, - _data: &serde_json::Value, - _lockdowns: &[Lockdown], // We dont need to care about other lockdowns - ) -> Result { - // QSL locks the critical roles - Ok(LockdownModeHandle { - roles: critical_roles.clone(), - channels: HashSet::new(), - }) - } - } -} - -/// Traditional server lockdown (lock all channels) -pub mod tsl { - use super::*; - use serde::{Deserialize, Serialize}; - - static DENY_PERMS: std::sync::LazyLock = - std::sync::LazyLock::new(|| { - serenity::all::Permissions::SEND_MESSAGES - | serenity::all::Permissions::SEND_MESSAGES_IN_THREADS - | serenity::all::Permissions::SEND_TTS_MESSAGES - | serenity::all::Permissions::CONNECT - }); - - // The big advantage of TSL is the lack of constraints/tests regarding server layout - #[derive(Debug, Serialize, Deserialize, Clone)] - pub struct TraditionalLockdownTestResult; - - impl LockdownTestResult for TraditionalLockdownTestResult { - fn can_apply_perfectly(&self) -> bool { - log::info!("Called can_apply_perfectly"); - true - } - - fn display_result(&self, _pg: &serenity::all::PartialGuild) -> String { - "".to_string() - } - } - - pub struct CreateTraditionalServerLockdown; - - #[async_trait] - impl CreateLockdownMode for CreateTraditionalServerLockdown { - fn syntax(&self) -> &'static str { - "tsl" - } - - fn to_lockdown_mode( - &self, - s: &str, - ) -> Result>, silverpelt::Error> { - if s == "tsl" { - Ok(Some(Box::new(TraditionalServerLockdown))) - } else { - Ok(None) - } - } - } - - pub struct TraditionalServerLockdown; - - impl TraditionalServerLockdown { - pub fn from_data( - data: &serde_json::Value, - ) -> Result< - std::collections::HashMap< - serenity::all::ChannelId, - Vec, - >, - silverpelt::Error, - > { - log::info!("Called from_data"); - let v: std::collections::HashMap< - serenity::all::ChannelId, - Vec, - > = serde_json::from_value(data.clone()) - .map_err(|e| format!("Error while deserializing permissions: {}", e))?; - - Ok(v) - } - } - - #[async_trait] - impl LockdownMode for TraditionalServerLockdown { - fn creator(&self) -> Box { - Box::new(CreateTraditionalServerLockdown) - } - - fn string_form(&self) -> String { - "tsl".to_string() - } - - // TSL > QSL as it updates all channels in a server - fn specificity(&self) -> usize { - 1 - } - - // TSL doesn't need to test anything so just return the result - async fn test( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _lockdowns: &[Lockdown], - ) -> Result, silverpelt::Error> { - log::info!("Called test"); - Ok(Box::new(TraditionalLockdownTestResult)) - } - - async fn setup( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - lockdowns: &[Lockdown], - ) -> Result { - log::info!("Called setup"); - let mut map = serde_json::Map::new(); - - for channel in pgc.iter() { - let mut overwrites = channel.permission_overwrites.to_vec(); - - // Check for an underlying permission overwrite to the channel - if let Some(underlying_overwrite) = - Lockdown::get_underlying_channel_permissions(lockdowns, channel.id).await - { - overwrites = underlying_overwrite; // Overwrite the overwrites - } - - map.insert(channel.id.to_string(), serde_json::to_value(overwrites)?); - } - - Ok(serde_json::Value::Object(map)) - } - - async fn shareable( - &self, - data: &serde_json::Value, - ) -> Result { - let data = Self::from_data(data)?; - Ok(LockdownSharableData { - role_permissions: HashMap::new(), - channel_permissions: data, - }) - } - - async fn create( - &self, - lockdown_data: &LockdownData, - _pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - _data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - log::info!("Called create"); - for channel in pgc.iter_mut() { - if all_handles - .is_channel_locked(channel.id, self.specificity()) - .is_some() - { - continue; // Someone else is handling this channel - } - - let mut overwrites = channel.permission_overwrites.to_vec(); - - let mut nyset_overwrite = critical_roles.clone(); - for overwrite in overwrites.iter_mut() { - match overwrite.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => { - if critical_roles.contains(&role_id) { - overwrite.deny = *DENY_PERMS; - nyset_overwrite.remove(&role_id); - } - } - _ => continue, - } - } - - if !nyset_overwrite.is_empty() { - for critical_role in nyset_overwrite.iter() { - let overwrite = serenity::all::PermissionOverwrite { - allow: serenity::all::Permissions::empty(), - deny: *DENY_PERMS, - kind: serenity::all::PermissionOverwriteType::Role(*critical_role), - }; - - overwrites.push(overwrite); - } - } - - match channel - .edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await - { - Ok(_) => {} - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - if er.status_code == reqwest::StatusCode::NOT_FOUND { - log::info!("Channel not found: {}", channel.id); - continue; // Rare, but sometimes happens (?) - } else { - return Err(format!( - "Failed to create channel lockdown (http, non-404) {}: {:?}", - channel.id, er - ) - .into()); - } - } - _ => { - return Err(format!( - "Failed to create channel lockdown (http) {}: {:?}", - channel.id, e - ) - .into()); - } - }, - _ => { - return Err(format!( - "Failed to create channel lockdown {}: {:?}", - channel.id, e - ) - .into()); - } - }, - }; - } - - Ok(()) - } - - async fn revert( - &self, - lockdown_data: &LockdownData, - _pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - _critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - log::info!("Called revert"); - let old_permissions = Self::from_data(data)?; - - for channel in pgc.iter_mut() { - if all_handles - .is_channel_locked(channel.id, self.specificity()) - .is_some() - { - continue; // Someone else is handling this channel - } - - // TODO: Handle this slightly better (maybe only apply the changes to critical roles somehow) - let Some(overwrites) = old_permissions.get(&channel.id).cloned() else { - continue; - }; - - match channel - .edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await - { - Ok(_) => {} - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - if er.status_code == reqwest::StatusCode::NOT_FOUND { - continue; // Rare, but sometimes happens (?) - } else { - return Err(format!( - "Failed to delete channel lockdown (http, non-404) {}: {:?}", - channel.id, er - ) - .into()); - } - } - _ => { - return Err(format!( - "Failed to delete channel lockdown (http) {}: {:?}", - channel.id, e - ) - .into()); - } - }, - _ => { - return Err(format!( - "Failed to delete channel lockdown {}: {:?}", - channel.id, e - ) - .into()); - } - }, - }; - } - - Ok(()) - } - - async fn handles( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _data: &serde_json::Value, - _lockdowns: &[Lockdown], - ) -> Result { - // TSL locks all channels, but *NOT* roles - Ok(LockdownModeHandle { - roles: HashSet::new(), - channels: pgc.iter().map(|c| c.id).collect(), - }) - } - } -} - -/// Single channel lock -pub mod scl { - use super::*; - use serde::{Deserialize, Serialize}; - - static DENY_PERMS: std::sync::LazyLock = - std::sync::LazyLock::new(|| { - serenity::all::Permissions::SEND_MESSAGES - | serenity::all::Permissions::SEND_MESSAGES_IN_THREADS - | serenity::all::Permissions::SEND_TTS_MESSAGES - | serenity::all::Permissions::CONNECT - }); - - // The big advantage of TSL is the lack of constraints/tests regarding server layout - #[derive(Debug, Serialize, Deserialize, Clone)] - pub struct SingleChannelLockdownTestResult; - - impl LockdownTestResult for SingleChannelLockdownTestResult { - fn can_apply_perfectly(&self) -> bool { - true - } - - fn display_result(&self, _pg: &serenity::all::PartialGuild) -> String { - "".to_string() - } - } - - pub struct CreateSingleChannelLockdown; - - #[async_trait] - impl CreateLockdownMode for CreateSingleChannelLockdown { - fn syntax(&self) -> &'static str { - "scl/" - } - - fn to_lockdown_mode( - &self, - s: &str, - ) -> Result>, silverpelt::Error> { - if s.starts_with("scl/") { - let channel_id = s - .strip_prefix("scl/") - .ok_or_else(|| silverpelt::Error::from("Invalid syntax"))?; - - let channel_id = channel_id - .parse() - .map_err(|e| format!("Error while parsing channel id: {}", e))?; - - Ok(Some(Box::new(SingleChannelLockdown(channel_id)))) - } else { - Ok(None) - } - } - } - - pub struct SingleChannelLockdown(pub serenity::all::ChannelId); - - impl SingleChannelLockdown { - pub fn from_data( - data: &serde_json::Value, - ) -> Result, silverpelt::Error> { - let v: Vec = - serde_json::from_value(data.clone()) - .map_err(|e| format!("Error while deserializing permissions: {}", e))?; - - Ok(v) - } - } - - #[async_trait] - impl LockdownMode for SingleChannelLockdown { - fn creator(&self) -> Box { - Box::new(CreateSingleChannelLockdown) - } - - fn string_form(&self) -> String { - format!("scl/{}", self.0) - } - - // SCL > TSL as it updates a single channel - fn specificity(&self) -> usize { - 2 - } - - // SCL doesn't need to test anything so just return the result - async fn test( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _lockdowns: &[Lockdown], - ) -> Result, silverpelt::Error> { - Ok(Box::new(SingleChannelLockdownTestResult)) - } - - async fn setup( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - lockdowns: &[Lockdown], - ) -> Result { - let channel = pgc - .iter() - .find(|c| c.id == self.0) - .ok_or_else(|| silverpelt::Error::from("Channel not found"))?; - - let mut overwrites = channel.permission_overwrites.to_vec(); - - // Check for an underlying permission overwrite to the channel - if let Some(underlying_overwrite) = - Lockdown::get_underlying_channel_permissions(lockdowns, channel.id).await - { - overwrites = underlying_overwrite; // Overwrite the overwrites - } - - Ok(serde_json::to_value(overwrites)?) - } - - async fn shareable( - &self, - data: &serde_json::Value, - ) -> Result { - let data = Self::from_data(data)?; - Ok(LockdownSharableData { - role_permissions: HashMap::new(), - channel_permissions: std::iter::once((self.0, data)).collect(), - }) - } - - async fn create( - &self, - lockdown_data: &LockdownData, - _pg: &mut serenity::all::PartialGuild, - _pgc: &mut [serenity::all::GuildChannel], - critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - if all_handles - .is_channel_locked(self.0, self.specificity()) - .is_some() - { - return Ok(()); // Someone else is handling this channel - } - - let mut overwrites = Self::from_data(data)?; - - let mut nyset_overwrite = critical_roles.clone(); - for overwrite in overwrites.iter_mut() { - match overwrite.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => { - if critical_roles.contains(&role_id) { - overwrite.deny = *DENY_PERMS; - nyset_overwrite.remove(&role_id); - } - } - _ => continue, - } - } - - if !nyset_overwrite.is_empty() { - for critical_role in nyset_overwrite.iter() { - let overwrite = serenity::all::PermissionOverwrite { - allow: serenity::all::Permissions::empty(), - deny: *DENY_PERMS, - kind: serenity::all::PermissionOverwriteType::Role(*critical_role), - }; - - overwrites.push(overwrite); - } - } - - self.0 - .edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await?; - - Ok(()) - } - - async fn revert( - &self, - lockdown_data: &LockdownData, - _pg: &mut serenity::all::PartialGuild, - _pgc: &mut [serenity::all::GuildChannel], - _critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - if all_handles - .is_channel_locked(self.0, self.specificity()) - .is_some() - { - return Ok(()); // Someone else is handling this channel - } - - let overwrites = Self::from_data(data)?; - - self.0 - .edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await?; - - Ok(()) - } - - async fn handles( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _data: &serde_json::Value, - _lockdowns: &[Lockdown], - ) -> Result { - // SCL locks a single channel - Ok(LockdownModeHandle { - roles: HashSet::new(), - channels: std::iter::once(self.0).collect(), - }) - } - } -} - -/// Single role lockdown -pub mod role { - use super::*; - use serde::{Deserialize, Serialize}; - - pub static DENY_PERMS: std::sync::LazyLock = - std::sync::LazyLock::new(|| { - serenity::all::Permissions::ADMINISTRATOR - | serenity::all::Permissions::MANAGE_GUILD - | serenity::all::Permissions::MANAGE_ROLES - | serenity::all::Permissions::MANAGE_CHANNELS - | serenity::all::Permissions::MANAGE_MESSAGES - | serenity::all::Permissions::MANAGE_WEBHOOKS - | serenity::all::Permissions::MANAGE_GUILD_EXPRESSIONS - | serenity::all::Permissions::KICK_MEMBERS - | serenity::all::Permissions::BAN_MEMBERS - | serenity::all::Permissions::MODERATE_MEMBERS - | serenity::all::Permissions::MANAGE_NICKNAMES - | serenity::all::Permissions::MOVE_MEMBERS - | serenity::all::Permissions::MUTE_MEMBERS - | serenity::all::Permissions::DEAFEN_MEMBERS - | serenity::all::Permissions::MENTION_EVERYONE - | serenity::all::Permissions::MANAGE_THREADS - }); - - #[derive(Debug, Serialize, Deserialize, Clone)] - pub struct RoleLockdownTestResult; - - impl LockdownTestResult for RoleLockdownTestResult { - fn can_apply_perfectly(&self) -> bool { - true - } - - fn display_result(&self, _pg: &serenity::all::PartialGuild) -> String { - "".to_string() - } - } - - pub struct CreateRoleLockdown; - - #[async_trait] - impl CreateLockdownMode for CreateRoleLockdown { - fn syntax(&self) -> &'static str { - "role/" - } - - fn to_lockdown_mode( - &self, - s: &str, - ) -> Result>, silverpelt::Error> { - if s.starts_with("role/") { - let role_id = s - .strip_prefix("role/") - .ok_or_else(|| silverpelt::Error::from("Invalid syntax"))?; - - let role_id = role_id - .parse() - .map_err(|e| format!("Error while parsing role id: {}", e))?; - - Ok(Some(Box::new(RoleLockdown(role_id)))) - } else { - Ok(None) - } - } - } - - #[derive(Debug, Serialize, Deserialize, Clone)] - pub struct RoleLockdownData { - pub global_perms: serenity::all::Permissions, - pub channel_overrides: - std::collections::HashMap, - } - - pub struct RoleLockdown(pub serenity::all::RoleId); - - impl RoleLockdown { - pub fn from_data(data: &serde_json::Value) -> Result { - let v: RoleLockdownData = serde_json::from_value(data.clone()) - .map_err(|e| format!("Error while deserializing role data: {}", e))?; - - Ok(v) - } - } - - #[async_trait] - impl LockdownMode for RoleLockdown { - fn creator(&self) -> Box { - Box::new(CreateRoleLockdown) - } - - fn string_form(&self) -> String { - format!("role/{}", self.0) - } - - // SCL > TSL as it updates a single channel - fn specificity(&self) -> usize { - 2 - } - - // SCL doesn't need to test anything so just return the result - async fn test( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _lockdowns: &[Lockdown], - ) -> Result, silverpelt::Error> { - Ok(Box::new(RoleLockdownTestResult)) - } - - async fn setup( - &self, - _lockdown_data: &LockdownData, - pg: &serenity::all::PartialGuild, - pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - lockdowns: &[Lockdown], - ) -> Result { - let role = pg - .roles - .iter() - .find(|c| c.id == self.0) - .ok_or_else(|| silverpelt::Error::from("Role not found"))?; - - let mut permissions = role.permissions; - - // Check for an underlying permission to the role - if let Some(underlying_permissions) = - Lockdown::get_underlying_role_permissions(lockdowns, role.id).await - { - permissions = underlying_permissions; // Overwrite the permissions - } - - let mut overwrites = std::collections::HashMap::new(); - - for channel in pgc.iter() { - let mut overwrite = channel - .permission_overwrites - .iter() - .find(|o| match o.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => role_id == self.0, - _ => false, - }) - .cloned(); - - // Check for an underlying permission overwrite to the channel - if let Some(underlying_overwrite) = - Lockdown::get_underlying_channel_permissions(lockdowns, channel.id).await - { - // Try finding the overwrite for this role, override the overwrite if found - let mut found = false; - - for u_overwrite in underlying_overwrite.iter() { - match u_overwrite.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => { - if role_id == self.0 { - overwrite = Some(u_overwrite.clone()); - found = true; - break; - } - } - _ => continue, - } - } - - if !found { - overwrite = None - } - } - - if let Some(overwrite) = overwrite { - overwrites.insert(channel.id, overwrite); - } - } - - Ok(serde_json::to_value(RoleLockdownData { - global_perms: permissions, - channel_overrides: overwrites, - })?) - } - - async fn shareable( - &self, - data: &serde_json::Value, - ) -> Result { - let data = Self::from_data(data)?; - Ok(LockdownSharableData { - role_permissions: std::iter::once((self.0, data.global_perms)).collect(), - channel_permissions: { - let mut map = std::collections::HashMap::new(); - - for (channel_id, overwrite) in data.channel_overrides.into_iter() { - map.insert(channel_id, vec![overwrite]); - } - - map - }, - }) - } - - async fn create( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - _critical_roles: &HashSet, - _data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - if all_handles - .is_role_locked(self.0, self.specificity()) - .is_some() - { - return Ok(()); // Someone else is handling this role - } - - // 1. Edit the role - pg.id - .edit_role( - &lockdown_data.cache_http.http, - self.0, - serenity::all::EditRole::new().permissions(serenity::all::Permissions::empty()), - ) - .await?; - - // 2. Edit the permission overwrites for each channel - for ch in pgc.iter_mut() { - let mut found_overwrite = false; - - let mut overwrites = ch.permission_overwrites.to_vec(); - - if let Some(overwrite) = overwrites.iter_mut().find(|o| match o.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => role_id == self.0, - _ => false, - }) { - found_overwrite = true; - overwrite.allow = serenity::all::Permissions::empty(); - overwrite.deny = *DENY_PERMS; - } - - if !found_overwrite { - overwrites.push(serenity::all::PermissionOverwrite { - allow: serenity::all::Permissions::empty(), - deny: *DENY_PERMS, - kind: serenity::all::PermissionOverwriteType::Role(self.0), - }); - } - - ch.edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await?; - } - - Ok(()) - } - - async fn revert( - &self, - lockdown_data: &LockdownData, - pg: &mut serenity::all::PartialGuild, - pgc: &mut [serenity::all::GuildChannel], - _critical_roles: &HashSet, - data: &serde_json::Value, - all_handles: &LockdownModeHandles, - _lockdowns: &[Lockdown], - ) -> Result<(), silverpelt::Error> { - if all_handles - .is_role_locked(self.0, self.specificity()) - .is_some() - { - return Ok(()); // Someone else is handling this role - } - - let rld = Self::from_data(data)?; - - // First edit the role itself - pg.id - .edit_role( - &lockdown_data.cache_http.http, - self.0, - serenity::all::EditRole::new().permissions(rld.global_perms), - ) - .await?; - - // Then fix up channels - for ch in pgc { - let old_overwrites = rld.channel_overrides.get(&ch.id); - - let mut overwrites = ch.permission_overwrites.to_vec(); - - // Remove old/existing overwrites - let mut found_overwrite = None; - for (i, overwrite) in overwrites.iter().enumerate() { - match overwrite.kind { - serenity::all::PermissionOverwriteType::Role(role_id) => { - if role_id == self.0 { - found_overwrite = Some(i); - break; - } - } - _ => continue, - } - } - - if let Some(i) = found_overwrite { - overwrites.remove(i); - } - - // Add back the old overwrite - if let Some(old_overwrite) = old_overwrites { - overwrites.push(old_overwrite.clone()); - } - - ch.edit( - &lockdown_data.cache_http.http, - serenity::all::EditChannel::new().permissions(overwrites), - ) - .await?; - } - - Ok(()) - } - - async fn handles( - &self, - _lockdown_data: &LockdownData, - _pg: &serenity::all::PartialGuild, - _pgc: &[serenity::all::GuildChannel], - _critical_roles: &HashSet, - _data: &serde_json::Value, - _lockdowns: &[Lockdown], - ) -> Result { - // Role locks a single role - Ok(LockdownModeHandle { - roles: std::iter::once(self.0).collect(), - channels: HashSet::new(), - }) - } - } -} diff --git a/core/rust.permissions.checks/Cargo.toml b/core/rust.permissions.checks/Cargo.toml deleted file mode 100644 index 6d4d3f71..00000000 --- a/core/rust.permissions.checks/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "permission_checks" -description = "Permission checking for Anti-Raid modules." -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -poise = { git = "https://github.com/Anti-Raid/poise", branch = "serenity-next" } -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -dashmap = { version = "6", features = ["serde", "inline", "rayon"] } -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -log = "0.4" - -# Anti-Raid specific -splashcore_rs = { path = "../rust.std" } -permissions = { path = "../rust.permissions" } -config = { path = "../rust.config" } -sandwich_driver = { path = "../rust.sandwich_driver" } -silverpelt = { path = "../rust.silverpelt" } - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.kittycat] -git = "https://github.com/infinitybotlist/kittycat" -branch = "main" diff --git a/core/rust.permissions.checks/src/lib.rs b/core/rust.permissions.checks/src/lib.rs deleted file mode 100644 index 57018375..00000000 --- a/core/rust.permissions.checks/src/lib.rs +++ /dev/null @@ -1,588 +0,0 @@ -use botox::cache::CacheHttpImpl; -use kittycat::perms::Permission; -use log::info; -use permissions::types::{PermissionCheck, PermissionResult}; -use serde::{Deserialize, Serialize}; -use serenity::all::{GuildId, UserId}; -use serenity::small_fixed_array::FixedArray; -use silverpelt::cache::SilverpeltCache; -use silverpelt::{ - module_config::{ - get_best_command_configuration, get_command_extended_data, get_module_configuration, - }, - types::{GuildCommandConfiguration, GuildModuleConfiguration}, - utils::permute_command_names, -}; -use sqlx::PgPool; - -#[inline] -pub async fn get_user_discord_info( - guild_id: GuildId, - user_id: UserId, - cache_http: &CacheHttpImpl, - reqwest: &reqwest::Client, - poise_ctx: &Option>, -) -> Result< - ( - bool, // is_owner - UserId, // owner_id - serenity::all::Permissions, // member_perms - FixedArray, // roles - ), - PermissionResult, -> { - #[cfg(test)] - { - // Check for env var CHECK_MODULES_TEST_ENABLED, if so, return dummy data - if std::env::var("CHECK_MODULES_TEST_ENABLED").unwrap_or_default() == "true" { - return Ok(( - true, - UserId::new(1), - serenity::all::Permissions::all(), - FixedArray::new(), - )); - } - } - - if let Some(cached_guild) = guild_id.to_guild_cached(&cache_http.cache) { - // OPTIMIZATION: if owner, we dont need to continue further - if user_id == cached_guild.owner_id { - return Ok(( - true, // is_owner - cached_guild.owner_id, // owner_id - serenity::all::Permissions::all(), // member_perms - FixedArray::new(), // OPTIMIZATION: no role data is needed for perm checks for owners - )); - } - - // OPTIMIZATION: If we have a poise_ctx which is also a ApplicationContext, we can directly use it - if let Some(poise::Context::Application(ref a)) = poise_ctx { - if let Some(ref mem) = a.interaction.member { - return Ok(( - mem.user.id == cached_guild.owner_id, - cached_guild.owner_id, - mem.permissions - .unwrap_or(splashcore_rs::serenity_backport::user_permissions( - mem.user.id, - &mem.roles, - cached_guild.id, - &cached_guild.roles, - cached_guild.owner_id, - )), - mem.roles.clone(), - )); - } - } - - // Now fetch the member, here calling member automatically tries to find in its cache first - if let Some(member) = cached_guild.members.get(&user_id) { - return Ok(( - member.user.id == cached_guild.owner_id, - cached_guild.owner_id, - splashcore_rs::serenity_backport::user_permissions( - member.user.id, - &member.roles, - cached_guild.id, - &cached_guild.roles, - cached_guild.owner_id, - ), - member.roles.clone(), - )); - } - } - - let guild = match guild_id.to_partial_guild(&cache_http).await { - Ok(guild) => guild, - Err(e) => { - return Err(PermissionResult::DiscordError { - error: e.to_string(), - }) - } - }; - - // OPTIMIZATION: if owner, we dont need to continue further - if user_id == guild.owner_id { - return Ok(( - true, - guild.owner_id, - serenity::all::Permissions::all(), - FixedArray::new(), - )); - } - - // OPTIMIZATION: If we have a poise_ctx which is also a ApplicationContext, we can directly use it - if let Some(poise::Context::Application(ref a)) = poise_ctx { - if let Some(ref mem) = a.interaction.member { - return Ok(( - mem.user.id == guild.owner_id, - guild.owner_id, - mem.permissions - .unwrap_or(splashcore_rs::serenity_backport::user_permissions( - mem.user.id, - &mem.roles, - guild.id, - &guild.roles, - guild.owner_id, - )), - mem.roles.clone(), - )); - } - } - - let member = { - let member = - match sandwich_driver::member_in_guild(cache_http, reqwest, guild_id, user_id).await { - Ok(member) => member, - Err(e) => { - return Err(PermissionResult::DiscordError { - error: e.to_string(), - }); - } - }; - - let Some(member) = member else { - return Err(PermissionResult::DiscordError { - error: "Member could not fetched".to_string(), - }); - }; - - member - }; - - Ok(( - member.user.id == guild.owner_id, - guild.owner_id, - splashcore_rs::serenity_backport::user_permissions( - member.user.id, - &member.roles, - guild.id, - &guild.roles, - guild.owner_id, - ), - member.roles.clone(), - )) -} - -pub async fn get_user_kittycat_perms( - opts: &CheckCommandOptions, - pool: &PgPool, - guild_id: GuildId, - guild_owner_id: UserId, - user_id: UserId, - roles: &FixedArray, -) -> Result, silverpelt::Error> { - if let Some(ref custom_resolved_kittycat_perms) = opts.custom_resolved_kittycat_perms { - let kc_perms = silverpelt::member_permission_calc::get_kittycat_perms( - &mut *pool.acquire().await?, - guild_id, - guild_owner_id, - user_id, - roles, - ) - .await?; - - let mut resolved_perms = Vec::new(); - for perm in custom_resolved_kittycat_perms { - if kittycat::perms::has_perm(&kc_perms, perm) { - resolved_perms.push(perm.clone()); - } - } - - Ok(resolved_perms) - } else { - Ok(silverpelt::member_permission_calc::get_kittycat_perms( - &mut *pool.acquire().await?, - guild_id, - guild_owner_id, - user_id, - roles, - ) - .await?) - } -} - -/// Extra options for checking a command -#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] -pub struct CheckCommandOptions { - /// Whether or not to ignore the fact that the module is disabled in the guild - #[serde(default)] - pub ignore_module_disabled: bool, - - /// Whether or not to ignore the fact that the command is disabled in the guild - #[serde(default)] - pub ignore_command_disabled: bool, - - /// What custom resolved permissions to use for the user. API needs this for limiting the permissions of a user - #[serde(default)] - pub custom_resolved_kittycat_perms: Option>, - - /// Custom command configuration to use - #[serde(default)] - pub custom_command_configuration: Option, - - /// Custom module configuration to use - #[serde(default)] - pub custom_module_configuration: Option, - - /// The current channel id - #[serde(default)] - pub channel_id: Option, -} - -#[allow(clippy::derivable_impls)] -impl Default for CheckCommandOptions { - fn default() -> Self { - Self { - ignore_module_disabled: false, - ignore_command_disabled: false, - custom_resolved_kittycat_perms: None, - custom_command_configuration: None, - custom_module_configuration: None, - channel_id: None, - } - } -} - -/// Check command checks whether or not a user has permission to run a command -#[allow(clippy::too_many_arguments)] -pub async fn check_command( - silverpelt_cache: &SilverpeltCache, - command: &str, - guild_id: GuildId, - user_id: UserId, - pool: &PgPool, - serenity_context: &serenity::all::Context, - reqwest: &reqwest::Client, - // If a poise::Context is available and originates from a Application Command, we can fetch the guild+member from cache itself - poise_ctx: &Option>, - // Needed for settings and the website (potentially) - opts: CheckCommandOptions, -) -> PermissionResult { - let command_permutations = permute_command_names(command); - - let module_ref = match silverpelt_cache - .command_id_module_map - .try_get(&command_permutations[0]) - { - dashmap::try_result::TryResult::Present(v) => v, - dashmap::try_result::TryResult::Absent => { - return PermissionResult::ModuleNotFound {}; - } - dashmap::try_result::TryResult::Locked => { - return PermissionResult::GenericError { - error: "This module is being updated! Please try again later.".to_string(), - }; - } - }; - - let module = match silverpelt_cache.module_cache.get(module_ref.value()) { - Some(v) => v, - None => { - return PermissionResult::UnknownModule { - module: module_ref.to_string(), - }; - } - }; - - info!( - "Checking if user {} can run command {} on module {}", - user_id, - command, - module.id() - ); - - if module.root_module() { - if !config::CONFIG.discord_auth.root_users.contains(&user_id) { - return PermissionResult::SudoNotGranted {}; - } - - return PermissionResult::OkWithMessage { - message: "root_cmd".to_string(), - }; - } - - let module_config = { - if let Some(ref custom_module_configuration) = opts.custom_module_configuration { - custom_module_configuration.clone() - } else { - let gmc = - match get_module_configuration(pool, &guild_id.to_string(), module_ref.value()) - .await - { - Ok(v) => v, - Err(e) => { - return e.into(); - } - }; - - gmc.unwrap_or(GuildModuleConfiguration { - id: "".to_string(), - guild_id: guild_id.to_string(), - module: module_ref.clone(), - disabled: None, - }) - } - }; - - let cmd_data = match get_command_extended_data(silverpelt_cache, &command_permutations) { - Ok(v) => v, - Err(e) => { - return e.into(); - } - }; - - let command_config = { - if let Some(ref custom_command_configuration) = opts.custom_command_configuration { - custom_command_configuration.clone() - } else { - let gcc = match get_best_command_configuration( - pool, - &guild_id.to_string(), - &command_permutations, - ) - .await - { - Ok(v) => v, - Err(e) => { - return e.into(); - } - }; - - gcc.unwrap_or(GuildCommandConfiguration { - id: "".to_string(), - guild_id: guild_id.to_string(), - command: command.to_string(), - perms: None, - disabled: None, - }) - } - }; - - // Check if command is disabled if and only if ignore_command_disabled is false - #[allow(clippy::collapsible_if)] - if !opts.ignore_command_disabled { - if command_config - .disabled - .unwrap_or(!cmd_data.is_default_enabled) - { - return PermissionResult::CommandDisabled { - command: command.to_string(), - }; - } - } - - // Check if module is disabled if and only if ignore_module_disabled is false - #[allow(clippy::collapsible_if)] - if !opts.ignore_module_disabled { - let module_default_enabled = { - let Some(module) = silverpelt_cache.module_cache.get(module_ref.value()) else { - return PermissionResult::UnknownModule { - module: module_ref.to_string(), - }; - }; - - module.is_default_enabled() - }; - - if module_config.disabled.unwrap_or(!module_default_enabled) { - return PermissionResult::ModuleDisabled { - module: module_ref.to_string(), - }; - } - } - - // Try getting guild+member from cache to speed up response times first - let (is_owner, guild_owner_id, member_perms, roles) = match get_user_discord_info( - guild_id, - user_id, - &botox::cache::CacheHttpImpl::from_ctx(serenity_context), - reqwest, - poise_ctx, - ) - .await - { - Ok(v) => v, - Err(e) => { - return e; - } - }; - - if is_owner { - return PermissionResult::OkWithMessage { - message: "owner".to_string(), - }; - } - - let kittycat_perms = - match get_user_kittycat_perms(&opts, pool, guild_id, guild_owner_id, user_id, &roles).await - { - Ok(v) => v, - Err(e) => { - return e.into(); - } - }; - - // Check for permission checks in this order: - // - command_config.perms - // - module_config.default_perms - // - cmd_data.default_perms - let check = { - if let Some(perms) = &command_config.perms { - perms - } else { - &cmd_data.default_perms - } - }; - - match silverpelt::ar_event::dispatch_event_to_modules( - &silverpelt::ar_event::EventHandlerContext { - guild_id, - data: serenity_context.data::(), - event: silverpelt::ar_event::AntiraidEvent::Custom(silverpelt::ar_event::CustomEvent { - event_name: "AR/CheckCommand".to_string(), - event_titlename: "(Anti-Raid) Check Command".to_string(), - event_data: serde_json::json!({ - "command": command, - "user_id": user_id, - "member_native_perms": member_perms, - "member_kittycat_perms": kittycat_perms, - "opts": opts, - "check": check, - "module_config": module_config, - "command_config": command_config, - "command_extended_data": cmd_data, - "is_owner": is_owner, - "guild_owner_id": guild_owner_id, - "roles": roles, - }), - }), - serenity_context: serenity_context.clone(), - }, - ) - .await - { - Ok(_) => {} - Err(e) => { - for (i, ei) in e.iter().enumerate() { - if ei.to_string() == "AR/CheckCommand/Skip" { - return PermissionResult::OkWithMessage { - message: format!("IDX=>{},message=>SKIP", i), - }; - } - } - - return PermissionResult::GenericError { - error: e - .into_iter() - .map(|x| x.to_string()) - .collect::>() - .join("\n") - .to_string(), - }; - } - }; - - permissions::check_perms(check, member_perms, &kittycat_perms) -} - -/// Returns whether a member has a kittycat permission -/// -/// Note that in opts, only custom_resolved_kittycat_perms is used -pub async fn member_has_kittycat_perm( - guild_id: GuildId, - user_id: UserId, - pool: &PgPool, - serenity_context: &serenity::all::Context, - reqwest: &reqwest::Client, - // If a poise::Context is available and originates from a Application Command, we can fetch the guild+member from cache itself - poise_ctx: &Option>, - perm: &kittycat::perms::Permission, - opts: CheckCommandOptions, -) -> PermissionResult { - // Try getting guild+member from cache to speed up response times first - let (is_owner, guild_owner_id, member_perms, roles) = match get_user_discord_info( - guild_id, - user_id, - &botox::cache::CacheHttpImpl::from_ctx(serenity_context), - reqwest, - poise_ctx, - ) - .await - { - Ok(v) => v, - Err(e) => { - return e; - } - }; - - if is_owner { - return PermissionResult::OkWithMessage { - message: "owner".to_string(), - }; - } - - let kittycat_perms = - match get_user_kittycat_perms(&opts, pool, guild_id, guild_owner_id, user_id, &roles).await - { - Ok(v) => v, - Err(e) => { - return e.into(); - } - }; - - match silverpelt::ar_event::dispatch_event_to_modules( - &silverpelt::ar_event::EventHandlerContext { - guild_id, - data: serenity_context.data::(), - event: silverpelt::ar_event::AntiraidEvent::Custom(silverpelt::ar_event::CustomEvent { - event_name: "AR/CheckKittycatPermissions".to_string(), - event_titlename: "(Anti-Raid) Check Kittycat Permissions".to_string(), - event_data: serde_json::json!({ - "user_id": user_id, - "member_native_perms": member_perms, - "member_kittycat_perms": kittycat_perms, - "perm": perm, - "is_owner": is_owner, - "guild_owner_id": guild_owner_id, - "roles": roles, - "opts": opts, - }), - }), - serenity_context: serenity_context.clone(), - }, - ) - .await - { - Ok(_) => {} - Err(e) => { - for (i, ei) in e.iter().enumerate() { - if ei.to_string() == "AR/CheckKittycatPermissions/Skip" { - return PermissionResult::OkWithMessage { - message: format!("IDX=>{},message=>SKIP", i), - }; - } - } - - return PermissionResult::GenericError { - error: e - .into_iter() - .map(|x| x.to_string()) - .collect::>() - .join("\n") - .to_string(), - }; - } - }; - - if !kittycat::perms::has_perm(&kittycat_perms, perm) { - return PermissionResult::MissingKittycatPerms { - check: PermissionCheck { - kittycat_perms: vec![perm.to_string()], - native_perms: vec![], - inner_and: false, - }, - }; - } - - PermissionResult::Ok {} -} diff --git a/core/rust.permissions/Cargo.toml b/core/rust.permissions/Cargo.toml deleted file mode 100644 index 577053f1..00000000 --- a/core/rust.permissions/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "permissions" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = { version = "1.0", features = ["derive"] } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.kittycat] -git = "https://github.com/infinitybotlist/kittycat" -branch = "main" diff --git a/core/rust.permissions/src/lib.rs b/core/rust.permissions/src/lib.rs deleted file mode 100644 index b3a1f484..00000000 --- a/core/rust.permissions/src/lib.rs +++ /dev/null @@ -1,157 +0,0 @@ -pub mod parse; -pub mod types; - -use types::{PermissionCheck, PermissionResult}; - -pub type Error = Box; // This is constant and should be copy pasted - -/// This function runs a permission check on a command -pub fn check_perms( - check: &PermissionCheck, - member_native_perms: serenity::all::Permissions, - member_kittycat_perms: &[kittycat::perms::Permission], -) -> PermissionResult { - if check.kittycat_perms.is_empty() && check.native_perms.is_empty() { - return PermissionResult::Ok {}; // Short-circuit if we don't have any permissions to check - } - - // Check if we have ADMINISTRATOR - let is_discord_admin = member_native_perms.contains(serenity::all::Permissions::ADMINISTRATOR); - - // Kittycat - if check.inner_and { - // inner AND, short-circuit if we don't have the permission - for perm in &check.kittycat_perms { - if !kittycat::perms::has_perm( - member_kittycat_perms, - &kittycat::perms::Permission::from_string(perm), - ) { - return PermissionResult::MissingKittycatPerms { - check: check.clone(), - }; - } - } - - if !is_discord_admin { - for perm in &check.native_perms { - if !member_native_perms.contains(*perm) { - return PermissionResult::MissingNativePerms { - check: check.clone(), - }; - } - } - } - } else { - // inner OR, short-circuit if we have the permission - let has_any_np = check - .native_perms - .iter() - .any(|perm| is_discord_admin || member_native_perms.contains(*perm)); - - if !has_any_np { - let has_any_kc = { - let mut has_kc = false; - for perm in check.kittycat_perms.iter() { - let kc = kittycat::perms::Permission::from_string(perm); - - if kittycat::perms::has_perm(member_kittycat_perms, &kc) { - has_kc = true; - break; - } - } - - has_kc - }; - - if !has_any_kc { - return PermissionResult::MissingAnyPerms { - check: check.clone(), - }; - } - } - } - - PermissionResult::Ok {} -} - -#[cfg(test)] -mod tests { - use super::*; - - fn err_with_code(e: PermissionResult, code: &str) -> bool { - let code_got = e.code(); - println!("test_check_perms: {} == {}", code_got, code); - code == code_got - } - - #[test] - fn test_check_perms() { - // Basic tests - assert!(err_with_code( - check_perms( - &PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![serenity::all::Permissions::ADMINISTRATOR], - inner_and: false, - }, - serenity::all::Permissions::empty(), - &["abc.test".into()], - ), - "missing_any_perms" - )); - - assert!(check_perms( - &PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![], - inner_and: false, - }, - serenity::all::Permissions::empty(), - &["abc.test".into()], - ) - .is_ok()); - - // With inner and - assert!(err_with_code( - check_perms( - &PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![ - serenity::all::Permissions::ADMINISTRATOR, - serenity::all::Permissions::BAN_MEMBERS - ], - inner_and: true, - }, - serenity::all::Permissions::BAN_MEMBERS, - &["abc.test".into()], - ), - "missing_native_perms" - )); - - // Admin overrides other native perms - assert!(check_perms( - &PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![serenity::all::Permissions::BAN_MEMBERS], - inner_and: false, - }, - serenity::all::Permissions::ADMINISTRATOR, - &["abc.test".into()], - ) - .is_ok()); - - // Kittycat - assert!(err_with_code( - check_perms( - &PermissionCheck { - kittycat_perms: vec!["backups.create".to_string()], - native_perms: vec![], - inner_and: false, - }, - serenity::all::Permissions::ADMINISTRATOR, - &[], - ), - "missing_any_perms" - )); - } -} diff --git a/core/rust.permissions/src/parse.rs b/core/rust.permissions/src/parse.rs deleted file mode 100644 index 1d0869c5..00000000 --- a/core/rust.permissions/src/parse.rs +++ /dev/null @@ -1,53 +0,0 @@ -use crate::types::PermissionCheck; - -const MAX_KITTYCAT_PERMS: usize = 10; -const MAX_INDIVIDUAL_KITTYCAT_PERM_SIZE: usize = 128; -const MAX_NATIVE_PERMS: usize = 10; - -// Parses a user-inputted PermissionCheck object into a parsed PermissionCheck object. -pub async fn parse_permission_check( - check: &PermissionCheck, -) -> Result { - if check.kittycat_perms.is_empty() && check.native_perms.is_empty() { - return Ok(check.clone()); - } - - let mut parsed_check = PermissionCheck { - kittycat_perms: check.kittycat_perms.clone(), - native_perms: check.native_perms.clone(), - inner_and: check.inner_and, - }; - - if parsed_check.kittycat_perms.len() > MAX_KITTYCAT_PERMS { - return Err(format!( - "too many kittycat perms: {}", - parsed_check.kittycat_perms.len() - ) - .into()); - } - - if parsed_check.native_perms.len() > MAX_NATIVE_PERMS { - return Err(format!("too many native perms: {}", parsed_check.native_perms.len()).into()); - } - - for native_perm in &mut parsed_check.native_perms { - let native_perm_without_unknown_bits = native_perm.iter_names().fold( - serenity::model::permissions::Permissions::empty(), - |acc, (_p_name, perm)| acc | perm, - ); - - *native_perm = native_perm_without_unknown_bits; - } - - for perm in &parsed_check.kittycat_perms { - if perm.len() > MAX_INDIVIDUAL_KITTYCAT_PERM_SIZE { - return Err(format!( - "kittycat perm too long: max={}", - MAX_INDIVIDUAL_KITTYCAT_PERM_SIZE - ) - .into()); - } - } - - Ok(parsed_check) -} diff --git a/core/rust.permissions/src/types.rs b/core/rust.permissions/src/types.rs deleted file mode 100644 index d4db2c4f..00000000 --- a/core/rust.permissions/src/types.rs +++ /dev/null @@ -1,159 +0,0 @@ -use serde::{Deserialize, Serialize}; -use std::fmt::Display; -use std::hash::Hash; - -#[derive(Default, Clone, Hash, Eq, PartialEq, Serialize, Deserialize, Debug)] -pub struct PermissionCheck { - /// The kittycat permissions needed to run the command - pub kittycat_perms: Vec, - /// The native permissions needed to run the command - pub native_perms: Vec, - /// Whether or not the perms are ANDed (all needed) or OR'd (at least one) - pub inner_and: bool, -} - -impl Display for PermissionCheck { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - if !self.native_perms.is_empty() { - write!(f, "\nDiscord: ")?; - - for (j, perm) in self.native_perms.iter().enumerate() { - if j != 0 { - write!(f, " ")?; - } - - write!(f, "{}", perm)?; - - if j < self.native_perms.len() - 1 { - if self.inner_and { - write!(f, " AND")?; - } else { - write!(f, " OR")?; - } - } - } - } - - if !self.kittycat_perms.is_empty() { - write!(f, "\nCustom Permissions (kittycat): ")?; - - for (j, perm) in self.kittycat_perms.iter().enumerate() { - if j != 0 { - write!(f, " ")?; - } - - write!(f, "{}", perm)?; - - if j < self.kittycat_perms.len() - 1 { - if self.inner_and { - write!(f, " AND")?; - } else { - write!(f, " OR")?; - } - } - } - } - - Ok(()) - } -} - -// @ci go=PermissionResult -#[derive(Clone, Serialize, Deserialize, Debug)] -#[serde(tag = "var")] -pub enum PermissionResult { - Ok {}, - OkWithMessage { message: String }, - MissingKittycatPerms { check: PermissionCheck }, - MissingNativePerms { check: PermissionCheck }, - MissingAnyPerms { check: PermissionCheck }, - CommandDisabled { command: String }, - UnknownModule { module: String }, - ModuleNotFound {}, - ModuleDisabled { module: String }, - DiscordError { error: String }, - SudoNotGranted {}, - GenericError { error: String }, -} - -impl From for PermissionResult { - fn from(e: T) -> Self { - PermissionResult::GenericError { - error: e.to_string(), - } - } -} - -impl PermissionResult { - pub fn code(&self) -> &'static str { - match self { - PermissionResult::Ok { .. } => "ok", - PermissionResult::OkWithMessage { .. } => "ok_with_message", - PermissionResult::MissingKittycatPerms { .. } => "missing_kittycat_perms", - PermissionResult::MissingNativePerms { .. } => "missing_native_perms", - PermissionResult::MissingAnyPerms { .. } => "missing_any_perms", - PermissionResult::CommandDisabled { .. } => "command_disabled", - PermissionResult::UnknownModule { .. } => "unknown_module", - PermissionResult::ModuleNotFound { .. } => "module_not_found", - PermissionResult::ModuleDisabled { .. } => "module_disabled", - PermissionResult::DiscordError { .. } => "discord_error", - PermissionResult::SudoNotGranted { .. } => "sudo_not_granted", - PermissionResult::GenericError { .. } => "generic_error", - } - } - - pub fn is_ok(&self) -> bool { - matches!( - self, - PermissionResult::Ok { .. } | PermissionResult::OkWithMessage { .. } - ) - } - - pub fn to_markdown(&self) -> String { - match self { - PermissionResult::Ok { .. } => "No message/context available".to_string(), - PermissionResult::OkWithMessage { message } => message.clone(), - PermissionResult::MissingKittycatPerms { check } => { - format!( - "You do not have the required permissions to perform this action. Try checking that you have the below permissions: {}", - check - ) - } - PermissionResult::MissingNativePerms { check } => { - format!( - "You do not have the required permissions to perform this action. Try checking that you have the below permissions: {}", - check - ) - } - PermissionResult::MissingAnyPerms { check } => { - format!( - "You do not have the required permissions to perform this action. Try checking that you have the below permissions: {}", - check - ) - } - PermissionResult::CommandDisabled { command } => { - format!( - "You cannot perform this action because the command ``{}`` is disabled on this server", - command - ) - } - PermissionResult::UnknownModule { module } => { - format!("The module ``{}`` does not exist", module) - } - PermissionResult::ModuleNotFound {} => { - "The module corresponding to this command could not be determined".to_string() - } - PermissionResult::ModuleDisabled { module } => { - format!("The module ``{}`` is disabled on this server", module) - } - PermissionResult::DiscordError { error } => { - format!("A Discord-related error seems to have occurred: {}.\n\nPlease try again later, it might work!", error) - } - PermissionResult::SudoNotGranted {} => { - "This module is only available for root (staff) and/or developers of the bot" - .to_string() - } - PermissionResult::GenericError { error } => error.clone(), - } - } -} diff --git a/core/rust.rpc_server.bot/Cargo.lock b/core/rust.rpc_server.bot/Cargo.lock deleted file mode 100644 index 2ec72d1a..00000000 --- a/core/rust.rpc_server.bot/Cargo.lock +++ /dev/null @@ -1,4506 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "botv2" -version = "6.0.0" -dependencies = [ - "async-recursion", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "env_logger", - "extract_map", - "fred", - "futures", - "futures-util", - "gwevent", - "indexmap", - "jobserver 0.0.1", - "kittycat", - "log", - "moka", - "once_cell", - "plsfix", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_repr", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "text-diff", - "tokio", - "url", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "calendrical_calculations" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe3bc6a50b4667fafdb6d9cf26731c5418c457e317d8166c972014facf9a5d" -dependencies = [ - "core_maths", - "displaydoc", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver 0.1.31", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core_maths" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" -dependencies = [ - "libm", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_filter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fancy-regex" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7493d4c459da9f84325ad297371a6b2b8a162800873a22e3b6b6512e61d18c05" -dependencies = [ - "bit-set", - "regex", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "fixed_decimal" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc7fdec9d7f6671a3ebb3282c969962aba67c49f6abac5311959b65cafabc10" -dependencies = [ - "displaydoc", - "smallvec", - "writeable", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gwevent" -version = "0.0.1" -dependencies = [ - "chrono", - "extract_map", - "indexmap", - "log", - "serde", - "serde_json", - "serenity", - "small-fixed-array", - "strum", - "strum_macros", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21be1c98fbdb29fff7e34b2939a4f30dad330d4cc20f7be1b3956e21032f67ba" -dependencies = [ - "icu_calendar", - "icu_casemap", - "icu_collator", - "icu_collections", - "icu_compactdecimal", - "icu_datetime", - "icu_decimal", - "icu_displaynames", - "icu_list", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_plurals", - "icu_properties", - "icu_provider", - "icu_relativetime", - "icu_segmenter", - "icu_timezone", -] - -[[package]] -name = "icu_calendar" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb932a690c92f87955e923106181ee0d5682e688ff37fb5c7b296e1fe806edb" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22aec7d032735d9acb256eeef72adcac43c3b7572f19b51576a63d664b524ca2" - -[[package]] -name = "icu_casemap" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7988d4f2655012592ac5b027722a93fbe12ff2a86d3e0f9ae686aedba0984f5e" -dependencies = [ - "displaydoc", - "icu_casemap_data", - "icu_collections", - "icu_locid", - "icu_properties", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_casemap_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36409fb8ce6f87c408310d87396ac471cc7320e007e648814c607c60fe77cc5" - -[[package]] -name = "icu_collator" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a45056e541cffde068f5c81ac1c0503b9ee2a4b967546422e509c5c653750" -dependencies = [ - "displaydoc", - "icu_collator_data", - "icu_collections", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39774016c5b9ad006941f3196fea83ade662d9167eb573111c8f4cc9593e2999" - -[[package]] -name = "icu_collections" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3c22da90659121ae1e38bd0fb378d15179c820f56a0c278032fb4eb5a0ca60" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_compactdecimal_data", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eaf4902ee2e804f2583611722f6961fe85f31eab7ec790f47dde2d1cd494fb" - -[[package]] -name = "icu_datetime" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508c7ed627cc0b031c81203eb98f34433e24b32b39d5b2c0238e4962a00957d" -dependencies = [ - "displaydoc", - "either", - "fixed_decimal", - "icu_calendar", - "icu_datetime_data", - "icu_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_timezone", - "smallvec", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_datetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6abc569cb4ee80b30707566f05c5c9ed4bed765f91ce41e7f5a37c5e6a75b3f" - -[[package]] -name = "icu_decimal" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf994f9ed8061c17bb313f28fba6cffc736f0a16c7fab827efc9b73fd3f7778" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "writeable", -] - -[[package]] -name = "icu_decimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2de3548316b697c70f30dec1395c9212db09df1d86a27624ee24872b71326c" - -[[package]] -name = "icu_displaynames" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726c0d83ff52f05907275f39e5bb7949a92fa3d09538de60cf73ccf8ee89a613" -dependencies = [ - "icu_displaynames_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_displaynames_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af40e6b723e5e6d9359cf0bb4e4ed6dfb9d6ab16b73b5c82b61f947e88bb30f6" - -[[package]] -name = "icu_list" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6c04ec71ad1bacdbfb47164d4801f80a0533d9340f94f1a880f521eff59f54" -dependencies = [ - "displaydoc", - "icu_list_data", - "icu_locid_transform", - "icu_provider", - "regex-automata 0.2.0", - "writeable", -] - -[[package]] -name = "icu_list_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6afcf7a9a7fedece70b7f17d7a7ecdfb8df145d37ae46d0277cd1e3932532" - -[[package]] -name = "icu_locid" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" - -[[package]] -name = "icu_normalizer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c183e31ed700f1ecd6b032d104c52fe8b15d028956b73727c97ec176b170e187" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22026918a80e6a9a330cb01b60f950e2b4e5284c59528fd0c6150076ef4c8522" - -[[package]] -name = "icu_plurals" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d807b123eb2a9ae8f12080fb8cce479f5c8a761fba0bb5ab52da6dd5e31a03" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals_data", - "icu_provider", - "zerovec", -] - -[[package]] -name = "icu_plurals_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3acd5f1f2f988ed2dae9316c3d3560dfe4e03a7516d142b4b89b92252ada41a" - -[[package]] -name = "icu_properties" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e296217453af983efa25f287a4c1da04b9a63bf1ed63719455068e4453eb5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a86c0e384532b06b6c104814f9c1b13bcd5b64409001c0d05713a1f3529d99" - -[[package]] -name = "icu_provider" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "icu_relativetime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47825312a5eb0790bad7b718fa8d41a8ea1e0ba597b4f7bb84bcfe97d7fc5aba" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_relativetime_data", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_relativetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b55cc15ea8981fbba78e9347d0c4003d4490c85f76e9adc7f270290046cae8" - -[[package]] -name = "icu_segmenter" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dc1e8f4ba33a6a4956770ac5c08570f255d6605519fb3a859a0c0a270a2f8f" -dependencies = [ - "core_maths", - "displaydoc", - "icu_collections", - "icu_locid", - "icu_provider", - "icu_segmenter_data", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_segmenter_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673d6698dcffce08cfe8fc5da3c11c3f2c663d5d6137fd58ab2cbf44235ab46" - -[[package]] -name = "icu_timezone" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35aabe571a7c653c0f543ff1512b8a1b2ad481cfa24b3d25115298d2ff3b50f" -dependencies = [ - "displaydoc", - "icu_calendar", - "icu_locid", - "icu_provider", - "icu_timezone_data", - "tinystr", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_timezone_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceee21e181cce2ab44e95923da6b3418df75369f570df82264c29c51ca398d4" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.0.1" -dependencies = [ - "botox", - "chrono", - "gwevent", - "indexmap", - "log", - "poise", - "reqwest", - "serde", - "serde_json", - "serenity", - "splashcore_rs", - "sqlx", - "tokio", -] - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "kittycat" -version = "0.2.0" -source = "git+https://github.com/infinitybotlist/kittycat?branch=main#9656e5216715e7a79b21563304443f42b7594b8c" -dependencies = [ - "indexmap", - "serde", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "litemap" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "moka" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" -dependencies = [ - "async-lock", - "async-trait", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener 5.3.0", - "futures-util", - "once_cell", - "parking_lot", - "quanta", - "rustc_version", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oem_cp" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330138902ab4dab09a86e6b7ab7ddeffb5f8435d52fe0df1bce8b06a17b10ee4" -dependencies = [ - "phf", - "phf_codegen", - "serde", - "serde_json", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plsfix" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d4fe3ff2c8c5fa4d86ee54d75ea27fe6aa93eb43209374eb1b56261e5eaf2e" -dependencies = [ - "encoding", - "encoding_rs", - "fancy-regex", - "html-escape", - "icu", - "lazy_static", - "oem_cp", - "regex", - "rustc-hash", - "unicode-normalization", -] - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "raw-cpuid" -version = "11.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" -dependencies = [ - "memchr", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "dashmap", - "futures", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 2.5.3", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "term" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "text-diff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309238dd66f8bf11a20d015b727b926f294a13fcb8d56770bb984e7a22c43897" -dependencies = [ - "getopts", - "term", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-width" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" - -[[package]] -name = "yoke" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zerofrom" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zerotrie" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0594125a0574fb93059c92c588ab209cc036a23d1baeb3410fa9181bea551a0" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff4439ae91fb5c72b8abc12f3f2dbf51bd27e6eadb9f8a5bc8898dddb0e27ea" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4e5997cbf58990550ef1f0e5124a05e47e1ebd33a84af25739be6031a62c20" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] diff --git a/core/rust.rpc_server.bot/Cargo.toml b/core/rust.rpc_server.bot/Cargo.toml deleted file mode 100644 index f8aee400..00000000 --- a/core/rust.rpc_server.bot/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "rust_rpc_server_bot" -version = "6.0.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = "1.0" -serde_json = "1.0" -indexmap = { version = "2", features = ["serde"] } -bitflags = "2" -axum = { version = "0.7.5", features = ["macros"] } - -# Anti-Raid specific -splashcore_rs = { path = "../../core/rust.std" } -ar_settings = { path = "../../core/rust.settings" } -sandwich_driver = { path = "../../core/rust.sandwich_driver" } -silverpelt = { path = "../../core/rust.silverpelt" } -permission_checks = { path = "../../core/rust.permissions.checks" } -permissions = { path = "../../core/rust.permissions" } -rust_rpc_server = { path = "../../core/rust.rpc_server" } -templating = { path = "../../core/rust.templating" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.kittycat] -git = "https://github.com/infinitybotlist/kittycat" -branch = "main" - diff --git a/core/rust.rpc_server.bot/src/lib.rs b/core/rust.rpc_server.bot/src/lib.rs deleted file mode 100644 index 6b364f94..00000000 --- a/core/rust.rpc_server.bot/src/lib.rs +++ /dev/null @@ -1,269 +0,0 @@ -pub mod settings_execute; -pub mod templating_exec; -pub mod types; - -use axum::{ - extract::{Path, State}, - http::StatusCode, - routing::{get, post}, - Json, Router, -}; -use rust_rpc_server::AppData; -use std::sync::Arc; - -type Response = Result, (StatusCode, String)>; - -pub fn create_bot_rpc_server( - data: Arc, - ctx: &serenity::all::Context, -) -> axum::routing::IntoMakeService { - let router = rust_rpc_server::create_blank_rpc_server() - // Returns the list of modules [Modules] - .route("/modules", get(modules)) - // Given a list of guild ids, return a set of 0s and 1s indicating whether each guild exists in cache [GuildsExist] - .route("/guilds-exist", get(guilds_exist)) - // Returns basic user/guild information [BaseGuildUserInfo] - .route( - "/base-guild-user-info/:guild_id/:user_id", - get(base_guild_user_info), - ) - // Returns if the user has permission to run a command on a given guild [CheckCommandPermission] - .route( - "/check-command-permission/:guild_id/:user_id", - get(check_command_permission), - ) - // Verify/parse a set of permission checks returning the parsed checks [ParsePermissionChecks] - .route("/parse-permission-checks", get(parse_permission_checks)) - // Clears the modules enabled cache [ClearModulesEnabledCache] - .route( - "/clear-modules-enabled-cache", - post(clear_modules_enabled_cache), - ) - // Executes a template on a Lua VM - .route( - "/template-exec/:guild_id/:user_id", - post(templating_exec::execute_template), - ) - // Executes an operation on a setting [SettingsOperation] - .route( - "/settings-operation/:guild_id/:user_id", - post(settings_execute::settings_operation), - ); - let router: Router<()> = router.with_state(AppData::new(data, ctx)); - router.into_make_service() -} - -/// Returns a list of modules [Modules] -async fn modules( - State(AppData { data, .. }): State, -) -> Json> { - let mut modules = Vec::new(); - - for idm in data.silverpelt_cache.canonical_module_cache.iter() { - let module = idm.value(); - modules.push(module.clone()); - } - - Json(modules) -} - -/// Given a list of guild ids, return a set of 0s and 1s indicating whether each guild exists in cache [GuildsExist] -#[axum::debug_handler] -async fn guilds_exist( - State(AppData { - data, cache_http, .. - }): State, - Json(guilds): Json>, -) -> Response> { - let mut guilds_exist = Vec::with_capacity(guilds.len()); - - for guild in guilds { - let has_guild = sandwich_driver::has_guild(&cache_http, &data.reqwest, guild) - .await - .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; - - guilds_exist.push({ - if has_guild { - 1 - } else { - 0 - } - }); - } - - Ok(Json(guilds_exist)) -} - -/// Returns basic user/guild information [BaseGuildUserInfo] -async fn base_guild_user_info( - State(AppData { - data, cache_http, .. - }): State, - Path((guild_id, user_id)): Path<(serenity::all::GuildId, serenity::all::UserId)>, -) -> Response { - let bot_user_id = cache_http.cache.current_user().id; - let guild = sandwich_driver::guild(&cache_http, &data.reqwest, guild_id) - .await - .map_err(|e| { - ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to get guild: {:#?}", e), - ) - })?; - - // Next fetch the member and bot_user - let member: serenity::model::prelude::Member = - match sandwich_driver::member_in_guild(&cache_http, &data.reqwest, guild_id, user_id).await - { - Ok(Some(member)) => member, - Ok(None) => { - return Err((StatusCode::NOT_FOUND, "User not found".into())); - } - Err(e) => { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to get member: {:#?}", e), - )); - } - }; - - let bot_user: serenity::model::prelude::Member = - match sandwich_driver::member_in_guild(&cache_http, &data.reqwest, guild_id, bot_user_id) - .await - { - Ok(Some(member)) => member, - Ok(None) => { - return Err((StatusCode::NOT_FOUND, "Bot user not found".into())); - } - Err(e) => { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to get bot user: {:#?}", e), - )); - } - }; - - // Fetch the channels - let channels = sandwich_driver::guild_channels(&cache_http, &data.reqwest, guild_id) - .await - .map_err(|e| { - ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to get channels: {:#?}", e), - ) - })?; - - let mut channels_with_permissions = Vec::with_capacity(channels.len()); - - for channel in channels.iter() { - channels_with_permissions.push(crate::types::GuildChannelWithPermissions { - user: guild.user_permissions_in(channel, &member), - bot: guild.user_permissions_in(channel, &bot_user), - channel: channel.clone(), - }); - } - - Ok(Json(crate::types::BaseGuildUserInfo { - name: guild.name.to_string(), - icon: guild.icon_url(), - owner_id: guild.owner_id.to_string(), - roles: guild.roles.into_iter().collect(), - user_roles: member.roles.to_vec(), - bot_roles: bot_user.roles.to_vec(), - channels: channels_with_permissions, - })) -} - -/// Returns if the user has permission to run a command on a given guild [CheckCommandPermission] -async fn check_command_permission( - State(AppData { - data, - serenity_context, - .. - }): State, - Path((guild_id, user_id)): Path<(serenity::all::GuildId, serenity::all::UserId)>, - Json(req): Json, -) -> Response { - let opts = req.opts; - - let flags = crate::types::RpcCheckCommandOptionsFlags::from_bits_truncate(opts.flags); - - let perm_res = permission_checks::check_command( - &data.silverpelt_cache, - &req.command, - guild_id, - user_id, - &data.pool, - &serenity_context, - &data.reqwest, - &None, - permission_checks::CheckCommandOptions { - ignore_module_disabled: flags - .contains(crate::types::RpcCheckCommandOptionsFlags::IGNORE_MODULE_DISABLED), - ignore_command_disabled: flags - .contains(crate::types::RpcCheckCommandOptionsFlags::IGNORE_COMMAND_DISABLED), - custom_resolved_kittycat_perms: opts.custom_resolved_kittycat_perms.map(|crkp| { - crkp.iter() - .map(|x| kittycat::perms::Permission::from_string(x)) - .collect::>() - }), - custom_command_configuration: opts.custom_command_configuration.map(|x| *x), - custom_module_configuration: opts.custom_module_configuration.map(|x| *x), - channel_id: opts.channel_id, - }, - ) - .await; - - let is_ok = perm_res.is_ok(); - - Ok(Json(crate::types::CheckCommandPermission { - perm_res, - is_ok, - })) -} - -/// Verify/parse a permission check returning the parsed check [ParsePermissionChecks] -async fn parse_permission_checks( - State(AppData { .. }): State, - Json(checks): Json, -) -> Response { - let parsed_checks = permissions::parse::parse_permission_check(&checks) - .await - .map_err(|e| { - ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Failed to parse permission check: {:#?}", e), - ) - })?; - - Ok(Json(parsed_checks)) -} - -// Clears the modules enabled cache [ClearModulesEnabledCache] -async fn clear_modules_enabled_cache( - State(AppData { data, .. }): State, - Json(req): Json, -) -> Response { - if let Some(guild_id) = req.guild_id { - if let Some(module) = req.module { - data.silverpelt_cache - .module_enabled_cache - .invalidate(&(guild_id, module)) - .await; - } else { - // Global enable/disable the module by iterating the entire cache - for (k, _) in data.silverpelt_cache.module_enabled_cache.iter() { - if k.0 == guild_id { - data.silverpelt_cache - .module_enabled_cache - .invalidate(&(k.0, k.1.clone())) - .await; - } - } - } - } else { - data.silverpelt_cache.module_enabled_cache.invalidate_all() - } - - Ok(Json(crate::types::ClearModulesEnabledCacheResponse {})) -} diff --git a/core/rust.rpc_server.bot/src/settings_execute.rs b/core/rust.rpc_server.bot/src/settings_execute.rs deleted file mode 100644 index 87b8bee8..00000000 --- a/core/rust.rpc_server.bot/src/settings_execute.rs +++ /dev/null @@ -1,109 +0,0 @@ -use crate::types::CanonicalSettingsResult; -use ar_settings::{self, types::OperationType, types::SettingsError}; -use axum::{ - extract::{Path, State}, - Json, -}; -use rust_rpc_server::AppData; - -/// Executes an operation on a setting [SettingsOperation] -pub(crate) async fn settings_operation( - State(AppData { - data, - serenity_context, - .. - }): State, - Path((guild_id, user_id)): Path<(serenity::all::GuildId, serenity::all::UserId)>, - Json(req): Json, -) -> Json { - let op: OperationType = req.op.into(); - - // Find the setting - let mut setting = None; - - if let Some(module_setting) = data.silverpelt_cache.settings_cache.get(&req.setting) { - setting = Some(module_setting.clone()); - }; - - if let Some(page_setting) = templating::cache::get_setting(guild_id, &req.setting).await { - setting = Some(page_setting); - }; - - let Some(setting) = setting else { - return Json(CanonicalSettingsResult::Err { - error: SettingsError::Generic { - message: "Setting not found".to_string(), - src: "SettingsOperationCore".to_string(), - typ: "client".to_string(), - }, - }); - }; - - match op { - OperationType::View => { - match ar_settings::cfg::settings_view( - &setting, - &data.settings_data(serenity_context), - guild_id, - user_id, - req.fields, - ) - .await - { - Ok(res) => Json(CanonicalSettingsResult::Ok { fields: res }), - Err(e) => Json(CanonicalSettingsResult::Err { error: e.into() }), - } - } - OperationType::Create => { - match ar_settings::cfg::settings_create( - &setting, - &data.settings_data(serenity_context), - guild_id, - user_id, - req.fields, - ) - .await - { - Ok(res) => Json(CanonicalSettingsResult::Ok { fields: vec![res] }), - Err(e) => Json(CanonicalSettingsResult::Err { error: e.into() }), - } - } - OperationType::Update => { - match ar_settings::cfg::settings_update( - &setting, - &data.settings_data(serenity_context), - guild_id, - user_id, - req.fields, - ) - .await - { - Ok(res) => Json(CanonicalSettingsResult::Ok { fields: vec![res] }), - Err(e) => Json(CanonicalSettingsResult::Err { error: e.into() }), - } - } - OperationType::Delete => { - let Some(pkey) = req.fields.get(&setting.primary_key) else { - return Json(CanonicalSettingsResult::Err { - error: SettingsError::MissingOrInvalidField { - field: setting.primary_key.to_string(), - src: "SettingsOperation".to_string(), - }, - }); - }; - - match ar_settings::cfg::settings_delete( - &setting, - &data.settings_data(serenity_context), - guild_id, - user_id, - pkey.clone(), - ) - .await - { - Ok(_res) => Json(CanonicalSettingsResult::Ok { fields: vec![] }), - Err(e) => Json(CanonicalSettingsResult::Err { error: e.into() }), - } - } - } -} diff --git a/core/rust.rpc_server.bot/src/templating_exec.rs b/core/rust.rpc_server.bot/src/templating_exec.rs deleted file mode 100644 index e7e5e0ce..00000000 --- a/core/rust.rpc_server.bot/src/templating_exec.rs +++ /dev/null @@ -1,58 +0,0 @@ -use crate::types::ExecuteTemplateResponse; -use crate::AppData; -use axum::{ - extract::{Path, State}, - Json, -}; - -/// Executes a template on a Lua VM -pub(crate) async fn execute_template( - State(AppData { - data, - serenity_context, - .. - }): State, - Path((guild_id, user_id)): Path<(serenity::all::GuildId, serenity::all::UserId)>, - Json(req): Json, -) -> Json { - let perm_res = permission_checks::check_command( - &data.silverpelt_cache, - "exec_template", - guild_id, - user_id, - &data.pool, - &serenity_context, - &data.reqwest, - &None, - permission_checks::CheckCommandOptions::default(), - ) - .await; - - if !perm_res.is_ok() { - return Json(ExecuteTemplateResponse::PermissionError { res: perm_res }); - } - - let resp = templating::execute::>( - guild_id, - templating::Template::Raw(req.template), - data.pool.clone(), - serenity_context.clone(), - data.reqwest.clone(), - templating::event::Event::new( - "(Anti-Raid) Template Execution".to_string(), - "AR/Virtual_ExecTemplate".to_string(), - "AR/Virtual_ExecTemplate".to_string(), - templating::event::ArcOrNormal::Normal(req.args), - false, - Some(user_id.to_string()), - ), - ) - .await; - - match resp { - Ok(reply) => Json(ExecuteTemplateResponse::Ok { result: reply }), - Err(e) => Json(ExecuteTemplateResponse::ExecErr { - error: e.to_string(), - }), - } -} diff --git a/core/rust.rpc_server.bot/src/types.rs b/core/rust.rpc_server.bot/src/types.rs deleted file mode 100644 index 1d143d7b..00000000 --- a/core/rust.rpc_server.bot/src/types.rs +++ /dev/null @@ -1,116 +0,0 @@ -use permissions::types::PermissionResult; -use serde::{Deserialize, Serialize}; -use serenity::all::{GuildChannel, Permissions, Role, RoleId}; -use silverpelt::types::{GuildCommandConfiguration, GuildModuleConfiguration}; - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct GuildChannelWithPermissions { - pub user: Permissions, - pub bot: Permissions, - pub channel: GuildChannel, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct BaseGuildUserInfo { - pub owner_id: String, - pub name: String, - pub icon: Option, - /// List of all roles in the server - pub roles: Vec, - /// List of roles the user has - pub user_roles: Vec, - /// List of roles the bot has - pub bot_roles: Vec, - /// List of all channels in the server - pub channels: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct CheckCommandPermission { - pub perm_res: PermissionResult, - pub is_ok: bool, -} - -#[derive(Debug, Serialize, Deserialize)] -/// Given a guild id, a user id and a command name, check if the user has permission to run the command -pub struct CheckCommandPermissionRequest { - pub command: String, - pub opts: RpcCheckCommandOptions, -} - -/// Extra options for checking a command -/// -/// This is seperate from the actual internal stuff to both avoid exposing -/// internals and to optimize data flow -#[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] -pub struct RpcCheckCommandOptions { - /// Flags of type RpcCheckCommandOptionsFlags - #[serde(default)] - pub flags: u8, - - /// What custom resolved permissions to use for the user. - /// - /// API needs this for limiting the permissions of a user, allows setting custom resolved perms - #[serde(default)] - pub custom_resolved_kittycat_perms: Option>, - - /// Custom permission checks to use - #[serde(default)] - pub custom_command_configuration: Option>, - - /// Custom permission checks to use - #[serde(default)] - pub custom_module_configuration: Option>, - - /// The current channel id - #[serde(default)] - pub channel_id: Option, -} - -bitflags::bitflags! { - pub struct RpcCheckCommandOptionsFlags: u8 { - /// Whether or not to ignore the fact that the module is disabled in the guild - const IGNORE_MODULE_DISABLED = 1 << 2; - /// Whether or not to ignore the fact that the command is disabled in the guild - const IGNORE_COMMAND_DISABLED = 1 << 3; - } -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct ClearModulesEnabledCacheRequest { - pub guild_id: Option, - pub module: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ClearModulesEnabledCacheResponse {} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum CanonicalSettingsResult { - Ok { - fields: Vec>, - }, - Err { - error: ar_settings::types::SettingsError, - }, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct SettingsOperationRequest { - pub fields: indexmap::IndexMap, - pub op: ar_settings::types::OperationType, - pub setting: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ExecuteTemplateRequest { - pub args: serde_json::Value, - pub template: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum ExecuteTemplateResponse { - Ok { result: Option }, - ExecErr { error: String }, - PermissionError { res: PermissionResult }, -} diff --git a/core/rust.rpc_server/Cargo.lock b/core/rust.rpc_server/Cargo.lock deleted file mode 100644 index 2ec72d1a..00000000 --- a/core/rust.rpc_server/Cargo.lock +++ /dev/null @@ -1,4506 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "botv2" -version = "6.0.0" -dependencies = [ - "async-recursion", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "env_logger", - "extract_map", - "fred", - "futures", - "futures-util", - "gwevent", - "indexmap", - "jobserver 0.0.1", - "kittycat", - "log", - "moka", - "once_cell", - "plsfix", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_repr", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "text-diff", - "tokio", - "url", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "calendrical_calculations" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe3bc6a50b4667fafdb6d9cf26731c5418c457e317d8166c972014facf9a5d" -dependencies = [ - "core_maths", - "displaydoc", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver 0.1.31", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core_maths" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" -dependencies = [ - "libm", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_filter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fancy-regex" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7493d4c459da9f84325ad297371a6b2b8a162800873a22e3b6b6512e61d18c05" -dependencies = [ - "bit-set", - "regex", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "fixed_decimal" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc7fdec9d7f6671a3ebb3282c969962aba67c49f6abac5311959b65cafabc10" -dependencies = [ - "displaydoc", - "smallvec", - "writeable", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gwevent" -version = "0.0.1" -dependencies = [ - "chrono", - "extract_map", - "indexmap", - "log", - "serde", - "serde_json", - "serenity", - "small-fixed-array", - "strum", - "strum_macros", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21be1c98fbdb29fff7e34b2939a4f30dad330d4cc20f7be1b3956e21032f67ba" -dependencies = [ - "icu_calendar", - "icu_casemap", - "icu_collator", - "icu_collections", - "icu_compactdecimal", - "icu_datetime", - "icu_decimal", - "icu_displaynames", - "icu_list", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_plurals", - "icu_properties", - "icu_provider", - "icu_relativetime", - "icu_segmenter", - "icu_timezone", -] - -[[package]] -name = "icu_calendar" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb932a690c92f87955e923106181ee0d5682e688ff37fb5c7b296e1fe806edb" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22aec7d032735d9acb256eeef72adcac43c3b7572f19b51576a63d664b524ca2" - -[[package]] -name = "icu_casemap" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7988d4f2655012592ac5b027722a93fbe12ff2a86d3e0f9ae686aedba0984f5e" -dependencies = [ - "displaydoc", - "icu_casemap_data", - "icu_collections", - "icu_locid", - "icu_properties", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_casemap_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36409fb8ce6f87c408310d87396ac471cc7320e007e648814c607c60fe77cc5" - -[[package]] -name = "icu_collator" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a45056e541cffde068f5c81ac1c0503b9ee2a4b967546422e509c5c653750" -dependencies = [ - "displaydoc", - "icu_collator_data", - "icu_collections", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39774016c5b9ad006941f3196fea83ade662d9167eb573111c8f4cc9593e2999" - -[[package]] -name = "icu_collections" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3c22da90659121ae1e38bd0fb378d15179c820f56a0c278032fb4eb5a0ca60" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_compactdecimal_data", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eaf4902ee2e804f2583611722f6961fe85f31eab7ec790f47dde2d1cd494fb" - -[[package]] -name = "icu_datetime" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508c7ed627cc0b031c81203eb98f34433e24b32b39d5b2c0238e4962a00957d" -dependencies = [ - "displaydoc", - "either", - "fixed_decimal", - "icu_calendar", - "icu_datetime_data", - "icu_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_timezone", - "smallvec", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_datetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6abc569cb4ee80b30707566f05c5c9ed4bed765f91ce41e7f5a37c5e6a75b3f" - -[[package]] -name = "icu_decimal" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf994f9ed8061c17bb313f28fba6cffc736f0a16c7fab827efc9b73fd3f7778" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "writeable", -] - -[[package]] -name = "icu_decimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2de3548316b697c70f30dec1395c9212db09df1d86a27624ee24872b71326c" - -[[package]] -name = "icu_displaynames" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726c0d83ff52f05907275f39e5bb7949a92fa3d09538de60cf73ccf8ee89a613" -dependencies = [ - "icu_displaynames_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_displaynames_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af40e6b723e5e6d9359cf0bb4e4ed6dfb9d6ab16b73b5c82b61f947e88bb30f6" - -[[package]] -name = "icu_list" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6c04ec71ad1bacdbfb47164d4801f80a0533d9340f94f1a880f521eff59f54" -dependencies = [ - "displaydoc", - "icu_list_data", - "icu_locid_transform", - "icu_provider", - "regex-automata 0.2.0", - "writeable", -] - -[[package]] -name = "icu_list_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6afcf7a9a7fedece70b7f17d7a7ecdfb8df145d37ae46d0277cd1e3932532" - -[[package]] -name = "icu_locid" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" - -[[package]] -name = "icu_normalizer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c183e31ed700f1ecd6b032d104c52fe8b15d028956b73727c97ec176b170e187" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22026918a80e6a9a330cb01b60f950e2b4e5284c59528fd0c6150076ef4c8522" - -[[package]] -name = "icu_plurals" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d807b123eb2a9ae8f12080fb8cce479f5c8a761fba0bb5ab52da6dd5e31a03" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals_data", - "icu_provider", - "zerovec", -] - -[[package]] -name = "icu_plurals_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3acd5f1f2f988ed2dae9316c3d3560dfe4e03a7516d142b4b89b92252ada41a" - -[[package]] -name = "icu_properties" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e296217453af983efa25f287a4c1da04b9a63bf1ed63719455068e4453eb5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a86c0e384532b06b6c104814f9c1b13bcd5b64409001c0d05713a1f3529d99" - -[[package]] -name = "icu_provider" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "icu_relativetime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47825312a5eb0790bad7b718fa8d41a8ea1e0ba597b4f7bb84bcfe97d7fc5aba" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_relativetime_data", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_relativetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b55cc15ea8981fbba78e9347d0c4003d4490c85f76e9adc7f270290046cae8" - -[[package]] -name = "icu_segmenter" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dc1e8f4ba33a6a4956770ac5c08570f255d6605519fb3a859a0c0a270a2f8f" -dependencies = [ - "core_maths", - "displaydoc", - "icu_collections", - "icu_locid", - "icu_provider", - "icu_segmenter_data", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_segmenter_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673d6698dcffce08cfe8fc5da3c11c3f2c663d5d6137fd58ab2cbf44235ab46" - -[[package]] -name = "icu_timezone" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35aabe571a7c653c0f543ff1512b8a1b2ad481cfa24b3d25115298d2ff3b50f" -dependencies = [ - "displaydoc", - "icu_calendar", - "icu_locid", - "icu_provider", - "icu_timezone_data", - "tinystr", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_timezone_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceee21e181cce2ab44e95923da6b3418df75369f570df82264c29c51ca398d4" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.0.1" -dependencies = [ - "botox", - "chrono", - "gwevent", - "indexmap", - "log", - "poise", - "reqwest", - "serde", - "serde_json", - "serenity", - "splashcore_rs", - "sqlx", - "tokio", -] - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "kittycat" -version = "0.2.0" -source = "git+https://github.com/infinitybotlist/kittycat?branch=main#9656e5216715e7a79b21563304443f42b7594b8c" -dependencies = [ - "indexmap", - "serde", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "litemap" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "moka" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" -dependencies = [ - "async-lock", - "async-trait", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener 5.3.0", - "futures-util", - "once_cell", - "parking_lot", - "quanta", - "rustc_version", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oem_cp" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330138902ab4dab09a86e6b7ab7ddeffb5f8435d52fe0df1bce8b06a17b10ee4" -dependencies = [ - "phf", - "phf_codegen", - "serde", - "serde_json", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plsfix" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d4fe3ff2c8c5fa4d86ee54d75ea27fe6aa93eb43209374eb1b56261e5eaf2e" -dependencies = [ - "encoding", - "encoding_rs", - "fancy-regex", - "html-escape", - "icu", - "lazy_static", - "oem_cp", - "regex", - "rustc-hash", - "unicode-normalization", -] - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "raw-cpuid" -version = "11.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" -dependencies = [ - "memchr", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "dashmap", - "futures", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 2.5.3", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "term" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "text-diff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309238dd66f8bf11a20d015b727b926f294a13fcb8d56770bb984e7a22c43897" -dependencies = [ - "getopts", - "term", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-width" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" - -[[package]] -name = "yoke" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zerofrom" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zerotrie" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0594125a0574fb93059c92c588ab209cc036a23d1baeb3410fa9181bea551a0" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff4439ae91fb5c72b8abc12f3f2dbf51bd27e6eadb9f8a5bc8898dddb0e27ea" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4e5997cbf58990550ef1f0e5124a05e47e1ebd33a84af25739be6031a62c20" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] diff --git a/core/rust.rpc_server/Cargo.toml b/core/rust.rpc_server/Cargo.toml deleted file mode 100644 index 248d983c..00000000 --- a/core/rust.rpc_server/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "rust_rpc_server" -version = "6.0.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -log = "0.4" -axum = "0.7.5" -hyper = "1" -hyper-util = { version = "0.1", features = ["tokio", "server-auto", "http1"] } -tower-service = "0.3" -tower-http = { version = "0.5.2", features = ["trace"] } -silverpelt = { path = "../../core/rust.silverpelt" } - -[dependencies.tokio] -version = "1" -features = ["sync", "macros", "rt-multi-thread"] - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" diff --git a/core/rust.rpc_server/src/lib.rs b/core/rust.rpc_server/src/lib.rs deleted file mode 100644 index d5f1edd1..00000000 --- a/core/rust.rpc_server/src/lib.rs +++ /dev/null @@ -1,134 +0,0 @@ -use axum::{http::Request, routing::get, Router}; -use hyper::body::Incoming; -use hyper_util::{ - rt::{TokioExecutor, TokioIo}, - server, -}; -use std::{convert::Infallible, path::PathBuf, sync::Arc}; -use tokio::net::UnixListener; -use tower_service::Service; - -#[derive(Debug, Clone)] -pub enum CreateRpcServerBind { - /// Bind to a specific address - Address(String), - /// Bind to a unix socket - #[cfg(unix)] - UnixSocket(String), -} - -#[derive(Debug, Clone)] -pub struct CreateRpcServerOptions { - /// The bind address for the RPC server - pub bind: CreateRpcServerBind, -} - -#[derive(Clone)] -pub struct AppData { - pub data: Arc, - pub cache_http: Arc, - pub serenity_context: serenity::all::Context, -} - -impl AppData { - pub fn new(data: Arc, ctx: &serenity::all::Context) -> Self { - Self { - data, - serenity_context: ctx.clone(), - cache_http: Arc::new(botox::cache::CacheHttpImpl::from_ctx(ctx)), - } - } -} - -pub fn create_blank_rpc_server() -> Router { - Router::new() - .layer(tower_http::trace::TraceLayer::new_for_http()) - .route("/", get(|| async { "bot" })) -} - -pub async fn start_rpc_server( - opts: CreateRpcServerOptions, - mut make_service: axum::routing::IntoMakeService, -) -> Result<(), silverpelt::Error> { - match opts.bind { - CreateRpcServerBind::Address(addr) => { - let listener = tokio::net::TcpListener::bind(addr).await?; - - log::info!("Listening on {}", listener.local_addr()?); - - loop { - let (socket, _remote_addr) = match listener.accept().await { - Ok(ok) => ok, - Err(err) => { - log::error!("failed to accept connection: {err:#}"); - continue; - } - }; - - let tower_service = unwrap_infallible(make_service.call(&socket).await); - - tokio::spawn(async move { - let socket = TokioIo::new(socket); - - let hyper_service = - hyper::service::service_fn(move |request: Request| { - tower_service.clone().call(request) - }); - - if let Err(err) = server::conn::auto::Builder::new(TokioExecutor::new()) - .serve_connection_with_upgrades(socket, hyper_service) - .await - { - log::error!("failed to serve connection: {err:#}"); - } - }); - } - } - #[cfg(unix)] - CreateRpcServerBind::UnixSocket(path) => { - let path = PathBuf::from(path); - - let _ = tokio::fs::remove_file(&path).await; - - tokio::fs::create_dir_all(path.parent().unwrap()).await?; - - let uds = UnixListener::bind(path.clone()).unwrap(); - - loop { - let (socket, _remote_addr) = match uds.accept().await { - Ok(ok) => ok, - Err(err) => { - log::error!("failed to accept connection: {err:#}"); - continue; - } - }; - - let tower_service = unwrap_infallible(make_service.call(&socket).await); - - tokio::spawn(async move { - let socket = TokioIo::new(socket); - - let hyper_service = - hyper::service::service_fn(move |request: Request| { - tower_service.clone().call(request) - }); - - if let Err(err) = server::conn::auto::Builder::new(TokioExecutor::new()) - .serve_connection_with_upgrades(socket, hyper_service) - .await - { - log::error!("failed to serve connection: {err:#}"); - } - }); - } - } - } -} - -fn unwrap_infallible(result: Result) -> T { - match result { - Ok(value) => value, - #[allow(unreachable_patterns)] - Err(never) => match never {}, - } -} diff --git a/core/rust.sandwich_driver/Cargo.lock b/core/rust.sandwich_driver/Cargo.lock deleted file mode 100644 index 0de56e3d..00000000 --- a/core/rust.sandwich_driver/Cargo.lock +++ /dev/null @@ -1,4559 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" - -[[package]] -name = "anstyle-parse" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-lock" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" -dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "base_data" -version = "0.1.0" -dependencies = [ - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[package]] -name = "calendrical_calculations" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe3bc6a50b4667fafdb6d9cf26731c5418c457e317d8166c972014facf9a5d" -dependencies = [ - "core_maths", - "displaydoc", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "colorchoice" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "core_maths" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" -dependencies = [ - "libm", -] - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "env_filter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fancy-regex" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7493d4c459da9f84325ad297371a6b2b8a162800873a22e3b6b6512e61d18c05" -dependencies = [ - "bit-set", - "regex", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "fixed_decimal" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc7fdec9d7f6671a3ebb3282c969962aba67c49f6abac5311959b65cafabc10" -dependencies = [ - "displaydoc", - "smallvec", - "writeable", -] - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getopts" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gwevent" -version = "0.0.1" -dependencies = [ - "chrono", - "extract_map", - "indexmap", - "log", - "serde", - "serde_json", - "serenity", - "small-fixed-array", - "strum", - "strum_macros", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "html-escape" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476" -dependencies = [ - "utf8-width", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21be1c98fbdb29fff7e34b2939a4f30dad330d4cc20f7be1b3956e21032f67ba" -dependencies = [ - "icu_calendar", - "icu_casemap", - "icu_collator", - "icu_collections", - "icu_compactdecimal", - "icu_datetime", - "icu_decimal", - "icu_displaynames", - "icu_list", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_plurals", - "icu_properties", - "icu_provider", - "icu_relativetime", - "icu_segmenter", - "icu_timezone", -] - -[[package]] -name = "icu_calendar" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb932a690c92f87955e923106181ee0d5682e688ff37fb5c7b296e1fe806edb" -dependencies = [ - "calendrical_calculations", - "displaydoc", - "icu_calendar_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_calendar_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22aec7d032735d9acb256eeef72adcac43c3b7572f19b51576a63d664b524ca2" - -[[package]] -name = "icu_casemap" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7988d4f2655012592ac5b027722a93fbe12ff2a86d3e0f9ae686aedba0984f5e" -dependencies = [ - "displaydoc", - "icu_casemap_data", - "icu_collections", - "icu_locid", - "icu_properties", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_casemap_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36409fb8ce6f87c408310d87396ac471cc7320e007e648814c607c60fe77cc5" - -[[package]] -name = "icu_collator" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2a45056e541cffde068f5c81ac1c0503b9ee2a4b967546422e509c5c653750" -dependencies = [ - "displaydoc", - "icu_collator_data", - "icu_collections", - "icu_locid", - "icu_locid_transform", - "icu_normalizer", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_collator_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39774016c5b9ad006941f3196fea83ade662d9167eb573111c8f4cc9593e2999" - -[[package]] -name = "icu_collections" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "137d96353afc8544d437e8a99eceb10ab291352699573b0de5b08bda38c78c60" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3c22da90659121ae1e38bd0fb378d15179c820f56a0c278032fb4eb5a0ca60" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_compactdecimal_data", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_compactdecimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53eaf4902ee2e804f2583611722f6961fe85f31eab7ec790f47dde2d1cd494fb" - -[[package]] -name = "icu_datetime" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508c7ed627cc0b031c81203eb98f34433e24b32b39d5b2c0238e4962a00957d" -dependencies = [ - "displaydoc", - "either", - "fixed_decimal", - "icu_calendar", - "icu_datetime_data", - "icu_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_timezone", - "smallvec", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_datetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6abc569cb4ee80b30707566f05c5c9ed4bed765f91ce41e7f5a37c5e6a75b3f" - -[[package]] -name = "icu_decimal" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf994f9ed8061c17bb313f28fba6cffc736f0a16c7fab827efc9b73fd3f7778" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "writeable", -] - -[[package]] -name = "icu_decimal_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2de3548316b697c70f30dec1395c9212db09df1d86a27624ee24872b71326c" - -[[package]] -name = "icu_displaynames" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726c0d83ff52f05907275f39e5bb7949a92fa3d09538de60cf73ccf8ee89a613" -dependencies = [ - "icu_displaynames_data", - "icu_locid", - "icu_locid_transform", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_displaynames_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af40e6b723e5e6d9359cf0bb4e4ed6dfb9d6ab16b73b5c82b61f947e88bb30f6" - -[[package]] -name = "icu_list" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6c04ec71ad1bacdbfb47164d4801f80a0533d9340f94f1a880f521eff59f54" -dependencies = [ - "displaydoc", - "icu_list_data", - "icu_locid_transform", - "icu_provider", - "regex-automata 0.2.0", - "writeable", -] - -[[package]] -name = "icu_list_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6afcf7a9a7fedece70b7f17d7a7ecdfb8df145d37ae46d0277cd1e3932532" - -[[package]] -name = "icu_locid" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0aa2536adc14c07e2a521e95512b75ed8ef832f0fdf9299d4a0a45d2be2a9d" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c17d8f6524fdca4471101dd71f0a132eb6382b5d6d7f2970441cb25f6f435a" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c6c3e8bf9580e2dafee8de6f9ec14826aaf359787789c7724f1f85f47d3dc" - -[[package]] -name = "icu_normalizer" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c183e31ed700f1ecd6b032d104c52fe8b15d028956b73727c97ec176b170e187" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22026918a80e6a9a330cb01b60f950e2b4e5284c59528fd0c6150076ef4c8522" - -[[package]] -name = "icu_plurals" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d807b123eb2a9ae8f12080fb8cce479f5c8a761fba0bb5ab52da6dd5e31a03" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_locid", - "icu_locid_transform", - "icu_plurals_data", - "icu_provider", - "zerovec", -] - -[[package]] -name = "icu_plurals_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3acd5f1f2f988ed2dae9316c3d3560dfe4e03a7516d142b4b89b92252ada41a" - -[[package]] -name = "icu_properties" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976e296217453af983efa25f287a4c1da04b9a63bf1ed63719455068e4453eb5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a86c0e384532b06b6c104814f9c1b13bcd5b64409001c0d05713a1f3529d99" - -[[package]] -name = "icu_provider" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba58e782287eb6950247abbf11719f83f5d4e4a5c1f2cd490d30a334bc47c2f4" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2abdd3a62551e8337af119c5899e600ca0c88ec8f23a46c60ba216c803dcf1a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "icu_relativetime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47825312a5eb0790bad7b718fa8d41a8ea1e0ba597b4f7bb84bcfe97d7fc5aba" -dependencies = [ - "displaydoc", - "fixed_decimal", - "icu_decimal", - "icu_locid_transform", - "icu_plurals", - "icu_provider", - "icu_relativetime_data", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_relativetime_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b55cc15ea8981fbba78e9347d0c4003d4490c85f76e9adc7f270290046cae8" - -[[package]] -name = "icu_segmenter" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dc1e8f4ba33a6a4956770ac5c08570f255d6605519fb3a859a0c0a270a2f8f" -dependencies = [ - "core_maths", - "displaydoc", - "icu_collections", - "icu_locid", - "icu_provider", - "icu_segmenter_data", - "utf8_iter", - "zerovec", -] - -[[package]] -name = "icu_segmenter_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673d6698dcffce08cfe8fc5da3c11c3f2c663d5d6137fd58ab2cbf44235ab46" - -[[package]] -name = "icu_timezone" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35aabe571a7c653c0f543ff1512b8a1b2ad481cfa24b3d25115298d2ff3b50f" -dependencies = [ - "displaydoc", - "icu_calendar", - "icu_locid", - "icu_provider", - "icu_timezone_data", - "tinystr", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_timezone_data" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceee21e181cce2ab44e95923da6b3418df75369f570df82264c29c51ca398d4" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "kittycat" -version = "0.2.0" -source = "git+https://github.com/infinitybotlist/kittycat?branch=main#9656e5216715e7a79b21563304443f42b7594b8c" -dependencies = [ - "indexmap", - "serde", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "litemap" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d642685b028806386b2b6e75685faadd3eb65a85fff7df711ce18446a422da" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "settings" -version = "6.0.0" -dependencies = [ - "async-recursion", - "base_data", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "modules" -version = "6.0.0" -dependencies = [ - "async-recursion", - "base_data", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "env_logger", - "extract_map", - "fred", - "futures", - "futures-util", - "gwevent", - "indexmap", - "kittycat", - "log", - "settings", - "moka", - "once_cell", - "plsfix", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_repr", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "text-diff", - "tokio", - "url", -] - -[[package]] -name = "moka" -version = "0.12.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" -dependencies = [ - "async-lock", - "async-trait", - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "event-listener 5.3.0", - "futures-util", - "once_cell", - "parking_lot", - "quanta", - "rustc_version", - "smallvec", - "tagptr", - "thiserror", - "triomphe", - "uuid", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oem_cp" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330138902ab4dab09a86e6b7ab7ddeffb5f8435d52fe0df1bce8b06a17b10ee4" -dependencies = [ - "phf", - "phf_codegen", - "serde", - "serde_json", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "plsfix" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d4fe3ff2c8c5fa4d86ee54d75ea27fe6aa93eb43209374eb1b56261e5eaf2e" -dependencies = [ - "encoding", - "encoding_rs", - "fancy-regex", - "html-escape", - "icu", - "lazy_static", - "oem_cp", - "regex", - "rustc-hash", - "unicode-normalization", -] - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "raw-cpuid" -version = "11.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.6", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" -dependencies = [ - "memchr", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "chrono", - "dashmap", - "futures", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "serenity", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener 2.5.3", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "term" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "text-diff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309238dd66f8bf11a20d015b727b926f294a13fcb8d56770bb984e7a22c43897" -dependencies = [ - "getopts", - "term", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c02bf3c538ab32ba913408224323915f4ef9a6d61c0e85d493f355921c0ece" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode-width" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" -dependencies = [ - "getrandom", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad7bb64b8ef9c0aa27b6da38b452b0ee9fd82beaf276a87dd796fb55cbae14e" - -[[package]] -name = "yoke" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e71b2e4f287f467794c671e2b8f8a5f3716b3c829079a1c44740148eff07e4" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6936f0cce458098a201c245a11bef556c6a0181129c7034d10d76d1ec3a2b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zerofrom" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zerotrie" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0594125a0574fb93059c92c588ab209cc036a23d1baeb3410fa9181bea551a0" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff4439ae91fb5c72b8abc12f3f2dbf51bd27e6eadb9f8a5bc8898dddb0e27ea" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4e5997cbf58990550ef1f0e5124a05e47e1ebd33a84af25739be6031a62c20" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] diff --git a/core/rust.sandwich_driver/Cargo.toml b/core/rust.sandwich_driver/Cargo.toml deleted file mode 100644 index 68d7f7c7..00000000 --- a/core/rust.sandwich_driver/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "sandwich_driver" -version = "6.0.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = "1.0" -log = "0.4" -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -serde_repr = "0.1" - -# Anti-Raid specific -config = { path = "../rust.config" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" diff --git a/core/rust.sandwich_driver/src/lib.rs b/core/rust.sandwich_driver/src/lib.rs deleted file mode 100644 index 448cc8c6..00000000 --- a/core/rust.sandwich_driver/src/lib.rs +++ /dev/null @@ -1,534 +0,0 @@ -use std::collections::HashMap; - -pub mod resp; - -type Error = Box; - -/// Checks if anti-raid is in a server or not -/// Fetches a guild while handling all the pesky errors serenity normally has -/// with caching -pub async fn has_guild( - ctx: &botox::cache::CacheHttpImpl, - reqwest_client: &reqwest::Client, - guild_id: serenity::all::GuildId, -) -> Result { - if ctx.cache.guilds().contains(&guild_id) { - return Ok(true); - } - - #[derive(serde::Serialize, serde::Deserialize, Debug)] - struct Resp { - ok: bool, - data: Option, - error: Option, - } - - // Check sandwich, it may be there - let url = format!( - "{}/antiraid/api/state?col=derived.has_guild_id&id={}", - config::CONFIG.meta.sandwich_http_api, - guild_id - ); - - let resp = reqwest_client.get(&url).send().await?.json::().await; - - if let Ok(resp) = resp { - if resp.ok { - let Some(has_guild_id) = resp.data else { - return Err("Could not derive has_guild_id prop".into()); - }; - - return Ok(has_guild_id); - } else { - log::warn!( - "Sandwich proxy returned error [has guild id]: {:?}", - resp.error - ); - } - } else { - log::warn!( - "Sandwich proxy returned invalid resp [has guild id]: {:?}", - resp - ); - } - - // Last resort: check if the guild is in the list using HTTP - let guild_id_immediately_preceding = serenity::all::GuildId::new(guild_id.get() - 1); - - let gi = match ctx - .http - .get_guilds( - Some(serenity::all::GuildPagination::After( - guild_id_immediately_preceding, - )), - serenity::nonmax::NonMaxU8::new(3), - ) - .await - { - Ok(gi) => gi, - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - return Err(format!("Failed to fetch guild info (http): {:?}", er).into()); - } - _ => { - return Err( - format!("Failed to fetch guild info (non-http error): {:?}", e).into(), - ); - } - }, - _ => { - return Err(format!("Failed to fetch member: {:?}", e).into()); - } - }, - }; - - // Check if the guild is in the list - let has_guild_id = gi.iter().any(|g| g.id == guild_id); - - Ok(has_guild_id) -} - -/// Fetches a guild while handling all the pesky errors serenity normally has -/// with caching -pub async fn guild( - ctx: &botox::cache::CacheHttpImpl, - reqwest_client: &reqwest::Client, - guild_id: serenity::model::id::GuildId, -) -> Result { - // Check serenity cache - { - let res = ctx.cache.guild(guild_id); - - if let Some(res) = res { - return Ok(res.clone().into()); - } - } - - #[derive(serde::Serialize, serde::Deserialize, Debug)] - struct Resp { - ok: bool, - data: Option, - error: Option, - } - - // Check sandwich, it may be there - let url = format!( - "{}/antiraid/api/state?col=guilds&id={}", - config::CONFIG.meta.sandwich_http_api, - guild_id - ); - - let resp = reqwest_client.get(&url).send().await?.json::().await; - - if let Ok(resp) = resp { - if resp.ok { - let Some(guild) = resp.data else { - return Err("Guild not found".into()); - }; - - return Ok(guild); - } else { - log::warn!( - "Sandwich proxy returned error [get guild]: {:?}", - resp.error - ); - } - } else { - log::warn!( - "Sandwich proxy returned invalid resp [get guild]: {:?}", - resp - ); - } - - // Last resore: make the http call - let res = ctx.http.get_guild(guild_id).await?; - - // Save to sandwich - let url = format!( - "{}/antiraid/api/state?col=guilds&id={}", - config::CONFIG.meta.sandwich_http_api, - guild_id - ); - - let resp = reqwest_client.post(&url).json(&res).send().await?; - - if !resp.status().is_success() { - log::warn!( - "Failed to update sandwich proxy with guild data: {:?}", - resp.text().await - ); - } - - Ok(res) -} - -/// Faster version of botox member in guild that also takes into account the sandwich proxy layer -pub async fn member_in_guild( - ctx: &botox::cache::CacheHttpImpl, - reqwest_client: &reqwest::Client, - guild_id: serenity::model::id::GuildId, - user_id: serenity::model::id::UserId, -) -> Result, Error> { - // Check serenity cache - if let Some(guild) = ctx.cache.guild(guild_id) { - if let Some(member) = guild.members.get(&user_id).cloned() { - return Ok(Some(member)); - } - } - - // Part 2, try sandwich state - let url = format!( - "{}/antiraid/api/state?col=members&id={}&guild_id={}", - config::CONFIG.meta.sandwich_http_api, - user_id, - guild_id - ); - - #[derive(serde::Serialize, serde::Deserialize)] - struct Resp { - ok: bool, - data: Option, - error: Option, - } - - let resp = reqwest_client - .get(&url) - .timeout(std::time::Duration::from_secs(5)) - .send() - .await? - .json::() - .await; - - match resp { - Ok(resp) => { - if resp.ok { - let Some(member) = resp.data else { - return Ok(None); - }; - - return Ok(Some(member)); - } else { - log::warn!( - "Sandwich proxy returned error [get member]: {:?}", - resp.error - ); - } - } - Err(e) => { - log::warn!("Failed to fetch member (http): {:?}", e); - } - } - - // Last resort, use botox to fetch from http and then update sandwich as well - let member = match ctx.http.get_member(guild_id, user_id).await { - Ok(mem) => mem, - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - if er.status_code == reqwest::StatusCode::NOT_FOUND { - return Ok(None); - } else { - return Err( - format!("Failed to fetch member (http, non-404): {:?}", er).into() - ); - } - } - _ => { - return Err(format!("Failed to fetch member (http): {:?}", e).into()); - } - }, - _ => { - return Err(format!("Failed to fetch member: {:?}", e).into()); - } - }, - }; - - // Update sandwich with a POST - let resp = reqwest_client.post(&url).json(&member).send().await?; - - if !resp.status().is_success() { - log::warn!( - "Failed to update sandwich proxy with member data: {:?}", - resp.text().await - ); - } - - Ok(Some(member)) -} - -/// Faster version of serenity guild_channels that also takes into account the sandwich proxy layer -pub async fn guild_channels( - ctx: &botox::cache::CacheHttpImpl, - reqwest_client: &reqwest::Client, - guild_id: serenity::model::id::GuildId, -) -> Result, Error> { - // Try serenity cache first - { - if let Some(guild) = ctx.cache.guild(guild_id) { - let channels = guild.channels.clone(); - return Ok(channels.into_iter().collect()); - }; - } - - let url = format!( - "{}/antiraid/api/state?col=guild_channels&id={}", - config::CONFIG.meta.sandwich_http_api, - guild_id - ); - - #[derive(serde::Serialize, serde::Deserialize)] - struct Resp { - ok: bool, - data: Option>, - error: Option, - } - - let resp = reqwest_client - .get(&url) - .timeout(std::time::Duration::from_secs(5)) - .send() - .await? - .json::() - .await; - - match resp { - Ok(resp) => { - if resp.ok { - let Some(channels) = resp.data else { - return Err("No channels found".into()); - }; - - return Ok(channels); - } else { - log::warn!( - "Sandwich proxy returned error [get guild channels]: {:?}", - resp.error - ); - } - } - Err(e) => { - log::warn!("Failed to fetch member (http): {:?}", e); - } - } - - // Last resort, fetch from http and then update sandwich as well - let channels = match ctx.http.get_channels(guild_id).await { - Ok(mem) => mem, - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - if er.status_code == reqwest::StatusCode::NOT_FOUND { - return Err("No channels found".into()); - } else { - return Err( - format!("Failed to fetch channels (http, non-404): {:?}", er).into(), - ); - } - } - _ => { - return Err(format!("Failed to fetch channels (http): {:?}", e).into()); - } - }, - _ => { - return Err(format!("Failed to fetch channels: {:?}", e).into()); - } - }, - }; - - let channels = channels.into_iter().collect(); - - // Update sandwich with a POST - let resp = reqwest_client.post(&url).json(&channels).send().await?; - - if !resp.status().is_success() { - log::warn!( - "Failed to update sandwich proxy with channel data: {:?}", - resp.text().await - ); - } - - Ok(channels) -} - -pub async fn channel( - ctx: &botox::cache::CacheHttpImpl, - reqwest_client: &reqwest::Client, - guild_id: Option, - channel_id: serenity::model::id::ChannelId, -) -> Result, Error> { - // Try serenity cache first - // - // We do this to ensure that we get up to date information if possible - if let Some(guild_id) = guild_id { - if let Some(guild) = ctx.cache.guild(guild_id) { - let channels = guild.channels.clone(); - - if let Some(channel) = channels.get(&channel_id) { - let chan = serenity::all::Channel::Guild(channel.clone()); - return Ok(Some(chan)); - } - }; - } - - let url = match guild_id { - Some(guild_id) => format!( - "{}/antiraid/api/state?col=channels&id={}&guild_id={}", - config::CONFIG.meta.sandwich_http_api, - channel_id, - guild_id - ), - None => format!( - "{}/antiraid/api/state?col=channels&id={}", - config::CONFIG.meta.sandwich_http_api, - channel_id - ), - }; - - #[derive(serde::Serialize, serde::Deserialize)] - struct Resp { - ok: bool, - data: Option, - error: Option, - } - - let resp = reqwest_client - .get(&url) - .timeout(std::time::Duration::from_secs(5)) - .send() - .await?; - - let status = resp.status(); - - let json = resp.json::().await?; - - if json.ok { - return Ok(json.data); - } else { - log::warn!( - "Sandwich proxy returned error [get channel]: {:?}, status: {:?}", - json.error, - status - ); - } - - // Last resort, fetch from http and then update sandwich as well - let channel = match channel_id.to_channel(&ctx, guild_id).await { - Ok(channel) => channel, - Err(e) => match e { - serenity::Error::Http(e) => match e { - serenity::all::HttpError::UnsuccessfulRequest(er) => { - if er.status_code == reqwest::StatusCode::NOT_FOUND { - return Ok(None); - } else { - return Err( - format!("Failed to fetch channels (http, non-404): {:?}", er).into(), - ); - } - } - _ => { - return Err(format!("Failed to fetch channels (http): {:?}", e).into()); - } - }, - _ => { - return Err(format!("Failed to fetch channels: {:?}", e).into()); - } - }, - }; - - // Update sandwich with a POST - let resp = reqwest_client - .post(&url) - .timeout(std::time::Duration::from_secs(10)) - .json(&channel) - .send() - .await?; - - if !resp.status().is_success() { - log::warn!( - "Failed to update sandwich proxy with channel data: {:?}", - resp.text().await - ); - } - - Ok(Some(channel)) -} - -pub async fn get_status(client: &reqwest::Client) -> Result { - let res = client - .get(format!( - "{}/api/status", - config::CONFIG.meta.sandwich_http_api - )) - .send() - .await? - .error_for_status()? - .json::>() - .await?; - - if !res.ok { - return Err("Sandwich API returned not ok".into()); - } - - let Some(data) = res.data else { - return Err("No data in response".into()); - }; - - // Parse out the shard connections - let mut shards = HashMap::new(); - - for manager in data.managers.iter() { - if manager.display_name != *"Anti Raid" { - continue; // Not for us - } - - for v in manager.shard_groups.iter() { - for shard in v.shards.iter() { - let shard_id = shard[0]; - let status = shard[1]; - let latency = shard[2]; - let guilds = shard[3]; - let uptime = shard[4]; - let total_uptime = shard[5]; - - shards.insert( - shard_id, - ShardConn { - status: match status { - 0 => "Idle".to_string(), - 1 => "Connecting".to_string(), - 2 => "Connected".to_string(), - 3 => "MarkedForClosure".to_string(), - 4 => "Closing".to_string(), - 5 => "Closed".to_string(), - 6 => "Erroring".to_string(), - _ => "Unknown".to_string(), - }, - real_latency: latency, - guilds, - uptime, - total_uptime, - }, - ); - } - } - } - - Ok(GetStatusResponse { - resp: data, - shard_conns: shards, - }) -} - -pub struct ShardConn { - pub status: String, - pub real_latency: i64, - pub guilds: i64, - pub uptime: i64, - pub total_uptime: i64, -} - -pub struct GetStatusResponse { - pub resp: resp::StatusEndpointResponse, - pub shard_conns: HashMap, -} diff --git a/core/rust.sandwich_driver/src/resp.rs b/core/rust.sandwich_driver/src/resp.rs deleted file mode 100644 index 65e1c350..00000000 --- a/core/rust.sandwich_driver/src/resp.rs +++ /dev/null @@ -1,41 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serde_repr::{Deserialize_repr, Serialize_repr}; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)] -#[repr(u8)] -pub enum ShardGroupStatus { - Idle, - Connecting, - Connected, - MarkedForClosure, - Closing, - Closed, - Erroring, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct StatusEndpointResponse { - pub uptime: i64, - pub managers: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct StatusEndpointManager { - pub display_name: String, - pub shard_groups: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct StatusEndpointShardGroup { - #[serde(rename = "id")] - pub shard_group_id: i32, - pub shards: Vec<[i64; 6]>, // // ShardID, Status, Latency (in milliseconds), Guilds, Uptime (in seconds), Total Uptime (in seconds) - pub status: ShardGroupStatus, - pub uptime: i64, -} - -#[derive(Serialize, Deserialize)] -pub struct Resp { - pub ok: bool, - pub data: Option, -} diff --git a/core/rust.settings/Cargo.lock b/core/rust.settings/Cargo.lock deleted file mode 100644 index 537f4d1f..00000000 --- a/core/rust.settings/Cargo.lock +++ /dev/null @@ -1,3399 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "aws-lc-rs" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8487b59d62764df8231cb371c459314df895b41756df457a1fb1243d65c89195" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15eb61145320320eb919d9bab524617a7aa4216c78d342fae3a758bc33073e4" -dependencies = [ - "bindgen", - "cc", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "base_data" -version = "0.1.0" -dependencies = [ - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.62", - "which", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "bytes-utils" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" -dependencies = [ - "bytes", - "either", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie-factory" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc16" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fred" -version = "9.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915e065b377f6e16d5c01eae96bf31eeaf81e1e300b76f938761b3c21307cad8" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "bytes-utils", - "crossbeam-queue", - "float-cmp", - "futures", - "log", - "parking_lot", - "rand", - "redis-protocol", - "rustls 0.23.5", - "rustls-native-certs", - "semver", - "serde_json", - "socket2", - "tokio", - "tokio-rustls 0.26.0", - "tokio-stream", - "tokio-util", - "url", - "urlencoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.5", -] - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[package]] -name = "settings" -version = "6.0.0" -dependencies = [ - "async-recursion", - "base_data", - "bitflags 2.5.0", - "botox", - "chrono", - "dashmap", - "extract_map", - "fred", - "futures", - "futures-util", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "regex", - "reqwest", - "rusty-s3", - "secrecy", - "serde", - "serde_json", - "serde_yaml", - "serenity", - "splashcore_rs", - "sqlx", - "strum", - "strum_macros", - "tokio", - "url", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.62", -] - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redis-protocol" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65deb7c9501fbb2b6f812a30d59c0253779480853545153a51d8e9e444ddc99f" -dependencies = [ - "bytes", - "bytes-utils", - "cookie-factory", - "crc16", - "log", - "nom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls 0.25.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afabcee0551bd1aa3e18e5adbf2c0544722014b899adb31bd186ec638d3da97e" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "chrono", - "dashmap", - "futures", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "serenity", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls 0.23.5", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/core/rust.settings/Cargo.toml b/core/rust.settings/Cargo.toml deleted file mode 100644 index 2052ee5f..00000000 --- a/core/rust.settings/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "ar_settings" -version = "6.0.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = "1.0" -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -chrono = { version = "0.4", features = ["serde"]} -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -serde_json = "1.0" -indexmap = { version = "2", features = ["serde"] } - -# Anti-Raid specific -splashcore_rs = { path = "../rust.std" } -permissions = { path = "../rust.permissions" } -async-recursion = "1.1.1" -async-trait = "0.1" -sandwich_driver = { path = "../rust.sandwich_driver" } - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" diff --git a/core/rust.settings/README.md b/core/rust.settings/README.md deleted file mode 100644 index e3bbc8ef..00000000 --- a/core/rust.settings/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## Common state variables: - -- {__author} => the user id of the user running the operation -- {__guild_id} => the guild id of the guild the operation is being run in -- {__now} always returns the current timestamp (TimestampTz), {__now_naive} returns the current timestamp in naive form (Timestamp) -- Note that these special variables do not need to live in state and may instead be special cased -- For sending a info message etc on save, the {__message} can be set - -## Special variables: - -- ``__limit`` and ``__offset``: These are used for limit-offset pagination and are used in the query to limit the number of results returned and the offset to start from - -### View operations: - -- ``__count``: Counts the number of rows instead of returning them \ No newline at end of file diff --git a/core/rust.settings/src/cfg.rs b/core/rust.settings/src/cfg.rs deleted file mode 100644 index 06cc3f71..00000000 --- a/core/rust.settings/src/cfg.rs +++ /dev/null @@ -1,996 +0,0 @@ -use crate::types::HookContext; - -use super::types::SettingsError; -use super::types::{ - ColumnType, InnerColumnType, InnerColumnTypeStringKind, OperationType, Setting, SettingsData, -}; -use splashcore_rs::value::Value; - -/// Parse a value against the schema's column type -fn _parse_value( - v: Value, - column_type: &ColumnType, - column_id: &str, -) -> Result { - match column_type { - ColumnType::Scalar { inner } => { - // Special case: JSON columns can be any type - if matches!(v, Value::List(_)) && !matches!(inner, InnerColumnType::Json { .. }) { - return Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Scalar".to_string(), - got_type: "Array".to_string(), - }); - } - - match inner { - InnerColumnType::Uuid {} => match v { - Value::String(s) => { - let value = s.parse::().map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "uuid_parse".to_string(), - accepted_range: "Valid UUID".to_string(), - error: e.to_string(), - } - })?; - - Ok(Value::Uuid(value)) - } - Value::Uuid(_) => Ok(v), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Uuid".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::String { kind, .. } => match v { - Value::String(ref s) => { - if s.is_empty() { - match kind { - InnerColumnTypeStringKind::Token { default_length } => { - Ok(Value::String(botox::crypto::gen_random(*default_length))) - } - _ => Ok(Value::None), - } - } else { - Ok(v) - } - } - Value::Uuid(v) => Ok(Value::String(v.to_string())), - Value::None => match kind { - InnerColumnTypeStringKind::Token { default_length } => { - Ok(Value::String(botox::crypto::gen_random(*default_length))) - } - _ => Ok(v), - }, - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "String".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Timestamp {} => match v { - Value::String(s) => { - let value = chrono::NaiveDateTime::parse_from_str(&s, "%Y-%m-%d %H:%M:%S") - .map_err(|e| SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "timestamp_parse".to_string(), - accepted_range: "Valid timestamp".to_string(), - error: e.to_string(), - })?; - - Ok(Value::Timestamp(value)) - } - Value::Timestamp(_) => Ok(v), - Value::None => Ok(v), - Value::TimestampTz(v) => Ok(Value::Timestamp(v.naive_utc())), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Timestamp".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::TimestampTz {} => match v { - Value::String(s) => { - let value = chrono::DateTime::parse_from_rfc3339(&s).map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "timestamp_tz_parse".to_string(), - accepted_range: "Valid timestamp with timezone".to_string(), - error: e.to_string(), - } - })?; - - // Convert value to DateTime from DateTime - let value: chrono::DateTime = - chrono::DateTime::from_naive_utc_and_offset( - value.naive_utc(), - chrono::Utc, - ); - - Ok(Value::TimestampTz(value)) - } - Value::Timestamp(v) => Ok(Value::TimestampTz( - chrono::DateTime::from_naive_utc_and_offset(v, chrono::Utc), - )), - Value::TimestampTz(_) => Ok(v), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "TimestampTz".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Interval {} => match v { - Value::String(s) => { - let dur = - splashcore_rs::utils::parse_duration_string_to_chrono_duration(&s) - .map_err(|e| SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "interval_parse".to_string(), - accepted_range: "Valid interval".to_string(), - error: e.to_string(), - })?; - - Ok(Value::Interval(dur)) - } - Value::Integer(v) => { - let duration = chrono::Duration::seconds(v); - Ok(Value::Interval(duration)) - } - Value::Interval(_) => Ok(v), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Interval".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Integer {} => match v { - Value::String(s) => { - if s.is_empty() { - Ok(Value::None) - } else { - let value = s.parse::().map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "integer_parse".to_string(), - accepted_range: "Valid integer".to_string(), - error: e.to_string(), - } - })?; - - Ok(Value::Integer(value)) - } - } - Value::Integer(v) => Ok(Value::Integer(v)), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Integer".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Float {} => match v { - Value::String(s) => { - let value = s.parse::().map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "float_parse".to_string(), - accepted_range: "Valid float".to_string(), - error: e.to_string(), - } - })?; - - Ok(Value::Float(value)) - } - Value::Float(v) => Ok(Value::Float(v)), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Float".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::BitFlag { values } => match v { - Value::Integer(v) => { - let mut final_value = 0; - - // Set all the valid bits in final_value to ensure no unknown bits are being set - for (_, bit) in values.iter() { - if *bit & v == *bit { - final_value |= *bit; - } - } - - if final_value == 0 { - // Set the first value as the default value - let Some(fv) = values.values().next() else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bitflag_default".to_string(), - accepted_range: "Valid bitflag".to_string(), - error: "No default value found".to_string(), - }); - }; - - final_value = *fv; - } - - Ok(Value::Integer(final_value)) - } - Value::String(s) => { - if s.is_empty() { - // Set the first value as the default value - let Some(fv) = values.values().next() else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bitflag_default".to_string(), - accepted_range: "Valid bitflag".to_string(), - error: "No default value found".to_string(), - }); - }; - - Ok(Value::Integer(*fv)) - } else { - let v = s.parse::().map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bitflag_parse".to_string(), - accepted_range: "Valid bitflag".to_string(), - error: e.to_string(), - } - })?; - - let mut final_value = 0; - - // Set all the valid bits in final_value to ensure no unknown bits are being set - for (_, bit) in values.iter() { - if *bit & v == *bit { - final_value |= *bit; - } - } - - if final_value == 0 { - // Set the first value as the default value - let Some(fv) = values.values().next() else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bitflag_default".to_string(), - accepted_range: "Valid bitflag".to_string(), - error: "No default value found".to_string(), - }); - }; - - final_value = *fv; - } - - Ok(Value::Integer(final_value)) - } - } - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Integer".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Boolean {} => match v { - Value::String(s) => { - let value = s.parse::().map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "boolean_parse".to_string(), - accepted_range: "Valid boolean".to_string(), - error: e.to_string(), - } - })?; - - Ok(Value::Boolean(value)) - } - Value::Boolean(v) => Ok(Value::Boolean(v)), - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Boolean".to_string(), - got_type: format!("{:?}", v), - }), - }, - InnerColumnType::Json { max_bytes } => { - // Convert back to json to get bytes - match v { - Value::String(s) => { - if s.as_bytes().len() > max_bytes.unwrap_or(0) { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_max_bytes".to_string(), - accepted_range: format!("<{}", max_bytes.unwrap_or(0)), - error: format!( - "s.as_bytes().len() > *max_bytes: {}", - s.as_bytes().len() - ), - }); - } - - let v: serde_json::Value = { - if !s.starts_with("[") && !s.starts_with("{") { - serde_json::Value::String(s) - } else { - serde_json::from_str(&s).map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_parse".to_string(), - accepted_range: "Valid JSON".to_string(), - error: e.to_string(), - } - })? - } - }; - - Ok(Value::Json(v)) - } - _ => { - let bytes = serde_json::to_string(&v.to_json()).map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_parse".to_string(), - accepted_range: "Valid JSON".to_string(), - error: e.to_string(), - } - })?; - - if let Some(max_bytes) = max_bytes { - if bytes.as_bytes().len() > *max_bytes { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_max_bytes".to_string(), - accepted_range: format!("<{}", max_bytes), - error: format!( - "json.as_bytes().len() > *max_bytes: {}", - bytes.as_bytes().len() - ), - }); - } - } - - Ok(v) - } - } - } - } - } - ColumnType::Array { inner } => { - if let InnerColumnType::Json { max_bytes } = inner { - // Convert back to json to get bytes of the full payload as a whole - let json = serde_json::to_string(&v.to_json()).map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_parse".to_string(), - accepted_range: "Valid JSON".to_string(), - error: e.to_string(), - } - })?; - - if let Some(max_bytes) = max_bytes { - if json.as_bytes().len() > *max_bytes { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "json_max_bytes".to_string(), - accepted_range: format!("<{}", max_bytes), - error: format!( - "json.as_bytes().len() > *max_bytes: {}", - json.as_bytes().len() - ), - }); - } - } - } - - match v { - Value::List(l) => { - let mut values: Vec = Vec::new(); - - let column_type = ColumnType::new_scalar(inner.clone()); - for v in l { - let new_v = _parse_value(v, &column_type, column_id)?; - - values.push(new_v); - } - - Ok(Value::List(values)) - } - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Array".to_string(), - got_type: format!("{:?}", v), - }), - } - } - } -} - -/// Validates the value against the schema's column type -/// -/// NOTE: This may make HTTP/Discord API requests to parse values such as channels etc. -#[allow(dead_code)] -#[async_recursion::async_recursion] -#[allow(clippy::too_many_arguments)] -async fn _validate_value( - v: Value, - guild_id: serenity::all::GuildId, - data: &SettingsData, - column_type: &ColumnType, - column_id: &str, - is_nullable: bool, -) -> Result { - let v = match column_type { - ColumnType::Scalar { inner } => { - // Special case: JSON columns can be any type - if matches!(v, Value::List(_)) && !matches!(inner, InnerColumnType::Json { .. }) { - return Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Scalar".to_string(), - got_type: "Array".to_string(), - }); - } - - match inner { - InnerColumnType::String { - min_length, - max_length, - allowed_values, - kind, - } => { - match v { - Value::String(ref s) => { - if let Some(min) = min_length { - if s.len() < *min { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "minlength".to_string(), - accepted_range: format!(">{}", min), - error: "s.len() < *min".to_string(), - }); - } - } - - if let Some(max) = max_length { - if s.len() > *max { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "maxlength".to_string(), - accepted_range: format!("<{}", max), - error: "s.len() > *max".to_string(), - }); - } - } - - if !allowed_values.is_empty() && !allowed_values.contains(&s) { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "allowed_values".to_string(), - accepted_range: format!("{:?}", allowed_values), - error: "!allowed_values.is_empty() && !allowed_values.contains(&s.as_str())".to_string() - }); - } - - let parsed_value = match kind { - InnerColumnTypeStringKind::Normal { .. } => v, - InnerColumnTypeStringKind::Token { .. } => v, // Handled in parse_value - InnerColumnTypeStringKind::Textarea { .. } => v, - InnerColumnTypeStringKind::TemplateRef { .. } => { - // Check that the template exists - let count = sqlx::query!( - "SELECT COUNT(*) FROM guild_templates WHERE guild_id = $1 AND name = $2", - guild_id.to_string(), - s - ) - .fetch_one(&data.pool) - .await - .map_err(|e| SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "template_ref".to_string(), - accepted_range: "Valid template name".to_string(), - error: e.to_string(), - })?; - - if count.count.unwrap_or(0) == 0 { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "template_ref".to_string(), - accepted_range: "Valid template name".to_string(), - error: "Template not found".to_string(), - }); - } - - v - } - InnerColumnTypeStringKind::KittycatPermission { .. } => v, // All kittycat permissions are valid - InnerColumnTypeStringKind::Role { .. } => { - // Try parsing to a RoleId - if let Err(err) = s.parse::() { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "snowflake_parse".to_string(), - accepted_range: "Valid role id".to_string(), - error: err.to_string(), - }); - } - - v - } - InnerColumnTypeStringKind::Channel { - allowed_channel_types, - needed_bot_permissions, - } => { - let Ok(channel_id) = s.parse::() - else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "snowflake_parse".to_string(), - accepted_range: "Valid channel id".to_string(), - error: "Channel id parse error".to_string(), - }); - }; - - // Perform required checks - let channel = sandwich_driver::channel( - &data.cache_http, - &data.reqwest, - Some(guild_id), - channel_id, - ) - .await - .map_err(|e| SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "channel_check".to_string(), - accepted_range: "Valid channel id".to_string(), - error: e.to_string(), - })?; - - let Some(channel) = channel else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "channel_check".to_string(), - accepted_range: "Valid channel id".to_string(), - error: "Channel not found".to_string(), - }); - }; - - let Some(guild_channel) = channel.guild() else { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "channel_check".to_string(), - accepted_range: "Valid channel id".to_string(), - error: "Channel not in guild".to_string(), - }); - }; - - if guild_channel.guild_id != guild_id { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "channel_check".to_string(), - accepted_range: "Valid channel id".to_string(), - error: "Channel not in guild".to_string(), - }); - } - - if !allowed_channel_types.is_empty() - && !allowed_channel_types.contains(&guild_channel.kind) - { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "allowed_channel_types".to_string(), - accepted_range: format!("{:?}", allowed_channel_types), - error: "Channel type not allowed".to_string(), - }); - } - - if !needed_bot_permissions.is_empty() { - let bot_user = { - let bot_user_id = - data.serenity_context.cache.current_user().id; - - let bot_user = sandwich_driver::member_in_guild( - &data.cache_http, - &data.reqwest, - guild_id, - bot_user_id, - ) - .await - .map_err(|e| { - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bot_user".to_string(), - accepted_range: "Valid bot user".to_string(), - error: e.to_string(), - } - })?; - - let Some(bot_user) = bot_user else { - return Err( - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bot_user".to_string(), - accepted_range: "Valid bot user" - .to_string(), - error: "Bot user not found".to_string(), - }, - ); - }; - - bot_user - }; - - let guild = sandwich_driver::guild( - &data.cache_http, - &data.reqwest, - guild_id, - ) - .await - .map_err(|e| SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "guild".to_string(), - accepted_range: "Valid guild".to_string(), - error: e.to_string(), - })?; - - let permissions = - guild.user_permissions_in(&guild_channel, &bot_user); - - if !permissions.contains(*needed_bot_permissions) { - return Err( - SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "bot_permissions".to_string(), - accepted_range: format!( - "{:?}", - needed_bot_permissions - ), - error: "Bot does not have required permissions" - .to_string(), - }, - ); - } - } - - v - } - InnerColumnTypeStringKind::User { .. } => { - // Try parsing to a UserId - if let Err(err) = s.parse::() { - return Err(SettingsError::SchemaCheckValidationError { - column: column_id.to_string(), - check: "snowflake_parse".to_string(), - accepted_range: "Valid user id".to_string(), - error: err.to_string(), - }); - } - - v - } - }; - Ok(parsed_value) - } - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "String".to_string(), - got_type: format!("{:?}", v), - }), - } - } - _ => Ok(v), - } - } - ColumnType::Array { inner } => match v { - Value::List(l) => { - let mut values: Vec = Vec::new(); - - let column_type = ColumnType::new_scalar(inner.clone()); - for v in l { - let new_v = - _validate_value(v, guild_id, data, &column_type, column_id, is_nullable) - .await?; - - values.push(new_v); - } - - Ok(Value::List(values)) - } - Value::None => Ok(v), - _ => Err(SettingsError::SchemaTypeValidationError { - column: column_id.to_string(), - expected_type: "Array".to_string(), - got_type: format!("{:?}", v), - }), - }, - }?; - - if matches!(v, Value::None) && !is_nullable { - return Err(SettingsError::SchemaNullValueValidationError { - column: column_id.to_string(), - }); - } - - Ok(v) -} - -/// Settings API: View implementation -pub async fn settings_view( - setting: &Setting, - data: &SettingsData, - guild_id: serenity::all::GuildId, - author: serenity::all::UserId, - filters: indexmap::IndexMap, // The filters to apply -) -> Result>, SettingsError> { - let Some(ref viewer) = setting.operations.view else { - return Err(SettingsError::OperationNotSupported { - operation: OperationType::View, - }); - }; - - let states = viewer - .view( - HookContext { - guild_id, - author, - data, - }, - filters, - ) - .await?; - - let mut values: Vec> = Vec::new(); - - for mut state in states { - // We know that the columns are in the same order as the row - for col in setting.columns.iter() { - let mut val = state.swap_remove(&col.id).unwrap_or(Value::None); - - // Validate the value. returning the parsed value - val = _parse_value(val, &col.column_type, &col.id)?; - - // Reinsert - state.insert(col.id.to_string(), val); - } - - // Remove ignored columns + secret columns now that the actions have been executed - for col in setting.columns.iter() { - if col.secret { - state.swap_remove(&col.id); - continue; // Skip secret columns in view. **this applies to view and update only as create is creating a new object** - } - - if col.ignored_for.contains(&OperationType::View) { - state.swap_remove(&col.id); - } - } - - values.push(state); - } - - Ok(values) -} - -/// Settings API: Create implementation -pub async fn settings_create( - setting: &Setting, - data: &SettingsData, - guild_id: serenity::all::GuildId, - author: serenity::all::UserId, - fields: indexmap::IndexMap, -) -> Result, SettingsError> { - let Some(ref creator) = setting.operations.create else { - return Err(SettingsError::OperationNotSupported { - operation: OperationType::Create, - }); - }; - - // Ensure all columns exist in fields, note that we can ignore extra fields so this one single loop is enough - let mut state = fields; - for column in setting.columns.iter() { - if column.ignored_for.contains(&OperationType::Create) { - continue; - } - - // If the column is ignored for, only parse, otherwise parse and validate - let value = { - // Get the value - let val = state.swap_remove(&column.id).unwrap_or(Value::None); - - // Validate and parse the value - let parsed_value = _parse_value(val, &column.column_type, &column.id)?; - _validate_value( - parsed_value, - guild_id, - data, - &column.column_type, - &column.id, - column.nullable, - ) - .await? - }; - - state.insert(column.id.to_string(), value); - } - - // Now execute all actions and handle null checks - for column in setting.columns.iter() { - // Checks should only happen if the column is not being intentionally ignored - if column.ignored_for.contains(&OperationType::Create) { - continue; - } - - let Some(value) = state.get(&column.id) else { - return Err(SettingsError::Generic { - message: format!( - "Column `{}` not found in state despite just being parsed", - column.id - ), - src: "settings_create [ext_checks]".to_string(), - typ: "internal".to_string(), - }); - }; - - // Check if the column is nullable - if !column.nullable && matches!(value, Value::None) { - return Err(SettingsError::MissingOrInvalidField { - field: column.id.to_string(), - src: "settings_create [null check]".to_string(), - }); - } - } - - // Remove ignored columns now that the actions have been executed - for col in setting.columns.iter() { - if col.ignored_for.contains(&OperationType::Create) { - state.swap_remove(&col.id); - } - } - - let new_state = creator - .create( - HookContext { - guild_id, - author, - data, - }, - state, - ) - .await?; - - Ok(new_state) -} - -/// Settings API: Update implementation -pub async fn settings_update( - setting: &Setting, - data: &SettingsData, - guild_id: serenity::all::GuildId, - author: serenity::all::UserId, - fields: indexmap::IndexMap, -) -> Result, SettingsError> { - let Some(ref updater) = setting.operations.update else { - return Err(SettingsError::OperationNotSupported { - operation: OperationType::Update, - }); - }; - - // Ensure all columns exist in fields, note that we can ignore extra fields so this one single loop is enough - let mut state = fields; - for column in setting.columns.iter() { - if column.ignored_for.contains(&OperationType::Update) { - continue; - } - - // If the column is ignored for, only parse, otherwise parse and validate - let value = { - // Get the value - let val = state.swap_remove(&column.id).unwrap_or(Value::None); - - // Validate and parse the value - let parsed_value = _parse_value(val, &column.column_type, &column.id)?; - _validate_value( - parsed_value, - guild_id, - data, - &column.column_type, - &column.id, - column.nullable, - ) - .await? - }; - - state.insert(column.id.to_string(), value); - } - - // Now execute all actions and handle null checks - for column in setting.columns.iter() { - // Checks should only happen if the column is not being intentionally ignored - if column.ignored_for.contains(&OperationType::Update) { - continue; - } - - let Some(value) = state.get(&column.id) else { - return Err(SettingsError::Generic { - message: format!( - "Column `{}` not found in state despite just being parsed", - column.id - ), - src: "settings_update [ext_checks]".to_string(), - typ: "internal".to_string(), - }); - }; - - // Check if the column is nullable - if !column.nullable && matches!(value, Value::None) { - return Err(SettingsError::MissingOrInvalidField { - field: column.id.to_string(), - src: "settings_create [null check]".to_string(), - }); - } - } - - // Remove ignored columns now that the actions have been executed - for col in setting.columns.iter() { - if col.ignored_for.contains(&OperationType::Update) { - state.swap_remove(&col.id); - } - } - - let new_state = updater - .update( - HookContext { - guild_id, - author, - data, - }, - state, - ) - .await?; - - Ok(new_state) -} - -/// Settings API: Delete implementation -#[allow(clippy::too_many_arguments)] -pub async fn settings_delete( - setting: &Setting, - data: &SettingsData, - guild_id: serenity::all::GuildId, - author: serenity::all::UserId, - pkey: Value, -) -> Result<(), SettingsError> { - let Some(ref deleter) = setting.operations.delete else { - return Err(SettingsError::OperationNotSupported { - operation: OperationType::Delete, - }); - }; - - let Some(pkey_column) = setting.columns.iter().find(|c| c.id == setting.primary_key) else { - return Err(SettingsError::Generic { - message: "Primary key column not found".to_string(), - src: "settings_update [pkey_column_let_else]".to_string(), - typ: "internal".to_string(), - }); - }; - - let pkey = _parse_value(pkey, &pkey_column.column_type, &setting.primary_key)?; - - deleter - .delete( - HookContext { - guild_id, - author, - data, - }, - pkey, - ) - .await?; - - Ok(()) -} diff --git a/core/rust.settings/src/common_columns.rs b/core/rust.settings/src/common_columns.rs deleted file mode 100644 index 11bc8831..00000000 --- a/core/rust.settings/src/common_columns.rs +++ /dev/null @@ -1,87 +0,0 @@ -use super::types::{ - Column, ColumnSuggestion, ColumnType, InnerColumnType, InnerColumnTypeStringKind, OperationType, -}; - -/// Standard created_at column -pub fn created_at() -> Column { - Column { - id: "created_at".to_string(), - name: "Created At".to_string(), - description: "The time the record was created.".to_string(), - column_type: ColumnType::new_scalar(InnerColumnType::TimestampTz {}), - nullable: false, - ignored_for: vec![OperationType::Create, OperationType::Update], - secret: false, - suggestions: ColumnSuggestion::None {}, - } -} - -/// Standard created_by column -pub fn created_by() -> Column { - Column { - id: "created_by".to_string(), - name: "Created By".to_string(), - description: "The user who created the record.".to_string(), - column_type: ColumnType::new_scalar(InnerColumnType::String { - min_length: None, - max_length: None, - allowed_values: vec![], - kind: InnerColumnTypeStringKind::User {}, - }), - ignored_for: vec![OperationType::Create, OperationType::Update], - secret: false, - nullable: false, - suggestions: ColumnSuggestion::None {}, - } -} - -/// Standard last_updated_at column -pub fn last_updated_at() -> Column { - Column { - id: "last_updated_at".to_string(), - name: "Last Updated At".to_string(), - description: "The time the record was last updated.".to_string(), - column_type: ColumnType::new_scalar(InnerColumnType::TimestampTz {}), - ignored_for: vec![OperationType::Create, OperationType::Update], - secret: false, - nullable: false, - suggestions: ColumnSuggestion::None {}, - } -} - -/// Standard last_updated_by column -pub fn last_updated_by() -> Column { - Column { - id: "last_updated_by".to_string(), - name: "Last Updated By".to_string(), - description: "The user who last updated the record.".to_string(), - column_type: ColumnType::new_scalar(InnerColumnType::String { - min_length: None, - max_length: None, - allowed_values: vec![], - kind: InnerColumnTypeStringKind::User {}, - }), - ignored_for: vec![OperationType::Create, OperationType::Update], - secret: false, - nullable: false, - suggestions: ColumnSuggestion::None {}, - } -} - -pub fn guild_id(id: &'static str, name: &'static str, description: &'static str) -> Column { - Column { - id: id.to_string(), - name: name.to_string(), - description: description.to_string(), - column_type: ColumnType::new_scalar(InnerColumnType::String { - min_length: None, - max_length: None, - allowed_values: vec![], - kind: InnerColumnTypeStringKind::Normal {}, - }), - nullable: false, - suggestions: ColumnSuggestion::None {}, - ignored_for: vec![OperationType::Create, OperationType::Update], - secret: false, - } -} diff --git a/core/rust.settings/src/lib.rs b/core/rust.settings/src/lib.rs deleted file mode 100644 index d58ff43c..00000000 --- a/core/rust.settings/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod cfg; -pub mod common_columns; -pub mod types; diff --git a/core/rust.settings/src/types.rs b/core/rust.settings/src/types.rs deleted file mode 100644 index e5e25ecb..00000000 --- a/core/rust.settings/src/types.rs +++ /dev/null @@ -1,511 +0,0 @@ -use async_trait::async_trait; -use splashcore_rs::value::Value; -use std::sync::Arc; - -pub type Error = Box; // This is constant and should be copy pasted - -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -pub enum SettingsError { - /// Operation not supported - OperationNotSupported { - operation: OperationType, - }, - /// Generic error - Generic { - message: String, - src: String, - typ: String, - }, - /// Schema type validation error - SchemaTypeValidationError { - column: String, - expected_type: String, - got_type: String, - }, - /// Schema null value validation error - SchemaNullValueValidationError { - column: String, - }, - /// Schema check validation error - SchemaCheckValidationError { - column: String, - check: String, - error: String, - accepted_range: String, - }, - /// Missing or invalid field - MissingOrInvalidField { - field: String, - src: String, - }, - RowExists { - column_id: String, - count: i64, - }, - RowDoesNotExist { - column_id: String, - }, - MaximumCountReached { - max: usize, - current: usize, - }, - PermissionError { - result: permissions::types::PermissionResult, - }, -} - -pub struct SettingsData { - pub pool: sqlx::PgPool, - pub reqwest: reqwest::Client, - pub object_store: Arc, - pub cache_http: botox::cache::CacheHttpImpl, - pub serenity_context: serenity::all::Context, -} - -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[allow(dead_code)] -pub enum ColumnType { - /// A single valued column (scalar) - Scalar { - /// The value type - inner: InnerColumnType, - }, - /// An array column - Array { - /// The inner type of the array - inner: InnerColumnType, - }, -} - -impl ColumnType { - /// Returns whether the column type is an array - #[allow(dead_code)] - pub fn is_array(&self) -> bool { - matches!(self, ColumnType::Array { .. }) - } - - /// Returns whether the column type is a scalar - #[allow(dead_code)] - pub fn is_scalar(&self) -> bool { - matches!(self, ColumnType::Scalar { .. }) - } - - pub fn new_scalar(inner: InnerColumnType) -> Self { - ColumnType::Scalar { inner } - } - - pub fn new_array(inner: InnerColumnType) -> Self { - ColumnType::Array { inner } - } -} - -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[allow(dead_code)] -pub enum InnerColumnTypeStringKind { - /// Normal string - Normal {}, - /// A token that is autogenerated if not provided by the user - Token { - /// The default length of the secret if not provided by the user - default_length: usize, - }, - /// A textarea - Textarea { ctx: String }, - /// A reference to a template by name - TemplateRef {}, - /// A kittycat permission - KittycatPermission {}, - /// User - User {}, - /// Role - Role {}, - /// Channel selector - Channel { - needed_bot_permissions: serenity::all::Permissions, - allowed_channel_types: Vec, - }, -} - -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -#[allow(dead_code)] -pub enum InnerColumnType { - Uuid {}, - String { - min_length: Option, - max_length: Option, - allowed_values: Vec, // If empty, all values are allowed - kind: InnerColumnTypeStringKind, - }, - Timestamp {}, - TimestampTz {}, - Interval {}, - Integer {}, - Float {}, - BitFlag { - /// The bit flag values - values: indexmap::IndexMap, - }, - Boolean {}, - Json { - max_bytes: Option, - }, -} - -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] -pub enum ColumnSuggestion { - Static { suggestions: Vec }, - None {}, -} - -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -pub struct Column { - /// The ID of the column on the database - pub id: String, - - /// The friendly name of the column - pub name: String, - - /// The description of the column - pub description: String, - - /// The type of the column - pub column_type: ColumnType, - - /// Whether or not the column is nullable - /// - /// Note that the point where nullability is checked may vary but will occur after pre_checks are executed - pub nullable: bool, - - /// Suggestions to display - pub suggestions: ColumnSuggestion, - - /// A secret field that is not shown to the user - pub secret: bool, - - /// For which operations should the field be ignored for (essentially, read only) - /// - /// Semantics are defined by the Executor - pub ignored_for: Vec, -} - -impl PartialEq for Column { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Hash, Eq, serde::Serialize, serde::Deserialize)] -#[allow(dead_code)] -pub enum OperationType { - View, - Create, - Update, - Delete, -} - -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -pub struct Setting { - /// The ID of the option - pub id: String, - - /// The name of the option - pub name: String, - - /// The description of the option - pub description: String, - - /// The primary key of the table. Should be present in ID - pub primary_key: String, - - /// Title template, used for the title of the embed - pub title_template: String, - - /// The columns for this option - pub columns: Arc>, - - /// The supported operations for this option - #[serde(skip_deserializing)] - pub operations: SettingOperations, -} - -#[derive(Clone, Default)] -pub struct SettingOperations { - /// How to view this setting - pub view: Option>, - - /// How to create this setting - pub create: Option>, - - /// How to update this setting - pub update: Option>, - - /// How to delete this setting - pub delete: Option>, -} - -impl std::fmt::Debug for SettingOperations { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "SettingOperations") - } -} - -impl serde::Serialize for SettingOperations { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut supported_operations = Vec::new(); - - if let Some(_v) = &self.view { - supported_operations.push(OperationType::View); - } - - if let Some(_v) = &self.create { - supported_operations.push(OperationType::Create); - } - - if let Some(_v) = &self.update { - supported_operations.push(OperationType::Update); - } - - if let Some(_v) = &self.delete { - supported_operations.push(OperationType::Delete); - } - - supported_operations.serialize(serializer) - } -} - -impl PartialEq for Setting { - fn eq(&self, other: &Self) -> bool { - self.id == other.id - } -} - -/// Wraps `v` in the currently used wrapper -/// -/// Currently, this is an Arc for now -pub fn settings_wrap(v: T) -> Arc { - Arc::new(v) -} - -/// This is the context provided to all hooks (post-actions, validators, etc.) -#[allow(dead_code)] -pub struct HookContext<'a> { - pub author: serenity::all::UserId, - pub guild_id: serenity::all::GuildId, - pub data: &'a SettingsData, // The data object -} - -#[async_trait] -pub trait SettingView: Send + Sync { - /// View the settings data - /// - /// All Executors should return an __count value containing the total count of the total number of entries - async fn view<'a>( - &self, - context: HookContext<'a>, - filters: indexmap::IndexMap, - ) -> Result>, SettingsError>; -} - -#[async_trait] -pub trait SettingCreator: Send + Sync { - /// Creates the setting - async fn create<'a>( - &self, - context: HookContext<'a>, - state: indexmap::IndexMap, - ) -> Result, SettingsError>; -} - -#[async_trait] -pub trait SettingUpdater: Send + Sync { - /// Updates the setting - async fn update<'a>( - &self, - context: HookContext<'a>, - state: indexmap::IndexMap, - ) -> Result, SettingsError>; -} - -#[async_trait] -pub trait SettingDeleter: Send + Sync { - /// Deletes the setting - async fn delete<'a>( - &self, - context: HookContext<'a>, - pkey: splashcore_rs::value::Value, - ) -> Result<(), SettingsError>; -} - -impl From - for SettingOperations -{ - fn from(v: T) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: Some(settings_wrap(v.clone())), - update: Some(settings_wrap(v.clone())), - delete: Some(settings_wrap(v)), - } - } -} - -#[allow(dead_code)] -impl SettingOperations { - pub fn to_view_op(v: T) -> Self { - SettingOperations { - view: Some(settings_wrap(v)), - create: None, - update: None, - delete: None, - } - } - - pub fn to_create_op(v: T) -> Self { - SettingOperations { - view: None, - create: Some(settings_wrap(v)), - update: None, - delete: None, - } - } - - pub fn to_update_op(v: T) -> Self { - SettingOperations { - view: None, - create: None, - update: Some(settings_wrap(v)), - delete: None, - } - } - - pub fn to_delete_op(v: T) -> Self { - SettingOperations { - view: None, - create: None, - update: None, - delete: Some(settings_wrap(v)), - } - } - - pub fn to_view_create_op(v: T) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: Some(settings_wrap(v)), - update: None, - delete: None, - } - } - - pub fn to_view_update_op(v: T) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: None, - update: Some(settings_wrap(v)), - delete: None, - } - } - - pub fn to_view_delete_op(v: T) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: None, - update: None, - delete: Some(settings_wrap(v)), - } - } - - pub fn to_create_update_op(v: T) -> Self { - SettingOperations { - view: None, - create: Some(settings_wrap(v.clone())), - update: Some(settings_wrap(v)), - delete: None, - } - } - - pub fn to_create_delete_op(v: T) -> Self { - SettingOperations { - view: None, - create: Some(settings_wrap(v.clone())), - update: None, - delete: Some(settings_wrap(v)), - } - } - - pub fn to_update_delete_op(v: T) -> Self { - SettingOperations { - view: None, - create: None, - update: Some(settings_wrap(v.clone())), - delete: Some(settings_wrap(v)), - } - } - - pub fn to_view_create_update_op< - T: SettingView + SettingCreator + SettingUpdater + Clone + 'static, - >( - v: T, - ) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: Some(settings_wrap(v.clone())), - update: Some(settings_wrap(v)), - delete: None, - } - } - - pub fn to_view_create_delete_op< - T: SettingView + SettingCreator + SettingDeleter + Clone + 'static, - >( - v: T, - ) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: Some(settings_wrap(v.clone())), - update: None, - delete: Some(settings_wrap(v)), - } - } - - pub fn to_view_update_delete_op< - T: SettingView + SettingUpdater + SettingDeleter + Clone + 'static, - >( - v: T, - ) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: None, - update: Some(settings_wrap(v.clone())), - delete: Some(settings_wrap(v)), - } - } - - pub fn to_create_update_delete_op< - T: SettingCreator + SettingUpdater + SettingDeleter + Clone + 'static, - >( - v: T, - ) -> Self { - SettingOperations { - view: None, - create: Some(settings_wrap(v.clone())), - update: Some(settings_wrap(v.clone())), - delete: Some(settings_wrap(v)), - } - } - - pub fn to_view_create_update_delete_op< - T: SettingView + SettingCreator + SettingUpdater + SettingDeleter + Clone + 'static, - >( - v: T, - ) -> Self { - SettingOperations { - view: Some(settings_wrap(v.clone())), - create: Some(settings_wrap(v.clone())), - update: Some(settings_wrap(v.clone())), - delete: Some(settings_wrap(v)), - } - } -} diff --git a/core/rust.silverpelt/Cargo.toml b/core/rust.silverpelt/Cargo.toml deleted file mode 100644 index 5bbecf9b..00000000 --- a/core/rust.silverpelt/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "silverpelt" -description = "Silverpelt provides the core library used to produce Anti-Raid modules. In Warriors, Silverpelt represents the mortal plane and the stars that guide the clans." -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -poise = { git = "https://github.com/Anti-Raid/poise", branch = "serenity-next" } -chrono = { version = "0.4", features = ["serde"]} -indexmap = { version = "2", features = ["serde"] } -serde_json = "1.0" -moka = { version = "0.12", features = ["future", "futures-util"] } -serde = { version = "1.0", features = ["derive"] } -typetag = "0.2" -dashmap = { version = "6", features = ["serde", "inline", "rayon"] } -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -log = "0.4" -async-trait = "0.1.80" -uuid = { version = "1", features = ["serde"] } - -# Anti-Raid specific -splashcore_rs = { path = "../rust.std" } -permissions = { path = "../rust.permissions" } -ar_settings = { path = "../rust.settings" } -config = { path = "../rust.config" } - -[dependencies.tokio] -version = "1" -features = ["sync", "macros", "rt-multi-thread"] - -[dependencies.botox] -git = "https://github.com/Anti-Raid/botox" -branch = "main" - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] - -[dependencies.kittycat] -git = "https://github.com/infinitybotlist/kittycat" -branch = "main" diff --git a/core/rust.silverpelt/src/ar_event.rs b/core/rust.silverpelt/src/ar_event.rs deleted file mode 100644 index 197c4084..00000000 --- a/core/rust.silverpelt/src/ar_event.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::data::Data; -use crate::Error; -use std::sync::Arc; - -pub use typetag; // Re-exported - -pub struct EventHandlerContext<'a> { - pub guild_id: serenity::all::GuildId, - pub data: Arc, - pub event: AntiraidEvent<'a>, - pub serenity_context: serenity::all::Context, -} - -/// This can be used to trigger a custom event -#[derive(Debug, serde::Serialize, serde::Deserialize)] -pub struct CustomEvent { - pub event_name: String, - pub event_titlename: String, - pub event_data: serde_json::Value, -} - -#[derive(Debug)] -#[must_use] -pub enum AntiraidEvent<'a> { - /// A regular discord event - Discord(&'a serenity::all::FullEvent), - - /// A sting create event. Dispatched when a sting is created - StingCreate(super::stings::Sting), - - /// A sting expiry event. Dispatched when a sting expires - StingExpire(super::stings::Sting), - - /// A sting delete event. Dispatched when a sting is manually deleted - StingDelete(super::stings::Sting), - - /// A punishment create event. Dispatched when a punishment is created - PunishmentCreate(super::punishments::Punishment), - - /// A punishment expiration event. Dispatched when a punishment expires - PunishmentExpire(super::punishments::Punishment), - - /// An on startup event is fired *at least once* when the bot starts up or the set of templates are modified - /// - /// The inner Vec is the list of templates modified/reloaded - OnStartup(Vec), - - /// A custom event - Custom(CustomEvent), -} - -/// Dispatches an event to all modules sequentially -/// -/// This works well because Anti-Raid uses very few event listeners (only 2) -pub async fn dispatch_event_to_modules<'a>( - event_handler_context: &EventHandlerContext<'a>, -) -> Result<(), Vec> { - let mut errors = Vec::new(); - - for refs in event_handler_context - .data - .silverpelt_cache - .module_cache - .iter() - { - let module = refs.value(); - - // To reduce DB calls / actually expensive work, check for event listeners first and then check the filter - let Some(event_listeners) = module.event_listeners() else { - continue; - }; - - if !event_listeners.event_handler_filter(&event_handler_context.event) { - continue; - } - - let module_enabled = { - match crate::module_config::is_module_enabled( - &event_handler_context.data.silverpelt_cache, - &event_handler_context.data.pool, - event_handler_context.guild_id, - module.id(), - ) - .await - { - Ok(enabled) => enabled, - Err(e) => { - errors.push(format!("Error getting module enabled status: {}", e).into()); - continue; - } - } - }; - - if !module_enabled { - continue; - } - - match event_listeners.event_handler(event_handler_context).await { - Ok(_) => {} - Err(e) => { - errors.push(e); - } - } - } - - if !errors.is_empty() { - return Err(errors); - } - - Ok(()) -} diff --git a/core/rust.silverpelt/src/cache.rs b/core/rust.silverpelt/src/cache.rs deleted file mode 100644 index 5a40cd81..00000000 --- a/core/rust.silverpelt/src/cache.rs +++ /dev/null @@ -1,114 +0,0 @@ -use crate::{canonical_module::CanonicalModule, module::Module, CommandExtendedDataMap}; -use moka::future::Cache; -use serenity::all::GuildId; -use std::sync::Arc; - -/// The compiler requires some help here with module cache so we use a wrapper struct -pub struct ModuleCacheEntry(pub Arc); - -impl Clone for ModuleCacheEntry { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -} - -impl std::ops::Deref for ModuleCacheEntry { - type Target = Arc; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -/// The silverpelt cache is a structure that contains the core state for the bot -pub struct SilverpeltCache { - /// Cache of whether a (GuildId, String) pair has said module enabled or disabled - pub module_enabled_cache: Cache<(GuildId, String), bool>, - - /// Cache of the extended data given a command (the extended data map stores the default base permissions and other data per command) - pub command_extra_data_map: dashmap::DashMap, - - /// A commonly needed operation is mapping a module id to its respective module - /// - /// module_cache is a cache of module id to module - /// - /// We use indexmap here to avoid the 'static restriction - pub module_cache: dashmap::DashMap, - - /// Command ID to module map - pub command_id_module_map: dashmap::DashMap, - - /// Cache of the canonical forms of all modules - pub canonical_module_cache: dashmap::DashMap, - - /// Cache of all known settings - pub settings_cache: dashmap::DashMap, -} - -impl Default for SilverpeltCache { - fn default() -> Self { - Self { - module_enabled_cache: Cache::builder().support_invalidation_closures().build(), - command_extra_data_map: dashmap::DashMap::new(), - module_cache: dashmap::DashMap::new(), - command_id_module_map: dashmap::DashMap::new(), - canonical_module_cache: dashmap::DashMap::new(), - settings_cache: dashmap::DashMap::new(), - } - } -} - -impl SilverpeltCache { - pub fn add_module(&mut self, module: Box) { - // Try validating the module first before adding it - match module.validate() { - Ok(_) => {} - Err(e) => { - panic!( - "SilverpeltCache::add_module - Failed to validate module: {}", - e - ); - } - } - - let module: Arc = module.into(); - - // Add the commands to cache - for (command, extended_data) in module.raw_commands().iter() { - self.command_id_module_map - .insert(command.name.to_string(), module.id().to_string()); - self.command_extra_data_map - .insert(command.name.to_string(), extended_data.clone()); - } - - // Add the settings to cache - for setting in module.config_options() { - self.settings_cache - .insert(setting.id.clone(), setting.clone()); - } - - // Add to canonical cache - self.canonical_module_cache - .insert(module.id().to_string(), CanonicalModule::from(&module)); - - // Add the module to cache - self.module_cache - .insert(module.id().to_string(), ModuleCacheEntry(module)); - } - - pub fn remove_module(&mut self, module_id: &str) { - if let Some((_, module)) = self.module_cache.remove(module_id) { - for (command, _) in module.raw_commands().iter() { - self.command_id_module_map.remove(&command.name.to_string()); - self.command_extra_data_map - .remove(&command.name.to_string()); - } - - for setting in module.config_options() { - self.settings_cache.remove(&setting.id); - } - - self.canonical_module_cache.remove(module_id); - } - } -} diff --git a/core/rust.silverpelt/src/canonical_module.rs b/core/rust.silverpelt/src/canonical_module.rs deleted file mode 100644 index fed34f0f..00000000 --- a/core/rust.silverpelt/src/canonical_module.rs +++ /dev/null @@ -1,165 +0,0 @@ -use indexmap::IndexMap; - -/// Canonical representation of a module for external use -#[derive(serde::Serialize, serde::Deserialize, Clone)] -pub struct CanonicalModule { - /// The ID of the module - pub id: String, - - /// The name of the module - pub name: String, - - /// The description of the module - pub description: String, - - /// Whether or not the module should be visible on the websites command lists - pub web_hidden: bool, - - /// Whether or the module can be enabled and/or disabled - pub toggleable: bool, - - /// Whether or not individual commands in the module can be configured - pub commands_toggleable: bool, - - /// Virtual module. These modules allow controlling certain functionality of the bot without being loaded into the actual bot - pub virtual_module: bool, - - /// Whether the module is enabled or disabled by default - pub is_default_enabled: bool, - - /// The commands in the module - pub commands: Vec, - - /// Modules may store files on seaweed, in order to allow for usage tracking, - /// s3_paths should be set to the paths of the files on seaweed - pub s3_paths: Vec, - - /// Config options for this module - pub config_options: Vec, -} - -/// Canonical representation of a command (data section) for external use -#[derive(serde::Serialize, serde::Deserialize, Clone)] -pub struct CanonicalCommand { - pub command: CanonicalCommandData, - pub extended_data: IndexMap, -} - -/// Canonical representation of a command argument for external use -#[derive(serde::Serialize, serde::Deserialize, Clone)] -pub struct CanonicalCommandArgument { - /// The name of the argument - pub name: String, - - /// The description of the argument - pub description: Option, - - /// Whether or not the argument is required - pub required: bool, - - /// The choices available for the argument - pub choices: Vec, -} - -/// Canonical representation of a command (data section) for external use -#[derive(serde::Serialize, serde::Deserialize, Clone)] -pub struct CanonicalCommandData { - /// The name of the command - pub name: String, - - /// The qualified name of the command - pub qualified_name: String, - - /// The description of the command - pub description: Option, - - /// NSFW status - pub nsfw: bool, - - /// The subcommands of the command - pub subcommands: Vec, - - /// Whether or not a subcommand is required or not - pub subcommand_required: bool, - - /// The arguments of the command - pub arguments: Vec, -} - -/// Given a command, return its canonical representation -impl CanonicalCommand { - pub fn from_repr( - cmd: &crate::Command, - extended_data: IndexMap<&'static str, crate::CommandExtendedData>, - ) -> Self { - CanonicalCommand { - command: cmd.into(), - extended_data: extended_data - .into_iter() - .map(|(k, v)| (k.to_string(), v)) - .collect(), - } - } -} - -/// Given command data, return its canonical representation -impl From<&crate::Command> for CanonicalCommandData { - fn from(cmd: &crate::Command) -> Self { - CanonicalCommandData { - name: cmd.name.to_string(), - qualified_name: cmd.qualified_name.to_string(), - description: cmd.description.as_ref().map(|x| x.to_string()), - nsfw: cmd.nsfw_only, - subcommands: cmd - .subcommands - .iter() - .map(CanonicalCommandData::from) - .collect(), - subcommand_required: cmd.subcommand_required, - arguments: cmd - .parameters - .iter() - .map(|arg| CanonicalCommandArgument { - name: arg.name.to_string(), - description: arg.description.as_ref().map(|x| x.to_string()), - required: arg.required, - choices: arg - .choices - .iter() - .map(|choice| choice.name.to_string()) - .collect(), - }) - .collect(), - } - } -} - -/// Given a module, return its canonical representation -impl From<&dyn crate::module::Module> for CanonicalModule { - fn from(module: &dyn crate::module::Module) -> Self { - CanonicalModule { - id: module.id().to_string(), - name: module.name().to_string(), - description: module.description().to_string(), - toggleable: module.toggleable(), - commands_toggleable: module.commands_toggleable(), - virtual_module: module.virtual_module(), - web_hidden: module.web_hidden(), - is_default_enabled: module.is_default_enabled(), - commands: module - .raw_commands() - .iter() - .map(|(cmd, perms)| CanonicalCommand::from_repr(cmd, perms.clone())) - .collect(), - s3_paths: module.s3_paths().clone(), - config_options: module.config_options(), - } - } -} - -/// Allow &Arc to be converted to CanonicalModule -impl From<&std::sync::Arc> for CanonicalModule { - fn from(module: &std::sync::Arc) -> Self { - CanonicalModule::from(&**module) - } -} diff --git a/core/rust.silverpelt/src/data.rs b/core/rust.silverpelt/src/data.rs deleted file mode 100644 index e5a824da..00000000 --- a/core/rust.silverpelt/src/data.rs +++ /dev/null @@ -1,101 +0,0 @@ -use splashcore_rs::objectstore::ObjectStore; -use std::fmt::Debug; -use std::sync::Arc; - -/// This struct stores base/standard command data, which is stored and accessible in all command invocations -#[derive(Clone)] -pub struct Data { - pub pool: sqlx::PgPool, - pub reqwest: reqwest::Client, - pub object_store: Arc, - pub props: Arc, - - /// Any extra data represented as a key-value map - pub extra_data: dashmap::DashMap>, - - /// The silverpelt cache to use for this module - pub silverpelt_cache: Arc, -} - -impl Debug for Data { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Data") - .field("pool", &"sqlx::PgPool") - .field("reqwest", &"reqwest::Client") - .field("object_store", &"Arc") - .field("props", &"Arc") - .field("extra_data", &self.extra_data.len()) - .field("silverpelt_cache", &"Arc") - .finish() - } -} - -impl Data { - /// Given the Data and a cache_http, returns the settings data - pub fn settings_data( - &self, - serenity_context: serenity::all::Context, - ) -> ar_settings::types::SettingsData { - ar_settings::types::SettingsData { - pool: self.pool.clone(), - reqwest: self.reqwest.clone(), - object_store: self.object_store.clone(), - cache_http: botox::cache::CacheHttpImpl::from_ctx(&serenity_context), - serenity_context, - } - } - - /// Given a settings data, return the silverpelt cache - /// - /// This is just a wrapper for .data::().silverpelt_cache.clone() - pub fn silverpelt_cache( - settings_data: &ar_settings::types::SettingsData, - ) -> Arc { - settings_data - .serenity_context - .data::() - .silverpelt_cache - .clone() - } - - /// Given a settings data, return the data - /// - /// This is just a wrapper for settings_data.serenity_context.data::().clone() - pub fn get_data(settings_data: &ar_settings::types::SettingsData) -> Arc { - settings_data.serenity_context.data::().clone() - } -} - -#[async_trait::async_trait] -pub trait Props -where - Self: Send + Sync, -{ - /// Converts the props to std::any::Any - fn as_any(&self) -> &(dyn std::any::Any + Send + Sync); - - /// Extra description of the service - fn extra_description(&self) -> String; - - /// If applicable, the shards available to this process - async fn shards(&self) -> Result, crate::Error>; - - /// If applicable, the shard count - async fn shard_count(&self) -> Result; - - /// Returns the shard messenger given the shard id - async fn shard_messenger( - &self, - shard_id: serenity::all::ShardId, - ) -> Result; - - /// Total number of guilds - /// - /// Note that this statistic may not always be available, in such cases, 0 will be returned - async fn total_guilds(&self) -> Result; - - /// Total number of users - /// - /// Note that this statistic may not always be available, in such cases, 0 will be returned - async fn total_users(&self) -> Result; -} diff --git a/core/rust.silverpelt/src/lib.rs b/core/rust.silverpelt/src/lib.rs deleted file mode 100644 index 7cfe6352..00000000 --- a/core/rust.silverpelt/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub mod ar_event; -pub mod cache; -pub mod canonical_module; -pub mod data; -pub mod member_permission_calc; -pub mod module; -pub mod module_config; -pub mod punishments; -pub mod stings; -pub mod types; -pub mod utils; - -use crate::types::{CommandExtendedData, CommandExtendedDataMap}; - -pub type Error = Box; // This is constant and should be copy pasted -pub type Command = poise::Command; -pub type Context<'a> = poise::Context<'a, data::Data, Error>; - -pub type BackgroundTask = ( - botox::taskman::Task, - fn(&serenity::all::Context) -> (bool, String), -); diff --git a/core/rust.silverpelt/src/member_permission_calc.rs b/core/rust.silverpelt/src/member_permission_calc.rs deleted file mode 100644 index 06f414e0..00000000 --- a/core/rust.silverpelt/src/member_permission_calc.rs +++ /dev/null @@ -1,123 +0,0 @@ -use kittycat::perms::Permission; -use serenity::all::{GuildId, RoleId, UserId}; - -/// ``create_roles_list_for_guild`` creates a list of roles for a guild including the everyone role as a string -/// -/// This is needed by other functions to rederive permissions such as ``rederive_perms_impl`` and ``get_user_positions_from_db`` -pub fn create_roles_list_for_guild(roles: &[RoleId], guild_id: GuildId) -> Vec { - let mut roles_str = Vec::new(); - - for role in roles { - roles_str.push(role.to_string()); - } - - roles_str.push(guild_id.everyone_role().to_string()); - - roles_str -} - -/// Returns the user positions of the member. This can be useful for caching or to reduce DB calls -/// -/// ``roles_str`` is the list of roles as strings. This can be obtained by calling ``create_roles_list_for_guild`` -pub async fn get_user_positions_from_db( - conn: &mut sqlx::PgConnection, - guild_id: GuildId, - roles_str: &[String], -) -> Result, crate::Error> { - // Rederive permissions for the new perms - let role_perms = sqlx::query!( - "SELECT role_id, perms, index FROM guild_roles WHERE guild_id = $1 AND role_id = ANY($2)", - guild_id.to_string(), - &roles_str - ) - .fetch_all(&mut *conn) - .await?; - - let mut user_positions = Vec::new(); - - for role in role_perms { - user_positions.push(kittycat::perms::PartialStaffPosition { - id: role.role_id, - perms: role - .perms - .iter() - .map(|x| Permission::from_string(x)) - .collect(), - index: role.index, - }) - } - - Ok(user_positions) -} - -/// Rederive permissions rederives the permissions given a member id and a list of roles -pub fn rederive_perms_impl( - guild_id: GuildId, - user_id: UserId, - user_positions: Vec, - perm_overrides: Vec, -) -> Vec { - // We hardcode root users for the main server to ensure root users have control over the bot even under extreme circumstances - if guild_id == config::CONFIG.servers.main.get() - && config::CONFIG.discord_auth.root_users.contains(&user_id) - { - return vec!["global.*".into()]; - } - - kittycat::perms::StaffPermissions { - user_positions, - perm_overrides, - } - .resolve() -} - -/// Rederive permissions rederives the permissions given a member id and a list of roles -/// -/// Calling rederive_perms_and_update_db has some side-effects. Use rederive_perms_impl if you do not want to update the database -/// -/// 0. The member will automatically be added to the guild_members table if they are not already in it -/// 1. Resolved_perms_cache will be updated in the guild_members table -async fn rederive_perms( - conn: &mut sqlx::PgConnection, - guild_id: GuildId, - user_id: UserId, - roles: &[RoleId], -) -> Result, crate::Error> { - let perm_overrides = sqlx::query!( - "SELECT perm_overrides FROM guild_members WHERE guild_id = $1 AND user_id = $2", - guild_id.to_string(), - user_id.to_string() - ) - .fetch_optional(&mut *conn) - .await? - .map(|x| { - x.perm_overrides - .iter() - .map(|x| Permission::from_string(x)) - .collect::>() - }) - .unwrap_or_default(); - - let roles_str = create_roles_list_for_guild(roles, guild_id); - let user_positions = get_user_positions_from_db(&mut *conn, guild_id, &roles_str).await?; - - let resolved_perms = rederive_perms_impl(guild_id, user_id, user_positions, perm_overrides); - - Ok(resolved_perms) -} - -/// Returns the kittycat permissions of a user. This function also takes into account permission overrides etc. -pub async fn get_kittycat_perms( - conn: &mut sqlx::PgConnection, - guild_id: GuildId, - guild_owner_id: UserId, - user_id: UserId, - roles: &[RoleId], -) -> Result, crate::Error> { - // For now, owners have full permission, this may change in the future (maybe??) - if guild_owner_id == user_id { - return Ok(vec!["global.*".into()]); - } - - Ok(rederive_perms(&mut *conn, guild_id, user_id, roles).await?) -} diff --git a/core/rust.silverpelt/src/module.rs b/core/rust.silverpelt/src/module.rs deleted file mode 100644 index df8beb52..00000000 --- a/core/rust.silverpelt/src/module.rs +++ /dev/null @@ -1,191 +0,0 @@ -pub type CommandObj = (crate::Command, crate::CommandExtendedDataMap); - -/// The `Module` trait can be used to create/define modules that run on Anti-Raid -/// -/// A trait is used here to avoid a ton of complicated BoxFuture's, make Default handling more explicit and customizable and makes creating new Modules easier -pub trait Module: Send + Sync { - /// The ID of the module - fn id(&self) -> &'static str; - - /// The name of the module - fn name(&self) -> &'static str; - - /// The description of the module - fn description(&self) -> &'static str; - - /// Whether or not the module should be visible on the websites command lists - fn web_hidden(&self) -> bool { - false - } - - /// Whether or the module can be enabled and/or disabled - fn toggleable(&self) -> bool { - true - } - - /// Whether or not individual commands in the module can be toggled - fn commands_toggleable(&self) -> bool { - true - } - - /// Virtual module. These modules allow controlling functionality of the bot without having its commands loaded into the bot - /// - /// Note that commands on a virtual module must also be virtual as well - fn virtual_module(&self) -> bool { - false - } - - /// Whether the module is enabled or disabled by default - fn is_default_enabled(&self) -> bool { - false // Don't enable new modules by default unless modules explicitly opt in to this behavior - } - - /// The commands in the module - fn raw_commands(&self) -> Vec { - Vec::new() - } - - /// Event listeners for the module - fn event_listeners(&self) -> Option> { - None - } - - /// Background tasks (if any), first argument is the task - /// - /// Second is a function that returns whether the task should be added - fn background_tasks(&self) -> Vec { - Vec::new() - } - - /// Modules may store files on seaweed, in order to allow for usage tracking, - /// s3_paths should be set to the paths of the files on seaweed - fn s3_paths(&self) -> Vec { - Vec::new() - } - - /// Config options for this module - fn config_options(&self) -> Vec { - Vec::new() - } - - /// Whether the module is a 'root'/sudo module. These modules will only be accessible - /// to a whitelist-defined set of users - fn root_module(&self) -> bool { - false - } - - /// Performs any sanity/validation checks on the module - /// - /// Should not be overrided by modules unless absolutely necessary - fn validate(&self) -> Result<(), crate::Error> { - validate_module(self) - } -} - -#[async_trait::async_trait] -pub trait ModuleEventListeners: Send + Sync { - /// Event handler for the module - /// - /// Modules requiring multiple event_handlers will have to handle that themselves - async fn event_handler( - &self, - _ctx: &crate::ar_event::EventHandlerContext, - ) -> Result<(), crate::Error> { - Ok(()) - } - - /// Filter the inbound events to a module - /// - /// This function is called before the event_handler function - /// - /// Returning false here will prevent a new tokio task from being spawned hence - /// making things more efficient - fn event_handler_filter(&self, _event: &crate::ar_event::AntiraidEvent) -> bool; -} - -/// Validates a module to ensure it is set up correctly -pub fn validate_module(module: &T) -> Result<(), crate::Error> { - let commands = module.raw_commands(); - - // If virtual module, all commands must also be virtual, if root command is virtual, all subcommands must be virtual - for command in commands.iter() { - let root_is_virtual = { - match command.1.get("") { - Some(root) => root.virtual_command, - None => false, - } - }; - for (sub_name, extended_data) in command.1.iter() { - if module.virtual_module() && !extended_data.virtual_command { - return Err(format!( - "Module {} is a virtual module, but has a non-virtual command {}", - module.id(), - command.0.name - ) - .into()); - } - - if root_is_virtual && !extended_data.virtual_command { - return Err(format!( - "Module {} has a virtual root command, but a non-virtual subcommand {} {}", - module.id(), - command.0.name, - sub_name - ) - .into()); - } - } - } - - // Check: Ensure all command extended data's have valid subcommands listed - for (command, extended_data) in commands.iter() { - let mut listed_subcommands = Vec::new(); - let mut actual_subcommands = Vec::new(); - - for (subcommand, _) in extended_data.iter() { - listed_subcommands.push(subcommand.to_string()); - } - - for subcommand in &command.subcommands { - actual_subcommands.push(subcommand.name.clone()); - } - - // We don't care about omission of "" (rootcmd) here - if !listed_subcommands.contains(&"".to_string()) { - listed_subcommands.insert(0, "".to_string()); - } - - if !actual_subcommands.contains(&"".to_string().into()) { - actual_subcommands.insert(0, "".to_string().into()); - } - - if listed_subcommands != actual_subcommands { - return Err( - format!( - "Module {} has a command {} with subcommands that do not match the actual subcommands [{} != {}]", - module.id(), - command.name, - listed_subcommands.join(", "), - actual_subcommands.join(", ") - ).into() - ); - } - } - - // Check that all config_opts have unique ids - let mut config_ids = Vec::new(); - - for config_opt in &module.config_options() { - if config_ids.contains(&config_opt.id) { - panic!( - "Module {} has a duplicate config option id: {}", - module.id(), - config_opt.id - ); - } - - config_ids.push(config_opt.id.clone()); - } - - Ok(()) -} diff --git a/core/rust.silverpelt/src/module_config.rs b/core/rust.silverpelt/src/module_config.rs deleted file mode 100644 index ac8e8a60..00000000 --- a/core/rust.silverpelt/src/module_config.rs +++ /dev/null @@ -1,283 +0,0 @@ -use crate::{ - cache::SilverpeltCache, - types::{GuildCommandConfiguration, GuildModuleConfiguration}, - utils::permute_command_names, - CommandExtendedData, -}; -use serenity::all::GuildId; -use sqlx::PgPool; - -/// Returns whether or not a module is enabled based on cache and/or database -/// -/// Note that fetching directly from database may be more reliable in certain cases -/// such as module_enable/disable and as such *SHOULD* be used there. This function -/// should only be called for cases where querying the database every time would be -/// too great a cost -#[allow(dead_code)] // This function is a useful utility function -pub async fn is_module_enabled( - silverpelt_cache: &SilverpeltCache, - pool: &PgPool, - guild_id: GuildId, - module: &str, -) -> Result { - if let Some(state) = silverpelt_cache - .module_enabled_cache - .get(&(guild_id, module.to_string())) - .await - { - Ok(state) - } else { - // Fetch from database - let disabled = sqlx::query!( - "SELECT disabled FROM guild_module_configurations WHERE guild_id = $1 AND module = $2", - guild_id.to_string(), - module - ) - .fetch_optional(pool) - .await?; - - if let Some(disabled) = disabled { - if let Some(disabled) = disabled.disabled { - silverpelt_cache - .module_enabled_cache - .insert((guild_id, module.to_string()), !disabled) - .await; - Ok(!disabled) - } else { - // User wants to use the default value - let module = silverpelt_cache - .module_cache - .get(module) - .ok_or::( - format!("Could not find module {} in cache", module).into(), - )?; - - silverpelt_cache - .module_enabled_cache - .insert( - (guild_id, module.id().to_string()), - module.is_default_enabled(), - ) - .await; - Ok(module.is_default_enabled()) - } - } else { - // User wants to use the default value - let module = silverpelt_cache - .module_cache - .get(module) - .ok_or::( - format!("Could not find module {} in cache", module).into(), - )?; - - silverpelt_cache - .module_enabled_cache - .insert( - (guild_id, module.id().to_string()), - module.is_default_enabled(), - ) - .await; - Ok(module.is_default_enabled()) - } - } -} - -/// Returns the configuration for a module, if it exists -pub async fn get_module_configuration( - pool: &PgPool, - guild_id: &str, - module: &str, -) -> Result, crate::Error> { - let rec = sqlx::query!( - "SELECT id, guild_id, module, disabled FROM guild_module_configurations WHERE guild_id = $1 AND module = $2", - guild_id, - module, - ) - .fetch_optional(pool) - .await?; - - if let Some(rec) = rec { - Ok(Some(GuildModuleConfiguration { - id: rec.id.hyphenated().to_string(), - guild_id: rec.guild_id, - module: rec.module, - disabled: rec.disabled, - })) - } else { - Ok(None) - } -} - -/// Returns the extended data for a command -pub fn get_command_extended_data( - silverpelt_cache: &SilverpeltCache, - permutations: &[String], -) -> Result { - let root_cmd = permutations.first().unwrap(); - - let root_cmd_data = silverpelt_cache.command_extra_data_map.get(root_cmd); - - let Some(root_cmd_data) = root_cmd_data else { - return Err(format!( - "The command ``{}`` does not exist [command not found in cache?]", - root_cmd - ) - .into()); - }; - - let mut cmd_data = root_cmd_data - .get("") - .unwrap_or(&CommandExtendedData::kittycat_or_admin(root_cmd, "*")) - .clone(); - - for command in permutations.iter() { - let cmd_replaced = command - .replace(&root_cmd.to_string(), "") - .trim() - .to_string(); - - if let Some(data) = root_cmd_data.get(&cmd_replaced.as_str()) { - cmd_data = data.clone(); - } - } - - Ok(cmd_data) -} - -/// Gets the best possible command configuation to run a specific command -/// -/// This assumes the base command is the first element in the permutations -/// -/// Note that disabled+perms are inherited from parent commands if explicitly set on parent but not explicitly set on the command itself -/// -/// @returns -/// Option - The best command configuration to use -pub async fn get_best_command_configuration( - pool: &PgPool, - guild_id: &str, - permutations: &[String], -) -> Result, crate::Error> { - let mut command_configuration: Option = None; - for permutation in permutations.iter() { - let rec = sqlx::query!( - "SELECT id, guild_id, command, perms, disabled FROM guild_command_configurations WHERE guild_id = $1 AND command = $2", - guild_id, - permutation, - ) - .fetch_optional(pool) - .await?; - - // We are deeper in the tree, so we can overwrite the command configuration - if let Some(rec) = rec { - let new_command_configuration = GuildCommandConfiguration { - id: rec.id.hyphenated().to_string(), - guild_id: rec.guild_id, - command: rec.command, - perms: { - if let Some(perms) = rec.perms { - serde_json::from_value(perms)? - } else { - // Check parent command for perms - if let Some(ref bcc) = command_configuration { - bcc.perms.clone() - } else { - // No perms found, return None (no perms - None - } - } - }, - disabled: { - if rec.disabled.is_some() { - rec.disabled - } else { - // Check parent command for disabled - if let Some(ref bcc) = command_configuration { - bcc.disabled - } else { - // No disabled found, return None - None - } - } - }, - }; - - command_configuration = Some(new_command_configuration); - } - } - - Ok(command_configuration) -} - -// Gets the exact command configuation for a specific command -pub async fn get_exact_command_configuration( - pool: &PgPool, - guild_id: &str, - command: &str, -) -> Result, crate::Error> { - let mut command_configuration = None; - let rec = sqlx::query!( - "SELECT id, guild_id, command, perms, disabled FROM guild_command_configurations WHERE guild_id = $1 AND command = $2", - guild_id, - command - ) - .fetch_optional(pool) - .await?; - - if let Some(rec) = rec { - command_configuration = Some(GuildCommandConfiguration { - id: rec.id.hyphenated().to_string(), - guild_id: rec.guild_id, - command: rec.command, - perms: { - if let Some(perms) = rec.perms { - serde_json::from_value(perms)? - } else { - None - } - }, - disabled: rec.disabled, - }); - } - - Ok(command_configuration) -} - -/// Returns all configurations of a command -#[allow(dead_code)] -pub async fn get_all_command_configurations( - pool: &PgPool, - guild_id: &str, - name: &str, -) -> Result, crate::Error> { - let permutations = permute_command_names(name); - - let mut command_configurations = Vec::new(); - - for permutation in permutations.iter() { - let rec = sqlx::query!( - "SELECT id, guild_id, command, perms, disabled FROM guild_command_configurations WHERE guild_id = $1 AND command = $2", - guild_id, - permutation, - ) - .fetch_optional(pool) - .await?; - - if let Some(rec) = rec { - command_configurations.push(GuildCommandConfiguration { - id: rec.id.hyphenated().to_string(), - guild_id: rec.guild_id, - command: rec.command, - perms: { - if let Some(perms) = rec.perms { - serde_json::from_value(perms)? - } else { - None - } - }, - disabled: rec.disabled, - }); - } - } - - Ok(command_configurations) -} diff --git a/core/rust.silverpelt/src/punishments.rs b/core/rust.silverpelt/src/punishments.rs deleted file mode 100644 index 81e76409..00000000 --- a/core/rust.silverpelt/src/punishments.rs +++ /dev/null @@ -1,256 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serenity::all::{GuildId, UserId}; -use std::str::FromStr; - -/// A punishment -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Punishment { - /// The ID of the applied punishment - pub id: sqlx::types::Uuid, - /// The module name - pub module: String, - /// Src of the sting, this can be useful if a module wants to store the source of the sting - pub src: Option, - /// The guild id of the applied punishment - pub guild_id: GuildId, - /// The punishment string - pub punishment: String, - /// Creator of the punishment - pub creator: PunishmentTarget, - /// The target of the punishment - pub target: PunishmentTarget, - /// The handle log encountered while handling the punishment - pub handle_log: serde_json::Value, - /// When the punishment was created - pub created_at: chrono::DateTime, - /// Duration of the punishment - pub duration: Option, - /// The reason for the punishment - pub reason: String, - /// Is Handled - pub is_handled: bool, - /// Extra misc data - pub data: Option, -} - -impl Punishment { - pub async fn get_expired( - db: impl sqlx::PgExecutor<'_>, - ) -> Result, crate::Error> { - let rec = sqlx::query!( - "SELECT id, module, src, guild_id, punishment, creator, target, is_handled, handle_log, created_at, duration, reason, data FROM punishments WHERE duration IS NOT NULL AND is_handled = false AND (created_at + duration) < NOW()", - ) - .fetch_all(db) - .await?; - - let mut punishments = Vec::new(); - - for row in rec { - punishments.push(Punishment { - id: row.id, - module: row.module, - src: row.src, - guild_id: row.guild_id.parse()?, - punishment: row.punishment, - creator: PunishmentTarget::from_str(&row.creator)?, - target: PunishmentTarget::from_str(&row.target)?, - handle_log: row.handle_log, - created_at: row.created_at, - duration: row.duration.map(|d| { - let secs = splashcore_rs::utils::pg_interval_to_secs(d); - std::time::Duration::from_secs(secs.try_into().unwrap()) - }), - is_handled: row.is_handled, - reason: row.reason, - data: row.data, - }); - } - - Ok(punishments) - } - - /// Dispatch a PunishmentCreate event - pub async fn dispatch_event(self, ctx: serenity::all::Context) -> Result<(), crate::Error> { - crate::ar_event::dispatch_event_to_modules(&crate::ar_event::EventHandlerContext { - guild_id: self.guild_id, - data: ctx.data::(), - event: crate::ar_event::AntiraidEvent::PunishmentCreate(self.into()), - serenity_context: ctx, - }) - .await - .map_err(|e| { - format!("Failed to dispatch event: {}", { - let mut strs = String::new(); - - for err in e { - strs.push_str(&format!("{}\n", err)); - } - - strs - }) - })?; - - Ok(()) - } -} - -/// Data required to create a punishment -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct PunishmentCreate { - /// The module name - pub module: String, - /// Src of the sting, this can be useful if a module wants to store the source of the sting - pub src: Option, - /// The guild id of the applied punishment - pub guild_id: GuildId, - /// The punishment string - pub punishment: String, - /// Creator of the punishment - pub creator: PunishmentTarget, - /// The target of the punishment - pub target: PunishmentTarget, - /// The handle log encountered while handling the punishment - pub handle_log: serde_json::Value, - /// Duration of the punishment - pub duration: Option, - /// The reason for the punishment - pub reason: String, - /// Extra misc data - pub data: Option, -} - -impl PunishmentCreate { - pub fn to_punishment( - self, - id: sqlx::types::Uuid, - created_at: chrono::DateTime, - is_handled: bool, - ) -> Punishment { - Punishment { - id, - created_at, - is_handled, - module: self.module, - src: self.src, - guild_id: self.guild_id, - punishment: self.punishment, - creator: self.creator, - target: self.target, - handle_log: self.handle_log, - duration: self.duration, - reason: self.reason, - data: self.data, - } - } - - /// Creates a new Punishment without dispatching it as an event - pub async fn create_without_dispatch( - self, - db: impl sqlx::PgExecutor<'_>, - ) -> Result { - let ret_data = sqlx::query!( - r#" - INSERT INTO punishments (module, src, guild_id, punishment, creator, target, handle_log, duration, reason, data) - VALUES ($1, $2, $3, $4, $5, $6, $7, make_interval(secs => $8), $9, $10) RETURNING id, created_at, is_handled - "#, - self.module, - self.src, - self.guild_id.to_string(), - self.punishment, - self.creator.to_string(), - self.target.to_string(), - self.handle_log, - self.duration.map(|d| d.as_secs() as f64), - self.reason, - self.data - ) - .fetch_one(db) - .await?; - - Ok(self.to_punishment(ret_data.id, ret_data.created_at, ret_data.is_handled)) - } - - /// Creates a new Punishment and dispatches it as an event in one go - pub async fn create_and_dispatch( - self, - ctx: serenity::all::Context, - db: impl sqlx::PgExecutor<'_>, - ) -> Result<(), crate::Error> { - let punishment = self.create_without_dispatch(db).await?; - - punishment.dispatch_event(ctx).await?; - - Ok(()) - } - - /// Creates a new Punishment and dispatches it as an event in one go - pub async fn create_and_dispatch_returning_id( - self, - ctx: serenity::all::Context, - db: impl sqlx::PgExecutor<'_>, - ) -> Result { - let punishment = self.create_without_dispatch(db).await?; - let sid = punishment.id; - - punishment.dispatch_event(ctx).await?; - - Ok(sid) - } -} - -/// A punishment target (either user or system) -#[derive(Debug, Clone, Copy)] -pub enum PunishmentTarget { - /// The punishment was created by a user - User(UserId), - /// The punishment was created by the system - System, -} - -impl std::fmt::Display for PunishmentTarget { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - PunishmentTarget::User(user_id) => write!(f, "user:{}", user_id), - PunishmentTarget::System => write!(f, "system"), - } - } -} - -impl std::str::FromStr for PunishmentTarget { - type Err = crate::Error; - - fn from_str(s: &str) -> Result { - if s == "system" { - Ok(PunishmentTarget::System) - } else { - let user_id = s - .strip_prefix("user:") - .ok_or_else(|| format!("Invalid sting creator: {}", s))?; - Ok(PunishmentTarget::User( - user_id - .parse() - .map_err(|e| format!("Invalid user ID: {}", e))?, - )) - } - } -} - -// Serde impls for PunishmentTarget -impl Serialize for PunishmentTarget { - fn serialize(&self, serializer: S) -> Result - where - S: serde::ser::Serializer, - { - serializer.serialize_str(&format!("{}", self)) - } -} - -impl<'de> Deserialize<'de> for PunishmentTarget { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - PunishmentTarget::from_str(&s).map_err(serde::de::Error::custom) - } -} diff --git a/core/rust.silverpelt/src/stings.rs b/core/rust.silverpelt/src/stings.rs deleted file mode 100644 index 477cdc00..00000000 --- a/core/rust.silverpelt/src/stings.rs +++ /dev/null @@ -1,516 +0,0 @@ -use serde::{Deserialize, Serialize}; -use std::str::FromStr; - -/// Represents a sting on AntiRaid -/// -/// Previous versions of AntiRaid had each module handle their own stings sharing them via a StingSource trAIT, but this was changed to a centralised system -/// to reduce database calls, reduce boilerplate, reduce data duplication, to make it easier to add new modules, and to make the bot easier to use, -/// understand and manage -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Sting { - /// The sting ID - pub id: sqlx::types::Uuid, - /// The module name - pub module: String, - /// Src of the sting, this can be useful if a module wants to store the source of the sting - pub src: Option, - /// The number of stings - pub stings: i32, - /// The reason for the stings (optional) - pub reason: Option, - /// The reason the stings were voided - pub void_reason: Option, - /// The guild ID the sting targets - pub guild_id: serenity::all::GuildId, - /// The creator of the sting - pub creator: StingTarget, - /// The target of the sting - pub target: StingTarget, - /// The state of the sting - pub state: StingState, - /// When the sting was created - pub created_at: chrono::DateTime, - /// When the sting expires as a chrono duration - pub duration: Option, - /// The data/metadata present within the sting, if any - pub sting_data: Option, - /// Is Handled - pub is_handled: bool, - /// The handle log encountered while handling the sting - pub handle_log: serde_json::Value, -} - -impl Sting { - /// Lists stings for a guild paginated based on page number - pub async fn list( - db: impl sqlx::PgExecutor<'_>, - guild_id: serenity::all::GuildId, - page: usize, - ) -> Result, crate::Error> { - const PAGE_SIZE: i64 = 20; // 20 stings per page - - if page > i64::MAX as usize { - return Err("Page number too large".into()); - } - - let page = std::cmp::max(page, 1) as i64; // Avoid negative pages - - let rec = sqlx::query!( - "SELECT id, module, src, stings, reason, void_reason, guild_id, creator, target, state, sting_data, created_at, duration, is_handled, handle_log FROM stings WHERE guild_id = $1 ORDER BY created_at DESC OFFSET $2 LIMIT $3", - guild_id.to_string(), - (page - 1) * PAGE_SIZE, - PAGE_SIZE, - ) - .fetch_all(db) - .await?; - - let mut stings = Vec::new(); - - for row in rec { - stings.push(Sting { - id: row.id, - module: row.module, - src: row.src, - stings: row.stings, - reason: row.reason, - void_reason: row.void_reason, - guild_id: row.guild_id.parse()?, - creator: StingTarget::from_str(&row.creator)?, - target: StingTarget::from_str(&row.target)?, - state: StingState::from_str(&row.state)?, - sting_data: row.sting_data, - created_at: row.created_at, - duration: row.duration.map(|d| { - let secs = splashcore_rs::utils::pg_interval_to_secs(d); - std::time::Duration::from_secs(secs.try_into().unwrap()) - }), - is_handled: row.is_handled, - handle_log: row.handle_log, - }); - } - - Ok(stings) - } - - pub async fn get_expired(db: impl sqlx::PgExecutor<'_>) -> Result, crate::Error> { - let rec = sqlx::query!( - "SELECT id, module, src, stings, reason, void_reason, guild_id, creator, target, state, sting_data, created_at, duration, is_handled, handle_log FROM stings WHERE duration IS NOT NULL AND is_handled = false AND (created_at + duration) < NOW()", - ) - .fetch_all(db) - .await?; - - let mut stings = Vec::new(); - - for row in rec { - stings.push(Sting { - id: row.id, - module: row.module, - src: row.src, - stings: row.stings, - reason: row.reason, - void_reason: row.void_reason, - guild_id: row.guild_id.parse()?, - creator: StingTarget::from_str(&row.creator)?, - target: StingTarget::from_str(&row.target)?, - state: StingState::from_str(&row.state)?, - sting_data: row.sting_data, - created_at: row.created_at, - duration: row.duration.map(|d| { - let secs = splashcore_rs::utils::pg_interval_to_secs(d); - std::time::Duration::from_secs(secs.try_into().unwrap()) - }), - is_handled: row.is_handled, - handle_log: row.handle_log, - }); - } - - Ok(stings) - } - - /// Dispatch a StingCreate event - pub async fn dispatch_create_event( - self, - ctx: serenity::all::Context, - ) -> Result<(), crate::Error> { - crate::ar_event::dispatch_event_to_modules(&crate::ar_event::EventHandlerContext { - guild_id: self.guild_id, - data: ctx.data::(), - event: crate::ar_event::AntiraidEvent::StingCreate(self.into()), - serenity_context: ctx, - }) - .await - .map_err(|e| { - format!("Failed to dispatch event: {}", { - let mut strs = String::new(); - - for err in e { - strs.push_str(&format!("{}\n", err)); - } - - strs - }) - })?; - - Ok(()) - } - - /// Dispatch a StingDelete event - pub async fn dispatch_delete_event( - self, - ctx: serenity::all::Context, - ) -> Result<(), crate::Error> { - crate::ar_event::dispatch_event_to_modules(&crate::ar_event::EventHandlerContext { - guild_id: self.guild_id, - data: ctx.data::(), - event: crate::ar_event::AntiraidEvent::StingDelete(self.into()), - serenity_context: ctx, - }) - .await - .map_err(|e| { - format!("Failed to dispatch event: {}", { - let mut strs = String::new(); - - for err in e { - strs.push_str(&format!("{}\n", err)); - } - - strs - }) - })?; - - Ok(()) - } - - /// Deletes a sting by ID - pub async fn delete_by_id( - db: impl sqlx::PgExecutor<'_>, - guild_id: serenity::all::GuildId, - id: sqlx::types::Uuid, - ) -> Result<(), crate::Error> { - sqlx::query!( - "DELETE FROM stings WHERE id = $1 AND guild_id = $2", - id, - guild_id.to_string(), - ) - .execute(db) - .await?; - - Ok(()) - } -} - -/// Data required to create a sting -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct StingCreate { - /// The module name - pub module: String, - /// Src of the sting, this can be useful if a module wants to store the source of the sting - pub src: Option, - /// The number of stings - pub stings: i32, - /// The reason for the stings (optional) - pub reason: Option, - /// The reason the stings were voided - pub void_reason: Option, - /// The guild ID the sting targets - pub guild_id: serenity::all::GuildId, - /// The creator of the sting - pub creator: StingTarget, - /// The target of the sting - pub target: StingTarget, - /// The state of the sting - pub state: StingState, - /// When the sting expires as a chrono duration - pub duration: Option, - /// The data/metadata present within the sting, if any - pub sting_data: Option, -} - -impl StingCreate { - pub fn to_sting( - self, - id: sqlx::types::Uuid, - created_at: chrono::DateTime, - ) -> Sting { - Sting { - id, - module: self.module, - src: self.src, - stings: self.stings, - reason: self.reason, - void_reason: self.void_reason, - guild_id: self.guild_id, - creator: self.creator, - target: self.target, - state: self.state, - created_at, - duration: self.duration, - sting_data: self.sting_data, - is_handled: false, - handle_log: serde_json::Value::Null, - } - } - - /// Creates a new Sting without dispatching it as an event - pub async fn create_without_dispatch( - self, - db: impl sqlx::PgExecutor<'_>, - ) -> Result { - let ret_data = sqlx::query!( - r#" - INSERT INTO stings (module, src, stings, reason, void_reason, guild_id, target, creator, state, duration, sting_data) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, make_interval(secs => $10), $11) RETURNING id, created_at - "#, - self.module, - self.src, - self.stings, - self.reason, - self.void_reason, - self.guild_id.to_string(), - self.target.to_string(), - self.creator.to_string(), - self.state.to_string(), - self.duration.map(|d| d.as_secs() as f64), - self.sting_data, - ) - .fetch_one(db) - .await?; - - Ok(self.to_sting(ret_data.id, ret_data.created_at)) - } - - /// Creates a new Sting and dispatches it as an event in one go - pub async fn create_and_dispatch( - self, - ctx: serenity::all::Context, - db: impl sqlx::PgExecutor<'_>, - ) -> Result<(), crate::Error> { - let sting = self.create_without_dispatch(db).await?; - - sting.dispatch_create_event(ctx).await?; - - Ok(()) - } - - /// Creates a new Sting and dispatches it as an event in one go - pub async fn create_and_dispatch_returning_id( - self, - ctx: serenity::all::Context, - db: impl sqlx::PgExecutor<'_>, - ) -> Result { - let sting = self.create_without_dispatch(db).await?; - let sid = sting.id; - - sting.dispatch_create_event(ctx).await?; - - Ok(sid) - } -} - -/// A sting target (either user or system) -#[derive(Debug, Clone, Copy)] -pub enum StingTarget { - /// The sting was created by a user - User(serenity::all::UserId), - /// The sting was created by the system - System, -} - -impl std::fmt::Display for StingTarget { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - StingTarget::User(user_id) => write!(f, "user:{}", user_id), - StingTarget::System => write!(f, "system"), - } - } -} - -impl std::str::FromStr for StingTarget { - type Err = crate::Error; - - fn from_str(s: &str) -> Result { - if s == "system" { - Ok(StingTarget::System) - } else { - let user_id = s - .strip_prefix("user:") - .ok_or_else(|| format!("Invalid sting creator: {}", s))?; - Ok(StingTarget::User( - user_id - .parse() - .map_err(|e| format!("Invalid user ID: {}", e))?, - )) - } - } -} - -// Serde impls for StingTarget -impl Serialize for StingTarget { - fn serialize(&self, serializer: S) -> Result - where - S: serde::ser::Serializer, - { - serializer.serialize_str(&format!("{}", self)) - } -} - -impl<'de> Deserialize<'de> for StingTarget { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - StingTarget::from_str(&s).map_err(serde::de::Error::custom) - } -} - -#[derive(Hash, Default, Debug, Clone, Copy, PartialEq)] -pub enum StingState { - #[default] - Active, - Voided, - Handled, -} - -impl std::fmt::Display for StingState { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - StingState::Active => write!(f, "active"), - StingState::Voided => write!(f, "voided"), - StingState::Handled => write!(f, "handled"), - } - } -} - -impl std::str::FromStr for StingState { - type Err = crate::Error; - - fn from_str(s: &str) -> Result { - match s { - "active" => Ok(StingState::Active), - "voided" => Ok(StingState::Voided), - "handled" => Ok(StingState::Handled), - _ => Err(format!("Invalid sting state: {}", s).into()), - } - } -} - -// Serde impls for StingState -impl Serialize for StingState { - fn serialize(&self, serializer: S) -> Result - where - S: serde::ser::Serializer, - { - serializer.serialize_str(&format!("{}", self)) - } -} - -impl<'de> Deserialize<'de> for StingState { - fn deserialize(deserializer: D) -> Result - where - D: serde::de::Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - StingState::from_str(&s).map_err(serde::de::Error::custom) - } -} - -pub struct StingAggregate { - /// The module name - pub module: String, - /// Src of the sting, this can be useful if a module wants to store the source of the sting - pub src: Option, - /// The target of the sting - pub target: StingTarget, - /// The total number of stings matching this aggregate - pub total_stings: i64, -} - -impl StingAggregate { - /// Returns the sum of all total stings in the aggregate - pub fn total_stings(vec: Vec) -> i64 { - vec.iter().map(|x| x.total_stings).sum() - } - - /// Returns the total stings per-user - /// - /// Returns (user_id_map, system_stings) - pub fn total_stings_per_user( - vec: Vec, - ) -> (std::collections::HashMap, i64) { - let mut map = std::collections::HashMap::new(); - - let mut system_stings = 0; - - for sting in vec { - match sting.target { - StingTarget::System => { - system_stings += sting.total_stings; - } - StingTarget::User(user_id) => { - *map.entry(user_id).or_insert(0) += sting.total_stings; - } - } - } - - // Add system stings to each user - for (_, total_stings) in map.iter_mut() { - *total_stings += system_stings; - } - - (map, system_stings) - } -} - -/// Returns total stings the user has -pub async fn get_aggregate_stings_for_guild_user( - db: impl sqlx::PgExecutor<'_>, - guild_id: serenity::all::GuildId, - target: serenity::all::UserId, -) -> Result, crate::Error> { - let rec = sqlx::query!( - "SELECT COUNT(*) AS total_stings, module, src, target FROM stings WHERE guild_id = $1 AND (target = $2 OR target = 'system') GROUP BY module, src, target", - guild_id.to_string(), - StingTarget::User(target).to_string(), - ) - .fetch_all(db) - .await?; - - let mut stings = Vec::new(); - - for row in rec { - stings.push(StingAggregate { - module: row.module, - src: row.src, - target: StingTarget::from_str(&row.target)?, - total_stings: row.total_stings.unwrap_or_default(), - }); - } - - Ok(stings) -} - -pub async fn get_aggregate_stings_for_guild( - db: impl sqlx::PgExecutor<'_>, - guild_id: serenity::all::GuildId, -) -> Result, crate::Error> { - let rec = sqlx::query!( - "SELECT SUM(stings) AS total_stings, module, src, target FROM stings WHERE guild_id = $1 GROUP BY module, src, target", - guild_id.to_string(), - ) - .fetch_all(db) - .await?; - - let mut stings = Vec::new(); - - for row in rec { - stings.push(StingAggregate { - module: row.module, - src: row.src, - target: StingTarget::from_str(&row.target)?, - total_stings: row.total_stings.unwrap_or_default(), - }); - } - - Ok(stings) -} diff --git a/core/rust.silverpelt/src/types.rs b/core/rust.silverpelt/src/types.rs deleted file mode 100644 index 00f1c953..00000000 --- a/core/rust.silverpelt/src/types.rs +++ /dev/null @@ -1,188 +0,0 @@ -use indexmap::{indexmap, IndexMap}; -use permissions::types::PermissionCheck; - -pub type CommandExtendedDataMap = IndexMap<&'static str, CommandExtendedData>; - -// @ci go=CommandExtendedData -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct CommandExtendedData { - /// The default permissions needed to run this command - pub default_perms: PermissionCheck, - /// Whether the command is enabled by default or not - pub is_default_enabled: bool, - /// Whether the command should be hidden on the website or not - pub web_hidden: bool, - /// Whether the command is a virtual command or not (virtual commands are not loaded into the bot, but can be used for permission checks etc) - pub virtual_command: bool, -} - -impl Default for CommandExtendedData { - fn default() -> Self { - Self { - default_perms: PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![], - inner_and: false, - }, - is_default_enabled: true, - web_hidden: false, - virtual_command: false, - } - } -} - -impl CommandExtendedData { - pub fn none() -> Self { - CommandExtendedData { - default_perms: PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![], - inner_and: false, - }, - is_default_enabled: true, - web_hidden: false, - virtual_command: false, - } - } - - pub fn none_map() -> CommandExtendedDataMap { - indexmap! { - "" => CommandExtendedData { - default_perms: PermissionCheck { - kittycat_perms: vec![], - native_perms: vec![], - inner_and: false, - }, - is_default_enabled: true, - web_hidden: false, - virtual_command: false, - }, - } - } - - pub fn kittycat_simple(namespace: &str, permission: &str) -> CommandExtendedData { - CommandExtendedData { - default_perms: PermissionCheck { - kittycat_perms: vec![format!("{}.{}", namespace, permission)], - native_perms: vec![], - inner_and: false, - }, - is_default_enabled: true, - web_hidden: false, - virtual_command: false, - } - } - - pub fn kittycat_or_admin(namespace: &str, permission: &str) -> CommandExtendedData { - CommandExtendedData { - default_perms: PermissionCheck { - kittycat_perms: vec![format!("{}.{}", namespace, permission)], - native_perms: vec![serenity::all::Permissions::ADMINISTRATOR], - inner_and: false, - }, - is_default_enabled: true, - web_hidden: false, - virtual_command: false, - } - } -} - -/// Guild command configuration data -#[derive(Clone, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct GuildCommandConfiguration { - /// The ID - pub id: String, - /// The guild id (from db) - pub guild_id: String, - /// The command name - pub command: String, - /// The permission checks on the command, if unset, will revert to the default perms set on the command itself - pub perms: Option, - /// Whether or not the command is disabled. None means to use the default command configuration - pub disabled: Option, -} - -impl GuildCommandConfiguration { - pub async fn to_full_guild_command_configuration( - self, - pool: &sqlx::PgPool, - ) -> Result { - let id = self.id.parse::()?; - let audit_info = sqlx::query!( - r#" - SELECT created_at, created_by, last_updated_at, last_updated_by - FROM guild_command_configurations - WHERE id = $1 - "#, - id - ) - .fetch_one(pool) - .await?; - - Ok(FullGuildCommandConfiguration { - id: self.id, - guild_id: self.guild_id, - command: self.command, - perms: self.perms, - disabled: self.disabled, - created_at: audit_info.created_at, - created_by: audit_info.created_by, - last_updated_at: audit_info.last_updated_at, - last_updated_by: audit_info.last_updated_by, - }) - } -} - -/// Full guild command configuration data including audit info etc. -#[derive(Clone, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct FullGuildCommandConfiguration { - /// The ID - pub id: String, - /// The guild id (from db) - pub guild_id: String, - /// The command name - pub command: String, - /// The permission checks on the command, if unset, will revert to the default perms set on the command itself - pub perms: Option, - /// Whether or not the command is disabled. None means to use the default command configuration - pub disabled: Option, - /// The time the command configuration was created - pub created_at: chrono::DateTime, - /// The user who created the command configuration - pub created_by: String, - /// The time the command configuration was last updated - pub last_updated_at: chrono::DateTime, - /// The user who last updated the command configuration - pub last_updated_by: String, -} - -impl FullGuildCommandConfiguration { - fn to_guild_command_configuration(&self) -> GuildCommandConfiguration { - GuildCommandConfiguration { - id: self.id.clone(), - guild_id: self.guild_id.clone(), - command: self.command.clone(), - perms: self.perms.clone(), - disabled: self.disabled, - } - } -} - -impl From for GuildCommandConfiguration { - fn from(f: FullGuildCommandConfiguration) -> Self { - f.to_guild_command_configuration() - } -} - -/// Guild module configuration data -#[derive(Clone, Hash, Eq, PartialEq, serde::Serialize, serde::Deserialize, Debug)] -pub struct GuildModuleConfiguration { - /// The ID - pub id: String, - /// The guild id (from db) - pub guild_id: String, - /// The module id - pub module: String, - /// Whether ot not the module is disabled or not. None means to use the default module configuration - pub disabled: Option, -} diff --git a/core/rust.silverpelt/src/utils.rs b/core/rust.silverpelt/src/utils.rs deleted file mode 100644 index 9b381ad8..00000000 --- a/core/rust.silverpelt/src/utils.rs +++ /dev/null @@ -1,47 +0,0 @@ -/// From name_split, construct a list of all permutations of the command name from the root till the end -/// -/// E.g: If subcommand is `limits hit`, then `limits` and `limits hit` will be constructed -/// as the list of commands to check -/// E.g 2: If subcommand is `limits hit add`, then `limits`, `limits hit` and `limits hit add` -/// will be constructed as the list of commands to check -pub fn permute_command_names(name: &str) -> Vec { - // Check if subcommand by splitting the command name - let name_split = name.split(' ').collect::>(); - - let mut commands_to_check = Vec::new(); - - for i in 0..name_split.len() { - let mut command = String::new(); - - for (j, cmd) in name_split.iter().enumerate().take(i + 1) { - command += cmd; - - if j != i { - command += " "; - } - } - - commands_to_check.push(command); - } - - commands_to_check -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_permute_command_names() { - assert_eq!(permute_command_names(""), vec![""]); - assert_eq!(permute_command_names("limits"), vec!["limits"]); - assert_eq!( - permute_command_names("limits hit"), - vec!["limits", "limits hit"] - ); - assert_eq!( - permute_command_names("limits hit add"), - vec!["limits", "limits hit", "limits hit add"] - ); - } -} diff --git a/core/rust.std/Cargo.lock b/core/rust.std/Cargo.lock deleted file mode 100644 index c4887aa5..00000000 --- a/core/rust.std/Cargo.lock +++ /dev/null @@ -1,3031 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -dependencies = [ - "serde", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "atoi" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" -dependencies = [ - "num-traits", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bool_to_bitflags" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36fc6ed2e593856869a03f5390020adfd8fc64187dc2d17763bbe041fe59b9d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "botox" -version = "0.1.0" -source = "git+https://github.com/infinitybotlist/botox?branch=main#ebc5dea74571d858f0b097df1a4e5f6a23c63cd1" -dependencies = [ - "futures", - "futures-util", - "indexmap", - "log", - "poise", - "rand", - "serenity", - "tokio", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "bytecount" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc32fast" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.62", -] - -[[package]] -name = "darling_macro" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", - "serde", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "either" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" -dependencies = [ - "serde", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if", - "home", - "windows-sys 0.48.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "extract_map" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf7509ab567289c5422ef33dd4982673b8a32d373c2abb6e7fce8ef8b2dc968" -dependencies = [ - "gat-lending-iterator", - "serde", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - -[[package]] -name = "flate2" -version = "1.0.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "spin 0.9.8", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gat-lending-iterator" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42327bb9f2aad5b6400dea3e3aea3a4959529387186d3dc27c08d401c808fda9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "hyper" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin 0.5.2", -] - -[[package]] -name = "libc" -version = "0.2.154" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsqlite3-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -dependencies = [ - "serde", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "poise" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "async-trait", - "derivative", - "futures-util", - "parking_lot", - "poise_macros", - "regex", - "serenity", - "tokio", - "tracing", - "trim-in-place", -] - -[[package]] -name = "poise_macros" -version = "0.6.1" -source = "git+https://github.com/serenity-rs/poise?branch=serenity-next#47a26bdee706d47ed3bda076abea1de4a0ec568f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pulldown-cmark" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" -dependencies = [ - "bitflags 2.5.0", - "memchr", - "unicase", -] - -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.22.4", - "rustls-native-certs", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.1", - "winreg", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "ring", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.1.2", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" -dependencies = [ - "base64 0.22.1", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092474d1a01ea8278f69e6a358998405fae5b8b963ddaeb2b0b04a128bf1dfb0" - -[[package]] -name = "rusty-s3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa883f1b986a5249641e574ca0e11ac4fb9970b009c6fbb96fedaf4fa78db8" -dependencies = [ - "base64 0.21.7", - "hmac", - "md-5", - "percent-encoding", - "quick-xml", - "serde", - "serde_json", - "sha2", - "time", - "url", - "zeroize", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "serde", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_cow" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e84ce5596a72f0c4c60759a10ff8c22d5eaf227b0dc2789c8746193309058b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.201" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serenity" -version = "0.12.1" -source = "git+https://github.com/Anti-Raid/serenity?branch=next#7e5cb4f708aa15d2a45b35f4457908aeb7a52d16" -dependencies = [ - "arrayvec", - "async-trait", - "base64 0.21.7", - "bitflags 2.5.0", - "bool_to_bitflags", - "bytes", - "chrono", - "dashmap", - "extract_map", - "flate2", - "futures", - "fxhash", - "mime_guess", - "nonmax", - "parking_lot", - "percent-encoding", - "reqwest", - "secrecy", - "serde", - "serde_cow", - "serde_json", - "small-fixed-array", - "strum", - "time", - "to-arraystring", - "tokio", - "tokio-tungstenite", - "tracing", - "typesize", - "url", - "zeroize", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "small-fixed-array" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf299da651fa534b1e98b852113b3e5d591ef3fa0c6ecdc3fa5224814c06037" -dependencies = [ - "serde", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "splashcore_rs" -version = "0.1.0" -dependencies = [ - "botox", - "chrono", - "dashmap", - "futures", - "indexmap", - "log", - "once_cell", - "poise", - "rand", - "reqwest", - "rusty-s3", - "serde", - "serde_json", - "serenity", - "sqlx", - "tokio", -] - -[[package]] -name = "sqlformat" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" -dependencies = [ - "sqlx-core", - "sqlx-macros", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", -] - -[[package]] -name = "sqlx-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" -dependencies = [ - "ahash", - "atoi", - "byteorder", - "bytes", - "chrono", - "crc", - "crossbeam-queue", - "either", - "event-listener", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-io", - "futures-util", - "hashlink", - "hex", - "indexmap", - "log", - "memchr", - "once_cell", - "paste", - "percent-encoding", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlformat", - "thiserror", - "tokio", - "tokio-stream", - "tracing", - "url", - "uuid", - "webpki-roots 0.25.4", -] - -[[package]] -name = "sqlx-macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" -dependencies = [ - "proc-macro2", - "quote", - "sqlx-core", - "sqlx-macros-core", - "syn 1.0.109", -] - -[[package]] -name = "sqlx-macros-core" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" -dependencies = [ - "dotenvy", - "either", - "heck", - "hex", - "once_cell", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2", - "sqlx-core", - "sqlx-mysql", - "sqlx-postgres", - "sqlx-sqlite", - "syn 1.0.109", - "tempfile", - "tokio", - "url", -] - -[[package]] -name = "sqlx-mysql" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "bytes", - "chrono", - "crc", - "digest", - "dotenvy", - "either", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "percent-encoding", - "rand", - "rsa", - "serde", - "sha1", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-postgres" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" -dependencies = [ - "atoi", - "base64 0.21.7", - "bitflags 2.5.0", - "byteorder", - "chrono", - "crc", - "dotenvy", - "etcetera", - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "hex", - "hkdf", - "hmac", - "home", - "itoa", - "log", - "md-5", - "memchr", - "once_cell", - "rand", - "serde", - "serde_json", - "sha2", - "smallvec", - "sqlx-core", - "stringprep", - "thiserror", - "tracing", - "uuid", - "whoami", -] - -[[package]] -name = "sqlx-sqlite" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" -dependencies = [ - "atoi", - "chrono", - "flume", - "futures-channel", - "futures-core", - "futures-executor", - "futures-intrusive", - "futures-util", - "libsqlite3-sys", - "log", - "percent-encoding", - "serde", - "sqlx-core", - "tracing", - "url", - "urlencoding", - "uuid", -] - -[[package]] -name = "stringprep" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" -dependencies = [ - "finl_unicode", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.62", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f660c3bfcefb88c538776b6685a0c472e3128b51e74d48793dc2a488196e8eb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "tagptr" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "thiserror" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "to-arraystring" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340b46242bcb0b5c24768ca5901c51f0b3439ed88d04e8870f83826b960760b4" -dependencies = [ - "arrayvec", - "itoa", - "ryu", -] - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" -dependencies = [ - "futures-util", - "log", - "rustls 0.22.4", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.26.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls 0.22.4", - "rustls-pki-types", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "typesize" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb704842c709bc76f63e99e704cb208beeccca2abbabd0d9aec02e48ca1cee0f" -dependencies = [ - "chrono", - "dashmap", - "extract_map", - "hashbrown", - "mini-moka", - "nonmax", - "parking_lot", - "secrecy", - "serde_json", - "time", - "typesize-derive", - "url", -] - -[[package]] -name = "typesize-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "uuid" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "wasm-streams" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "webpki-roots" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", -] - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "zerocopy" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.62", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/core/rust.std/Cargo.toml b/core/rust.std/Cargo.toml deleted file mode 100644 index dd96220f..00000000 --- a/core/rust.std/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "splashcore_rs" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -poise = { git = "https://github.com/Anti-Raid/poise", branch = "serenity-next" } -chrono = { version = "0.4", features = ["serde"]} -indexmap = { version = "2", features = ["serde"] } -serde_json = "1.0" -serde = { version = "1.0", features = ["derive"] } -sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "postgres", "chrono", "uuid", "json"] } -rusty-s3 = "0.5" -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "rustls-tls-native-roots"] } -extract_map = { version = "0.1.0", features = ["serde", "iter_mut"] } -log = "0.4" - -[dependencies.serenity] -git = "https://github.com/Anti-Raid/serenity" -branch = "next" -features = ["model", "http", "cache", "rustls_backend", "unstable"] diff --git a/core/rust.std/src/lib.rs b/core/rust.std/src/lib.rs deleted file mode 100644 index e561aa6e..00000000 --- a/core/rust.std/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod objectstore; -pub mod priorityset; -pub mod serenity_backport; -pub mod utils; -pub mod value; - -pub type Error = Box; diff --git a/core/rust.std/src/objectstore.rs b/core/rust.std/src/objectstore.rs deleted file mode 100644 index b9a13710..00000000 --- a/core/rust.std/src/objectstore.rs +++ /dev/null @@ -1,374 +0,0 @@ -use rusty_s3::S3Action; - -const CHUNK_SIZE: usize = 5 * 1024 * 1024; -const MULTIPART_MIN_SIZE: usize = 50 * 1024 * 1024; -const MULTIPART_SIGN_DURATION: std::time::Duration = std::time::Duration::from_secs(30); -const PUT_OBJECT_TIME: std::time::Duration = std::time::Duration::from_secs(30); - -/// Simple abstraction around object storages -pub enum ObjectStore { - S3 { - credentials: rusty_s3::Credentials, - bucket: rusty_s3::Bucket, - }, - Local { - prefix: String, - }, -} - -pub struct ListObjectsResponse { - pub key: String, - pub last_modified: chrono::DateTime, -} - -impl ObjectStore { - /// Note that duration is only supported for S3 - /// - /// On S3, this returns a presigned URL, on local, it returns a file:// url - pub fn get_url(&self, key: &str, duration: std::time::Duration) -> String { - match self { - ObjectStore::S3 { - credentials, - bucket, - } => { - let action = bucket.get_object(Some(credentials), key); - let url = action.sign(duration); - url.to_string() - } - ObjectStore::Local { prefix } => { - format!("file://{}/{}", prefix, key) - } - } - } - - /// Lists all files in the object store with a given prefix - pub async fn list_files( - &self, - client: &reqwest::Client, - key: Option<&str>, - ) -> Result, crate::Error> { - match self { - ObjectStore::S3 { - credentials, - bucket, - } => { - let mut continuation_token = None; - let mut resp = vec![]; - - loop { - let mut action = bucket.list_objects_v2(Some(credentials)); - - if let Some(key) = key { - action.with_prefix(key); - } - - if let Some(continuation_token) = &continuation_token { - action.with_continuation_token(continuation_token); - } - - let url = action.sign(std::time::Duration::from_secs(30)); - let response = client - .get(url) - .send() - .await - .map_err(|e| format!("Failed to list objects: {}", e))?; - - if !response.status().is_success() { - let text = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - return Err(format!("Failed to list objects: {}", text).into()); - } - - let body = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - - let list = rusty_s3::actions::ListObjectsV2::parse_response(&body)?; - - for object in list.contents { - resp.push(ListObjectsResponse { - key: object.key, - last_modified: object.last_modified.parse()?, - }); - } - - if list.next_continuation_token.is_none() { - break; - } - - continuation_token = list.next_continuation_token; - } - - Ok(resp) - } - ObjectStore::Local { prefix } => { - let mut path = std::path::Path::new(prefix).to_path_buf(); - - if let Some(key) = key { - path = path.join(key); - } - - let mut files = vec![]; - for entry in std::fs::read_dir(path) - .map_err(|e| format!("Failed to read directory: {}", e))? - { - let entry = entry.map_err(|e| format!("Failed to read entry: {}", e))?; - let path = entry.path(); - if path.is_file() { - files.push(ListObjectsResponse { - key: path - .file_name() - .ok_or("Failed to get file name")? - .to_string_lossy() - .to_string(), - last_modified: entry - .metadata() - .map_err(|e| format!("Failed to get metadata: {}", e))? - .modified() - .map_err(|e| format!("Failed to get modified time: {}", e))? - .into(), - }); - } - } - - Ok(files) - } - } - } - - /// Uploads a file to the object store with a given key - pub async fn upload_file( - &self, - client: &reqwest::Client, - key: &str, - data: &[u8], - ) -> Result<(), crate::Error> { - match self { - ObjectStore::S3 { - credentials, - bucket, - } => { - if data.len() > MULTIPART_MIN_SIZE { - let action = bucket.create_multipart_upload(Some(credentials), key); - let url = action.sign(MULTIPART_SIGN_DURATION); - let response = client - .post(url) - .send() - .await - .map_err(|e| format!("Failed to create object: {}", e))?; - - if !response.status().is_success() { - let text = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - return Err(format!("Failed to create object: {}", text).into()); - } - - let body = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - - let multipart = - rusty_s3::actions::CreateMultipartUpload::parse_response(&body)?; - - // Upload parts - let mut error: Option = None; - let mut parts = vec![]; - loop { - let action = - bucket.upload_part(Some(credentials), key, 1, multipart.upload_id()); - let url = action.sign(MULTIPART_SIGN_DURATION); - - // Split into 5 mb parts - let range = std::ops::Range { - start: parts.len() * CHUNK_SIZE, - end: std::cmp::min(data.len(), (parts.len() + 1) * CHUNK_SIZE), - }; - - let send_data = &data[range.start..range.end]; - - let etag = { - let response = match client - .put(url) - .body(send_data.to_vec()) - .send() - .await - .map_err(|e| format!("Failed to create object: {}", e)) - { - Ok(response) => response, - Err(e) => { - error = Some(e.into()); - break; - } - }; - - if !response.status().is_success() { - let text = match response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e)) - { - Ok(text) => text, - Err(e) => { - error = Some(e.into()); - break; - } - }; - - error = Some(format!("Failed to create object: {}", text).into()); - break; - } - - let etag_header = - match response.headers().get("ETag").ok_or("Missing ETag header") { - Ok(etag) => etag, - Err(e) => { - error = Some(e.into()); - break; - } - }; - - let etag_str = match etag_header.to_str() { - Ok(etag_str) => etag_str, - Err(e) => { - error = Some(e.into()); - break; - } - }; - - etag_str.to_string() - }; - - parts.push(etag); - - if range.end == data.len() { - break; - } - } - - if let Some(error) = error { - // Abort upload on error - let action = bucket.abort_multipart_upload( - Some(credentials), - key, - multipart.upload_id(), - ); - - let url = action.sign(std::time::Duration::from_secs(30)); - - client - .delete(url) - .send() - .await - .map_err(|e| format!("Failed to abort upload: {}", e))?; - - return Err(error); - } - - // Complete upload - let mut parts_str: Vec<&str> = vec![]; - - for part in &parts { - parts_str.push(part) - } - - let action = bucket.complete_multipart_upload( - Some(credentials), - key, - multipart.upload_id(), - parts_str.into_iter(), - ); - - let url = action.sign(MULTIPART_SIGN_DURATION); - - let response = client - .post(url) - .body(action.body()) - .send() - .await - .map_err(|e| format!("Failed to complete upload: {}", e))?; - - if !response.status().is_success() { - let text = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - return Err(format!("Failed to complete upload: {}", text).into()); - } - - Ok(()) - } else { - let action = bucket.put_object(Some(credentials), key); - let url = action.sign(PUT_OBJECT_TIME); - let response = client - .put(url) - .body(data.to_vec()) - .send() - .await - .map_err(|e| format!("Failed to create object: {}", e))?; - - if !response.status().is_success() { - let text = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - return Err(format!("Failed to create object: {}", text).into()); - } - - Ok(()) - } - } - ObjectStore::Local { prefix } => { - let path = std::path::Path::new(prefix).join(key); - std::fs::create_dir_all(path.parent().unwrap()) - .map_err(|e| format!("Failed to create directory: {}", e))?; - std::fs::write(path, data).map_err(|e| format!("Failed to write object: {}", e))?; - - Ok(()) - } - } - } - - pub async fn delete(&self, client: &reqwest::Client, key: &str) -> Result<(), crate::Error> { - match self { - ObjectStore::S3 { - credentials, - bucket, - } => { - let mut action = bucket.delete_object(Some(credentials), key); - action - .query_mut() - .insert("response-cache-control", "no-cache, no-store"); - - let url = action.sign(std::time::Duration::from_secs(30)); - let response = client - .delete(url) - .send() - .await - .map_err(|e| format!("Failed to delete object: {}", e))?; - - if !response.status().is_success() { - let text = response - .text() - .await - .map_err(|e| format!("Failed to read response: {}", e))?; - return Err(format!("Failed to delete object: {}", text).into()); - } - - Ok(()) - } - ObjectStore::Local { prefix } => { - let path = std::path::Path::new(prefix).join(key); - std::fs::remove_file(path) - .map_err(|e| format!("Failed to delete object: {}", e))?; - - Ok(()) - } - } - } -} diff --git a/core/rust.std/src/priorityset.rs b/core/rust.std/src/priorityset.rs deleted file mode 100644 index 25a8c136..00000000 --- a/core/rust.std/src/priorityset.rs +++ /dev/null @@ -1,100 +0,0 @@ -/// Priority sets -/// -/// PrioritySet can add elements with its priority with all priorities being saved. -/// When removing an element, the elements prior priority will be set. -use std::collections::{HashMap, VecDeque}; - -#[derive(Default)] -pub struct PrioritySet { - elements: HashMap>, -} - -/// Adds an element with a priority -/// -/// If the element already exists, the priority will be added to the list of priorities. -/// If the element does not exist, a new list of priorities will be created. -impl PrioritySet { - pub fn add(&mut self, element: T, priority: usize) { - if let Some(priorities) = self.elements.get_mut(&element) { - priorities.push_back(priority); - } else { - let mut priorities = VecDeque::new(); - priorities.push_back(priority); - self.elements.insert(element, priorities); - } - } - - /// Removes an element with a priority with priorities removed from back to front - pub fn remove(&mut self, element: T, priority: usize) { - if let Some(priorities) = self.elements.get_mut(&element) { - let mut removed = false; - let mut new_priorities = VecDeque::new(); - - while let Some(p) = priorities.pop_back() { - if p == priority && !removed { - // We've removed an element, so we need to skip this priority - removed = true; - } else { - // Reinstate the priority in new_priorities - new_priorities.push_back(p); - } - } - - // If the element has no more priorities, remove it - // Otherwise, update the element with the new priorities - if new_priorities.is_empty() { - self.elements.remove(&element); - } else { - self.elements.insert(element, new_priorities); - } - } - } - - /// Finds the highest priority of an element - /// Returns None if the element does not exist - pub fn highest_priority(&self, element: &T) -> Option { - if let Some(priorities) = self.elements.get(element) { - priorities.iter().rev().max().cloned() - } else { - None - } - } - - /// Finds the lowest priority of an element - /// Returns None if the element does not exist - pub fn lowest_priority(&self, element: &T) -> Option { - if let Some(priorities) = self.elements.get(element) { - priorities.iter().min().cloned() - } else { - None - } - } - - /// Checks if an element exists - /// Returns true if the element exists - pub fn exists(&self, element: &T) -> bool { - self.elements.contains_key(element) - } - - /// Iterates over the elements and their highest priorities - pub fn iter(&self) -> PrioritySetIter { - PrioritySetIter { - iter: self.elements.iter(), - } - } -} - -/// Iterates over the elements and their highest priorities -pub struct PrioritySetIter<'a, T: std::hash::Hash + Clone + PartialEq + Eq> { - iter: std::collections::hash_map::Iter<'a, T, VecDeque>, -} - -impl<'a, T: std::hash::Hash + Clone + PartialEq + Eq> Iterator for PrioritySetIter<'a, T> { - type Item = (&'a T, usize); - - fn next(&mut self) -> Option { - self.iter - .next() - .map(|(k, v)| (k, *v.iter().rev().max().unwrap())) - } -} diff --git a/core/rust.std/src/serenity_backport.rs b/core/rust.std/src/serenity_backport.rs deleted file mode 100644 index 9c0e0137..00000000 --- a/core/rust.std/src/serenity_backport.rs +++ /dev/null @@ -1,79 +0,0 @@ -//use extract_map::ExtractMap; -use extract_map::ExtractMap; -use log::{error, warn}; -use serenity::all::{GuildId, Member, PartialGuild, Permissions, Role, RoleId, UserId}; - -pub fn member_permissions(guild: &PartialGuild, member: &Member) -> Permissions { - user_permissions( - member.user.id, - &member.roles, - guild.id, - &guild.roles, - guild.owner_id, - ) -} - -/// Helper function that can also be used from [`PartialGuild`]. -/// Backported from https://github.com/serenity-rs/serenity/blob/efb5820cd5dd3325dff767bb2f96d380715dce30/src/model/guild/mod.rs -pub fn user_permissions( - member_user_id: UserId, - member_roles: &[RoleId], - guild_id: GuildId, - guild_roles: &ExtractMap, - guild_owner_id: UserId, -) -> Permissions { - calculate_permissions(CalculatePermissions { - is_guild_owner: member_user_id == guild_owner_id, - everyone_permissions: if let Some(role) = guild_roles.get(&RoleId::new(guild_id.get())) { - role.permissions - } else { - error!("@everyone role missing in {}", guild_id); - Permissions::empty() - }, - user_roles_permissions: member_roles - .iter() - .map(|role_id| { - if let Some(role) = guild_roles.get(role_id) { - role.permissions - } else { - warn!( - "{} on {} has non-existent role {:?}", - member_user_id, guild_id, role_id - ); - Permissions::empty() - } - }) - .collect(), - }) -} - -struct CalculatePermissions { - /// Whether the guild member is the guild owner - pub is_guild_owner: bool, - /// Base permissions given to @everyone (guild level) - pub everyone_permissions: Permissions, - /// Permissions allowed to a user by their roles (guild level) - pub user_roles_permissions: Vec, -} - -/// Translated from the pseudo code at https://discord.com/developers/docs/topics/permissions#permission-overwrites -/// -/// The comments within this file refer to the above link -fn calculate_permissions(data: CalculatePermissions) -> Permissions { - if data.is_guild_owner { - return Permissions::all(); - } - - // 1. Base permissions given to @everyone are applied at a guild level - let mut permissions = data.everyone_permissions; - // 2. Permissions allowed to a user by their roles are applied at a guild level - for role_permission in data.user_roles_permissions { - permissions |= role_permission; - } - - if permissions.contains(Permissions::ADMINISTRATOR) { - return Permissions::all(); - } - - permissions -} diff --git a/core/rust.std/src/utils.rs b/core/rust.std/src/utils.rs deleted file mode 100644 index 53f64744..00000000 --- a/core/rust.std/src/utils.rs +++ /dev/null @@ -1,306 +0,0 @@ -use sqlx::postgres::types::PgInterval; -use std::collections::HashMap; -use std::sync::LazyLock; - -pub fn create_special_allocation_from_str( - special_allocations: &str, -) -> Result, crate::Error> { - let split = special_allocations.split(',').collect::>(); - - if !split.is_empty() { - let mut map = HashMap::new(); - - for v in split { - if v.is_empty() { - continue; - } - - let split = v.split('=').collect::>(); - - if split.len() != 2 { - return Err("Invalid special allocation format".into()); - } - - let channel_id = split[0].to_string(); - let number = split[1].parse::()?; - - map.insert(channel_id, number); - } - - Ok(map) - } else { - Ok(HashMap::new()) - } -} - -pub fn pg_interval_to_secs(i: PgInterval) -> i64 { - i.microseconds / 1000000 + ((i.days * 86400) as i64) + ((i.months * 2628000) as i64) -} - -pub fn pg_interval_to_chrono_duration(i: PgInterval) -> chrono::Duration { - let secs = pg_interval_to_secs(i); - - chrono::Duration::from_std(std::time::Duration::from_secs( - secs.try_into().unwrap_or_default(), - )) - .unwrap_or_default() -} - -pub fn secs_to_pg_interval(secs: i64) -> PgInterval { - PgInterval { - microseconds: secs * 1000000, - days: (secs / 86400) as i32, - months: (secs / 2628000) as i32, - } -} - -pub fn chrono_duration_to_pg_interval(d: chrono::Duration) -> PgInterval { - let secs = d.num_seconds(); - - secs_to_pg_interval(secs) -} - -pub fn secs_to_pg_interval_u64(secs: u64) -> PgInterval { - // Check if the value is too large to fit in an i64 - if secs > i64::MAX as u64 { - // If it is, return the maximum value - return PgInterval { - microseconds: i64::MAX, - days: i32::MAX, - months: i32::MAX, - }; - } - - secs_to_pg_interval(secs as i64) -} - -pub fn parse_pg_interval(i: PgInterval) -> String { - let seconds = pg_interval_to_secs(i); - - let dur = std::time::Duration::from_secs(seconds.try_into().unwrap_or_default()); - - format!("{:?}", dur) -} - -#[derive(poise::ChoiceParameter, PartialEq, Debug)] -pub enum Unit { - #[name = "Seconds"] - Seconds, - #[name = "Minutes"] - Minutes, - #[name = "Hours"] - Hours, - #[name = "Days"] - Days, - #[name = "Weeks"] - Weeks, -} - -impl Unit { - /// Convert the unit to seconds - pub fn to_seconds(&self) -> u64 { - match self { - Unit::Seconds => 1, - Unit::Minutes => 60, - Unit::Hours => 3600, - Unit::Days => 86400, - Unit::Weeks => 604800, - } - } - - /// Same as to_seconds but returns an i64 instead of a u64 for easier use with sqlx - pub fn to_seconds_i64(&self) -> i64 { - match self { - Unit::Seconds => 1, - Unit::Minutes => 60, - Unit::Hours => 3600, - Unit::Days => 86400, - Unit::Weeks => 604800, - } - } -} - -impl TryFrom<&str> for Unit { - type Error = crate::Error; - - fn try_from(s: &str) -> Result { - match s { - "seconds" => Ok(Unit::Seconds), - "second" => Ok(Unit::Seconds), // Allow "second" as a shorthand for "seconds" - "secs" => Ok(Unit::Seconds), // Allow "secs" as a shorthand for "seconds" - "sec" => Ok(Unit::Seconds), // Allow "sec" as a shorthand for "seconds" - "s" => Ok(Unit::Seconds), // Allow "s" as a shorthand for "seconds" - "minutes" => Ok(Unit::Minutes), - "minute" => Ok(Unit::Minutes), // Allow "minute" as a shorthand for "minutes" - "mins" => Ok(Unit::Minutes), // Allow "mins" as a shorthand for "minutes" - "min" => Ok(Unit::Minutes), // Allow "min" as a shorthand for "minutes" - "m" => Ok(Unit::Minutes), // Allow "m" as a shorthand for "minutes" - "hours" => Ok(Unit::Hours), - "hour" => Ok(Unit::Hours), // Allow "hour" as a shorthand for "hours" - "hrs" => Ok(Unit::Hours), // Allow "hrs" as a shorthand for "hours" - "hr" => Ok(Unit::Hours), // Allow "hr" as a shorthand for "hours" - "h" => Ok(Unit::Hours), // Allow "h" as a shorthand for "hours" - "days" => Ok(Unit::Days), - "day" => Ok(Unit::Days), // Allow "day" as a shorthand for "days" - "d" => Ok(Unit::Days), // Allow "d" as a shorthand for "days" - "weeks" => Ok(Unit::Weeks), - "week" => Ok(Unit::Weeks), // Allow "week" as a shorthand for "weeks" - "w" => Ok(Unit::Weeks), // Allow "w" as a shorthand for "weeks" - _ => Err("Invalid unit".into()), - } - } -} - -/// Given a string of the format days/hours/minutes/seconds, parse it into a u64 of seconds -/// -/// This function should handle both spaced and non-spaced formats -pub fn parse_duration_string(s: &str) -> Result<(u64, Unit), crate::Error> { - let mut number: u64 = 0; - let mut unit = String::new(); - - // Keep looping adding up each number until we hit a non-number which gets added to unit - for c in s.chars() { - if c.is_numeric() { - number = number * 10 + c.to_digit(10).ok_or("Cannot convert to integer")? as u64; - } else { - if c == ' ' { - continue; - } - - unit.push(c); - } - } - - let unit = Unit::try_from(unit.as_str())?; - - Ok((number, unit)) -} - -/// Given a string of the format days/hours/minutes/seconds, parse it into a chrono::Duration -/// -/// This is a wrapper around parse_duration_string that converts the result into a chrono::Duration -pub fn parse_duration_string_to_chrono_duration(s: &str) -> Result { - let (number, unit) = parse_duration_string(s)?; - - Ok(chrono::Duration::from_std(std::time::Duration::from_secs( - number * unit.to_seconds(), - ))?) -} - -pub static REPLACE_CHANNEL: LazyLock> = - LazyLock::new(|| vec![("<#", ""), (">", "")]); - -pub static REPLACE_USER: LazyLock> = - LazyLock::new(|| vec![("<@", ""), ("!", ""), (">", "")]); - -pub static REPLACE_ROLE: LazyLock> = - LazyLock::new(|| vec![("<@", ""), ("&", ""), (">", "")]); - -/// Parse a numeric list from a string without knowing its separator -pub fn parse_numeric_list( - s: &str, - replace: &[(&'static str, &'static str)], -) -> Result, T::Err> { - let mut list = Vec::new(); - let mut number = String::new(); - - for c in s.chars() { - if c.is_numeric() { - number.push(c); - } else if !number.is_empty() { - for (from, to) in replace { - number = number.replace(from, to); - } - list.push(number.parse::()?); - number.clear(); - } - } - - if !number.is_empty() { - list.push(number.parse::()?); - } - - Ok(list) -} - -/// Parse a numeric list from a string without knowing its separator, returning a string instead of a number -#[allow(dead_code)] -pub fn parse_numeric_list_to_str( - s: &str, - replace: &[(&'static str, &'static str)], -) -> Result, T::Err> { - let mut list = Vec::new(); - let mut number = String::new(); - - for c in s.chars() { - if c.is_numeric() { - number.push(c); - } else if !number.is_empty() { - for (from, to) in replace { - number = number.replace(from, to); - } - list.push(number.parse::()?.to_string()); - number.clear(); - } - } - - if !number.is_empty() { - list.push(number.parse::()?.to_string()); - } - - Ok(list) -} - -pub fn split_input_to_string(s: &str, separator: &str) -> Vec { - s.split(separator) - .filter_map(|s| { - let s = s.trim(); - if s.is_empty() { - None - } else { - Some(s.to_string()) - } - }) - .collect() -} - -pub mod value_utils { - use crate::value::Value; - - /// Given a template string, where state variables are surrounded by curly braces, return the - /// template value (if a single variable) or a string if not - pub fn template_to_string_map( - map: &indexmap::IndexMap, - template: &str, - ) -> Value { - let mut result = template.to_string(); - - // Get number of variables in the template - let num_starts = result.matches('{').count(); - - // If 1 variables, return the value of the variable - if num_starts == 1 && result.starts_with('{') && result.ends_with('}') { - let var = template - .chars() - .skip(1) - .take(template.len() - 2) - .collect::(); - - return get_variable_value(map, &var); - } - - for (key, value) in map { - result = result.replace(&format!("{{{}}}", key), &value.to_string()); - } - - Value::String(result) - } - - pub fn get_variable_value(map: &indexmap::IndexMap, variable: &str) -> Value { - match variable { - "__now" => Value::TimestampTz(chrono::Utc::now()), - "__now_naive" => Value::Timestamp(chrono::Utc::now().naive_utc()), - _ => map.get(variable).cloned().unwrap_or(Value::None), - } - } -} diff --git a/core/rust.std/src/value.rs b/core/rust.std/src/value.rs deleted file mode 100644 index 5242d796..00000000 --- a/core/rust.std/src/value.rs +++ /dev/null @@ -1,518 +0,0 @@ -use sqlx::{postgres::PgRow, postgres::PgTypeKind, Column, Row, TypeInfo}; -use std::hash::{Hash, Hasher}; - -#[derive(Debug, Clone, PartialEq)] -#[allow(dead_code)] -/// Represents a supported value type -pub enum Value { - /// A uuid value - Uuid(sqlx::types::Uuid), - - /// A string value - String(String), - - /// A timestamp value - Timestamp(chrono::NaiveDateTime), - - /// A timestamp value with timezone - TimestampTz(chrono::DateTime), - - /// An interval value - Interval(chrono::Duration), - - /// An integer value - Integer(i64), - - /// A float value - Float(f64), - - /// A boolean value - Boolean(bool), - - /// A list of values - List(Vec), - - /// A (indexmap) of values - Map(indexmap::IndexMap), - - /// Raw JSON data - Json(serde_json::Value), - - /// None - None, -} - -impl Hash for Value { - fn hash(&self, state: &mut H) { - match self { - Value::Uuid(u) => u.hash(state), - Value::String(s) => s.hash(state), - Value::Timestamp(t) => t.hash(state), - Value::TimestampTz(t) => t.hash(state), - Value::Interval(i) => i.hash(state), - Value::Integer(i) => i.hash(state), - Value::Float(f) => f.to_bits().hash(state), - Value::Boolean(b) => b.hash(state), - Value::List(l) => l.hash(state), - Value::Map(m) => { - for (k, v) in m { - k.hash(state); - v.hash(state); - } - } - Value::Json(j) => j.to_string().hash(state), - Value::None => None::.hash(state), - } - } -} - -impl Value { - /// Convert the Value to a serde_json::Value - #[allow(dead_code)] - pub fn to_json(&self) -> serde_json::Value { - match self { - Value::Uuid(u) => serde_json::Value::String(u.to_string()), - Value::String(s) => serde_json::Value::String(s.clone()), - Value::Timestamp(t) => serde_json::Value::String(t.to_string()), - Value::TimestampTz(t) => serde_json::Value::String(t.to_string()), - Value::Integer(i) => serde_json::Value::Number(serde_json::Number::from(*i)), - Value::Interval(i) => { - serde_json::Value::Number(serde_json::Number::from(i.num_seconds())) - } - Value::Float(f) => serde_json::Value::Number( - serde_json::Number::from_f64(*f).unwrap_or(serde_json::Number::from(0)), - ), - Value::Boolean(b) => serde_json::Value::Bool(*b), - Value::List(l) => serde_json::Value::Array(l.iter().map(|v| v.to_json()).collect()), - Value::Map(m) => { - let mut obj = serde_json::Map::new(); - for (k, v) in m { - obj.insert(k.clone(), v.to_json()); - } - serde_json::Value::Object(obj) - } - Value::Json(j) => j.clone(), - Value::None => serde_json::Value::Null, - } - } - - /// Convert a serde_json::Value to a Value - #[allow(dead_code)] - pub fn from_json(value: &serde_json::Value) -> Self { - match value { - serde_json::Value::String(s) => { - let t = chrono::NaiveDateTime::parse_from_str(&s, "%Y-%m-%d %H:%M:%S"); - - if let Ok(t) = t { - return Self::Timestamp(t); - } - - let value = chrono::DateTime::parse_from_rfc3339(&s); - - if let Ok(value) = value { - return Self::TimestampTz(value.into()); - } - - Self::String(s.clone()) - } - serde_json::Value::Number(n) => { - if n.is_i64() { - Self::Integer(n.as_i64().unwrap()) - } else { - Self::Float(n.as_f64().unwrap()) - } - } - serde_json::Value::Bool(b) => Self::Boolean(*b), - serde_json::Value::Array(a) => Self::List(a.iter().map(Value::from_json).collect()), - serde_json::Value::Object(o) => { - let mut m = indexmap::IndexMap::new(); - for (k, v) in o { - m.insert(k.clone(), Self::from_json(v)); - } - Self::Map(m) - } - serde_json::Value::Null => Self::None, - } - } - - /// Converts a PgColumn to a Value - #[allow(dead_code)] - pub fn from_sqlx(row: &PgRow, index: usize) -> Result { - let typ_info = row.try_column(index)?.type_info(); - let typ = typ_info.name().to_lowercase(); - - match typ_info.kind() { - PgTypeKind::Simple => match typ.as_str() { - "text" | "citext" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::String(v)) - } - "int4" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Integer(v.into())) - } - "int8" | "bigint" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Integer(v)) - } - "float4" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Float(v as f64)) - } - "float8" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Float(v)) - } - "bool" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Boolean(v)) - } - "json" | "jsonb" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::from_json(&v)) - } - "uuid" => { - let Some(v) = row.try_get::, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::Uuid(v)) - } - "timestamp" => { - let Some(v) = - row.try_get::, _>(index)? - else { - return Ok(Value::None); - }; - Ok(Value::Timestamp(v)) - } - "timestamptz" => { - let Some(v) = row - .try_get::>, _>(index)? - else { - return Ok(Value::None); - }; - Ok(Value::TimestampTz(v)) - } - "interval" => { - let Some(v) = - row.try_get::, _>(index)? - else { - return Ok(Value::None); - }; - let secs = crate::utils::pg_interval_to_secs(v); - Ok(Value::Interval(chrono::Duration::seconds(secs))) - } - _ => Err("Unsupported type".into()), - }, - PgTypeKind::Array(ar) => { - let typ = ar.name().to_lowercase(); - match typ.as_str() { - "text" | "citext" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List(v.into_iter().map(Value::String).collect())) - } - "int4" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List( - v.into_iter().map(|x| Value::Integer(x.into())).collect(), - )) - } - "int8" | "bigint" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List(v.into_iter().map(Value::Integer).collect())) - } - "float4" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List( - v.into_iter().map(|f| Value::Float(f as f64)).collect(), - )) - } - "float8" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List(v.into_iter().map(Value::Float).collect())) - } - "bool" => { - let Some(v) = row.try_get::>, _>(index)? else { - return Ok(Value::None); - }; - Ok(Value::List(v.into_iter().map(Value::Boolean).collect())) - } - "json" | "jsonb" => { - let Some(v) = row.try_get::>, _>(index)? - else { - return Ok(Value::None); - }; - let mut m: Vec = Vec::new(); - - for i in v { - m.push(Value::from_json(&i)); - } - - Ok(Value::List(m)) - } - "uuid" => { - let Some(v) = row.try_get::>, _>(index)? - else { - return Ok(Value::None); - }; - Ok(Value::List(v.into_iter().map(Value::Uuid).collect())) - } - "timestamp" => { - let Some(v) = row - .try_get::>, _>(index)? - else { - return Ok(Value::None); - }; - let mut m: Vec = Vec::new(); - - for i in v { - m.push(Value::Timestamp(i)); - } - - Ok(Value::List(m)) - } - "timestamptz" => { - let Some(v) = row - .try_get::>>, _>( - index, - )? - else { - return Ok(Value::None); - }; - - let mut m: Vec = Vec::new(); - - for i in v { - m.push(Value::TimestampTz(i)); - } - - Ok(Value::List(m)) - } - "interval" => { - let Some(v) = row - .try_get::>, _>(index)? - else { - return Ok(Value::None); - }; - - let mut m: Vec = Vec::new(); - - for i in v { - let secs = crate::utils::pg_interval_to_secs(i); - m.push(Value::Interval(chrono::Duration::seconds(secs))); - } - - Ok(Value::List(m)) - } - _ => Err("Unsupported type".into()), - } - } - _ => Err("Unsupported type".into()), - } - } -} - -impl std::fmt::Display for Value { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Value::Uuid(u) => write!(f, "{}", u), - Value::String(s) => write!(f, "{}", s), - Value::Timestamp(t) => write!(f, "{}", t), - Value::TimestampTz(t) => write!(f, "{}", t), - Value::Integer(i) => write!(f, "{}", i), - Value::Interval(i) => { - // We format to a string in the format of "1d 2h 3m 4s" - let mut secs = i.num_seconds(); - let mut mins = secs / 60; - secs %= 60; - let mut hours = mins / 60; - mins %= 60; - let days = hours / 24; - hours %= 24; - - if days > 0 { - write!(f, "{}d ", days)?; - } - - if hours > 0 { - write!(f, "{}h ", hours)?; - } - - if mins > 0 { - write!(f, "{}m ", mins)?; - } - - if secs > 0 { - write!(f, "{}s", secs)?; - } - - Ok(()) - } - Value::Float(fl) => write!(f, "{}", fl), - Value::Boolean(b) => write!(f, "{}", b), - Value::List(l) => { - write!(f, "[")?; - for (i, v) in l.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{}", v)?; - } - write!(f, "]") - } - Value::Json(j) => write!(f, "{}", j), - Value::Map(m) => { - write!(f, "{{")?; - for (i, (k, v)) in m.iter().enumerate() { - if i > 0 { - write!(f, ", ")?; - } - write!(f, "{}: {}", k, v)?; - } - write!(f, "}}") - } - Value::None => write!(f, "None"), - } - } -} - -// serde_json as_TYPE methods -impl Value { - pub fn as_u64(&self) -> Option { - match self { - Value::Integer(i) => Some(*i as u64), - Value::Float(f) => Some(*f as u64), - _ => None, - } - } - - pub fn as_i64(&self) -> Option { - match self { - Value::Integer(i) => Some(*i), - Value::Float(f) => Some(*f as i64), - _ => None, - } - } - - pub fn as_f64(&self) -> Option { - match self { - Value::Integer(i) => Some(*i as f64), - Value::Float(f) => Some(*f), - _ => None, - } - } - - pub fn as_bool(&self) -> Option { - match self { - Value::Boolean(b) => Some(*b), - _ => None, - } - } - - pub fn as_string(&self) -> Option<&str> { - match self { - Value::String(s) => Some(s), - _ => None, - } - } - - pub fn as_array(&self) -> Option<&Vec> { - match self { - Value::List(l) => Some(l), - _ => None, - } - } - - pub fn as_map(&self) -> Option<&indexmap::IndexMap> { - match self { - Value::Map(m) => Some(m), - _ => None, - } - } - - /// as_object is an alias to as_map - pub fn as_object(&self) -> Option<&indexmap::IndexMap> { - self.as_map() - } - - pub fn as_uuid(&self) -> Option<&sqlx::types::Uuid> { - match self { - Value::Uuid(u) => Some(u), - _ => None, - } - } - - pub fn as_timestamp(&self) -> Option<&chrono::NaiveDateTime> { - match self { - Value::Timestamp(t) => Some(t), - _ => None, - } - } - - pub fn as_timestamp_tz(&self) -> Option<&chrono::DateTime> { - match self { - Value::TimestampTz(t) => Some(t), - _ => None, - } - } - - pub fn as_interval(&self) -> Option<&chrono::Duration> { - match self { - Value::Interval(i) => Some(i), - _ => None, - } - } - - pub fn as_none(&self) -> bool { - matches!(self, Value::None) - } -} - -impl serde::Serialize for Value { - fn serialize(&self, serializer: S) -> Result { - let value = self.to_json(); - - value.serialize(serializer) - } -} - -impl<'de> serde::Deserialize<'de> for Value { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let value = serde_json::Value::deserialize(deserializer)?; - - Ok(Value::from_json(&value)) - } -} - -impl From for Value { - fn from(value: serde_json::Value) -> Self { - Value::from_json(&value) - } -} diff --git a/core/rust.templating.docgen/Cargo.toml b/core/rust.templating.docgen/Cargo.toml deleted file mode 100644 index 4390b546..00000000 --- a/core/rust.templating.docgen/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "templating_docgen" -version = "0.1.0" -edition = "2021" - -[dependencies] -serde = { version = "1", features = ["derive"] } -erased-serde = { version = "0.4", default-features = false, features = ["alloc"] } diff --git a/core/rust.templating.docgen/src/lib.rs b/core/rust.templating.docgen/src/lib.rs deleted file mode 100644 index f6dd63e5..00000000 --- a/core/rust.templating.docgen/src/lib.rs +++ /dev/null @@ -1,805 +0,0 @@ -/// Tooling to document the Anti-Raid Luau API. -// -use std::sync::Arc; - -/// A primitive type in the Anti-Raid Luau API. -/// E.g. u64, string, etc. -/// -/// These are typedefs to primitive Luau types -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Primitive { - pub name: String, - pub lua_type: String, - pub description: String, - pub constraints: Vec, -} - -// Primitive builder code -impl Primitive { - pub fn name(self, name: &str) -> Self { - let mut p = self; - p.name = name.to_string(); - p - } - - pub fn lua_type(self, lua_type: &str) -> Self { - let mut p = self; - p.lua_type = lua_type.to_string(); - p - } - - pub fn description(self, description: &str) -> Self { - let mut p = self; - p.description = description.to_string(); - p - } - - pub fn add_constraint(self, name: &str, description: &str, accepted_values: &str) -> Self { - let mut p = self; - p.constraints.push(PrimitiveConstraint { - name: name.to_string(), - description: description.to_string(), - accepted_values: accepted_values.to_string(), - }); - - p - } - - pub fn build(self) -> Primitive { - self - } -} - -impl Primitive { - pub fn type_definition(&self) -> String { - format!("type {} = {}", self.name, self.lua_type) - } -} - -/// A primitive constraint -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct PrimitiveConstraint { - pub name: String, - pub description: String, - pub accepted_values: String, -} - -/// A special helper types for building a list of primitives. -#[derive(Default)] -pub struct PrimitiveListBuilder { - pub primitives: Vec, - pub methods: Vec, - pub types: Vec, -} - -impl PrimitiveListBuilder { - pub fn add( - self, - name: &str, - lua_type: &str, - description: &str, - p_fn: impl Fn(Primitive) -> Primitive, - ) -> Self { - let mut p = self; - - let new_primitive = Primitive::default() - .name(name) - .lua_type(lua_type) - .description(description); - - p.primitives.push(p_fn(new_primitive)); - - p - } - - pub fn method_mut(mut self, name: &str, f: impl FnOnce(Method) -> Method) -> Self { - let method = self.methods.iter_mut().find(|m| m.name == name); - - if let Some(method) = method { - let new_method = f(method.clone()); - - *method = new_method; - } else { - let method = Method { - name: name.to_string(), - ..Default::default() - }; - self.methods.push(f(method)); - } - - self - } - - pub fn type_mut(self, name: &str, description: &str, f: impl FnOnce(Type) -> Type) -> Self { - let mut p = self; - let new_typ = Type::new(name, description); - p.types.push(f(new_typ)); - - p - } - - pub fn add_type(self, types: Type) -> Self { - let mut p = self; - p.types.push(types); - p - } -} - -/// A plugin in the Anti-Raid Luau API. -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Plugin { - pub name: String, - pub description: String, - pub methods: Vec, - pub fields: Vec, - pub types: Vec, - pub enums: Vec, -} - -#[allow(dead_code)] -// Plugin builder code -impl Plugin { - pub fn name(self, name: &str) -> Self { - let mut p = self; - p.name = name.to_string(); - p - } - - pub fn description(self, description: &str) -> Self { - let mut p = self; - p.description = description.to_string(); - p - } - - pub fn add_method(self, methods: Method) -> Self { - let mut p = self; - p.methods.push(methods); - p - } - - pub fn method_mut(mut self, name: &str, f: impl FnOnce(Method) -> Method) -> Self { - let method = self.methods.iter_mut().find(|m| m.name == name); - - if let Some(method) = method { - let new_method = f(method.clone()); - - *method = new_method; - } else { - let method = Method { - name: name.to_string(), - ..Default::default() - }; - self.methods.push(f(method)); - } - - self - } - - pub fn add_field(self, fields: Field) -> Self { - let mut p = self; - p.fields.push(fields); - p - } - - pub fn add_type(self, types: Type) -> Self { - let mut p = self; - p.types.push(types); - p - } - - pub fn add_enum(self, enums: Enum) -> Self { - let mut p = self; - p.enums.push(enums); - p - } - - pub fn type_mut(self, name: &str, description: &str, f: impl FnOnce(Type) -> Type) -> Self { - let mut p = self; - let new_typ = Type::new(name, description); - p.types.push(f(new_typ)); - - p - } - - pub fn enum_mut(self, name: &str, description: &str, f: impl FnOnce(Enum) -> Enum) -> Self { - let mut p = self; - let new_enum = Enum::new(name, description); - p.enums.push(f(new_enum)); - - p - } - - pub fn field_mut(self, name: &str, f: impl FnOnce(Field) -> Field) -> Self { - let mut p = self; - let field = p.fields.iter_mut().find(|f| f.name == name); - - if let Some(field) = field { - let new_field = f(field.clone()); - - *field = new_field; - } else { - let field = Field { - name: name.to_string(), - ..Default::default() - }; - p.fields.push(f(field)); - } - - p - } - - pub fn build(self) -> Plugin { - self - } -} - -/*impl Plugin { - pub fn to_markdown(&self) -> String { - - } -}*/ - -/// A method in a plugin. -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Method { - pub name: String, - pub generics: Vec, - pub description: String, - pub parameters: Vec, - pub returns: Vec, -} - -// Method builder code -impl Method { - pub fn name(self, name: &str) -> Self { - let mut m = self; - m.name = name.to_string(); - m - } - - pub fn add_generic(self, param: String) -> Self { - let mut m = self; - m.generics.push(param); - m - } - - pub fn description(self, description: &str) -> Self { - let mut m = self; - m.description = description.to_string(); - m - } - - pub fn add_parameter(self, parameters: Parameter) -> Self { - let mut m = self; - m.parameters.push(parameters); - m - } - - pub fn parameter(&mut self, name: &str, f: impl FnOnce(Parameter) -> Parameter) -> Self { - let parameter = self.parameters.iter_mut().find(|p| p.name == name); - - if let Some(parameter) = parameter { - let new_parameter = f(parameter.clone()); - - *parameter = new_parameter; - } else { - let parameter = Parameter { - name: name.to_string(), - ..Default::default() - }; - - self.parameters.push(f(parameter)); - } - - self.clone() - } - - pub fn add_return(self, returns: Parameter) -> Self { - let mut m = self; - m.returns.push(returns); - m - } - - pub fn return_(&mut self, name: &str, f: impl FnOnce(Parameter) -> Parameter) -> Self { - let return_ = self.returns.iter_mut().find(|r| r.name == name); - - if let Some(return_) = return_ { - let new_return_ = f(return_.clone()); - - *return_ = new_return_; - } else { - let return_ = Parameter { - name: name.to_string(), - ..Default::default() - }; - self.returns.push(f(return_)); - } - - self.clone() - } - - pub fn build(self) -> Method { - self - } -} - -impl Method { - pub fn func_name(&self, cls: &Option) -> String { - if let Some(cls) = cls { - format!("{}:{}", cls, self.name) - } else { - self.name.clone() - } - } - - /// Format: function name(parameters) -> returns - pub fn type_signature(&self, cls: &Option) -> String { - let mut out = String::new(); - out.push_str(&format!("function {}", self.func_name(cls))); - - // Add in the generics if they exist - if !self.generics.is_empty() { - out.push_str(&format!("<{}>", self.generics.join(", "))); - } - - out.push_str(&format!( - "({})", - self.parameters - .iter() - .map(|p| p.type_signature()) - .collect::>() - .join(", ") - )); - - if self.returns.len() == 1 { - out.push_str(&format!(": {}", self.returns[0].r#type.clone())); - } else if self.returns.len() > 2 { - out.push_str(&format!( - ": ({})", - self.returns - .iter() - .map(|r| r.r#type.clone()) - .collect::>() - .join(", ") - )); - } - out - } -} - -/// A parameter in a method. -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Parameter { - pub name: String, - pub description: String, - pub r#type: String, -} - -// Parameter builder code -impl Parameter { - pub fn name(self, name: &str) -> Self { - let mut p = self; - p.name = name.to_string(); - p - } - - pub fn description(self, description: &str) -> Self { - let mut p = self; - p.description = description.to_string(); - p - } - - pub fn typ(self, r#type: &str) -> Self { - let mut p = self; - p.r#type = r#type.to_string(); - p - } - - pub fn build(self) -> Parameter { - self - } -} - -impl Parameter { - /// Format: : - pub fn type_signature(&self) -> String { - let mut out = String::new(); - out.push_str(&format!("{}: {}", self.name, self.r#type)); - out - } -} - -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Field { - pub name: String, - pub description: String, - pub r#type: String, -} - -// Field builder code -impl Field { - pub fn name(self, name: &str) -> Self { - let mut f = self; - f.name = name.to_string(); - f - } - - pub fn description(self, description: &str) -> Self { - let mut f = self; - f.description = description.to_string(); - f - } - - pub fn typ(self, r#type: &str) -> Self { - let mut f = self; - f.r#type = r#type.to_string(); - f - } - - pub fn build(self) -> Field { - self - } -} - -#[derive(Default, serde::Serialize, Clone)] -pub struct Type { - pub name: String, - pub description: String, - pub generics: Vec, - pub example: Option>, - pub refers_to: Option, - pub fields: Vec, // Description of the fields in type - pub methods: Vec, -} - -impl std::fmt::Debug for Type { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Type") - .field("description", &self.description) - .field("methods", &self.methods) - .finish() - } -} - -// Type builder code -impl Type { - pub fn new(name: &str, description: &str) -> Self { - Type { - name: name.to_string(), - description: description.to_string(), - ..Default::default() - } - } - - pub fn example(self, example: Arc) -> Self { - let mut t = self; - t.example = Some(example); - t - } - - pub fn description(self, description: &str) -> Self { - let mut t = self; - t.description = description.to_string(); - t - } - - pub fn add_method(self, methods: Method) -> Self { - let mut t = self; - t.methods.push(methods); - t - } - - pub fn method_mut(&mut self, name: &str, f: impl FnOnce(Method) -> Method) -> Self { - let method = self.methods.iter_mut().find(|m| m.name == name); - - if let Some(method) = method { - let new_method = f(method.clone()); - - *method = new_method; - } else { - let method = Method { - name: name.to_string(), - ..Default::default() - }; - self.methods.push(f(method)); - } - - self.clone() - } - - pub fn add_field(self, fields: Field) -> Self { - let mut t = self; - t.fields.push(fields); - t - } - - pub fn field(&mut self, name: &str, f: impl FnOnce(Field) -> Field) -> Self { - let fields = self.fields.iter_mut().find(|p| p.name == name); - - if let Some(field) = fields { - let new_field = f(field.clone()); - - *field = new_field; - } else { - let field = Field { - name: name.to_string(), - ..Default::default() - }; - self.fields.push(f(field)); - } - - self.clone() - } - - pub fn add_generic(self, param: &str) -> Self { - let mut t = self; - t.generics.push(param.to_string()); - t - } - - pub fn refers_to(self, refer_to: &str) -> Self { - let mut t = self; - t.refers_to = Some(refer_to.to_string()); - t - } - - /// Helper function to refer to serenity docs using `serenity_link` - pub fn refers_to_serenity(self, typ: &str) -> Self { - let mut t = self; - t.refers_to = Some(serenity_link(typ.to_string())); - t - } -} - -// Other type code -impl Type { - pub fn genericized_name(&self) -> String { - let mut name = self.name.clone(); - - if !self.generics.is_empty() { - name.push_str(&format!("<{}>", self.generics.join(", "))); - } - - name - } -} - -#[derive(Default, serde::Serialize, Clone)] -pub struct EnumVariant { - pub name: String, - pub description: String, - pub example: Option>, - pub refers_to: Option, - pub fields: Vec, // Description of the fields in type - pub methods: Vec, -} - -impl std::fmt::Debug for EnumVariant { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("EnumVariant") - .field("description", &self.description) - .field("methods", &self.methods) - .finish() - } -} - -// EnumVariant builder code -impl EnumVariant { - pub fn new(name: &str, description: &str) -> Self { - EnumVariant { - name: name.to_string(), - description: description.to_string(), - ..Default::default() - } - } - - pub fn example(self, example: Arc) -> Self { - let mut t = self; - t.example = Some(example); - t - } - - pub fn description(self, description: &str) -> Self { - let mut t = self; - t.description = description.to_string(); - t - } - - pub fn add_method(self, methods: Method) -> Self { - let mut t = self; - t.methods.push(methods); - t - } - - pub fn method_mut(&mut self, name: &str, f: impl FnOnce(Method) -> Method) -> Self { - let method = self.methods.iter_mut().find(|m| m.name == name); - - if let Some(method) = method { - let new_method = f(method.clone()); - - *method = new_method; - } else { - let method = Method { - name: name.to_string(), - ..Default::default() - }; - self.methods.push(f(method)); - } - - self.clone() - } - - pub fn add_field(self, fields: Field) -> Self { - let mut t = self; - t.fields.push(fields); - t - } - - pub fn field(&mut self, name: &str, f: impl FnOnce(Field) -> Field) -> Self { - let fields = self.fields.iter_mut().find(|p| p.name == name); - - if let Some(field) = fields { - let new_field = f(field.clone()); - - *field = new_field; - } else { - let field = Field { - name: name.to_string(), - ..Default::default() - }; - self.fields.push(f(field)); - } - - self.clone() - } - - pub fn refers_to(self, refer_to: &str) -> Self { - let mut t = self; - t.refers_to = Some(refer_to.to_string()); - t - } - - /// Helper function to refer to serenity docs using `serenity_link` - pub fn refers_to_serenity(self, typ: &str) -> Self { - let mut t = self; - t.refers_to = Some(serenity_link(typ.to_string())); - t - } -} - -#[derive(Default, Debug, serde::Serialize, Clone)] -pub struct Enum { - pub name: String, - pub description: String, - pub variants: Vec, -} - -impl Enum { - pub fn new(name: &str, description: &str) -> Self { - Enum { - name: name.to_string(), - description: description.to_string(), - variants: vec![], - } - } - - #[allow(dead_code)] - pub fn name(self, name: &str) -> Self { - let mut e = self; - e.name = name.to_string(); - e - } - - #[allow(dead_code)] - pub fn description(self, description: &str) -> Self { - let mut e = self; - e.description = description.to_string(); - e - } - - pub fn add_variant(&mut self, variant: EnumVariant) { - self.variants.push(variant); - } - - pub fn variant(self, name: &str, f: impl FnOnce(EnumVariant) -> EnumVariant) -> Self { - let mut e = self; - let variant = e.variants.iter_mut().find(|v| v.name == name); - - if let Some(variant) = variant { - let new_variant = f(variant.clone()); - - *variant = new_variant; - } else { - let variant = EnumVariant { - name: name.to_string(), - ..Default::default() - }; - e.variants.push(f(variant)); - } - - e - } -} - -pub fn serenity_link(typ: String) -> String { - // Module on docs.rs, generate link - // E.g. std::sync::Arc -> [std::sync::Arc](https://docs.rs/std/latest/std/sync/struct.Arc.html) - // serenity::model::user::User -> [serenity::model::user::User](https://docs.rs/serenity/latest/serenity/model/user/struct.User.html) - - let mut parts = typ.split("::").collect::>(); - let last = parts.pop().unwrap(); - let first = parts.remove(0); - - let mut url = format!("https://docs.rs/{}/latest/{}/", first, first); - url.push_str(&parts.join("/")); - url.push_str(&format!("/struct.{}.html", last)); - - format!("[{}]({})", typ, url) -} - -pub struct LuaParamaterTypeMetadata { - pub table_dim: usize, - pub option_dim: usize, - pub raw_type: String, -} - -impl LuaParamaterTypeMetadata { - /// Panics is t is invalid - /// - /// Note that this method is naive and only handles simple cases of