diff --git a/Cargo.lock b/Cargo.lock index bc5a124..cfaa0ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,28 @@ dependencies = [ "libc", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + [[package]] name = "async-trait" version = "0.1.68" @@ -79,6 +101,12 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "autocfg" version = "1.1.0" @@ -112,6 +140,12 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + [[package]] name = "bit-set" version = "0.5.3" @@ -133,6 +167,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bitvec" version = "1.0.1" @@ -227,6 +267,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time 0.3.22", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -385,6 +436,39 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "devise" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6eacefd3f541c66fc61433d65e54e0e46e0a029a819a7dbbc7a7b489e8a85f8" +dependencies = [ + "devise_codegen", + "devise_core", +] + +[[package]] +name = "devise_codegen" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8cf4b8dd484ede80fd5c547592c46c3745a617c8af278e2b72bea86b2dfed6" +dependencies = [ + "devise_core", + "quote", +] + +[[package]] +name = "devise_core" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" +dependencies = [ + "bitflags 2.3.3", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.27", +] + [[package]] name = "digest" version = "0.10.7" @@ -396,6 +480,18 @@ dependencies = [ "subtle", ] +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "encoding_rs" version = "0.8.32" @@ -453,6 +549,20 @@ dependencies = [ "instant", ] +[[package]] +name = "figment" +version = "0.10.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4547e226f4c9ab860571e070a9034192b3175580ecea38da34fcdb53a018c9a5" +dependencies = [ + "atomic", + "pear", + "serde", + "toml", + "uncased", + "version_check", +] + [[package]] name = "flate2" version = "1.0.26" @@ -597,6 +707,19 @@ dependencies = [ "slab", ] +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -624,6 +747,12 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "h2" version = "0.3.20" @@ -858,6 +987,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -870,6 +1000,12 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + [[package]] name = "instant" version = "0.1.12" @@ -908,6 +1044,17 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi 0.3.1", + "rustix 0.38.4", + "windows-sys 0.48.0", +] + [[package]] name = "itoa" version = "1.0.6" @@ -953,6 +1100,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + [[package]] name = "lock_api" version = "0.4.10" @@ -969,6 +1122,21 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -1016,6 +1184,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matches" version = "0.1.10" @@ -1090,7 +1267,7 @@ checksum = "ebcd85ec209a5b84fd9f54b9e381f6fa17462bc74160d018fc94fd8b9f61faa8" dependencies = [ "async-trait", "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "bson", "chrono", "derivative", @@ -1129,6 +1306,26 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "multer" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "log", + "memchr", + "mime", + "spin 0.9.8", + "tokio", + "tokio-util", + "version_check", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -1153,6 +1350,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -1183,15 +1390,17 @@ dependencies = [ [[package]] name = "obsessed-yanqing" -version = "1.3.1" +version = "1.4.0" dependencies = [ "chrono", "levenshtein", "mongodb", "poise", + "prometheus-client", "rand", "regex", "reqwest", + "rocket", "select", "serde", "serde_derive", @@ -1213,7 +1422,7 @@ version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -1260,6 +1469,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1292,6 +1507,29 @@ dependencies = [ "digest", ] +[[package]] +name = "pear" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a386cd715229d399604b50d1361683fe687066f42d56f54be995bc6868f71c" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi 1.0.0-rc", +] + +[[package]] +name = "pear_codegen" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f0f13dac8069c139e8300a6510e3f4143ecf5259c60b116a9b271b4ca0d54" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.27", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1406,6 +1644,42 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", + "version_check", + "yansi 1.0.0-rc", +] + +[[package]] +name = "prometheus-client" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c99afa9a01501019ac3a14d71d9f94050346f55ca471ce90c799a15c58f61e2" +dependencies = [ + "dtoa", + "itoa", + "parking_lot", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -1463,7 +1737,27 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "ref-cast" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85d07b1a5f16b5548f4255a978c94259971aff73f39e8d67e8250e8b2f6667c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a930b010d9effee5834317bb7ff406b76af7724348fd572b38705b4bd099fa92" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", ] [[package]] @@ -1474,8 +1768,17 @@ checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1486,9 +1789,15 @@ checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.4" @@ -1559,12 +1868,93 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", ] +[[package]] +name = "rocket" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58734f7401ae5cfd129685b48f61182331745b357b96f2367f01aebaf1cc9cc9" +dependencies = [ + "async-stream", + "async-trait", + "atomic", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap 1.9.3", + "is-terminal", + "log", + "memchr", + "multer", + "num_cpus", + "parking_lot", + "pin-project-lite", + "rand", + "ref-cast", + "rocket_codegen", + "rocket_http", + "serde", + "state", + "tempfile", + "time 0.3.22", + "tokio", + "tokio-stream", + "tokio-util", + "ubyte", + "version_check", + "yansi 0.5.1", +] + +[[package]] +name = "rocket_codegen" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7093353f14228c744982e409259fb54878ba9563d08214f2d880d59ff2fc508b" +dependencies = [ + "devise", + "glob", + "indexmap 1.9.3", + "proc-macro2", + "quote", + "rocket_http", + "syn 2.0.27", + "unicode-xid", +] + +[[package]] +name = "rocket_http" +version = "0.5.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936012c99162a03a67f37f9836d5f938f662e26f2717809761a9ac46432090f4" +dependencies = [ + "cookie", + "either", + "futures", + "http", + "hyper", + "indexmap 1.9.3", + "log", + "memchr", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state", + "time 0.3.22", + "tokio", + "uncased", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1605,11 +1995,24 @@ version = "0.37.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys 0.4.3", "windows-sys 0.48.0", ] @@ -1677,6 +2080,12 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.1.0" @@ -1699,7 +2108,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1808,6 +2217,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1851,7 +2269,7 @@ dependencies = [ "async-trait", "async-tungstenite", "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "bytes", "cfg-if", "chrono", @@ -1896,6 +2314,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -1952,6 +2379,30 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + [[package]] name = "string_cache" version = "0.8.7" @@ -2044,7 +2495,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall", - "rustix", + "rustix 0.37.20", "windows-sys 0.48.0", ] @@ -2079,6 +2530,16 @@ dependencies = [ "syn 2.0.27", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.1.45" @@ -2193,6 +2654,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.8" @@ -2208,6 +2680,40 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -2245,6 +2751,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -2342,6 +2878,25 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "ubyte" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6" +dependencies = [ + "serde", +] + +[[package]] +name = "uncased" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +dependencies = [ + "serde", + "version_check", +] + [[package]] name = "unicase" version = "2.6.0" @@ -2372,6 +2927,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "untrusted" version = "0.7.1" @@ -2406,6 +2967,12 @@ dependencies = [ "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2707,6 +3274,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -2745,3 +3321,15 @@ dependencies = [ "mac", "markup5ever", ] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "yansi" +version = "1.0.0-rc" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee746ad3851dd3bc40e4a028ab3b00b99278d929e48957bcb2d111874a7e43e" diff --git a/Cargo.toml b/Cargo.toml index b5bf7fd..3357dcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsessed-yanqing" -version = "1.3.1" +version = "1.4.0" edition = "2021" authors = ["Evann Regnault"] license = "MIT" @@ -20,3 +20,5 @@ regex = "1.9.1" rand = "0.8.5" mongodb = "2.6.0" chrono = "0.4.26" +prometheus-client = "0.21.2" +rocket = "0.5.0-rc.3" \ No newline at end of file diff --git a/README.md b/README.md index 2619553..138b649 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Obsessed Yanqing -This is a bot whose main purpose is to give as much infomrations as possible about Honkai Star Rail. +This is a bot whose main purpose is to give as much information as possible about Honkai Star Rail. > ⚠️ Disclaimer : All Data is fetched from [Prydwen.gg](https://prydwen.gg) @@ -16,7 +16,7 @@ choice.
This message will contain: > In order to update this message every hour, three information are stored in a database : Guild id, Channel id, Message id. > -> ❗ Those are the only information stored by the bot ! +> ❗ Those are the only sensibles information stored by the bot ! ### Character Data @@ -40,8 +40,17 @@ You'll also need a mongoDB server alongside it. TOKEN : The discord bot's token MONGO_HOST : The hostname of the mongodb instance MONGO_PORT : The port of the mongodb instance +METRICS_ENABLED : Put to true to enable metrics +METRICS_PORT : Port on which the metrics server will listen ``` +## Metrics + +A prometheus compatible server is running in the background of the bot running on the port 8080.
+For the moment, it provides two information: +- `server_count` The number of server the bot is in. +- `character_command_count` The number of time a character has been searched. + ## APIs / Libraries - [Prydwen.gg](https://www.prydwen.gg/star-rail/) diff --git a/src/commands/character.rs b/src/commands/character.rs index 4e33861..cca42da 100644 --- a/src/commands/character.rs +++ b/src/commands/character.rs @@ -11,6 +11,7 @@ use crate::data::character::{Character, get_character_data}; use crate::data::cones::get_light_cone; use crate::data::description::get_all_texts; use crate::data::proscons::{format_proscons}; +use crate::metrics::characters::CharacterLabels; use crate::utils::color_manager::get_element_color; use crate::utils::emote_manager::{get_element_emote, get_path_emote}; @@ -329,6 +330,9 @@ async fn choice_interaction_handler(ctx: Context<'_>, message: &ReplyHandle<'_>) } }; let character_string = &interaction.data.values[0]; + ctx.data().registries.character_count.get_or_create(&CharacterLabels{ + character_name: character_string.clone() + }).inc(); let character = get_character_data(character_string.to_string()).await.unwrap(); menu_handler(ctx, interaction, character, CharacterTab::Home).await; } diff --git a/src/data/mod.rs b/src/data/mod.rs index a539d96..2ef54ed 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -1,4 +1,9 @@ -pub struct Data {} // User data, which is stored and accessible in all command invocations +use std::sync::Arc; +use crate::metrics::core::AllRegistries; + +pub struct Data { + pub registries: Arc +} // User data, which is stored and accessible in all command invocations pub type Error = Box; pub type Context<'a> = poise::Context<'a, Data, Error>; diff --git a/src/main.rs b/src/main.rs index 5e09f6f..891f938 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,24 +2,26 @@ mod commands; mod data; mod utils; mod mongo; +mod metrics; - - - +use std::sync::Arc; use std::time::Duration; use poise::serenity_prelude::GatewayIntents; use serenity::client::Context; +use serenity::http::GuildPagination; use serenity::model::id::ChannelId; use serenity::model::prelude::Activity; use crate::commands::events::create_event_embeds; use crate::data::{Data}; +use crate::metrics::core::{AllRegistries, create_registries, Empty, setup_server}; use crate::mongo::core::get_all_status_messages; -fn update_daily(ctx: Context) { +fn update_daily(ctx: Context, all_registries: Arc) { tokio::task::spawn(async move { let mut interval = tokio::time::interval(Duration::from_secs(60*60)); loop { + get_total_guilds_count(&ctx, &all_registries).await; let status_messages = get_all_status_messages().await; let embeds = create_event_embeds().await; @@ -42,12 +44,21 @@ fn update_daily(ctx: Context) { } }); } - interval.tick().await; } }); } +async fn get_total_guilds_count(ctx: &Context, all_registries: &Arc) { + let mut cnt: i64 = 0; + let mut guilds = ctx.http.get_guilds(None, None).await.expect("Cannot get guilds"); + while !guilds.is_empty() { + cnt += guilds.len() as i64; + guilds = ctx.http.get_guilds(Some(&GuildPagination::After(guilds.last().expect("Cannot get last").id)), None).await.expect("Cannot get nexts"); + } + all_registries.server_count.get_or_create(&Empty {}).set(cnt); +} + #[tokio::main] async fn main() { // Build our client @@ -65,12 +76,23 @@ async fn main() { Box::pin(async move { ctx.set_activity(Activity::listening("/character")).await; poise::builtins::register_globally(ctx, &framework.options().commands).await?; - update_daily(ctx.clone()); + let all_registries = Arc::new(create_registries()); + + + let server_registry = Arc::clone(&all_registries); + tokio::task::spawn(async move { + setup_server(server_registry).await + }); + + let updater_registry = Arc::clone(&all_registries); + update_daily(ctx.clone(), updater_registry); + + println!("Bot Started"); - Ok(Data {}) + Ok(Data {registries: all_registries}) }) }); - framework.run().await.unwrap(); + framework.run_autosharded().await.unwrap(); } \ No newline at end of file diff --git a/src/metrics/characters.rs b/src/metrics/characters.rs new file mode 100644 index 0000000..2cfe254 --- /dev/null +++ b/src/metrics/characters.rs @@ -0,0 +1,6 @@ +use prometheus_client::encoding::EncodeLabelSet; + +#[derive(Clone, Debug, Hash, PartialEq, Eq, EncodeLabelSet)] +pub struct CharacterLabels { + pub(crate) character_name: String +} \ No newline at end of file diff --git a/src/metrics/core.rs b/src/metrics/core.rs new file mode 100644 index 0000000..4175897 --- /dev/null +++ b/src/metrics/core.rs @@ -0,0 +1,81 @@ +use std::net::IpAddr; +use std::sync::Arc; +use prometheus_client::encoding::EncodeLabelSet; +use prometheus_client::encoding::text::encode; +use rocket::{routes, get, State, Config}; +use prometheus_client::metrics::counter::Counter; +use prometheus_client::metrics::family::Family; +use prometheus_client::metrics::gauge::Gauge; +use prometheus_client::registry::Registry; +use rocket::config::LogLevel; +use crate::metrics::characters::CharacterLabels; + +struct RocketState { + registry: Registry +} + +#[derive(Clone, Debug, Hash, PartialEq, Eq, EncodeLabelSet)] +pub struct Empty {} + +pub struct AllRegistries { + pub character_count: Family::, + pub server_count: Family:: +} + +pub fn create_registries() -> AllRegistries { + + + let character_count = Family::::default(); + let server_count = Family::::default(); + + AllRegistries { + character_count, + server_count + } +} + + +#[get("/metrics")] +fn metrics(state: &State) -> String { + let mut buffer = String::new(); + encode(&mut buffer, &state.registry).unwrap(); + buffer +} + + +pub async fn setup_server(all_registries: Arc) { + if let Ok(enabled) = std::env::var("METRICS_ENABLED") { + let test = match enabled.to_lowercase().as_str() { + "false" => false, + "true" => true, + _ => false + }; + if !test {println!("Metrics are not enabled, set METRICS_ENABLED to true to enable them !"); return;} + + + let mut registry = Registry::default(); + + registry.register( + "character_command_count", + "Number of character command used", + all_registries.character_count.clone() + ); + + registry.register( + "server_count", + "Number of servers the bot is in", + all_registries.server_count.clone() + ); + + let config = Config { + address: IpAddr::V4("0.0.0.0".parse().unwrap()), + port: std::env::var("METRICS_PORT").expect("No metrics found !").as_str().parse::().expect("METRICS_PORT is not in base 10"), + log_level: LogLevel::Critical, + ..Config::default() + }; + + rocket::custom(config).mount("/", routes![metrics]).manage(RocketState { registry }).launch().await.expect("Cannot launch Metrics Server"); + } else { + println!("Metrics are not enabled, set METRICS_ENABLED to true to enable them !"); + } +} \ No newline at end of file diff --git a/src/metrics/mod.rs b/src/metrics/mod.rs new file mode 100644 index 0000000..1992fb3 --- /dev/null +++ b/src/metrics/mod.rs @@ -0,0 +1,2 @@ +pub mod core; +pub mod characters; \ No newline at end of file