From b6a3bea2c49e40b8540025295ecf9cdc3c24f3db Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 3 Feb 2022 14:55:56 +0100 Subject: [PATCH] Initial recommit to poise --- .env | 1 + .gitignore | 3 + Cargo.lock | 2496 ++++++++++++++++++++++++++++ Cargo.toml | 24 + data/database.db | Bin 0 -> 405504 bytes migrations/20220127114757_init.sql | 47 + src/commands/invites.rs | 152 ++ src/commands/mod.rs | 50 + src/commands/planning.rs | 249 +++ src/commands/schedule.rs | 409 +++++ src/commands/utils.rs | 114 ++ src/entity/events.rs | 52 + src/entity/locations.rs | 35 + src/entity/mod.rs | 8 + src/entity/prelude.rs | 6 + src/entity/series.rs | 27 + src/entity/sessions.rs | 38 + src/main.rs | 241 +++ 18 files changed, 3952 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 data/database.db create mode 100644 migrations/20220127114757_init.sql create mode 100644 src/commands/invites.rs create mode 100644 src/commands/mod.rs create mode 100644 src/commands/planning.rs create mode 100644 src/commands/schedule.rs create mode 100644 src/commands/utils.rs create mode 100644 src/entity/events.rs create mode 100644 src/entity/locations.rs create mode 100644 src/entity/mod.rs create mode 100644 src/entity/prelude.rs create mode 100644 src/entity/series.rs create mode 100644 src/entity/sessions.rs create mode 100644 src/main.rs diff --git a/.env b/.env new file mode 100644 index 0000000..7d755c8 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL=sqlite:data/database.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5664357 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +/data/config +/.vscode \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fc8135b --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2496 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-rwlock" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261803dcc39ba9e72760ba6e16d0199b1eef9fc44e81bffabbebb9f5aea3906c" +dependencies = [ + "async-mutex", + "event-listener", +] + +[[package]] +name = "async-stream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-tungstenite" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5682ea0913e5c20780fe5785abacb85a411e7437bf52a1bedb93ddb3972cb8dd" +dependencies = [ + "futures-io", + "futures-util", + "log", + "pin-project-lite", + "tokio", + "tokio-rustls 0.23.2", + "tungstenite", + "webpki-roots 0.22.2", +] + +[[package]] +name = "atoi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +dependencies = [ + "num-traits 0.2.14", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bae" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cached" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2bc2fd249a24a9cdd4276f3a3e0461713271ab63b0e9e656e200e8e21c8c927" +dependencies = [ + "async-mutex", + "async-rwlock", + "async-trait", + "cached_proc_macro", + "cached_proc_macro_types", + "futures", + "hashbrown", + "once_cell", +] + +[[package]] +name = "cached_proc_macro" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3531903b39df48a378a7ed515baee7c1fff32488489c7d0725eb1749b22a91" +dependencies = [ + "cached_proc_macro_types", + "darling 0.13.1", + "quote", + "syn", +] + +[[package]] +name = "cached_proc_macro_types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" + +[[package]] +name = "cc" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" + +[[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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits 0.2.14", + "serde 1.0.136", + "time", + "winapi", +] + +[[package]] +name = "config" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" +dependencies = [ + "lazy_static", + "nom 5.1.2", + "rust-ini", + "serde 1.0.136", + "serde-hjson", + "serde_json", + "toml", + "yaml-rust", +] + +[[package]] +name = "core-foundation" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + +[[package]] +name = "crc32fast" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b979d76c9fcb84dffc80a73f7290da0f83e4c95773494674cb44b76d13a7a110" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "darling" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" +dependencies = [ + "darling_core 0.12.4", + "darling_macro 0.12.4", +] + +[[package]] +name = "darling" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +dependencies = [ + "darling_core 0.13.1", + "darling_macro 0.13.1", +] + +[[package]] +name = "darling_core" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" +dependencies = [ + "darling_core 0.12.4", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +dependencies = [ + "darling_core 0.13.1", + "quote", + "syn", +] + +[[package]] +name = "dashmap" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b799062aaf67eb976af3bdca031ee6f846d2f0a5710ddbb0d2efee33f3cc4760" +dependencies = [ + "cfg-if", + "num_cpus", + "parking_lot", + "serde 1.0.136", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +dependencies = [ + "serde 1.0.136", +] + +[[package]] +name = "encoding_rs" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "event-listener" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d04dafd11240188e146b6f6476a898004cace3be31d4ec5e08e216bf4947ac0" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project", + "spin 0.9.2", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" + +[[package]] +name = "futures-executor" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" + +[[package]] +name = "futures-macro" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" + +[[package]] +name = "futures-task" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" + +[[package]] +name = "futures-util" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "h2" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.1", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 0.4.8", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" +dependencies = [ + "http", + "hyper", + "rustls 0.20.2", + "tokio", + "tokio-rustls 0.23.2", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[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.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lexical-core" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" +dependencies = [ + "arrayvec 0.5.2", + "bitflags", + "cfg-if", + "ryu", + "static_assertions", +] + +[[package]] +name = "libc" +version = "0.2.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74" + +[[package]] +name = "libsqlite3-sys" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cafc7c74096c336d9d27145f7ebd4f4b6f95ba16aa5a282387267e6925cb58" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "lock_api" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] + +[[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.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "native-tls" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "lexical-core", + "memchr", + "version_check", +] + +[[package]] +name = "nom" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +dependencies = [ + "memchr", + "minimal-lexical", + "version_check", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits 0.2.14", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits 0.2.14", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.14", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "ol_rusty" +version = "0.1.0" +dependencies = [ + "cached", + "chrono", + "config", + "futures", + "glob", + "lazy_static", + "log", + "poise", + "regex", + "reqwest", + "sea-orm", + "serde 1.0.136", + "serde_json", + "simplelog", + "sqlx", + "tokio", +] + +[[package]] +name = "once_cell" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ouroboros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06562f88448f4f22a6cfb76b3d0d01af62e82e3dacb2a88c1a3a8a1694a501c6" +dependencies = [ + "aliasable", + "ouroboros_macro", + "stable_deref_trait", +] + +[[package]] +name = "ouroboros_macro" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cdc8f765173c2dad6c1f371d0997c2d21003bd14949da99d910ad409d88a85" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" + +[[package]] +name = "poise" +version = "0.1.0" +source = "git+https://github.com/kangalioo/poise?branch=develop#eeda0e61b5b6e027f791e0965d6dc1c3d031c3bb" +dependencies = [ + "async-trait", + "futures-core", + "futures-util", + "once_cell", + "poise_macros", + "regex", + "serenity", + "tokio", +] + +[[package]] +name = "poise_macros" +version = "0.1.0" +source = "git+https://github.com/kangalioo/poise?branch=develop#eeda0e61b5b6e027f791e0965d6dc1c3d031c3bb" +dependencies = [ + "darling 0.12.4", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls 0.20.2", + "rustls-pemfile", + "serde 1.0.136", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.23.2", + "tokio-util", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.22.2", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rust-ini" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" + +[[package]] +name = "rust_decimal" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0593ce4677e3800ddafb3de917e8397b1348e06e688128ade722d88fbe11ebf" +dependencies = [ + "arrayvec 0.7.2", + "num-traits 0.2.14", + "serde 1.0.136", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-pemfile" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sea-orm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5452736ac11d11f9dcf1980897d3a6302d78ee2bfcb928b0f9c03569f2e6b12c" +dependencies = [ + "async-stream", + "async-trait", + "chrono", + "futures", + "futures-util", + "once_cell", + "ouroboros", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-strum", + "serde 1.0.136", + "serde_json", + "sqlx", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sea-orm-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8b7b6d423b591bf447685e9ea7cecd65e0c282e18dc5ddc7438425cd296faa8" +dependencies = [ + "bae", + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sea-query" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83e4a0dd79545b61c6ca453a28d0a88829487869a8559a35a3192f1b6aacad8" +dependencies = [ + "chrono", + "rust_decimal", + "sea-query-derive", + "serde_json", + "uuid", +] + +[[package]] +name = "sea-query-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", + "thiserror", +] + +[[package]] +name = "sea-strum" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391d06a6007842cfe79ac6f7f53911b76dfd69fc9a6769f1cf6569d12ce20e1b" +dependencies = [ + "sea-strum_macros", +] + +[[package]] +name = "sea-strum_macros" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b4397b825df6ccf1e98bcdabef3bbcfc47ff5853983467850eeab878384f21" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "security-framework" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d09d3c15d814eda1d6a836f2f2b56a6abc1446c8a34351cb3180d3db92ffe4ce" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90dd10c41c6bfc633da6e0c659bd25d31e0791e5974ac42970267d59eba87f7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-hjson" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" +dependencies = [ + "lazy_static", + "num-traits 0.1.43", + "regex", + "serde 0.8.23", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +dependencies = [ + "indexmap", + "itoa 1.0.1", + "ryu", + "serde 1.0.136", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.1", + "ryu", + "serde 1.0.136", +] + +[[package]] +name = "serenity" +version = "0.10.10" +source = "git+https://github.com/serenity-rs/serenity?branch=next#e7567464e09806aec8f6ee9317d33c808d39eea3" +dependencies = [ + "async-trait", + "async-tungstenite", + "base64", + "bitflags", + "bytes", + "chrono", + "dashmap", + "flate2", + "futures", + "mime", + "mime_guess", + "parking_lot", + "percent-encoding", + "reqwest", + "serde 1.0.136", + "serde_json", + "tokio", + "tracing", + "typemap_rev", + "url", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "simplelog" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1348164456f72ca0116e4538bdaabb0ddb622c7d9f16387c725af3e96d6001c" +dependencies = [ + "chrono", + "log", + "termcolor", +] + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sqlformat" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +dependencies = [ + "itertools", + "nom 7.1.0", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692749de69603d81e016212199d73a2e14ee20e2def7d7914919e8db5d4d48b9" +dependencies = [ + "sqlx-core", + "sqlx-macros", +] + +[[package]] +name = "sqlx-core" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518be6f6fff5ca76f985d434f9c37f3662af279642acf730388f271dff7b9016" +dependencies = [ + "ahash", + "atoi", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-channel", + "crossbeam-queue", + "crossbeam-utils", + "either", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "hashlink", + "hex", + "indexmap", + "itoa 1.0.1", + "libc", + "libsqlite3-sys", + "log", + "memchr", + "num-bigint", + "once_cell", + "parking_lot", + "percent-encoding", + "rust_decimal", + "rustls 0.19.1", + "serde 1.0.136", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "sqlx-rt", + "stringprep", + "thiserror", + "tokio-stream", + "url", + "uuid", + "webpki 0.21.4", + "webpki-roots 0.21.1", +] + +[[package]] +name = "sqlx-macros" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e45140529cf1f90a5e1c2e561500ca345821a1c513652c8f486bbf07407cc8" +dependencies = [ + "dotenv", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde 1.0.136", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-rt", + "syn", + "url", +] + +[[package]] +name = "sqlx-rt" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8061cbaa91ee75041514f67a09398c65a64efed72c90151ecd47593bad53da99" +dependencies = [ + "once_cell", + "tokio", + "tokio-rustls 0.22.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stringprep" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +dependencies = [ + "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 = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls 0.19.1", + "tokio", + "webpki 0.21.4", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27d5f2b839802bd8267fa19b0530f5a08b9c08cd417976be2a65d130fe1c11b" +dependencies = [ + "rustls 0.20.2", + "tokio", + "webpki 0.22.0", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde 1.0.136", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ad3713a14ae247f22a728a0456a545df14acf3867f905adff84be99e23b3ad1" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand", + "rustls 0.20.2", + "sha-1", + "thiserror", + "url", + "utf-8", + "webpki 0.22.0", +] + +[[package]] +name = "typemap_rev" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[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.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", + "serde 1.0.136", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde 1.0.136", +] + +[[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 = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + +[[package]] +name = "web-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki 0.21.4", +] + +[[package]] +name = "webpki-roots" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449" +dependencies = [ + "webpki 0.22.0", +] + +[[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-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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[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 = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b70ed95 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "ol_rusty" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +cached = "0.26" +chrono = "0.4" +config = "0.11" +futures = { version = "0.3.13", default-features = false } +glob = "0.3" +lazy_static = "1" +log = "0.4.14" +simplelog = "0.11.1" +poise = { git = "https://github.com/kangalioo/poise", branch = "develop", features = ["collector"] } +regex = {version="1"} +reqwest = "0.11" +sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "offline"] } +sea-orm = { version = "^0", features = [ "sqlx-sqlite", "runtime-tokio-rustls", "macros" ], default-features = false } +serde_json = "1" +serde = "1" +tokio = { version = "1.4.0", features = ["rt-multi-thread", "process"] } diff --git a/data/database.db b/data/database.db new file mode 100644 index 0000000000000000000000000000000000000000..81d319e840638119f48be37aa864b185ba52cad2 GIT binary patch literal 405504 zcmeFa37A~xS?^g@y|3jgj-ohjAvK^WVpa^xh%sn0}Nca+;D*h2+RE5 zbE>Lao824WVM>s8t9AO+cfRv|@Atm{_y7LixyMh}mQ*FJH?D?D6|-#GH$TNk>uPA?d;^!xyoVb7DV`JYl z{%50uV_(dVdw+T}(3^qY4D@E8Hv_#H=*_@C?-^*ler#ylJ@*t_U$hiP3o5vlgiET~ z{?B96=VzwoXDahkM^4XF+CQv3Fgo&FZ851ocd@w?HkL+Co|&IHK6Acu=IngsOmO=2 zzR{7T+EsPCpUcfh=4YOq=bCfpPtH!Af2wk7=BWo(-*3<8o)?!!hPG|rUVLdf8`R9R zYH_KVe;vJHNcqoXM71Ql@9IHhqr2Gs$kqR(7L%2KU@VDh#*NywrCNRQ*4wB?O*QZE zV3T=kHvwr*eMg*v$EvGt)D3mCg^F z57d%9m9u9mM`upY@HVEW=BB5P&fGMGTyxV+o7uo`xMlvM+uv_=&)(6&ZHKoP3%p$Q zeDj$FJn@U+@=`tf`^9{&FY5V!$6h=>G_-BUj^c;I>>bUiW|P@#cK$nj!+Yxd^bT+8 zwv%|r#g!~Kve~_OwYIp-V!ho$>&#vDYVPy~^4YlM?d3mSc~`67?CM2(>x_3k^@cg` z{O}I1adgjt;lXXwJMJ{?ovFL1cfK2W|3J1oT6680m-RW9z3jo8W?lYeJ#&8ZKDc#_ zu}TJCX_e&Tkip7l548sRhPLh8S!_L(jrDYUV>G+p^xrVz?vJ;6(0c#iwwaxGn&a-r zUevqa4!pRhIJB)=Eq-_)8~Q~y#Pckk@ z?j`x%o6B*`Hmw{vd-n9q)S2$@<^LLAR`HeQ^3}?b(`S#|^l$2U6)%fLyC{~uGyIOh zAKi1fG`MZ9dZ+2Vc``2QH~*xMLv~mW+6n$wEPtZF|M&j%W}r6%y&34uKyL}(8R*SGZw7iZ@J~7ePZoy;?lwmj`d=Ua#s{7qs4do(49zgA8vn0XbnPMA ze8{$cw(_yBf8+A!Kkyy@$4^{4p1%9;Km4iV-rK+Ue_8mKf8Kol2j02+vA2BS4}R^d z-t-?nd-n$)`_x_05B%}Sga7tNB*|Ya|3!iS@BQh`KyL}(8R*SG zZw7iZ(3^qY4D@E;pVbVE^bL&UP{IJu)nEPtdAg^|Unu{1`A_n{{Ih!8-ox}}pf>}( z8R*SGZw7iZ(3^qY4D@E8Hv_#H=*>WH2L69E14mldc-nofDZXxRmH7JRN91d%{Bgb( z9xeYu{*C;l_op`ly&34uKyL}(8R*SGZw7iZ(3^pO^cmQ-r!Oc) zi60u8YgR4Ii>j8MI@QPxRaLVbPlZwF`JPqyBx9?{)plsPX`;E+$hY09<(OVI)O5G% zM#?vn*mIQY75+QP|Ce&||2gviy()lz^jF*az}^h>W}r6%y&34uKyL}(8R*TxKi~|!={h&R`>^Eyi{)RG4|*{Fk9^zv)0=_b4D@E8Hv_#H=*>WH26{8l zn}Oa8^k$$p1HBpO&A@Aa2KGGA7Ze?Xq`#|-svgE+)lz9(^_1aO6VK!?mfWH26{8ln}Oa8^k$$p1HBpO%|LGkdNa_Qfi0ea=*9EgF?{h6zFvIs0lvQH#W(Qv z-K`Ju^WH26{8ln}Oa8 zY|RWjB{ll7>4vUrB~?vXr06}@s`|>0t9}xt$_zcnkJI9WeBhj9^u5qDZOc&AFm~gr z<+@(g)Ag{bA{E)G74i%5d%5_$+}m=!#MBbIYG`RvwL(3qMv;+Jeckoa)QTuR?}y}?2VRsS{oOAne7*n0 zvwVH~i*lcPUzGdod{M4>TT4D`M@#N=PfPCemX_RSTTAZq#@1bYeS>_|T`6D6kMm{n zVZKc4=F9jSN|Rq#7@hbPp#dD9w93y;{L17XPkyF+Vsfzj@yV!s4?pky>CHfI26{8l zn}Oa8^k$$p1HBpO%|LGkdNa_Qf!Fp7yfw=LM|v7NzFUnWhYWKX>Q&#eJhH%%X~t3H zxSlHg-#o|xxjIaA!_&FY)?HP#3_X=pvt89SJ@Qk_A~$UnevhkPCs*r?z3RDcgnGRS<3#sD*Yk^$ z^tPZtZgm&C|@PYiW{ow|QP=#nm|EG3|t@G3=s5+pm|aO*>SMXnYmhPgiET~3SXB$&0L_o$hFPL z!Ulxc0L#E)L^0Frv#VW887715KEuk>*xjcwm7}MT<5g45WVh=Yn>MLf-R zI!|+6UE&pl3zey+yqneUWXqp%`Yw4!KR6!T<3~!^G)YxgLXfdM43bKXD%;4jSdkd3 zxciJNPivpL9xjAeYZd=QrCRAcFgw;Y^u+h7j!IZPzHIy`<&{J%Bqz1gIMPloE~!Rb zUtFp!s>LN9`1rg$?ZSduyrh_(2>Z*g*^Ugy#5|d72|Z3sANG!6Db@by)~RxL-KB97 z8K#d3ab@|3ArvB0*;SuU*Gv;eQ0(VVp;wLePSRPV*}#q0#=4vAt~;9!ClRMgm7T;S zM9QstjJnE!qAQgu$Me!#pT_XJPxD$`cT*GcjK_nW0XsQX5V4G^>pBi^ENkO}<+nUL z)@@5qSS`1E#-p`H?Rt2*GE+U*s6F3Vdpd^kfbK-f&_myItEr3ev?3H=Jak{6hUu1W z`mSlE-TgLWySDN(_L!wJ0+$0HRv3q1n8XIhG-r}Ml~g((I9+SR%eAFeG%n9@DtJ0D zIoE6*lT|g8!rG;*Sl?BANtBji$#l$D_Zi&IcdWYlf_lDUSe0<8ax}cY#J2A~$N}9j z5-ruSnAO;FSj>?ZRwEq;Ls=L#BQ;iPJPp_^ThSY^~J~nIBEMh6%M(5AVWaO8BB<4t$Ke<~fPtfUz~l%O2-k zZK1xjVhT1oc5^fz`<}p57>vlyJPRB98;5Q+bXgPzK89|`CI@5Gc`e4RW7k|8^&msB z328b+vmu9r#gFv3YT8OUQEH`L9M6U?Bw=Ot$*NtMUcR=`Q9nH*qdp|dD&=_4JRb+h z&V0nw#TwG<$hA_~jwvUPy)x>yGk{q$d4Y|}5tY^(s=~Ucbe7p`U_HHeIDaQ|LCjI= z#~u&HOJLK)sm19KaV9!GYt7gE&|2B}D^F)+#tm1;-Xi0sDVC#hj4CWrUabeA)Wg~0 zi{`|>lVEkVr^04sHf+=u!+n*hXt{Fqav0U_;5Qr^${+DiU}|<8DLDmAjTL9vF~_MB zY1J4n-%p&-NX_nIBO1v3q3i{=y*bQZ6zQhzS7TGRX>^5;>$`@H#~u5ot~}jvwS3Do z>Pz*d>(|ugx6L~TW&AV2t{{#u!M=&vu_AG?eS(xQj^*P++tCvfyRrh|3C|{W8wcw|Wll9}s=3uK=i!0Q z%h4Uvu{d2h{UgE`E5T@cDbWls9dAtYbS!uGm1y1XI<7Xag*ebiJ+0~`9;dSxCwQC@ zHrm3rnVMy>tS;0W3rXcXPR;cj>~XAI8;fFBUE5}6V_ZW&_AQo&?I|}2J%X$3w^U^o z4@p(0!^T3r^;myC{M|w9rW{RiLPIk*p$D3QHH~~GGcs}XeH|y;Tsd=Y9sUM9?5%zm z^L_F#E(?v25JRllNtLLX=`e74@VQmhPrXFBtn)bSz6-tWeCkylO}7)d55ID3YV4@> ztgtQjsozz~-_glH;oJL($Eo3mbe^+xP8>f?;J0)365i6OPH#s+JdDv^4~_@F??c34SvJG%l&`Ue^=jy(svjCvUr>e|1tiw4(w*i3p)ch&{b?( zu5Xx_sw@&EEcPRft#2tajtxsQ(`5 zBZ?!=OwCPCov%EZ)`*6$x9u-hEz~j0)mUkA02v%WF@}z%ml$}_x^4OrPgkZFmLq&m zrIP2u>#hCo$QQ|;U=IPAsTmkZGf8p1EW*K%q2T_t;D_B6+{IG5>tS=pu4~x@ zAc<9VY>POA<&X2hJ}^wqas16tv1ziydhR)usKwS(_cHLp!Qepfj9iE#jtTc!z67dl zJscKxhMjnp#w!4FY(rXx)(NJ7+E&gc))i|?SHNf*04@6od;%niz!7-XCQ8wKUu$nf zVu<$g5PtyNkF#AF;;AS=4PcC_0m$rYT4bu&>U_ELDo%{oiD|35#g_iqOnWmYYQ zjimEx{(+w7y>F9+w=*CJ)Qt$Z5tz|dk$ABdOE3jv@V(dxNw(g~?cm|^yh7N#>ZHnh+0N~&yrC>!7pn>k<2X^g-p8H1n0nS#(NU2TqsxH@oN|D1M zRmB`B-nXWi+);Hbg`oC}mnwO%G2d8@ul&PWj>q1bzd*te+|v-ZfE-zhMFLnNqvp_8 znbRFjWgUk^Yx{sK$dz+5w;b{U*A4VOinkGrT z?vr#wTFiGu#t(bq6QdKb5TKH&15{OB71SNU~;7{F<<&HNKqSc*p z-gazr*MHHwV>L`3!UTw5Ti5^zE=DAD0dP~(^9d)lh=kM<&;#G8OFYkqh%R356Z?CIE0Pu zM`R{}bco3BJY+$pH-1WPc^s#2lf`lp2>w1Y3_AH$^25NH7#QLNj_kCmTsE=qknN6F z7K<^fp0CBcehCt81mDf|BJZxNg@(_v#JOQY9jqeA2Ouk%C)TLa0ESn6T+-k3z8REM(${nS>#Rg{shET1+sg$2r&5AMqP?ar3Jf$;A9X-F^LyXR^QlpV|x^@N2OUt5#XHE zwnP~uhkY+H9mkD47wD?9;a8rqv*9&YCuB7v1D73e7zdMVa1;@hk|YDPwSgm(cz*i) zN@9EcDQt=V?=BoFl+RCoV&ccg|6=@!u^$-y(~OhDGuY&zMGFQjPXrha z*zY8r1UO(HNn+kM2ZHcG*cyb=91@Di-S87RiQLY|WbsaC`0sp3hJQAg3Gnw786Lr= zT!EPtsJovCP!hRDL{iR6*=d~@(DqB@L3E);%+?lEvr%M?7)W6_K5ia7Z-6)% zHUJBTgbAT&O5@0>(Z*Vs*|uld zonzSvNes9c;VkHhg&h#8P3VSZ72J{JF=$a7YctD@`ZWcS=+-2ZDfB+P_bLbgk*UkC z6C1FS6YxqO@?+RV!z9PhtR$*(EKF5}|EPsa%L=Acv-O~v&%YV$^}vfF2!GX7hav^a zOEm8)r)p!0Efr&xR-Jl!8{yqBI=&OOk2kAO{-mfa$yR z&X{*Ve8RqyCxmw?76(cTZUG!YV7u6JY_P?yGtnM17G+~$9pDS3O%kGLBk_SY3nP-X zX23jP?}OF&{u#CW%<{|Mz1Xs~e2i{zNJFU!ekrba3OZ`xQi^A8!J35_!(CX^-A$-< zC~}+Fgqxb%4;~oBnja7Rp!GVBtw?|ecA*5|1v8XWRp_l6)(7Sg`QpyO)Zr}3(wMuR zEGiNv%hy!nj3DGI?t*SASNEWZKt00g!ChdZg{1H}*@z@V4F;i^X1^JSHxV#l)WD_1 zIk{*n~O!3JF-B**3hANW;A3u8!AiG|O%G69|KyERDF zrrzR?D$f9*xGmU@lk4JAz<*7Jg$?ZoX0kwwJ~%LOl*@ChJVW=pe1GGq>SW+K!zD=z zp9!NZJV=0nYNW+(;>UJkB&N(a&^u^@4#m}hjg>E#$iO9ZbpsU1ifl4ar|ZqIw$R$K zuRA_1v}5Iwgo{J60I**CDnH?Hg(A)>gY3qs*Yj!<0n4 z7mi~N5lN)8hGl%_I>vWmZ$7?L!9h~G4pcF~Mx1;iQ3%yh=)tOXRmg)vsx#VAn!x_u zk#^<}o;!Av+z9Eel=BS!o;)Cd5KI`&PlZ0>>9?k=Z}81RZbC|h>9N?2R;=*?PSo5a%K?52(awn z8Zq5~Az^46EJ}y)hx0h;WGiocUyp}NpkgaQX127}9AvIzZS8%4v1Xp6?onD`J3wbi zoaJSON#tW?@gMETB)f+5m#-*tOPvJp22b3LC9d=M|AU3{)a2Jp{KmxH<7({t$BLs* zjeOVe=ZD`sbZYR$fzJ)}^`GhcNa?3bgT=E2={c}@hx5BqFzFqTRZ zAB@n!gP#G0ItWw~le%=sDgzmif#5uX;9rHy3ZI0GlAQLP#ox|R^BC@2 zxSUYxK}ClYQLNZGz_j&&QF;V-7#?=jm2lFsA^4GvkHE?u!h76c3OgR-L7<{f*Bgtq z40UM3X~yaNCGZ?PhHio6QkWp=ya;Cy+sskIVj>9*(ZX(H?2LZZbF^OqX?UuxKtD;4 zxa1O9dBnB~-elx^rU%v+LImg_Xm~LjAM}Y+`Jj&nhdppHd`JvLZ8*YFjk%0Uxs9LI8`eX7a2VofAV|&yr86j>R z5Gdx9iG+~=2&HsDJBMW13Rbgf{&9FuRA!eisfC4l$E_!gvrdj7zM`4h1m@&c@F}TP zBdDM-0n4ZCnA$GT;`WEMj-6!8*?D> zqq@QKlEXw0F(5?=^q^!B1yE2WAe{uR&|Q2rwX_gYsB=?%y03DA{4=!+`zps(y>Y45 zrk6Z+B7YD!xCEQXOz~XtPfQ#-gDevdB4`Jc8;V>Yt9H+_HfzD&jP2k0hk4?7{xD~Q zOC;u9-^3zmrZ~8Xls17Su&{L)yu4v&1<-FljJZ`O!qz{SbxgL%&R|bq11hJH@Hbgr z68=enhb(~v2rUIwPF=lgm^vgN$yszv)CP!e6rBNPQ=gS;V%;_QNZ~X?cZxMF0ZU5F zdG-9Qn8^N_eAsrdLvm*Z(K(2UM6Il1DRw2oPRV-1J_Kazdil2-_J$M56oJH?V~SWF zPu2o`!K0zn(zd9krA$*`?&I~^%ioDN*1G>_KH&R;9h%D@08I+elpF)& zoDD=UqMZ%^-UR^L^DMBR?vZCs@$?mxM35`c1^Ao71j4rRn<+tRp83uQd+QqKf$4ml z+k!*T3IT3Na$}%4aij)1@*wEorgLT+DQT2$D7~`eyX#>cq3Wh`RtJuBM=bFe6T=~k zYr|O${)CC42oXLgF9|kUhiU_iy5hEVR`5E4|4og!I+c%jcd$o?$mf6-unc4^KzraV zLW+o#6ep0`@spLsd+UfdkQB9DYKKVaQ<*6g4+vm*W0ZYbP&}9{1sTjbce%E(P`g$+ z*~H){t(iyj@lv1cDK@DO@DN5)$V%xRGYoj`P>le-lDOWA8*`f(-opCi4Lrwz!})WN z-SjD;(?imBVBDO@QhI>~0Qp&*QDRZW_Pg`EL-JjpJGSA3=7C4LBj&)zR+{j^vT748 zdv7E~LwrXSQwR!)yK6PN->p~;f-h2r9`36K>WBl0oeYT#s?-x`P?P1f?^aY(B)-8E z?8Arh5zkP|E=9a1q(c$p=RAQL3K33%C=IqP)qrU9ztV_-o5*pB=c&aR-v&hm&miwd zLfUa1Sjoz=s2R?)t=-Du6>M|;OC*o~f4ESdo&4sB-x&Y9adYg0qrW)%j*;ubKRvvC z=<48qKk$14_w`48-&y+4B^yzMAKtp)f3tUL9ZmD8KNXmM?81JMGJ#lNG-|3yxAWEs zWT{mI2y@c*)LU?G@|Pe8eRh;*S#DuplHtepLvXSjIACEyk*;PaKa2&4vq@N7jqvv_ zQ!kK%4VC#uJyrEeo^mpvVF~*j+MkqwQ}qpbf%8hI-j7OistCe}+NKw97u)|iNfG$< z)&Z42Mm5-NlY&980PC1oteY&;k&-siSn;|+vc?YEVCfwm1J*!7jY$OBN>Y)86eKg8 zX>1mpW-I`y5ltu~kA>HW67!J5)`;w5@mYr;tpIy6T<{`19}00 zC#()cI&^Z}vC5F0N+;OMN%`v^wH3>#4-;hXGzj8@8|OMQsoDrD(& z!ee}YUUwP^iG+$*v>BSu;tZ&j)&A&v^VNPK*y+chkhtpj+L(Em7_56Cj;5HOi25KK zeslK)w0+vHnL*`a>(oltw}!ln`6D1e;EN+2y2#mNoGFhydWeV(sbDRJs!e4@x?*B( zegtvG!EM+hpj&z*d&ee7_u%DAA|ASIWQ(rQ?bs;Yy|ccdpL~xD{VWLaP7hkLDV3uU z$WS|Yl2kVBY{)00EJE?{?PkCG$?RJANeSH86#)e}oST4%*Y_-Y-kooS0|Dj|&L{OR z5R}D35Uhl74rYx)y@Sk6BHn6eE9WE=_rM0B4k&1TO4LVmOO+Q?5uyY$!zCPQc_6+a zbZ{OV4`~}I-Obro)pzA%bp!bgkW1>xsEsCQg=9g%3C4x~5r93lVmhc`XRJBPgt2bC z25)2IeL7#_2ZCKZD;Z~wak%QN6KJy_u}m;|eVeLlFA@G^cf8&2y2MK_<8)|*CPMuq zP~bcbL4|ouk>pBUheWoVqIrh7ZCxSQIw6J)g090!D6~K515A~|FVG>9qZajq0#$=Z zycD(`d}lu1ZGnmEOK6h4f{8(Pl$5!I#zaR@Rbq|^Qq+jibjG{#T|Qn;pS7oOeM0m& zB)bmqgdN1kKiiPjv??u{!IKtx^UvcFxPo?chuh zv5}>|%~-pumVy~Y?KP1Hbqj3MLPt%jH0^Z{mBRBjY-zj%o6f*c))APhPDr;A*%3gUS`kU)A&VtKlUPwa8uXcLn*QJRQuL1|A?#1hWTLKZM^hDujM&CB_XCt2-`HqoiM^2C2JN%c!pBw)8@C(D|hIbGB z?a(g{eb3OB3_UTlZ>Ti*D}(>j;D-mF9yA6=27YtkQv+Wy5DvHl6aD{J{}1(lO~2}Y zxc~Ki|4-kK_I`E%-QdS25NyuK&QO@%qVu+LgDP;1z;4j6#>`J0>BPMN)JS7$r zY8Gc3qyi|4n#d#KvT1$iMIm%8nD$h5OUPt~5czS8xTTPgJz|~!pWfguoyHYa2g5PQ4hFEw6fW{)x5zTW zkcpL-DUJv zx zfu08A^dQTEyAc_}Y~}%Qr4p-eSNlrP5aH!Y$*zS^GAv`_f(SKPyjJS{)1;Ki5mTKM ziou*6vr!o5&fMIwW|k6{%4jePi8h)J{gEkUXyY$meH;%Z`+ zu$2T|@HQbs1U9f9RSLnAKEX~0oJ_KPC*Y<;{dzmm!W2zH2th&!Sc)>!;sg1WR^syqQz`Qf zw~9l9$wyTT4-LIJ^zlmX>0F6GpTp`z%mBe?rVHg1+zKzG6bjaC8W%FlNvuSbHj4-l zjKIW%#0zy4LQ6vN1$h8!>b0WE?kPGz>}iVph#4?{JT|o>EWDVkB9$bFYLU zCW!w@9*bR!Ilz3dH-PHkScP#hf9*Jdv7o}R#>8||T1%cx%3VPCFiE`kxR?oMYrG%0 z+`RD&(n&?nS`rPBO`<|FVT8KH&t#t-Arxov!Av)oXXSs0E(w_8a&Vfwsj&3v>`LANex5-bLb!koj%W;=2ga45r0a&at(Ku8~#zBa$o!12ItqY1`6DYXRqA(_NS zBq8xA7**zJLRNE1;32{E-JCMBP z-AhI$^!UHHw2)s(37yaFJVcZqh+}P-@NM9I!SE$xHo}@(i*rWNAp|aB(kqa&PsyM;9$r50lG)q8>MPkS$A zFlN5lsq)7Ml_P)?1Ah>APOv}?NE1a4q$3ie_|g2s9oyINlQ3E`??R{%qr_{&O%-?8 zOiO=|UrD7L#Vj28l6KK>7((&>m~kqLsXoOEF8qi5N}VMDwr_gC7f2d04ziG(cBYGb zny#~#ihq_p&>E1nC$kIJAlCKv?6XOJQ-+dBrZY;W0jHD6L|BDFQ}o<$WDEZ(zvZhJ zTxt0&T@F`}DN{riSYphMtUr$;0ca4eh09cYV}2zCWr!1s3ZwYj9R5B^{_H5iN%%|P z{9)hD>`Fupal-L3aZ?2+!fu1EaCerI<5S;knx*IRD^ZaWf7?XzAvX#Lsv)kzUIp)` z(##6`-jZL5(1z5S8|WJ3_e3X_!wwHoP(MB?>^q!Y$=OZHhJS(&&x*q{g^MT3kZ6~2 zDpF~!mB#Wb2}>x=k@w9)Le+$`)5TZjC>G@;s`FLpO{0asD9japuF(Ir{g?U=^}nI- z5BfgS_YHkl@|e5ub8TGUsq%sHz~rxGxWKz7&B@V;-4C2rhzI!Y6h8z z4@(#XN8%>VUkHvI;ZP+wsk7+P)afOH!mRLZ*p%!TTu!!{F55-GevZMuFuNzNh(jF| z$Gsfvib5?gb80sU=5UH)5|~cuujNW$0um(RKGRBqdqPZL_d*#Ewv-ObPS>5%XY(s< z>iMzM@WpY^D3&6+q>dD=M>>qS00yZlKAvBRsg+Ee4G~-d4T(b~AQM$w8`=X=XYpt9 zD^XrRQx`u%=*bvBPE8SEpizoc{F93E`f{8?xY2Z~AZ8RXn}n#y6U{f#ec;y=M^V&w zcXm%GYtq_5Wc>Ja5uNo@iW5SruR~mPV(X~%vHVJ8<81tEDF2wl5GaM(Yj}kujVTg? zETt!<%$q`;Emokg&^N?Kg5pk=5zqvj17ipz&iPUN-}8G)As}fdQ}qAZ@iGT2!5b}5 z9Nw32_GO+AC3LYP!ov8~_;Li{U1ay(^j-l_A=8FU6f(BNn-o<@ZwB00J1j=|m1Hg*u5_t?f- z6=#`eCv>s!C4J54E9Y0@K&2!vOj!GPQ=O#*G2z`(cjkxo~|FU_ummE!`(lAr(v zKp~TS8A)u;C1LA2WDGr3%*?iFMUcZYtc9bHs%PGNBmpG+1=uwB;89Ze?);vUY2WYpa_YgqGcC4ONV2__X7nRr21rKO+9ujD``Da^o#hNyXlsvqGqkRL@A#30Txqmm~U znS382709H)@?|rz@9?5|rFgm^FI4v8BR`+rlEgAzB_e(NG7khag-6dPC{g|<)X-z6 z_-olM*O03T@>`m0YEgg{#cepsA}37jNV0<%oX>(#RXUqp$)k}i6GTDq6hk^sn6N}y zM+5;#(6Q(XpUysf4N7C#sc!0YR*0y7@W_jbPr-I0*F|A8fe9s}RKk0GgV~2urb{N? zph8Ksog8vc&;!_~_}w5*kiTrNFAE<`jbxIIcOvbZaFWPs15?VX#?xU&H9L$8-lv4gAS;zCu`R@?yupN|Czne_D@Bhmz;)tI?!rAw zXYwnFc|wvoV0pYJEIV5RmL?83MW}?+Y~$i|ekBnYYQQW>aD5OLJa{YxhK}(QWLtXw#PX;}EHY?K&W5D2!q zFy-+InRgPiEF?5|pktFTwTi!$T}hCSk<JmD1_jFJ|=qzWh4kroDKNy6s75$F+@54F~1Tk z6%k`lwTwv;bPQTH=9oi3a7L6i_2R$Ht|XgEfXFyw@gy~ts3%fPQ17uxYz)HVz8(3M zP+d7U2w7O{_?#RYmHq9+Zf6!3#pO0$VyL*@Pc?7}sO6W^bGHdKAAA?DJMgNP+Z zBt)Tr5g|5#{j$(@D|};qO9&hUG>Eqdjff&3b{n8Pf54lWkLa;(N6PXzA3_kLXbAG2YuLE9xef{hSCe0Z+7G;$D-%>{Q5@FnFenE4X==YI;m3rU9eSg03;A&cXM|N|8eHT2{a2olTFeZD&8N=E_5P}0AOYGV|eLO zVdq7_!th>2{lH0p8!l&~L{32DJjnBieud~^AnPa$O?)1LbCk8B;wSPeDV2}N2thx< z9!2aBsu=hL7t2S%C-b6}-kn`3f{B^3g&_;c#Hj?Q2NlGl1CAhMOpMa+=2v>WJIpk2 zxVRL&90WR<1DGM0Q;4CC*LP2LC6!k+e#7x1fal+ZqXbo!0N2H7!}&Fxxb*G$mDDmx z9WUnrR$D~LI0(e6fpWqg0Ax#xKbuX`8kDNM?3SDvID$NSX0(Y@nICe`)INfxv6SF> z7XCE5l5_-{NIUmkt^NI3k-p)U-brUSq)qW^cH@2g7x zvGkVW)xwXxwxY$>gI|<0cy`1vcO1*dJY(sG!F2j zTL82@cdot&;i${0eDH%EEy?;{rMR7 zhrsx(dEPI9Drg`lK0^l1nxEdpU>~}k4|a;emV|N{7=nZ^QdKWqGpUPX{n1qvOkPKn zt4pK1-ORegc9P)&xF_$%!NY?BkE2KnGEKb#$gip0h8wl18bE;zzbYmXMQ51{Wb@=}<*>3Li;A z8B7r(%cwCyrD-eD)N?{>Qd_JGvuI)WOmM!n|5=_SBX4m)L(LYc*DSfn@gtI&I0$T2 zZUX57kYwdaGA5L_QS#QtN&Y96^95rEk9(X+>?s~Qlu$<_4kw=os9=IX;bFq(>`wR% zQ!iQ=khnHnUrX4F7lQW+XwBwQSQHNYECED`4&FOO*a$luN73r#kJa~8gr9p8N4YO}oOVyI>guk{edoJ&Srlde>#e-qq9?GL`4hOoZtwym#PFKX zA;KL);~K93OGGdw7SMEs>(QZQc3(@kunW)Dz%j+s5WRLz1;k}oek9uw!o$x8RDi9U z7u3zy5&DLii-e}gXF?K?%4BvR*)2X4|{j8 z8>@z@9$_rx1r`!RmDryzoG)2Uo#Wyah7FESgF(V^d_=-KasR|w=Cs#S5<}t}$SYiW|VDfe8b%ln^(IB{*6bD4zi=o3KA|8dvD7d5-~%$|gz@ zKp{3(J+!}`FN$r!K`>tr*OWOS#Vm#e=gr5?;K!49mP9LFdS@+nD-_ymIV;%WnbszS zwh2M8{fpfJlWdh%NqE+-WUvsfXAy!gllRA4rK>TK-zyGy?b>pi81REv^8xP(c2UIq zsvh?p2aM_7fTF`X3IEdz`Cy+8cCptuV+HC$T>}ptkVtHj@c;4Y5@kwhyAg4lRA_YL)MGucVK7|}H0Pp{lk~xRo zmp{tcU>7>ugjH-!T6kb{$+VDx5M+{VNeBqOwCb$6d4I~IY>80wI$y=nT0VY?pn-Z| zJQL`~G|Q6{3s1`dexqE8>=nr-UdXMlV&$|K2zAp^h8yg=`^e?|F=hgSf>(!X?)Vr; z6`=A9ZUQ-y_=Knknk|sB_zY+Tl01j4Ld21sol)(ITB)Y*DwdOmL+1fb7(5IT0xk?) z&KA;;bS7YZgK)S`ra*dHiV2b2x>R3mS(ow$xGy+}gUA^~x-0~=^6()EAL2|2?J1%MBl6|xhAPl z5wA(H(umnhh7snRmP{R;n$F78DXidz!gK~ZKz}O(!GYVzwBh=ZEhIYz_g2ka3#-RO zD!<-{FC!+^Z0&Egd%9QY7zfS>HHmu53vg&fmYVH{V>%<_fYpl=0@1vDTKAmC&LhdW)SL2OBI%V*Ee51V(NsK zs6$arwW_>`lJ9kt7pB;Qy_ zwrbd-g19ajfUTJzObCL9w#E;M)U}i839CdJY;?bzBF5jq!OQ>D#YDw?)4Di^o z7V>px=xy}T+HmO?v@xi8m?H>fm^U(R)IS2Tf%TFG^y%N2o(?PLurXoFX-TW~LX{>5 za85&DQbIhUH6AP>GeUKSL~10RDc(dJuj_p3?$KJKtEuX56r6!I!@)=rNy=1No7AjO z=Z-8V?g}X|63L!^gjQQi^@W=h_gd9fyN!A^xQ~)uX&%IJib59-Ck_rPgRF2SQRGN< zKzBWK+G&6`bsEj#a5~UNI7!LyV3x@lfNg=kBXW$wJERFvALsZH^M>}-=(1pF$VPCY zV=ZU`E5sayD9pP;2tq3G>4=bNlMD|c472}gii{& zz=L)zOxyOJTs7boTv}MxY(A1gLS95AglrVmO6abEMUtwuNsH%L!0~xu0@KwC!l)~0 zAxHK;W#tT1ghi05hbD0LN_ah#=47p`^ZCwz3emMNX>K#f?yU0m=sT086(P?vNchM2 z!;}z_wMr<-CAVTBS(G_hi{Vn%S|M*1bBw@&ZjGE1q-j7rm|bChNDUXwZ=fr(wqyNF zo$BLyYj;Z;nzPaD;65N0`lkpx2zopqB~=a-V{qz`j>ou?Tk15C;{A6uIF-&QHC>>qPp5S!fDp@uhE3$|P>;gBhHxhQ6b=xe9LU>r zMmL;u;qn5wTue_%))bgT29aIdxyHrs$Q{08OnZ zY9O8?fRZ9(mK^L9j5fkYsG9>OxL$hf*xXb_{El@G)o7J+7ket$4#&b*Qua*?K3+Xi zZs2RoEIM9kgr*=pRJtzqZReAeIn~-^8=Fw#bn*1c3WBh z@cV;RdkW|}u; z#Llz|veynF-Q$y$W-Cg@m&k^|3XBd#YbcS_YXRXShX9$ZYs5NceD%5EY?YGFCeD#F zACwg|C+`A%1-x=$B1)W0DToN-k<+3M44{%mkYJxH57hn6wN_dgVH>7H+D@Pr)IA*~ zWWWz356xnNb%&h9a+8< zE-lr%o!F{hoNsP4B0` z8GVS1R9I!Oft0TZ1%R@8M_SgpA>HPd5tcs}F4h}zcpiO!KHihG#q#hMg{fjt*e|CF zctLhLa6qTNP9SgGdAtA?>>sYAikD|ai-)|83$^6E9929RH*7PmMn}?vMT5*vn(jj~yKSo6(;f{hHB>qYsSy=E%Pr zX^l(`|IP6C4qqAehW>QuGeciFbYbYO!Osl7IQS@4{hu57(t(rk_J4xff>Zt5`+leI zV|{7gy`}$B`uC+q>4DC zru9)a3`c%veawj?w!FX15f~0y{efB7AdldX*&n!tji)h<{$O`u-RVS4?+4iLE5O8<;>px;CNxv z%6k5T{lS64#?;I9$TC^C+|{EG^aqCun^B%RxLfwd26dp$zN0^Qy0C@HOEdS&i`aZh z>h0MoUY~5aexIC5>uY;)ul&logpQByl5M(KrD44yAG|KO^XN|b;LUcEJ^8l&;A~+_ z5^d8v`h#gsBAoP%x0HP3t^I*t*m%>s>OK9zw!)h8^F;f zSa*A{{oDG3?S-{#g*k8P5B3yds%=S*O9hH3sYwt84TXpVIxBuZ_03L7-{|W?)M8KW1&AJ=9#Iv>8bOTCsUN4X#$^r=D{~)hReo9r-TW~ZrJqvHWhmiIZ1zm z3DK)A^}=xK{PYy$m_2F@SBze|3V z-vW1ouLDa5M1jzk*g>d&peoddBkJnA^H8IjSL?!!YA6~lh7XtJyrX?01agXD=xZWS zsz`m%BoLi8)DcWf8MSG7V+MIw=Nk3)2R}S1zYSas(G5~bA|+>3n-eEX{Q$CQ#50tj zP;oXzYw#5mE+4i%A&YU{-O*>q`-2Mw1O*{qLm5xdk|k9ou~tew1}Rk)Ba{fEJ)Pst zX_Zy7u}2#<37u|0Q)b4pqXLlt0&ZyP(u@`sFg#xL1X!@3=|Gp%7SiLK8H?*8qlcDW zxX{LBfDINeDSb4vq{xNRY7oYiOW29#0HXp?fdNh$idK}o2B)JlIrH#{%pOd0fIpb` zRA&%5Qg}y!7YP~`Ga_hGo#J>WX93&J)fVbYGW7fdonhHyl-5&VOoWxqb2XAdJZ1>5!605fTPS3UywkRSBkMjFLnp>r1d5D@qha`5&v95=o@9B`d+S zp%TW20=}S|M4~v2ZdLr0$pgoTYiTW(`2V58*A~h@TK>xN`SP15e|z$~CKo5IiC>-g zmlLNawvYeH_?L}8I$j+6g|V+3J3rPx`tze-I{L`S-;Vsq$XAS<9RBO!9~ypX*dO}q zp-&Ah4(%TN!@*AuUKz9p{vJiYIr;|vNdH{_7%F~W()UQ|7fT;49ioTePZz(s7!-?q z=e>;+oD zE_BRv`?4k%3FM)Y%5(WYH<*FNOXr{O55fWx?9yqICT9?41X%^1=c|BTNNyn9OY#)W zerYia@TD4;u2-gJr}8EMaiiY6(K5Kt_3zwyc6pIsW5*{!=bPMmRh}dJvB-|R)~G*Q zLxZ*wU9U9Zo+3&Atk`3^JlH5*OAUx91Cd)28WM#*6@y}GGE9i7 z!o|e8ON$UH9Ab)AQ}+VQcIMz1U3OnkK@*Se04#x!lqY+R^bbcD_Bv^QrP%MPoAGA)lvy&&jDU0ENGQ9YtOKPreb=D8=?rOfvoW`h=9ylFw~EdM%57q;&vh3`r!Z zRzstoih2}y$-was(sa#r0~`nLF_-_Y9ESN~c(^X6oSZgwq_W((RPaBT6ClAfeWSIJ zPakFA#95i5ie7obYcD%K|J0&bP|B#;4kR$CPGhD(BAGK0Kd>peld6&#tpP?@cq zQ;oDPY!4PszE!eyln>?D)eM+{pi0RTS*@&24yhAijZm&gVOJbMccG}iEqk3d$aB#| z;u<85=E@^oUcjxs5F`FW>tQP^o9B_BBv1e*(}Q1w1te4Gc3xk82Zpus5~myClBxh$ zSF%RAN?>-nJ7@WX?wdY(MIs6kurwkQiRDVI3l8--p!>`lgnzs^@rGj37nG<=UXt?1Na~*2IRElBE0y1J z6=V{cx$_H@^Wd;?&Sfr3Y?IH#&0<`~%$46dtOSEZ`UWy3E-x+^)y-jB#@%0e+LxvDv z&n7I8$0qeghMl+sfFIX@#GG~Oal7gXWr9F_Yb>%29-kmu>A<~zU@DZ&i)|2G_p;b^B z&5;Hz7450$==`ko+_`r7`r&uUYN9w2F=#1FGevyOl`3u#I3Zkwzy{p{r+Q`Oc0AzB zeVlz-q5+Oe+AR=xKzU&jsVn7o#RZLtd}!W-XhRs{UCAJ>?&PUGC5S7`JxT(YOwwG~A-IAfuaEX0 zVq!LWjBq{T3++|;$diISNUbq~H}F?7p$D8#QSrl9!jZ?)lJ#S!tgdb8?&HH3vN_~@ zAk7D}fIb2edS;FX>L4sHXc2_4hToZjW7Z94`0*zMUV!OJDjk0#mg&RPv7S+7B%Gua zpAHkaZ0_w+=||P_l5{S`0XZJXjR*wLx|3)hNiygI#IQIWENirADcwd3#OQ_sR^Gx$ zn1eSgrFmIOr~P9Sjhnp!;ixEyDc#Z%QpAt$y}+$n}Yq8+D<>JbP-lsB73d*)O{UaMMsF67{- z%w}g~vwBVtBCevUQi@Y?q*+GtPIS&loM)=@$)8f{AQp1w(Af+GLD`MQBly2cI3)r} zpjIz+Z^(+EAPL1x&!SkEJ9z}gRLGc*oe`&jIG3jE6eQELR<u4vZ{J7M*EJ2TrKJXJ8D?=bT$Kvpo>Pn-sbi}0Qykx!socO5My`g?MQDSN&zTxj-=t`a zEZ%L2CHXi`oRp&-cLTiBjZgkzX*sJd+QOeW;7?kpk%L=DPg}gp>20X3o zF>V@)(g>$CS1vp0@qdxQ2YF+2kJ^jJzvJHG_=mK9E{EX~GLtYz$E znb|fw*`1N}E26fv?xt?o7tszJHQof<5?7Cdk9shaV68Tp~maO8J6n^M-LHj?!&sx*1`*Q-uQ^9>WoES|!01hmH z3#8!>lDSnnsq0i+V#hnJIidEqiRkzYdbj)E))^kqQ@Hw~xhpNQP)-xCjEI5`WAIiW zoI>6@9bQ^q3^~MO;b6X<$H<7o2kE;0s*(*I-b-Ggplcf?K|hm!!m+L#A1L{s1rLtVygYRUFDzdPsm0lu4|FH% zo7{jVB0r=m_yRFd6l6dKNgATpjUtwQ+x6X9)(8o%!-d%BLO$GjTR!5cfF=3r5^>!L zT^V~mwL)LqoCmYfN0@HykVm*5D&ro)dl(=hy2SVhZ3*!37&!3}2qKfEpzC)F8CM&X ze9{R9513MnxoIB?0LRwJPat3>&{CFE(@}tjZ4I6(TJFAaw7v*b(Cp1 zSBfbipGGl`h^3%*fg304lu}9UNDM%wQD>2_Ecg6PWK~c+{+jB&*HZ-bw$?q}5#n|U zw2O2Ym9H2N{4v^oVFMvuq5=T^Lrd{j8sVA~*XtSKBdxdOBitFxA?`=u2c!yIf~>R@)D#e0_rW88{acU+>MtQbv$5Vv#seX zcA~XCe*y}mIr%emiH4hqUr{F~Qu}zWj0q(bsnP*gx^<58BZktef9e8hr}gIiS!RMA zi0Qqm$lh(9rDL`?Uz#gYiu4%NCAkK`LdzPmg#@Z3-su#O((T(+^YZ{aO)3=kw6^6V zzc08S>#wtyDCVY+f>4m;MkF0xq%}0q0Clz`2XB1~-I0?OTvttQ>{7Lh!V|UFQe-4D zX-Mi4U?Z4Fbw4$zCR#n9$5TrHAoPQLr1hqiMbB7OA`6Ai3#?h5mqQ*T2>n~|A7I9n z9<8g(DKq=W>A1eu=UcVt_qFcMpTMS^h>#aBRXXfsaJpt-X0S|(+)r>sJ9Mb^uspHj zw^hD-r3Z0Q09-fhuw5p0uE3giIc_TS0m zF!k;R;EweUSmOUj3SVC!`+v{mZ%%&aWIAb2{O!a~O?-4B8UN$)Pmh0ae0uy1WABIi z|5tGTzj}0fbYSEsM_wA49l2-tH-?`Xew4m`KRoo((9xlx!EYP9I_M7$4E)T%Hx4{C zaBu&A>i_ostNl*jFZF#*--W*IrQa@nSE*Sti+@-A9R2&Q6s^Kv6<+4UZ~U_#a{l(h z+V`;qGynd=dLP_}mM^TS4b^n)?Fj4!NK2AK=EbG1-l0z-QQDKM@8p;xb@o$ zYp?z@;n3e#SZ8hPBarA}JZ`v{*RBjY#N=)-F=xZKhv>9kfiw+vJv(3>l3yOI z`f6b#dMwBHlJ32KgC{6dpBFkkf^9hUJSzubC~0Od6}e72y-13j<}@mzmlS>YK$wp$ zzpqAeL#gDs@cJS6^lo9pdW1T>did2ezoK%36uu20IlWhEWf(VdG7BZOHVy$@~H{qT?;J3nB(uV?%6^YDAARQrdY@k(^AuP?ti@ zjC!aJL#RIp4OXYFAL5Zq`w&0|(VNehY*YgStI=*ajUM9;Aqls7V^QkbJ1nOuxb%k$ z+V6lHL+W0X{B;^?@m8p3MS+~kRw!=hT7xBq-tl_v2dlT%h?i?i55u#EMwUwFJ_^D? zs-ck~k|FtX$OsU8P*M;ww|gYK+z8P%Ae+0t``fVYZTLLA5fSO8*#y5$uX-Q~LLi14 zQ`S#BYrAtQ$|N$g--gMduyiNy7AiYo6K!sYa^bwQW~GBF+*zK3bSZ>*+SM9P&X|RH zgidLu|3G%6qAJJK!lh*tOv9!NBY$rJPB>J2!q*`6j9ZS3BpUDpp){e3PBYjiNP^tFJ`TgXKUmm=_EzhScMSxs*IlH( zmvS7C3~+lQ8$t%?H{`Jr>V8q$r7MHs%w10w)%8`Rrlt`1uI#JKw3%_!EC>F2Mm<-_ z>3J7WiEZv%A+fLdLOOusMAEgAb}u0Ebc18pp!v^g5Jenv`iuzZ+*haTP57e^!R6N> z5|L|z2ru&2*-MjMM&@0Vuvxnxp{Acvbf*`VqwXGaCS=FZ$(25_QU?I+!Fywel1df| zxUInDS-o~V$8tRHPQzttKz; ztH2*^)RNo)y~023hvC1yz}_G!PE9x z-&}>vx=^o|`U5phXCr!8&}IQX8>ki;G&(!FZRGbyzHelC1)W=qF z%+hz1$`m+*rxxqaKZ{SGIw#t`O7}>}Nl`?{~| zzx)<~H`^CD2ipQXmT7~Zt8ozyIj%6vx#LLBp|j`p!Ml38irR4*a1T6%-QL+w-P1C% z2?gUR>iqs*AJDIT$l0QM5yLB;jIbueXu{>rS`SfrKqt*BtFVh5!DJTGuGWuz>v+F? z^o^Jt_gqKmd_~0Q2ng+zWcjYyZm?KTf%FF38pN8~e4Qz9NI~`HQWHr$`yZ@edt9D5 z%<0L5H_1u}S;cWnGQ~Ncpf*lcXLugx-M^NoCCD6#W%N}B;>v)rI%8P<*nz<;w9f_D z^#SN_BUjB@gK0ee*xDf^j)PY>q%C|mI6kI;mco(E*K>qjAgD}8@ih(}I}9%W$ceQl zr34ZFyjG0Re>!Ca&-tHKbdAfhfIAZiv(8B+TJe@IM~(-62o-71gZ=I! z$JUOn;Ww?{=9Wiof4d_Z=MOxHfL8G`_6vPePN2LN{i^qkE zy;D?5sSROESB-~H-bTxDpZifG8lguZHViV1!!!azn?~@0VWFL;#7K=gU!*zeGG-jk z=~%mTI6gR?pJpI_gg|(rf(<#JPPiq{W*18e@1gSGBgaoZTi<1C zis1$EJ2@X7bGS)`TR;_JWXAHKi48fT%1LIr!6Se;fmmId)M$=@wMGTElfogUjK;hf@0GH0-rse?)dIt9{n0x~`K-ICzXS@TAn?ezXFBE-8+1 zjzSX_vL5?N^}ge=B-d8jDN@(zt~Y%3RUXB5SRY=8LUZI5bVVDhq#SDxwNE@MxZHC) zT5S2Pu`h>K^Ge7dS247Oz^Ni4G9?d-UuR-h)g7MaB~~g?x^ryoCn%}(m`FrW(WctK(E-#Cn5(+`uymWHaMhG+#UVp zcKc3jienujf02IG5Ep<;!|^o~w_&JFri0JRj{q)dN6}=%<9-17>*kYKW)Ij>Zoplr zIty@$f^Y-xZ;>i5dS~X;0&Vu-0HOMu_dVlRo_N+9sNyYLM(YHuS^G$lK?H4?2j(6# zrDW$1Odb~zFvF8i969k!Y+~19Cuj_Wy*mXjbaN*zl(*9nBv_8dDvnDOv`ghsA3FQ+ z3NFIsm<7CNVv}s+d0SPn_cVfN1whfpbZ$_n_l@I5w9_l7<0Ghl5Go{8DK_ufcc{hT z@iRJAA%@D_U2SZr ztth04e{fxf>c?(FbWp0r7K!N29Z~*V!-ht%2TrV3S)&|7zQ3b=qWef}P)}cnaqv>I zOm(X&8tst*Dm$qd1U>-tUiG5pf7b>`bB9kp(S8kP0fMnC0JRC-zYex+YjA*vNm;mh z2uY#BS4-<*)`R`W9`7H01WEJ2k>iisqF;??pd96_pagC2OukK2Amu~8S8EFgMT6fq zxV|?j4k4MC-Q!2vPrL@N06iJ2OK>a1vcZ`o`6QsLjg-I~qUQicp?2yk*>g%VbTfXz zfy_F_34x%gt~$2y{G&6kMrDHoHBn)q7;w*#-oE=D;VzRi^MduSco+#)6}#Xv!6y5+ zDvC#593VZWLLiaQyOjLNO_PvZnA~BCseK11vvG>7+4c8Ctd3oQ z{28jQgD5~*I$o-2uCsBs(+$`q_HMNo`z~TTUEfIeVGLX(qGdR0cQmWPMvoBRzV3{o z{mIr27;L3;&k-r@)pt#|UL*(RVx<+P>J_CMwoLwFc){UX^lbz-!wN~zS7Qd$h=+kZ zFo3g729^zO(9UA9Dtdy7_+p%Ax319{Sl{6{V(k^2fXlN!e7i#sk6f`ew(JOPVJij{ z^_&jmb33c2uJQ`}|D{;Olms4ajU6N zb7m1N#m{X#W8&xKdD%V)|BJ*3ig2ruAw@_{62i}h-7OvwsI6Fr-;V&V|IBr8{V&br z?gDUZRk!vLMwQnxirh>crxJ>k)y_eRcgK$$twQvNu+&8G?3-?mr#cVNYyCiMiId|9 zOOXASWRswsR&I(_GAZmR^8YW+9?o_h-1)6k|E^zt@6yjLy9o=KRP`+b zNeeKFlU6|6w~wyg?zc9)b$ERa;CQ%o83jn*0WxBv^L4`r+p48|4Nib^HxMqC8tVX# z4GiBVt$?Jr&b`JAlQ?AwzMwu(fn?xE`zwm7z0exzRgxUVL;bdh|9FJo>w9iDw%m2O z
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, + token: String, + high_tier: bool, + custom: bool, + #[serde(rename = "isUsed")] + used: bool, +} + +async fn get_invite(invite: &str) -> Result, Error> { + let client = reqwest::Client::new(); + let req = client + .get(format!( + "https://api.morningstreams.com/api/invites/{}", + invite + )) + .send() + .await?; + if req.status().as_u16() == 404 { + // debug!("Error 404 on getting the invites, this just means invite not found"); + Ok(None) + } else if req.status().as_u16() == 200 { + let data: InviteInfo = req.json().await?; + // debug!("invite data: {:#?}", data); + Ok(Some(data)) + } else { + Ok(None) + } +} + +#[derive(Debug, poise::SlashChoiceParameter)] +pub enum InviteActions { + #[name = "Does this invite exist?"] + Exist, + #[name = "Is this invite valid?"] + Valid, + // If no name is given, the variant name is used + #[name = "Get invite information"] + Info, + #[name = "Which user used the invite?"] + User, +} + +#[poise::command(slash_command)] +pub async fn invites( + ctx: Context<'_>, + #[description = "Action to perform with invite"] action: InviteActions, + #[description = "The invite to check"] invite: String, +) -> Result<(), Error> { + let invite_res = get_invite(&invite).await; + match invite_res { + Err(e) => { + ctx.say(format!("Error getting invite: {}", e)).await?; + } + Ok(invite_opt) => { + ctx.send(|b| { + match action { + InviteActions::Exist => { + b.content(match invite_opt { + None => "Invite not found", + Some(_) => "Invite found", + }); + } + InviteActions::Valid => { + b.content(match invite_opt { + None => "Invite not found", + Some(i) => { + if !i.used { + "✅ Invite is valid and not used yet" + } else { + "❌ Invite is valid but is already used" + } + } + }); + } + InviteActions::Info => { + b.content(match invite_opt { + None => "Invite not found".to_owned(), + Some(i) => { + if !i.used { + "Ooh this invite is still up for grabs, go quickly claim it!" + .to_owned() + } else { + match i.used_by { + None => { + "Invite is already used but can not find the user..." + .to_owned() + } + Some(user) => format!( + "This invite has already been used by {}", + user.name + ), + } + } + } + }); + } + InviteActions::User => { + match invite_opt { + None => b.content("Invite not found"), + Some(i) => { + b.embed(|e| { + e.title("Invite information"); + e.description(format!("Invite: {}", i.token)); + if i.used { + e.field("Used", "Yes", true); + if let Some(user) = i.used_by { + e.field("Used by", user.name, true); + } + } else { + e.field("Used", "No", true); + } + e.field( + "High tier", + if i.high_tier { "Yes" } else { "No" }, + true, + ); + e.field("Custom", if i.custom { "Yes" } else { "No" }, true); + e.field("Given out by", i.from_user.name, true); + e + }); + b.content("Embed:") + } + }; + } + } + b + }) + .await?; + } + }; + Ok(()) +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..a782477 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,50 @@ +use crate::{Context, Error}; +use poise::serenity_prelude as serenity; + +pub mod invites; +pub mod planning; +pub mod schedule; +pub mod utils; + +/// Boop the bot! +#[poise::command(prefix_command, track_edits, slash_command)] +pub async fn boop(ctx: Context<'_>) -> Result<(), Error> { + let uuid_boop = ctx.id(); + + ctx.send(|m| { + m.content("I want some boops!").components(|c| { + c.create_action_row(|ar| { + ar.create_button(|b| { + b.style(serenity::ButtonStyle::Primary) + .label("Boop me!") + .custom_id(uuid_boop) + }) + }) + }) + }) + .await?; + + let mut boop_count = 0; + while let Some(mci) = serenity::CollectComponentInteraction::new(ctx.discord()) + .author_id(ctx.author().id) + .channel_id(ctx.channel_id()) + .timeout(std::time::Duration::from_secs(120)) + .filter(move |mci| mci.data.custom_id == uuid_boop.to_string()) + .await + { + boop_count += 1; + + let mut msg = mci.message.clone(); + msg.edit(ctx.discord(), |m| { + m.content(format!("Boop count: {}", boop_count)) + }) + .await?; + + mci.create_interaction_response(ctx.discord(), |ir| { + ir.kind(serenity::InteractionResponseType::DeferredUpdateMessage) + }) + .await?; + } + + Ok(()) +} diff --git a/src/commands/planning.rs b/src/commands/planning.rs new file mode 100644 index 0000000..976f0be --- /dev/null +++ b/src/commands/planning.rs @@ -0,0 +1,249 @@ +use super::utils; +use crate::{Context, Error}; +use futures::{Stream, StreamExt}; + +#[allow(dead_code)] +async fn autocomplete_series(_ctx: Context<'_>, partial: String) -> impl Stream { + futures::stream::iter(&[ + "Formula 1", + "Formula", + "MotoGP", + "Moto", + "IndyCar", + "World Rally Championship", + ]) + .filter(move |name| futures::future::ready(name.starts_with(&partial))) + .map(|name| name.to_string()) +} + +#[allow(dead_code)] +async fn autocomplete_session(_ctx: Context<'_>, partial: String) -> impl Stream { + futures::stream::iter(&[ + "Race", + "Qualifying", + "Free practice 3", + "Free practice 2", + "Free practice 1", + "Sprint race", + ]) + .filter(move |name| futures::future::ready(name.starts_with(&partial))) + .map(|name| name.to_string()) +} + +/// Get a list of supported racing series +#[poise::command{slash_command}] +pub async fn series( + ctx: Context<'_>, + #[description = "Filter for series (These are suggestions)"] + #[autocomplete = "autocomplete_series"] + serie: Option, +) -> Result<(), Error> { + let filter: String = match serie { + None => "%".to_string(), + Some(s) if s.is_empty() => "%".to_string(), + Some(s) => { + format!("%{}%", s) + } + }; + let query = sqlx::query!("SELECT name FROM Series WHERE name like ?", filter) + .fetch_many(&ctx.data().database); + + let serie_list = query + .filter_map(|result| async move { result.ok()?.right() }) + .map(|record| record.name) + .collect() + .await; + + let pages = utils::paginator(serie_list, 1000, ", ".to_string()); + + print!("{:?}", pages); + + utils::paginate_string(ctx, pages).await?; + + Ok(()) +} + +#[derive(Debug, poise::SlashChoiceParameter)] +pub enum Timeframe { + #[name = "Currently happening"] + Current, + #[name = "Currently happening or starting in the future"] + Future, + #[name = "Currently happening or already ended"] + Past, + #[name = "Everything"] + Everything, +} + +#[derive(sqlx::FromRow)] +struct Session { + name: String, + start: i64, + duration_minutes: i64, + #[sqlx(rename = "series_name")] + series: String, + #[sqlx(rename = "location_name")] + location: Option, +} + +impl Session { + fn to_string(&self) -> String { + match &self.location { + None => format!( + " - | **{}** `{}`", + self.start, + (self.start + 60 * self.duration_minutes), + self.series, + self.name + ), + Some(l) => format!( + " - | **{}** `{}` @*{}*", + self.start, + (self.start + 60 * self.duration_minutes), + self.series, + self.name, + l + ), + } + } +} + +/// Get a list of racing sessions +#[poise::command{slash_command}] +pub async fn sessions( + ctx: Context<'_>, + #[description = "Filter for the session"] filter: Option, + #[description = "Filter sessions for when they are/were happening, defaults to future"] + timeframe: Option, +) -> Result<(), Error> { + let filter_f: String = match filter { + None => "%".to_string(), + Some(s) if s.is_empty() => "%".to_string(), + Some(s) => { + format!("%{}%", s) + } + }; + + let mut base_query: String = "SELECT name, start, duration_minutes, series_name, location_name FROM sessions WHERE (series_name LIKE ? or location_name like ? or name like ?)".to_string(); + + let time_query = match timeframe { + Some(Timeframe::Everything) => " ORDER BY abs(julianday() - julianday(start, 'unixepoch')) ASC", + Some(Timeframe::Current) => " AND (DATETIME(start, 'unixepoch') > DATETIME() AND DATETIME((start+60*duration_minutes), 'unixepoch') < DATETIME()) ORDER BY start ASC", + Some(Timeframe::Past) => " AND DATETIME(start, 'unixepoch') < DATETIME() ORDER BY start DESC", + _ => " AND DATETIME((start+60*duration_minutes), 'unixepoch') > DATETIME() ORDER BY start ASC", + }; + + base_query.push_str(time_query); + + let stream: Vec = sqlx::query_as::<_, Session>(&base_query) + .bind(&filter_f) + .bind(&filter_f) + .bind(&filter_f) + .fetch_all(&ctx.data().database) + .await?; + + let sessions: Vec = stream.iter().map(|s| s.to_string()).collect(); + let pages = utils::paginator(sessions, 1900, "\n".to_string()); + utils::paginate_string(ctx, pages).await?; + + Ok(()) +} + +#[derive(sqlx::FromRow)] +struct Event { + // name: String, + #[sqlx(rename = "start_date")] + start: String, + #[sqlx(rename = "end_date")] + end: Option, + description: String, + #[sqlx(rename = "series_name")] + series: String, + #[sqlx(rename = "location_name")] + location: Option, +} + +impl Event { + fn to_string(&self) -> String { + let mut result: String = match &self.end { + None => format!("`{}`", self.start), + Some(end) => format!("`{}` - `{}`", self.start, end), + }; + + result.push_str(&format!(" | **{}** {}", self.series, self.description)); + + if let Some(loc) = &self.location { + result.push_str(&format!("Location: {}", loc)); + }; + + return result; + } +} + +/// Get a list of racing events +#[poise::command{slash_command}] +pub async fn events( + ctx: Context<'_>, + #[description = "Filter for the session"] filter: Option, + #[description = "Filter events for when they are/were happening, defaults to future"] + timeframe: Option, +) -> Result<(), Error> { + let filter_f: String = match filter { + None => "%".to_string(), + Some(s) if s.is_empty() => "%".to_string(), + Some(s) => { + format!("%{}%", s) + } + }; + + let mut base_query: String = "SELECT start_date, end_date, description, series_name, location_name FROM events WHERE (series_name LIKE ? or location_name like ? or description like ?)".to_string(); + + let time_query = match timeframe { + Some(Timeframe::Everything) => " ORDER BY abs(julianday() - julianday(start_date)) ASC", + Some(Timeframe::Current) => " AND ((end_date is NULL and start_date == date()) OR (start_date <= date() AND end_date >= date())) ORDER BY start_date ASC, end_date ASC", + Some(Timeframe::Past) => " AND JULIANDAY(start_date) - JULIANDAY(date()) <= 0 ORDER BY start DESC", + _ => " AND start_date >= DATE() ORDER BY start_date ASC, end_date ASC", + }; + + base_query.push_str(time_query); + + let stream: Vec = sqlx::query_as::<_, Event>(&base_query) + .bind(&filter_f) + .bind(&filter_f) + .bind(&filter_f) + .fetch_all(&ctx.data().database) + .await?; + + let events: Vec = stream.iter().map(|e| e.to_string()).collect(); + + let pages = utils::paginator(events, 1900, "\n".to_string()); + + utils::paginate_string(ctx, pages).await?; + + Ok(()) +} + +/// Overall information about racing events and sessions +#[poise::command(slash_command)] +pub async fn planning(ctx: Context<'_>) -> Result<(), Error> { + ctx.say("Hey this is a parent command, how'd you get here?") + .await?; + + Ok(()) +} + +pub fn get_command() -> poise::Command< + super::super::Data, + Box<(dyn std::error::Error + Sync + std::marker::Send + 'static)>, +> { + poise::Command { + subcommands: vec![ + series(), + sessions(), + events(), + // Let's make sure poise isn't confused by the duplicate names! + // planning(), + ], + ..planning() + } +} diff --git a/src/commands/schedule.rs b/src/commands/schedule.rs new file mode 100644 index 0000000..67cb3fc --- /dev/null +++ b/src/commands/schedule.rs @@ -0,0 +1,409 @@ +use crate::{Context, Error}; +use cached::proc_macro::cached; +use futures::{Stream, StreamExt}; +use log::*; + +use chrono::{DateTime, NaiveDateTime, TimeZone, Utc}; +use poise::serenity_prelude::CreateEmbed; +use reqwest::header::AUTHORIZATION; +use reqwest::Error as reqError; +use serde::Deserialize; +use std::cmp::Ordering::{Greater, Less}; + +#[derive(Debug, Clone)] +struct Event { + name: String, + series: String, + _lower_series: String, + session: String, + _lower_session: String, + date: DateTime, +} + +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +struct F1Data { + #[serde(rename = "seasonContext")] + season_context: SeasonContext, + race: Race, +} +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +struct SeasonContext { + timetables: Vec, +} + +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +struct Race { + #[serde(rename = "meetingOfficialName")] + name: String, + #[serde(rename = "meetingCountryName")] + country: String, +} +#[allow(dead_code)] +#[derive(Debug, Deserialize)] +struct TimeTable { + state: String, + session: String, + #[serde(rename = "gmtOffset")] + offset: String, + #[serde(rename = "startTime")] + start: String, + #[serde(rename = "endTime")] + end: String, +} + +impl Event { + fn create(name: String, series: String, session: String, date: DateTime) -> Event { + Event { + name, + _lower_series: series.to_ascii_lowercase(), + series, + _lower_session: session.to_ascii_lowercase(), + session, + date, + } + } + + fn deref(&self) -> Event { + Event { + name: self.name.to_string(), + _lower_series: self._lower_series.to_string(), + series: self.series.to_string(), + _lower_session: self._lower_session.to_string(), + session: self.session.to_string(), + date: self.date.clone(), + } + } + + fn check_series(&self, series: String) -> bool { + return self._lower_series.contains(&series); + } + + fn check_session(&self, session: String) -> bool { + return self._lower_session.contains(&session); + } + + #[allow(dead_code)] + fn check(&self, series: String, session: String) -> bool { + if self._lower_session.contains(&session) { + if self._lower_series.contains(&series) { + return true; + } + } + return false; + } +} + +fn parse_time(time: String) -> Option> { + let tim = NaiveDateTime::parse_from_str(&*time, "%Y-%m-%dT%H:%M:%S.%fZ"); + match tim { + Ok(t) => Some(Utc.from_utc_datetime(&t)), + Err(e) => { + warn!("Error on parsing time: {}", e); + None + } + } +} + +fn parse_f1_time(mut time: String, offset: &String) -> Option> { + time.push_str(offset); + let tim = DateTime::parse_from_str(&time, "%Y-%m-%dT%H:%M:%S%:z"); + match tim { + Ok(t) => Some(t.with_timezone(&Utc)), + Err(e) => { + warn!("Error on parsing time: {}", e); + None + } + } +} + +// Use cached to cache the requests, don't repeatedly redo this call. Caches for 1 hour. +#[cached(time = 3600)] +async fn get_api_events() -> Vec { + let token = super::super::SETTINGS + .read() + .unwrap() + .get_table("morningstreams") + .unwrap() + .get("token") + .expect("Config error, please set the morningstreams[token] value") + .clone() + .into_str() + .expect("Config error, please make sure morningstreams[token] is a string"); + let client = reqwest::Client::new(); + let req = client + .get(format!("https://api.morningstreams.com/api/events")) + .header(AUTHORIZATION, token) + .send() + .await; + #[derive(Debug, Deserialize)] + struct Data { + category: String, + name: String, + session: String, + date: String, + } + + let result: Option> = match req { + Err(e) => { + warn!("Error getting schedule {}", e); + None + } + Ok(req) => { + info!("Did MS event request status code {}", req.status().as_u16()); + if req.status().as_u16() == 404 { + warn!("404 on getting MS events"); + None + } else if req.status().as_u16() == 200 { + let data: Result, reqError> = req.json().await; + match data { + Err(e) => { + warn!("Error parsing morningstreams event: {}", e); + None + } + Ok(dat) => { + let mut result: Vec = Vec::new(); + for d in dat { + let t = parse_time(d.date.to_string()); + if let Some(tim) = t { + result.push(Event::create( + d.name.to_string(), + d.category.to_string(), + d.session.to_string(), + tim, + )); + } + } + if result.len() > 0 { + result.sort_by(|a, b| a.date.cmp(&b.date)); + Some(result) + } else { + None + } + } + } + } else { + None + } + } + }; + match result { + None => { + return Vec::new(); + } + Some(events) => return events, + } +} + +#[allow(dead_code)] +#[cached(time = 3600)] +async fn get_f1_events() -> Option> { + let token = super::super::SETTINGS + .read() + .unwrap() + .get_table("morningstreams") + .unwrap() + .get("token") + .expect("Config error, please set the morningstreams[token] value") + .clone() + .into_str() + .expect("Config error, please make sure morningstreams[token] is a string"); + let client = reqwest::Client::new(); + let req = client + .get(format!( + "https://api.morningstreams.com/api/events/f1/event-tracker" + )) + .header(AUTHORIZATION, token) + .send() + .await; + + let result: Option> = match req { + Err(e) => { + warn!("Error getting schedule {}", e); + None + } + Ok(req) => { + info!("Did MS F1 request status code {}", req.status().as_u16()); + if req.status().as_u16() == 404 { + warn!("404 on getting F1 events"); + return None; + } else if req.status().as_u16() == 200 { + let data: Result = req.json().await; + match data { + Err(e) => { + warn!("Error parsing morningstreams event: {}", e); + None + } + Ok(dat) => { + // return Some(dat); + let mut events: Vec = Vec::new(); + // let mut sessions: Vec = Vec::new(); + for ses in dat.season_context.timetables { + if let Some(start) = parse_f1_time(ses.start, &ses.offset) { + events.push(Event::create( + dat.race.name.to_string(), + "Formula 1".to_string(), + ses.session, + start, + )) + } + } + return Some(events); + } + } + } else { + None + } + } + }; + return result; +} + +#[cached(size = 5, time = 3600)] +async fn filter_events(series: String, session: String) -> (Option, Option) { + let mut events: Vec = get_api_events().await; + + if let Some(mut e) = get_f1_events().await { + events.append(&mut e); + } + if events.len() == 0 { + return (None, None); + } else { + let mut next_event: Option<&Event> = None; + let mut previous_event: Option<&Event> = None; + let now = Utc::now(); + for e in &events { + if e.check_series(series.to_string()) && e.check_session(session.to_string()) { + match now.cmp(&e.date) { + // Now is greater (after) event + Greater => { + if let Some(p) = previous_event { + if p.date.cmp(&e.date) == Less { + previous_event = Some(e) + }; + } else { + previous_event = Some(e); + } + } + Less => { + if let Some(f) = next_event { + if f.date.cmp(&e.date) == Greater { + next_event = Some(e) + } + } else { + next_event = Some(e); + } + } + _ => { + next_event = Some(e); + previous_event = Some(e); + } + }; + } + } + + let first: Option = match previous_event { + None => None, + Some(e) => Some(e.deref()), + }; + let second: Option = match next_event { + None => None, + Some(e) => Some(e.deref()), + }; + (first, second) + } +} + +#[allow(dead_code)] +fn build_embed<'a>(event: Event, e: &'a mut CreateEmbed) -> &'a mut CreateEmbed { + e.title(format!("{} | {}", event.series, event.name)); + + // e.description(format!("{}", event.session)); + e.field("Session", &event.session, true); + e.field( + "Starts in", + format!("", &event.date.timestamp()), + true, + ); + e.field( + "Date and time", + format!("", &event.date.timestamp()), + true, + ); + + e.timestamp(event.date); + e +} + +#[allow(dead_code)] +async fn autocomplete_series(_ctx: Context<'_>, partial: String) -> impl Stream { + futures::stream::iter(&["Formula 1", "MotoGP", "IndyCar"]) + .filter(move |name| futures::future::ready(name.starts_with(&partial))) + .map(|name| name.to_string()) +} + +#[allow(dead_code)] +async fn autocomplete_session(_ctx: Context<'_>, partial: String) -> impl Stream { + futures::stream::iter(&[ + "Race", + "Qualifying", + "Free practice 3", + "Free practice 2", + "Free practice 1", + "Sprint race", + ]) + .filter(move |name| futures::future::ready(name.starts_with(&partial))) + .map(|name| name.to_string()) +} + +#[poise::command(slash_command)] +pub async fn schedule( + ctx: Context<'_>, + #[description = "Which series to look for"] + #[autocomplete = "autocomplete_series"] + series: Option, + #[description = "Which session to look for"] + #[autocomplete = "autocomplete_session"] + session: Option, +) -> Result<(), Error> { + let serie: String = match series { + None => "".to_string(), + Some(ser) => { + if vec![ + "f1".to_string(), + "formula 1".to_string(), + "formula1".to_string(), + ] + .contains(&ser.to_ascii_lowercase()) + { + "formula 1".to_string() + } else { + ser.to_ascii_lowercase() + } + } + }; + let session: String = match session { + None => "".to_string(), + Some(s) => s.to_ascii_lowercase(), + }; + // Get the events (This will hopefully be cached) + let (previous_event, next_event) = filter_events(serie, session.to_string()).await; + + // Do the event sending thingy... + if let Some(e) = next_event { + ctx.send(|b| b.embed(|em| build_embed(e, em))).await?; + } else if let Some(e) = previous_event { + ctx.send(|b| { + b.embed(|em| build_embed(e, em)); + b.content("No future events found, showing most recent") + }) + .await?; + } else { + ctx.say("No future events found, showing most recent") + .await?; + }; + + Ok(()) +} diff --git a/src/commands/utils.rs b/src/commands/utils.rs new file mode 100644 index 0000000..76afafb --- /dev/null +++ b/src/commands/utils.rs @@ -0,0 +1,114 @@ +use std::vec; + +use crate::{Context, Error}; +use poise::serenity_prelude as serenity; + +pub fn paginator(input: Vec, chunk_size: usize, join_string: String) -> Vec { + if input.len() == 0 { + return vec![]; + } + let mut result: Vec = vec![]; + let mut part: String = "".to_string(); + let filler = &join_string.chars().count(); + for i in input { + if part.chars().count() + i.chars().count() + filler >= chunk_size { + result.push(part); + part = i.to_string(); + } + part.push_str(&join_string); + part.push_str(&i.to_string()); + } + result.push(part); + return result; +} + +pub async fn paginate_string(ctx: Context<'_>, pages: Vec) -> Result<(), Error> { + let uuid_command = ctx.id().to_string(); + let page_count = pages.len(); + + match pages.len() { + 0 => { + ctx.say("No data found :(").await?; + return Ok(()); + } + 1 => { + ctx.say(pages.get(0).unwrap()).await?; + return Ok(()); + } + _ => {} + }; + + ctx.send(|m| { + m.content(format!( + "{}\n\nPage: {}/{}", + pages.get(0).unwrap(), + 1, + page_count + )) + .components(|c| { + c.create_action_row(|ar| { + ar.create_button(|b| { + b.style(serenity::ButtonStyle::Primary) + .label("Previous page") + .custom_id(format!("{}_previous", uuid_command)) + }); + ar.create_button(|b| { + b.style(serenity::ButtonStyle::Primary) + .label("Next page") + .custom_id(format!("{}_next", uuid_command)) + }); + ar.create_button(|b| { + b.style(serenity::ButtonStyle::Secondary) + .label("Reset") + .custom_id(format!("{}_close", uuid_command)) + }) + }) + }) + }) + .await?; + // let interaction1 = if let ReplyHandle::Application { http, interaction } = msg.unwrap(){Some(interaction)} else {None}; + // let interaction = interaction1.unwrap(); + + let mut page = 0; + while let Some(mci) = serenity::CollectComponentInteraction::new(ctx.discord()) + // .author_id(ctx.author().id) + .channel_id(ctx.channel_id()) + .timeout(std::time::Duration::from_secs(1200)) + // .filter(move |mci| mci.data.custom_id == uuid_command.to_string()) + .await + { + if !mci.data.custom_id.contains(&uuid_command) { + continue; + } + + if mci.data.custom_id.contains("_previous") { + if page == 0 { + page = page_count - 1; + } else { + page = (page - 1) % page_count; + } + } else if mci.data.custom_id.contains("_next") { + page = (page + 1) % page_count; + } else if mci.data.custom_id.contains("_close") { + page = 0; + } + + let mut msg = mci.message.clone(); + msg.edit(ctx.discord(), |m| { + m.content(format!( + "{}\n\nPage: {}/{}", + pages.get(page).unwrap(), + page + 1, + page_count + )) + }) + .await?; + + mci.create_interaction_response(ctx.discord(), |ir| { + ir.kind(serenity::InteractionResponseType::DeferredUpdateMessage) + }) + .await?; + } + + Ok(()) +} diff --git a/src/entity/events.rs b/src/entity/events.rs new file mode 100644 index 0000000..e1a92fa --- /dev/null +++ b/src/entity/events.rs @@ -0,0 +1,52 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "events")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: String, + pub start_date: String, + pub end_date: Option, + pub description: String, + pub series: String, + pub series_name: String, + pub location: Option, + pub location_name: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "super::series::Entity", + from = "Column::Series", + to = "super::series::Column::Id", + on_update = "NoAction", + on_delete = "Cascade" + )] + Series, + #[sea_orm( + belongs_to = "super::locations::Entity", + from = "Column::Location", + to = "super::locations::Column::Id", + on_update = "NoAction", + on_delete = "Cascade" + )] + Locations, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Series.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Locations.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/entity/locations.rs b/src/entity/locations.rs new file mode 100644 index 0000000..1988786 --- /dev/null +++ b/src/entity/locations.rs @@ -0,0 +1,35 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "locations")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: String, + pub name: String, + pub description: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::sessions::Entity")] + Sessions, + #[sea_orm(has_many = "super::events::Entity")] + Events, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Sessions.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Events.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/entity/mod.rs b/src/entity/mod.rs new file mode 100644 index 0000000..b5d5ffc --- /dev/null +++ b/src/entity/mod.rs @@ -0,0 +1,8 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +pub mod prelude; + +pub mod events; +pub mod locations; +pub mod series; +pub mod sessions; diff --git a/src/entity/prelude.rs b/src/entity/prelude.rs new file mode 100644 index 0000000..85ffee3 --- /dev/null +++ b/src/entity/prelude.rs @@ -0,0 +1,6 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +pub use super::events::Entity as Events; +pub use super::locations::Entity as Locations; +pub use super::series::Entity as Series; +pub use super::sessions::Entity as Sessions; diff --git a/src/entity/series.rs b/src/entity/series.rs new file mode 100644 index 0000000..a763b64 --- /dev/null +++ b/src/entity/series.rs @@ -0,0 +1,27 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "series")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: String, + pub name: String, + pub description: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::events::Entity")] + Events, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Events.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/entity/sessions.rs b/src/entity/sessions.rs new file mode 100644 index 0000000..98d33f8 --- /dev/null +++ b/src/entity/sessions.rs @@ -0,0 +1,38 @@ +//! SeaORM Entity. Generated by sea-orm-codegen 0.5.0 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "sessions")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: String, + pub name: String, + pub start: i32, + pub duration_minutes: Option, + pub location: Option, + pub location_name: Option, + pub series: String, + pub series_name: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "super::locations::Entity", + from = "Column::Location", + to = "super::locations::Column::Id", + on_update = "NoAction", + on_delete = "Cascade" + )] + Locations, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Locations.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..5a65496 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,241 @@ +use config::{Config, File}; +use glob::glob; +use lazy_static::lazy_static; +use log::LevelFilter; +use poise::serenity_prelude as serenity; +use poise::serenity_prelude::UserId; +use regex::Regex; +use simplelog::SimpleLogger; +use std::{collections::HashSet, sync::RwLock}; + +// mod entity; + +// Types used by all command functions +type Error = Box; +type Context<'a> = poise::Context<'a, Data, Error>; + +mod commands; + +// Custom user data passed to all command functions +pub struct Data { + database: sqlx::SqlitePool, +} + +lazy_static! { + static ref SETTINGS: RwLock = RwLock::new(Config::default()); +} + +/// Register application commands in this guild or globally +/// +/// Run with no arguments to register in guild, run with argument "global" to register globally. +#[poise::command( + prefix_command, + hide_in_help, + // required_permissions = "MANAGE_MESSAGES | ADMINISTRATOR", + owners_only=true, +)] +async fn register(ctx: Context<'_>, #[flag] global: bool) -> Result<(), Error> { + poise::builtins::register_application_commands(ctx, global).await?; + + Ok(()) +} + +/// Boop the bot! +#[poise::command(prefix_command, track_edits, slash_command)] +pub async fn boop(ctx: Context<'_>) -> Result<(), Error> { + let uuid_boop = ctx.id(); + + ctx.send(|m| { + m.content("I want some boops!").components(|c| { + c.create_action_row(|ar| { + ar.create_button(|b| { + b.style(serenity::ButtonStyle::Primary) + .label("Boop me!") + .custom_id(uuid_boop) + }) + }) + }) + }) + .await?; + + let mut boop_count = 0; + while let Some(mci) = serenity::CollectComponentInteraction::new(ctx.discord()) + .author_id(ctx.author().id) + .channel_id(ctx.channel_id()) + .timeout(std::time::Duration::from_secs(1200)) + .filter(move |mci| mci.data.custom_id == uuid_boop.to_string()) + .await + { + boop_count += 1; + + let mut msg = mci.message.clone(); + msg.edit(ctx.discord(), |m| { + m.content(format!("Boop count: {}", boop_count)) + }) + .await?; + + mci.create_interaction_response(ctx.discord(), |ir| { + ir.kind(serenity::InteractionResponseType::DeferredUpdateMessage) + }) + .await?; + } + + Ok(()) +} + +async fn on_error(error: poise::FrameworkError<'_, Data, Error>) { + // This is our custom error handler + // They are many errors that can occur, so we only handle the ones we want to customize + // and forward the rest to the default handler + match error { + poise::FrameworkError::Setup { error } => panic!("Failed to start bot: {:?}", error), + poise::FrameworkError::Command { error, ctx } => { + println!("Error in command `{}`: {:?}", ctx.command().name, error,); + } + error => { + if let Err(e) = poise::builtins::on_error(error).await { + println!("Error while handling error: {}", e) + } + } + } +} + +/// Show this help menu +#[poise::command(prefix_command, track_edits, slash_command)] +async fn help( + ctx: Context<'_>, + #[description = "Specific command to show help about"] + #[autocomplete = "poise::builtins::autocomplete_command"] + command: Option, +) -> Result<(), Error> { + poise::builtins::help( + ctx, + command.as_deref(), + poise::builtins::HelpConfiguration { + extra_text_at_bottom: "\ +This bot is very much a work in progress. Commands will change and may break.", + show_context_menu_commands: true, + ..Default::default() + }, + ) + .await?; + Ok(()) +} + +fn setup_config() -> Result<(), Error> { + SETTINGS + .write() + .unwrap() + .merge( + glob("data/config/*") + .unwrap() + .map(|path| File::from(path.unwrap())) + .collect::>(), + ) + .unwrap(); + + println!("{:#?}", SETTINGS.read()); + Ok(()) +} + +async fn app() -> Result<(), Error> { + let discord = SETTINGS.read().unwrap().get_table("discord").unwrap(); + + let mut owners: HashSet = HashSet::new(); + owners.insert(UserId(117992484310745097)); + + let prefix: String = discord + .get("prefix") + .expect("Config error, please set the discord[token] value") + .clone() + .into_str() + .expect("Config error, please make sure discord[token] is a string"); + let options = poise::FrameworkOptions { + commands: vec![ + help(), + register(), + commands::invites::invites(), + commands::schedule::schedule(), + commands::boop(), + commands::planning::get_command(), + // poise::Command { + // subcommands: vec![ + // commands::planning::series(), + // commands::planning::sessions(), + // commands::planning::events(), + // // Let's make sure poise isn't confused by the duplicate names! + // // commands::planning::planning(), + // ], + // ..commands::planning::planning() + // }, + ], + prefix_options: poise::PrefixFrameworkOptions { + prefix: Some(prefix.into()), + edit_tracker: Some(poise::EditTracker::for_timespan( + std::time::Duration::from_secs(3600), + )), + additional_prefixes: vec![ + poise::Prefix::Regex(Regex::new("(?i)ol'? rusty please").unwrap()), + poise::Prefix::Regex(Regex::new("(?i)Oi Rusty please").unwrap()), + ], + ..Default::default() + }, + on_error: |error| Box::pin(on_error(error)), + pre_command: |ctx| { + Box::pin(async move { + println!("Executing command {}...", ctx.command().qualified_name); + }) + }, + post_command: |ctx| { + Box::pin(async move { + println!("Executed command {}!", ctx.command().qualified_name); + }) + }, + owners, + ..Default::default() + }; + + // let discord = SETTINGS.read().unwrap().get_table("discord").unwrap(); + let token = discord + .get("token") + .expect("Config error, please set the discord[token] value") + .clone() + .into_str() + .expect("Config error, please make sure discord[token] is a string"); + + let database = sqlx::sqlite::SqlitePoolOptions::new() + .max_connections(5) + .connect_with( + "sqlite:data/database.db" + .parse::()? + .create_if_missing(true), + ) + .await?; + sqlx::migrate!("./migrations").run(&database).await?; + + poise::Framework::build() + .token(token) + .user_data_setup(move |_ctx, _ready, _framework| { + Box::pin(async move { Ok(Data { database: database }) }) + }) + .options(options) + .run() + .await + .unwrap(); + + Ok(()) +} + +#[tokio::main] +async fn main() { + print!("Starting the bot"); + setup_config().unwrap(); + // env_logger::init(); + // init_log(); + SimpleLogger::init(LevelFilter::Warn, simplelog::Config::default()).unwrap(); + + if let Err(e) = app().await { + log::error!("{}", e); + std::process::exit(1); + } +}