normalized database

This commit is contained in:
Robin Appelman 2020-06-17 23:33:10 +02:00
commit d6c622fcda
8 changed files with 677 additions and 591 deletions

402
Cargo.lock generated
View file

@ -50,15 +50,9 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.11.0" version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" checksum = "e223af0dc48c96d4f8342ec01a4974f139df863896b316681efd36742f22cc67"
[[package]]
name = "base64"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
@ -89,9 +83,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.2.1" version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187" checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
[[package]] [[package]]
name = "byte-tools" name = "byte-tools"
@ -113,9 +107,9 @@ checksum = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.50" version = "1.0.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
@ -130,7 +124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
dependencies = [ dependencies = [
"num-integer", "num-integer",
"num-traits 0.2.11", "num-traits 0.2.12",
"serde", "serde",
"time", "time",
] ]
@ -153,12 +147,13 @@ checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
[[package]] [[package]]
name = "crossbeam-queue" name = "crossbeam-queue"
version = "0.2.1" version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crossbeam-utils", "crossbeam-utils",
"maybe-uninit",
] ]
[[package]] [[package]]
@ -205,9 +200,9 @@ checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.22" version = "0.8.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" checksum = "e8ac63f94732332f44fe654443c46f6375d1939684c17b0afb6cb56b0456e171"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
] ]
@ -229,9 +224,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
[[package]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.6" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]] [[package]]
name = "foreign-types" name = "foreign-types"
@ -266,9 +261,9 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
[[package]] [[package]]
name = "futures" name = "futures"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
dependencies = [ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
@ -281,9 +276,9 @@ dependencies = [
[[package]] [[package]]
name = "futures-channel" name = "futures-channel"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
@ -291,15 +286,15 @@ dependencies = [
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
[[package]] [[package]]
name = "futures-executor" name = "futures-executor"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-task", "futures-task",
@ -308,27 +303,30 @@ dependencies = [
[[package]] [[package]]
name = "futures-io" name = "futures-io"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
[[package]] [[package]]
name = "futures-sink" name = "futures-sink"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
[[package]] [[package]]
name = "futures-task" name = "futures-task"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
dependencies = [
"once_cell",
]
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
dependencies = [ dependencies = [
"futures-channel", "futures-channel",
"futures-core", "futures-core",
@ -336,6 +334,7 @@ dependencies = [
"futures-sink", "futures-sink",
"futures-task", "futures-task",
"memchr", "memchr",
"pin-project",
"pin-utils", "pin-utils",
"slab", "slab",
] ]
@ -362,9 +361,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.2.4" version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42" checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@ -380,10 +379,19 @@ dependencies = [
] ]
[[package]] [[package]]
name = "hermit-abi" name = "heck"
version = "0.1.11" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a0d737e0f947a1864e93d33fdef4af8445a00d1ed8dc0c8ddb73139ea6abf15" checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "hermit-abi"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -433,9 +441,9 @@ checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.13.5" version = "0.13.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" checksum = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -447,8 +455,8 @@ dependencies = [
"httparse", "httparse",
"itoa", "itoa",
"log", "log",
"net2",
"pin-project", "pin-project",
"socket2",
"time", "time",
"tokio", "tokio",
"tower-service", "tower-service",
@ -481,9 +489,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "1.3.2" version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292" checksum = "c398b2b113b55809ceb9ee3e753fcbac793f1956663f3c36549c1346015c2afe"
dependencies = [ dependencies = [
"autocfg", "autocfg",
] ]
@ -505,9 +513,9 @@ checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.37" version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a27d435371a2fa5b6d2b028a74bbdb1234f308da363226a2854ca3ff8ba7055" checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177"
dependencies = [ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
@ -530,9 +538,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.69" version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
[[package]] [[package]]
name = "log" name = "log"
@ -565,12 +573,24 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3516df0fb44d98fe6d6e859d224adfb7b6686447937e5b96308d6061595eed04" checksum = "3516df0fb44d98fe6d6e859d224adfb7b6686447937e5b96308d6061595eed04"
[[package]]
name = "maplit"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
[[package]] [[package]]
name = "matches" name = "matches"
version = "0.1.8" version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
[[package]]
name = "maybe-uninit"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
[[package]] [[package]]
name = "md-5" name = "md-5"
version = "0.8.0" version = "0.8.0"
@ -606,9 +626,9 @@ dependencies = [
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.6.21" version = "0.6.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fuchsia-zircon", "fuchsia-zircon",
@ -623,6 +643,17 @@ dependencies = [
"winapi 0.2.8", "winapi 0.2.8",
] ]
[[package]]
name = "mio-uds"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0"
dependencies = [
"iovec",
"libc",
"mio",
]
[[package]] [[package]]
name = "miow" name = "miow"
version = "0.2.1" version = "0.2.1"
@ -655,9 +686,9 @@ dependencies = [
[[package]] [[package]]
name = "net2" name = "net2"
version = "0.2.33" version = "0.2.34"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
@ -666,12 +697,12 @@ dependencies = [
[[package]] [[package]]
name = "num-integer" name = "num-integer"
version = "0.1.42" version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"num-traits 0.2.11", "num-traits 0.2.12",
] ]
[[package]] [[package]]
@ -680,14 +711,14 @@ version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
dependencies = [ dependencies = [
"num-traits 0.2.11", "num-traits 0.2.12",
] ]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.11" version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611"
dependencies = [ dependencies = [
"autocfg", "autocfg",
] ]
@ -702,6 +733,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "once_cell"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
[[package]] [[package]]
name = "opaque-debug" name = "opaque-debug"
version = "0.2.3" version = "0.2.3"
@ -730,9 +767,9 @@ checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
[[package]] [[package]]
name = "openssl-sys" name = "openssl-sys"
version = "0.9.55" version = "0.9.58"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7717097d810a0f2e2323f9e5d11e71608355e24828410b55b9d4f18aa5f9a5d8" checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"cc", "cc",
@ -749,18 +786,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]] [[package]]
name = "pin-project" name = "pin-project"
version = "0.4.9" version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f6a7f5eee6292c559c793430c55c00aea9d3b3d1905e855806ca4d7253426a2" checksum = "12e3a6cdbfe94a5e4572812a0201f8c0ed98c1c452c7b8563ce2276988ef9c17"
dependencies = [ dependencies = [
"pin-project-internal", "pin-project-internal",
] ]
[[package]] [[package]]
name = "pin-project-internal" name = "pin-project-internal"
version = "0.4.9" version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8988430ce790d8682672117bc06dda364c0be32d3abd738234f19f3240bad99a" checksum = "6a0ffd45cf79d88737d7cc85bfd5d2894bee1139b356e616fe85dc389c61aaf7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -769,15 +806,15 @@ dependencies = [
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.1.4" version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" checksum = "282adbf10f2698a7a77f8e983a74b2d18176c19a7fd32a45446139ae7b02b715"
[[package]] [[package]]
name = "pin-utils" name = "pin-utils"
version = "0.1.0-alpha.4" version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
@ -787,24 +824,24 @@ checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.6" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.10" version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
dependencies = [ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.3" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@ -858,9 +895,9 @@ checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.3.7" version = "1.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@ -870,26 +907,26 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.17" version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
[[package]] [[package]]
name = "remove_dir_all" name = "remove_dir_all"
version = "0.5.2" version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [ dependencies = [
"winapi 0.3.8", "winapi 0.3.8",
] ]
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.10.4" version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02b81e49ddec5109a9dcfc5f2a317ff53377c915e9ae9d4f2fb50914b85614e2" checksum = "3b82c9238b305f26f53443e3a4bc8528d64b8d0bee408ec949eb7bf5635ec680"
dependencies = [ dependencies = [
"base64 0.11.0", "base64",
"bytes", "bytes",
"encoding_rs", "encoding_rs",
"futures-core", "futures-core",
@ -908,7 +945,6 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"serde", "serde",
"serde_urlencoded", "serde_urlencoded",
"time",
"tokio", "tokio",
"tokio-tls", "tokio-tls",
"url", "url",
@ -920,15 +956,15 @@ dependencies = [
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.3" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]] [[package]]
name = "schannel" name = "schannel"
version = "0.1.18" version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "039c25b130bd8c1321ee2d7de7fde2659fa9c2744e4bb29711cfc852ea53cd19" checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"winapi 0.3.8", "winapi 0.3.8",
@ -936,9 +972,9 @@ dependencies = [
[[package]] [[package]]
name = "security-framework" name = "security-framework"
version = "0.4.2" version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a" checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"core-foundation", "core-foundation",
@ -949,9 +985,9 @@ dependencies = [
[[package]] [[package]]
name = "security-framework-sys" name = "security-framework-sys"
version = "0.4.2" version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f" checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405"
dependencies = [ dependencies = [
"core-foundation-sys", "core-foundation-sys",
"libc", "libc",
@ -959,18 +995,18 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.106" version = "1.0.112"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" checksum = "736aac72d1eafe8e5962d1d1c3d99b0df526015ba40915cb3c49d042e92ec243"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.106" version = "1.0.112"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" checksum = "bf0343ce212ac0d3d6afd9391ac8e9c9efe06b533c8d33f660f6390cc4093f57"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -979,9 +1015,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.51" version = "1.0.55"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" checksum = "ec2c5d7e739bc07a3e73381a39d61fdb5f671c60c1df26a130690665803d8226"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -1014,9 +1050,9 @@ dependencies = [
[[package]] [[package]]
name = "sha2" name = "sha2"
version = "0.8.1" version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69"
dependencies = [ dependencies = [
"block-buffer", "block-buffer",
"digest", "digest",
@ -1032,31 +1068,53 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.3.0" version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a" checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
[[package]]
name = "socket2"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"winapi 0.3.8",
]
[[package]]
name = "sqlformat"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce64a4576e1720a2e511bf3ccdb8c0f6cfed0fc265bcbaa0bd369485e02c631"
dependencies = [
"lazy_static",
"maplit",
"regex",
]
[[package]] [[package]]
name = "sqlx" name = "sqlx"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2c268cf2f045f3d8b6b54e50653e66c59d6770373b2b59ba29dea459e8294cf" checksum = "8974cacd80085fbe49e778708d660dec6fb351604dc34c3905b26efb2803b038"
dependencies = [ dependencies = [
"sqlx-core", "sqlx-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"sqlx-macros", "sqlx-macros 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "sqlx-core" name = "sqlx-core"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "673fb6f30bdc14b7812a5ae22d7cc1e8e3d1debd5384eedbdf745827e9721cf3"
dependencies = [ dependencies = [
"async-native-tls", "async-native-tls",
"async-stream", "async-stream",
"base64 0.12.0", "base64",
"bitflags", "bitflags",
"byteorder", "byteorder",
"chrono",
"crossbeam-queue", "crossbeam-queue",
"crossbeam-utils", "crossbeam-utils",
"futures-channel", "futures-channel",
@ -1074,28 +1132,69 @@ dependencies = [
"serde_json", "serde_json",
"sha-1", "sha-1",
"sha2", "sha2",
"sqlformat",
"tokio",
"url",
]
[[package]]
name = "sqlx-core"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ac5a436f941c42eac509471a730df5c3c58e1450e68cd39afedbd948206273"
dependencies = [
"async-native-tls",
"async-stream",
"base64",
"bitflags",
"byteorder",
"chrono",
"crossbeam-queue",
"crossbeam-utils",
"futures-channel",
"futures-core",
"futures-util",
"hex",
"hmac",
"libc",
"log",
"md-5",
"memchr",
"percent-encoding",
"rand",
"serde",
"serde_json",
"sha-1",
"sha2",
"sqlformat",
"tokio", "tokio",
"url", "url",
] ]
[[package]] [[package]]
name = "sqlx-macros" name = "sqlx-macros"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de981547a9e8c15336b30079ca040ca252aa91c071e05298d699981d6dec041"
dependencies = [ dependencies = [
"dotenv", "dotenv",
"futures", "futures",
"heck",
"lazy_static", "lazy_static",
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde_json", "serde_json",
"sqlx-core", "sqlx-core 0.3.5",
"syn", "syn",
"tokio", "tokio",
"url", "url",
] ]
[[package]]
name = "sqlx-macros"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de2ae78b783af5922d811b14665a5a3755e531c3087bb805cf24cf71f15e6780"
replace = "sqlx-macros 0.3.5"
[[package]] [[package]]
name = "steamid-ng" name = "steamid-ng"
version = "0.3.4" version = "0.3.4"
@ -1117,9 +1216,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.17" version = "1.0.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" checksum = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1154,18 +1253,18 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.15" version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.15" version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1183,28 +1282,29 @@ dependencies = [
[[package]] [[package]]
name = "time" name = "time"
version = "0.1.42" version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
dependencies = [ dependencies = [
"libc", "libc",
"redox_syscall",
"winapi 0.3.8", "winapi 0.3.8",
] ]
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "0.2.18" version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34ef16d072d2b6dc8b4a56c70f5c5ced1a37752116f8e7c1e80c659aa7cb6713" checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
"futures-core", "futures-core",
"iovec", "iovec",
"lazy_static", "lazy_static",
"libc",
"memchr", "memchr",
"mio", "mio",
"mio-uds",
"num_cpus", "num_cpus",
"pin-project-lite", "pin-project-lite",
"slab", "slab",
@ -1224,9 +1324,9 @@ dependencies = [
[[package]] [[package]]
name = "tokio-tls" name = "tokio-tls"
version = "0.3.0" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bde02a3a5291395f59b06ec6945a3077602fac2b07eeeaf0dee2122f3619828" checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343"
dependencies = [ dependencies = [
"native-tls", "native-tls",
"tokio", "tokio",
@ -1291,6 +1391,12 @@ dependencies = [
"smallvec", "smallvec",
] ]
[[package]]
name = "unicode-segmentation"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"
version = "0.2.0" version = "0.2.0"
@ -1310,15 +1416,15 @@ dependencies = [
[[package]] [[package]]
name = "vcpkg" name = "vcpkg"
version = "0.2.8" version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.1" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
[[package]] [[package]]
name = "want" name = "want"
@ -1338,9 +1444,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.60" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cc57ce05287f8376e998cbddfb4c8cb43b84a7ec55cf4551d7c00eef317a47f" checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"serde", "serde",
@ -1350,9 +1456,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.60" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d967d37bf6c16cca2973ca3af071d0a2523392e4a594548155d89a678f4237cd" checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
@ -1365,9 +1471,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-futures" name = "wasm-bindgen-futures"
version = "0.4.10" version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7add542ea1ac7fdaa9dc25e031a6af33b7d63376292bd24140c637d00d1c312a" checksum = "64487204d863f109eb77e8462189d111f27cb5712cc9fdb3461297a76963a2f6"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys", "js-sys",
@ -1377,9 +1483,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.60" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bd151b63e1ea881bb742cd20e1d6127cef28399558f3b5d415289bc41eee3a4" checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -1387,9 +1493,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.60" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d68a5b36eef1be7868f668632863292e37739656a80fc4b9acec7b0bd35a4931" checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1400,15 +1506,15 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.60" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf76fe7d25ac79748a37538b7daeed1c7a6867c92d3245c12c6222e4a20d639" checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.37" version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d6f51648d8c56c366144378a33290049eafdd784071077f6fe37dae64c1c4cb" checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"wasm-bindgen", "wasm-bindgen",
@ -1450,9 +1556,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.6.2" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69"
dependencies = [ dependencies = [
"winapi 0.3.8", "winapi 0.3.8",
] ]

View file

@ -5,7 +5,7 @@ authors = ["Robin Appelman <robin@icewind.nl>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
sqlx = { version = "0.3", default_features = false, features = ["macros", "postgres", "json", "runtime-tokio"] } sqlx = { version = "0.3", default_features = false, features = ["macros", "postgres", "json", "runtime-tokio", "chrono"] }
dotenv = "0.15.0" dotenv = "0.15.0"
main_error = "0.1.0" main_error = "0.1.0"
tokio = { version = "0.2.13", features = ["macros", "time"] } tokio = { version = "0.2.13", features = ["macros", "time"] }
@ -14,4 +14,7 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
chrono = { version = "0.4", features = ["serde"] } chrono = { version = "0.4", features = ["serde"] }
steamid-ng = "0.3.4" steamid-ng = "0.3.4"
test-case = "1.0.0" test-case = "1.0.0"
[replace]
"sqlx-macros:0.3.5" = { path = "../sqlx/sqlx-macros" }

View file

@ -1,231 +1,17 @@
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public; CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
CREATE TYPE team AS ENUM ('Blue', 'Red'); CREATE TYPE team AS ENUM ('blue', 'red');
CREATE TYPE class_type AS ENUM ('scout', 'soldier', 'pyro', 'demoman', 'heavyweapons', 'engineer', 'medic', 'sniper', 'spy'); CREATE TYPE class_type AS ENUM ('scout', 'soldier', 'pyro', 'demoman', 'heavyweapons', 'engineer', 'medic', 'sniper', 'spy');
CREATE TYPE game_mode AS ENUM ('ultiduo', '4v4', '6v6', '7v7', '9v9', 'other'); CREATE TYPE game_mode AS ENUM ('ultiduo', '4v4', '6v6', '7v7', '9v9', 'other');
CREATE TYPE map_type AS ENUM ('stopwatch', 'cp', 'koth', 'ctf', 'ultiduo', 'bball', 'other');
CREATE TYPE event_type AS ENUM ('charge', 'pointcap', 'medic_death', 'round_win'); CREATE TYPE event_type AS ENUM ('charge', 'pointcap', 'medic_death', 'round_win');
CREATE TYPE medigun AS ENUM ('medigun', 'kritzkrieg', 'quickfix', 'vacinator'); CREATE TYPE medigun AS ENUM ('medigun', 'kritzkrieg', 'quickfix', 'vacinator');
CREATE TYPE weapon_id AS ENUM (
'sniperrifle',
'taunt_sniper',
'sydney_sleeper',
'the_winger',
'hot_hand',
'deflect_rocket',
'scout_sword',
'voodoo_pin',
'degreaser',
'shortstop',
'robot_arm',
'tf_pumpkin_bomb',
'kunai',
'wrench',
'necro_smasher',
'headtaker',
'proto_syringe',
'eternal_reward',
'eureka_effect',
'dragons_fury_bonus',
'grappling_hook',
'pep_pistol',
'guillotine',
'lava_axe',
'wrangler_kill',
'panic_attack',
'loose_cannon',
'thirddegree',
'taunt_pyro',
'iron_bomber',
'persian_persuader',
'amputator',
'tf_projectile_pipe',
'awper_hand',
'demokatana',
'loose_cannon_reflect',
'obj_minisentry',
'back_scratcher',
'pomson',
'the_classic',
'sandman',
'axtinguisher',
'obj_sentrygun2',
'jar',
'samrevolver',
'deflect_flare',
'loch_n_load',
'tf_projectile_rocket',
'annihilator',
'rocketpack_stomp',
'ullapool_caber_explosion',
'minigun',
'deflect_promode',
'liberty_launcher',
'nessieclub',
'quickiebomb_launcher',
'cow_mangler',
'wrap_assassin',
'blackbox',
'candy_cane',
'rocketlauncher_directhit',
'ai_flamethrower',
'soda_popper',
'frontier_justice',
'rescue_ranger_reflect',
'warrior_spirit',
'widowmaker',
'quake_rl',
'tf_projectile_arrow',
'sledgehammer',
'deflect_arrow',
'market_gardener',
'unique_pickaxe_escape',
'pistol_scout',
'boston_basher',
'spellbook_bats',
'holymackerel',
'club',
'ball',
'fireaxe',
'backburner',
'eviction_notice',
'holiday_punch',
'taunt_soldier',
'shotgun_primary',
'nonnonviolent_protest',
'force_a_nature',
'paintrain',
'freedom_staff',
'shotgun_hwg',
'long_heatmaker',
'shotgun_soldier',
'knife',
'batsaber',
'mailbox',
'compound_bow',
'ullapool_caber',
'ambassador',
'player_penetration',
'powerjack',
'crusaders_crossbow',
'scotland_shard',
'wrench_jag',
'scattergun',
'unknown',
'shahanshah',
'pistol',
'spellbook_boss',
'smg',
'dragons_fury',
'revolver',
'player',
'the_maul',
'skullbat',
'ham_shank',
'solemn_vow',
'iron_curtain',
'bonesaw',
'dumpster_device',
'bushwacka',
'builder',
'bread_bite',
'southern_hospitality',
'tribalkukri',
'the_capper',
'fists',
'disciplinary_action',
'tf_projectile_flare',
'bleed_kill',
'black_rose',
'letranger',
'tomislav',
'atomizer',
'back_scatter',
'pep_brawlerblaster',
'tf_projectile_pipe_remote',
'battleaxe',
'deflect_flare_detonator',
'taunt_medic',
'telefrag',
'stickybomb_defender',
'splendid_screen',
'claidheamohmor',
'airstrike',
'righteous_bison',
'gloves_running_urgently',
'sword',
'mantreads',
'deflect_sticky',
'enforcer',
'scorch_shot',
'pro_rifle',
'spy_cicle',
'bat',
'sharp_dresser',
'spellbook_lightning',
'tide_turner',
'shotgun_pyro',
'lava_bat',
'taunt_heavy',
'bottle',
'unique_pickaxe',
'phlogistinator',
'crossing_guard',
'giger_counter',
'charged_smg',
'syringegun_medic',
'gloves',
'bazaar_bargain',
'spellbook_mirv',
'big_earner',
'battleneedle',
'warfan',
'obj_sentrygun',
'manmelter',
'family_business',
'reserve_shooter',
'short_circuit',
'flaregun',
'spellbook_fireball',
'world',
'jar_milk',
'flamethrower',
'shooting_star',
'trigger_hurt',
'blutsauger',
'taunt_spy',
'tf_projectile_energy_ball',
'jar_gas',
'tf_projectile_mechanicalarmorb',
'obj_sentrygun3',
'diamondback',
'shovel',
'brass_beast',
'loose_cannon_impact',
'demoshield',
'prinny_machete',
'machina',
'rocketlauncher_fireball',
'sticky_resistance',
'detonator',
'tf_projectile_sentryrocket',
'unarmed_combat',
'spellbook_skeleton',
'ubersaw',
'maxgun',
'robot_arm_combo_kill',
'rescue_ranger',
'apocofists',
'natascha',
'pro_smg',
'steel_fists',
'fryingpan',
);
CREATE TABLE logs ( CREATE TABLE logs (
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
red_score INTEGER NOT NULL, red_score INTEGER NOT NULL,
@ -233,6 +19,7 @@ CREATE TABLE logs (
length INTEGER NOT NULL, length INTEGER NOT NULL,
game_mode game_mode NOT NULL, game_mode game_mode NOT NULL,
map TEXT NOT NULL, map TEXT NOT NULL,
type map_type NOT NULL,
date TIMESTAMP WITHOUT TIME ZONE NOT NULL date TIMESTAMP WITHOUT TIME ZONE NOT NULL
); );
@ -309,6 +96,23 @@ CREATE TABLE events_medic_death (
CREATE INDEX events_medic_death_round_id_idx CREATE INDEX events_medic_death_round_id_idx
ON events_medic_death USING BTREE (round_id); ON events_medic_death USING BTREE (round_id);
CREATE INDEX events_medic_death_steam_id_idx
ON events_medic_death USING BTREE (steam_id);
CREATE TABLE events_drop (
id SERIAL PRIMARY KEY,
round_id INTEGER NOT NULL REFERENCES rounds(id),
time INTEGER NOT NULL,
team team NOT NULL,
steam_id BIGINT NOT NULL
);
CREATE INDEX events_drop_round_id_idx
ON events_drop USING BTREE (round_id);
CREATE INDEX events_drop_steam_id_idx
ON events_drop USING BTREE (steam_id);
CREATE TABLE events_round_win ( CREATE TABLE events_round_win (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
round_id INTEGER NOT NULL REFERENCES rounds(id), round_id INTEGER NOT NULL REFERENCES rounds(id),
@ -382,7 +186,7 @@ CREATE UNIQUE INDEX class_stats_player_id_type_idx
CREATE TABLE player_weapon_stats ( CREATE TABLE player_weapon_stats (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
class_stat_id INTEGER NOT NULL REFERENCES class_stats(id), class_stat_id INTEGER NOT NULL REFERENCES class_stats(id),
weapon weapon_id NOT NULL, weapon TEXT NOT NULL,
kills INTEGER NOT NULL, kills INTEGER NOT NULL,
shots INTEGER NOT NULL, shots INTEGER NOT NULL,
hits INTEGER NOT NULL, hits INTEGER NOT NULL,

View file

@ -1,12 +1,17 @@
use serde::Deserialize; use serde::Deserialize;
#[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Eq, PartialEq)] #[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Eq, PartialEq)]
#[sqlx(rename = "team")]
#[sqlx(rename_all = "lowercase")]
pub enum TeamId { pub enum TeamId {
Blue, Blue,
Red, Red,
} }
#[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Eq, PartialEq)] #[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
#[sqlx(rename_all = "lowercase")]
#[sqlx(rename = "class_type")]
pub enum Class { pub enum Class {
Scout, Scout,
Soldier, Soldier,
@ -19,13 +24,20 @@ pub enum Class {
Spy, Spy,
} }
#[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Eq, PartialEq)] #[derive(Debug, Clone, Copy, sqlx::Type, Eq, PartialEq)]
#[sqlx(rename = "game_mode")]
pub enum GameMode { pub enum GameMode {
#[sqlx(rename = "ultiduo")]
UltiDuo, UltiDuo,
#[sqlx(rename = "4v4")]
Fours, Fours,
#[sqlx(rename = "6v6")]
Sixes, Sixes,
#[sqlx(rename = "7v7")]
Sevens, Sevens,
#[sqlx(rename = "9v9")]
Highlander, Highlander,
#[sqlx(rename = "other")]
Other, Other,
} }
@ -39,6 +51,7 @@ pub enum EventType {
#[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Hash, Eq, PartialEq)] #[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Hash, Eq, PartialEq)]
#[serde(rename_all = "lowercase")] #[serde(rename_all = "lowercase")]
#[sqlx(rename_all = "lowercase")]
pub enum Medigun { pub enum Medigun {
Medigun, Medigun,
KritzKrieg, KritzKrieg,
@ -52,221 +65,21 @@ impl Default for Medigun {
} }
} }
#[derive(Debug, Clone, Copy, sqlx::Type, Deserialize, Hash, Eq, PartialEq)] #[derive(Debug, Clone, Copy, sqlx::Type, Eq, PartialEq)]
// #[sqlx(rename_all = "snake_case")] #[sqlx(rename_all = "lowercase")]
#[serde(rename_all = "snake_case")] #[sqlx(rename = "map_type")]
pub enum Weapon { pub enum MapType {
Sniperrifle, Stopwatch,
TauntSniper, Cp,
SydneySleeper, KOTH,
TheWinger, CTF,
HotHand, UltiDuo,
DeflectRocket, BBall,
ScoutSword, Other,
VoodooPin, }
Degreaser,
Shortstop, impl Default for MapType {
RobotArm, fn default() -> Self {
TfPumpkinBomb, MapType::Other
Kunai, }
Wrench,
NecroSmasher,
Headtaker,
ProtoSyringe,
EternalReward,
EurekaEffect,
DragonsFuryBonus,
GrapplingHook,
PepPistol,
Guillotine,
LavaAxe,
WranglerKill,
PanicAttack,
LooseCannon,
Thirddegree,
TauntPyro,
IronBomber,
PersianPersuader,
Amputator,
TfProjectilePipe,
AwperHand,
Demokatana,
LooseCannonReflect,
ObjMinisentry,
BackScratcher,
Pomson,
TheClassic,
Sandman,
Axtinguisher,
ObjSentrygun2,
Jar,
Samrevolver,
DeflectFlare,
LochNLoad,
TfProjectileRocket,
Annihilator,
RocketpackStomp,
UllapoolCaberExplosion,
Minigun,
DeflectPromode,
LibertyLauncher,
Nessieclub,
QuickiebombLauncher,
CowMangler,
WrapAssassin,
Blackbox,
CandyCane,
RocketlauncherDirecthit,
AiFlamethrower,
SodaPopper,
FrontierJustice,
RescueRangerReflect,
WarriorSpirit,
Widowmaker,
QuakeRl,
TfProjectileArrow,
Sledgehammer,
DeflectArrow,
MarketGardener,
UniquePickaxeEscape,
PistolScout,
BostonBasher,
SpellbookBats,
Holymackerel,
Club,
Ball,
Fireaxe,
Backburner,
EvictionNotice,
HolidayPunch,
TauntSoldier,
ShotgunPrimary,
NonnonviolentProtest,
ForceANature,
Paintrain,
FreedomStaff,
ShotgunHwg,
LongHeatmaker,
ShotgunSoldier,
Knife,
Batsaber,
Mailbox,
CompoundBow,
UllapoolCaber,
Ambassador,
PlayerPenetration,
Powerjack,
CrusadersCrossbow,
ScotlandShard,
WrenchJag,
Scattergun,
Unknown,
Shahanshah,
Pistol,
SpellbookBoss,
Smg,
DragonsFury,
Revolver,
Player,
TheMaul,
Skullbat,
HamShank,
SolemnVow,
IronCurtain,
Bonesaw,
DumpsterDevice,
Bushwacka,
Builder,
BreadBite,
SouthernHospitality,
Tribalkukri,
TheCapper,
Fists,
DisciplinaryAction,
TfProjectileFlare,
BleedKill,
BlackRose,
Letranger,
Tomislav,
Atomizer,
BackScatter,
PepBrawlerblaster,
TfProjectilePipeRemote,
Battleaxe,
DeflectFlareDetonator,
TauntMedic,
Telefrag,
StickybombDefender,
SplendidScreen,
Claidheamohmor,
Airstrike,
RighteousBison,
GlovesRunningUrgently,
Sword,
Mantreads,
DeflectSticky,
Enforcer,
ScorchShot,
ProRifle,
SpyCicle,
Bat,
SharpDresser,
SpellbookLightning,
TideTurner,
ShotgunPyro,
LavaBat,
TauntHeavy,
Bottle,
UniquePickaxe,
Phlogistinator,
CrossingGuard,
GigerCounter,
ChargedSmg,
SyringegunMedic,
Gloves,
BazaarBargain,
SpellbookMirv,
BigEarner,
Battleneedle,
Warfan,
ObjSentrygun,
Manmelter,
FamilyBusiness,
ReserveShooter,
ShortCircuit,
Flaregun,
SpellbookFireball,
World,
JarMilk,
Flamethrower,
ShootingStar,
TriggerHurt,
Blutsauger,
TauntSpy,
TfProjectileEnergyBall,
JarGas,
TfProjectileMechanicalarmorb,
ObjSentrygun3,
Diamondback,
Shovel,
BrassBeast,
LooseCannonImpact,
Demoshield,
PrinnyMachete,
Machina,
RocketlauncherFireball,
StickyResistance,
Detonator,
TfProjectileSentryrocket,
UnarmedCombat,
SpellbookSkeleton,
Ubersaw,
Maxgun,
RobotArmComboKill,
RescueRanger,
Apocofists,
Natascha,
ProSmg,
SteelFists,
Fryingpan,
} }

257
src/database.rs Normal file
View file

@ -0,0 +1,257 @@
use crate::data::{Class, GameMode, MapType, Medigun, TeamId};
use crate::normalized::NormalizedLog;
use crate::raw::Event;
use chrono::{DateTime, Utc};
use sqlx::PgPool;
use std::collections::HashMap;
use steamid_ng::SteamID;
pub async fn store_log(pool: &PgPool, id: u32, log: &NormalizedLog) -> Result<(), sqlx::Error> {
sqlx::query!(
"INSERT INTO logs(id, red_score, blue_score, length, game_mode, map, type, date)\
VALUES($1, $2, $3, $4, $5, $6, $7, $8)",
id as i32,
log.teams.red.score as i32,
log.teams.blue.score as i32,
log.info.total_length as i32,
log.game_mode() as GameMode,
log.info.map,
log.info.map_type() as MapType,
log.info.date() as DateTime<Utc>
)
.execute(pool)
.await?;
for (num, round) in log.rounds.iter().enumerate() {
let round_id: i32 = sqlx::query!(
r#"INSERT INTO rounds(
round, log_id, length, winner, first_cap, red_score, blue_score,
red_kills, blue_kills, red_dmg, blue_dmg, red_ubers, blue_ubers
)
VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
RETURNING id"#,
num as i32,
id as i32,
round.length as i32,
round.winner as TeamId,
round.first_cap as TeamId,
round.team.red.score as i32,
round.team.blue.score as i32,
round.team.red.kills as i32,
round.team.blue.kills as i32,
round.team.red.dmg as i32,
round.team.blue.dmg as i32,
round.team.red.charges as i32,
round.team.blue.charges as i32,
)
.fetch_one(pool)
.await?
.id;
for event in &round.events {
match event {
Event::PointCap { time, team, point } => {
sqlx::query!(
"INSERT INTO events_point_cap(round_id, time, team, point)\
VALUES($1, $2, $3, $4)",
round_id,
*time as i32,
*team as TeamId,
*point as i32,
)
.execute(pool)
.await?;
}
Event::RoundWin { time, team } => {
sqlx::query!(
"INSERT INTO events_round_win(round_id, time, team)\
VALUES($1, $2, $3)",
round_id,
*time as i32,
*team as TeamId,
)
.execute(pool)
.await?;
}
Event::MedicDeath {
time,
team,
steamid,
killer,
} => {
sqlx::query!(
"INSERT INTO events_medic_death(round_id, time, team, steam_id, killer)\
VALUES($1, $2, $3, $4, $5)",
round_id,
*time as i32,
*team as TeamId,
u64::from(*steamid) as i64,
u64::from(*killer) as i64,
)
.execute(pool)
.await?;
}
Event::Drop {
time,
steamid,
team,
} => {
sqlx::query!(
"INSERT INTO events_drop(round_id, time, team, steam_id)\
VALUES($1, $2, $3, $4)",
round_id,
*time as i32,
*team as TeamId,
u64::from(*steamid) as i64,
)
.execute(pool)
.await?;
}
Event::Charge {
medigun,
time,
steamid,
team,
} => {
sqlx::query!(
"INSERT INTO events_charge(round_id, time, team, medigun, steam_id)\
VALUES($1, $2, $3, $4, $5)",
round_id,
*time as i32,
*team as TeamId,
*medigun as Medigun,
u64::from(*steamid) as i64,
)
.execute(pool)
.await?;
}
}
}
}
let mut heals_received: HashMap<SteamID, u32> = HashMap::new();
for heal_map in log.heal_spread.values() {
for (steam_id, heals) in heal_map {
heals_received
.entry(*steam_id)
.and_modify(|received| *received += heals)
.or_insert(*heals);
}
}
for (steam_id, player) in &log.players {
let kills = log.class_kills.get(steam_id).cloned().unwrap_or_default();
let player_id: i32 = sqlx::query!(
"INSERT INTO players (\
log_id, steam_id, name, kills, deaths, assists,\
suicides, dmg, damage_taken, ubers, medigun_ubers,\
kritzkrieg_ubers, quickfix_ubers, vacinator_ubers,\
drops, medkits, medkits_hp, backstabs, headshots,\
heal, heals_received,\
scout_kills, soldier_kills, pyro_kills, demoman_kills,\
heavy_kills, engineer_kills, medic_kills, sniper_kills, spy_kills
)\
VALUES(\
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10,\
$11, $12, $13, $14, $15, $16, $17, $18, $19, $20,\
$21, $22, $23, $24, $25, $26, $27, $28, $29, $30\
)\
RETURNING id",
id as i32,
u64::from(*steam_id) as i64,
log.names.get(steam_id).cloned().unwrap_or_default(),
player.kills as i32,
player.deaths as i32,
player.assists as i32,
player.suicides as i32,
player.dmg as i32,
player.dt_real as i32,
player.ubers as i32,
player
.ubertypes
.get(&Medigun::Medigun)
.copied()
.unwrap_or_default() as i32,
player
.ubertypes
.get(&Medigun::KritzKrieg)
.copied()
.unwrap_or_default() as i32,
player
.ubertypes
.get(&Medigun::QuickFix)
.copied()
.unwrap_or_default() as i32,
player
.ubertypes
.get(&Medigun::Vacinator)
.copied()
.unwrap_or_default() as i32,
player.drops as i32,
player.medkits as i32,
player.medkits_hp as i32,
player.backstabs as i32,
player.headshots as i32,
player.heal as i32,
heals_received.get(steam_id).copied().unwrap_or_default() as i32,
kills.scout as i32,
kills.soldier as i32,
kills.pyro as i32,
kills.demoman as i32,
kills.heavyweapons as i32,
kills.engineer as i32,
kills.medic as i32,
kills.sniper as i32,
kills.spy as i32
)
.fetch_one(pool)
.await?
.id;
for class in &player.class_stats {
let class_stat_id: i32 = sqlx::query!(
"INSERT INTO class_stats(player_id, type, time, kills, deaths, assists, dmg)\
VALUES($1, $2, $3, $4, $5, $6, $7)\
RETURNING id",
player_id,
class.class as Class,
class.total_time as i32,
class.kills as i32,
class.deaths as i32,
class.assists as i32,
class.dmg as i32,
)
.fetch_one(pool)
.await?
.id;
for (weapon, stats) in &class.weapon {
sqlx::query!(
"INSERT INTO player_weapon_stats(class_stat_id, weapon, kills, shots, hits, dmg)\
VALUES($1, $2, $3, $4, $5, $6)",
class_stat_id as i32,
*weapon,
stats.kills as i32,
stats.shots as i32,
stats.hits as i32,
stats.dmg as i32,
)
.execute(pool)
.await?;
}
}
}
Ok(())
}
// macro_rules! insert_fields {
// ($table:ident, {
// $($($field:ident => $value:expr),)+
// }) => {
// sqlx::query!(
// concat!("INSERT INTO ", stringify!($table), "(", stringify!$(field)) ") VALUES ()"\
// VALUES($1, $2, $3, $4, $5)",
// )
// };
// }

View file

@ -1,7 +1,23 @@
mod data; mod data;
mod raw; mod database;
mod normalized; mod normalized;
mod raw;
fn main() { use crate::database::store_log;
println!("Hello, world!"); use crate::normalized::NormalizedLog;
use main_error::MainError;
use sqlx::PgPool;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), MainError> {
let database_url = dotenv::var("DATABASE_URL")?;
let content = fs::read_to_string("tests/data/2522305.json").unwrap();
let parsed: NormalizedLog = serde_json::from_str(&content).unwrap();
let pool = PgPool::builder().max_size(2).build(&database_url).await?;
dbg!(store_log(&pool, 2522305, &parsed).await)?;
Ok(())
} }

View file

@ -1,8 +1,10 @@
pub use crate::data::TeamId; pub use crate::data::TeamId;
use crate::data::{GameMode, MapType};
use crate::raw::RawLog; use crate::raw::RawLog;
pub use crate::raw::{ pub use crate::raw::{
ChatMessage, ClassNumbers, Event, Player, RoundPlayer, Team, Teams, Uploader, ChatMessage, ClassNumbers, Event, Player, RoundPlayer, Team, Teams, Uploader,
}; };
use chrono::{DateTime, NaiveDateTime, Utc};
use serde::Deserialize; use serde::Deserialize;
use std::collections::HashMap; use std::collections::HashMap;
use steamid_ng::SteamID; use steamid_ng::SteamID;
@ -24,6 +26,22 @@ pub struct NormalizedLog {
pub info: Info, pub info: Info,
} }
impl NormalizedLog {
pub fn game_mode(&self) -> GameMode {
if self.info.map_type() == MapType::UltiDuo {
return GameMode::UltiDuo;
}
match self.players.len() {
7..=9 => GameMode::Fours,
11..=13 => GameMode::Sixes,
14 => GameMode::Sevens,
17..=19 => GameMode::Highlander,
_ => GameMode::Other,
}
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Info { pub struct Info {
pub map: String, pub map: String,
@ -49,6 +67,30 @@ pub struct Info {
pub uploader: Uploader, pub uploader: Uploader,
} }
impl Info {
pub fn map_type(&self) -> MapType {
if map_is_stopwatch(&self.map) {
MapType::Stopwatch
} else if self.map.starts_with("cp") {
MapType::Cp
} else if self.map.starts_with("koth") {
MapType::KOTH
} else if self.map.starts_with("ctf") {
MapType::CTF
} else if self.map.starts_with("ultiduo") {
MapType::UltiDuo
} else if self.map.starts_with("bball") {
MapType::BBall
} else {
MapType::Other
}
}
pub fn date(&self) -> DateTime<Utc> {
DateTime::from_utc(NaiveDateTime::from_timestamp(self.date as i64, 0), Utc)
}
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Round { pub struct Round {
pub start_time: u64, pub start_time: u64,

View file

@ -1,4 +1,4 @@
use crate::data::{Class, Medigun, TeamId, Weapon}; use crate::data::{Class, Medigun, TeamId};
use serde::export::TryFrom; use serde::export::TryFrom;
use serde::Deserialize; use serde::Deserialize;
use std::collections::HashMap; use std::collections::HashMap;
@ -54,6 +54,7 @@ pub struct Team {
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct Player { pub struct Player {
pub class_stats: Vec<ClassStat>,
pub team: TeamId, pub team: TeamId,
pub kills: u16, pub kills: u16,
pub deaths: u16, pub deaths: u16,
@ -106,20 +107,64 @@ pub struct ClassStat {
#[serde(rename = "type")] #[serde(rename = "type")]
pub class: Class, pub class: Class,
pub kills: u16, pub kills: u16,
pub assists: u16,
pub deaths: u16,
pub dmg: u32, pub dmg: u32,
pub total_time: u32, pub total_time: u32,
pub weapon: HashMap<Weapon, WeaponStat>, #[serde(default)]
pub weapon: HashMap<String, WeaponStat>,
} }
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum RawWeaponStats {
Kills(u32),
Stats {
kills: u32,
dmg: u32,
avg_dmg: f32,
shots: u32,
hits: u32,
},
}
#[derive(Debug, Clone, Deserialize)]
#[serde(from = "RawWeaponStats")]
pub struct WeaponStat { pub struct WeaponStat {
pub kills: u32, pub kills: u32,
pub dmg: u32, pub dmg: u32,
pub avg_dmg: u32, pub avg_dmg: f32,
pub shots: u32, pub shots: u32,
pub hits: u32, pub hits: u32,
} }
impl From<RawWeaponStats> for WeaponStat {
fn from(raw: RawWeaponStats) -> Self {
match raw {
RawWeaponStats::Kills(kills) => WeaponStat {
kills,
dmg: 0,
avg_dmg: 0.0,
shots: 0,
hits: 0,
},
RawWeaponStats::Stats {
kills,
dmg,
avg_dmg,
shots,
hits,
} => WeaponStat {
kills,
dmg,
avg_dmg,
shots,
hits,
},
}
}
}
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
pub struct Round { pub struct Round {
#[serde(default)] #[serde(default)]
@ -187,7 +232,7 @@ impl Event {
} }
} }
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize, Default)]
pub struct ClassNumbers { pub struct ClassNumbers {
#[serde(default)] #[serde(default)]
pub scout: u8, pub scout: u8,