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