diff --git a/Cargo.lock b/Cargo.lock index be44253..48d46f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", "once_cell", "version_check", ] @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.53" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -115,9 +115,9 @@ dependencies = [ "log", "pin-project-lite", "tokio", - "tokio-rustls 0.23.3", + "tokio-rustls 0.23.4", "tungstenite", - "webpki-roots 0.22.3", + "webpki-roots 0.22.4", ] [[package]] @@ -163,9 +163,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "base64ct" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea908e7347a8c64e378c17e30ef880ad73e3b4498346b055c2c00ea342f3179" +checksum = "3bdca834647821e0b13d9539a8634eb62d3501b6b6c2cec1722786ee6671b851" [[package]] name = "bigdecimal" @@ -202,15 +202,6 @@ dependencies = [ "generic-array 0.12.4", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.5", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -235,14 +226,17 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ + "lazy_static", "memchr", + "regex-automata", + "serde", ] [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byte-tools" @@ -290,7 +284,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time 0.1.43", + "time 0.1.44", "winapi 0.3.9", ] @@ -351,12 +345,11 @@ dependencies = [ "aes-gcm", "base64", "hkdf", - "hmac", "percent-encoding", "rand 0.8.5", - "sha2 0.10.2", + "sha2", "subtle", - "time 0.3.9", + "time 0.3.11", "version_check", ] @@ -421,12 +414,12 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" dependencies = [ "cfg-if 1.0.0", - "lazy_static", + "once_cell", ] [[package]] @@ -441,14 +434,36 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "2ccfd8c0ee4cce11e45b3fd6f9d5e69e0cc62912aa6a0cb1bf4617b0eba5a12f" dependencies = [ "generic-array 0.14.5", "typenum", ] +[[package]] +name = "csv" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa 0.4.8", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -495,13 +510,14 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.2.0" +version = "5.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" +checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" dependencies = [ "cfg-if 1.0.0", - "num_cpus", - "parking_lot 0.12.0", + "hashbrown 0.12.2", + "lock_api", + "parking_lot_core 0.9.3", "serde", ] @@ -575,15 +591,6 @@ dependencies = [ "generic-array 0.12.4", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.5", -] - [[package]] name = "digest" version = "0.10.3" @@ -603,9 +610,9 @@ checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "either" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" [[package]] name = "encoding_rs" @@ -666,25 +673,23 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall", - "winapi 0.3.9", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if 1.0.0", "crc32fast", - "libc", "miniz_oxide", ] @@ -875,14 +880,14 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if 1.0.0", "js-sys", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -904,9 +909,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -941,7 +946,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.3", "tracing", ] @@ -954,13 +959,19 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" + [[package]] name = "hashlink" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" dependencies = [ - "hashbrown", + "hashbrown 0.11.2", ] [[package]] @@ -1007,20 +1018,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -1029,9 +1040,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1053,9 +1064,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.18" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ "bytes", "futures-channel", @@ -1066,7 +1077,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa", + "itoa 1.0.2", "pin-project-lite", "socket2", "tokio", @@ -1083,9 +1094,9 @@ checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ "http", "hyper", - "rustls 0.20.4", + "rustls 0.20.6", "tokio", - "tokio-rustls 0.23.3", + "tokio-rustls 0.23.4", ] [[package]] @@ -1138,12 +1149,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.2", "serde", ] @@ -1208,15 +1219,21 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.1" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -1254,9 +1271,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.124" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libm" @@ -1276,18 +1293,18 @@ dependencies = [ [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "loom" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if 1.0.0", "generator", @@ -1321,9 +1338,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" @@ -1349,9 +1366,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", ] @@ -1369,7 +1386,7 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.2", + "miow", "net2", "slab", "winapi 0.2.8", @@ -1377,16 +1394,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow 0.3.7", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -1413,15 +1428,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "multer" version = "2.0.2" @@ -1438,7 +1444,7 @@ dependencies = [ "mime", "spin 0.9.3", "tokio", - "tokio-util 0.6.9", + "tokio-util 0.6.10", "version_check", ] @@ -1508,15 +1514,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-bigint" version = "0.3.3" @@ -1547,9 +1544,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -1557,9 +1554,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ "autocfg", "num-integer", @@ -1568,9 +1565,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", "libm", @@ -1588,38 +1585,38 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] [[package]] name = "oauth2" -version = "4.1.0" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e47cfc4c0a1a519d9a025ebfbac3a2439d1b5cdf397d72dcb79b11d9920dab" +checksum = "6d62c436394991641b970a92e23e8eeb4eb9bca74af4f5badc53bcd568daadbd" dependencies = [ "base64", "chrono", - "getrandom 0.2.6", + "getrandom 0.2.7", "http", "rand 0.8.5", "reqwest", "serde", "serde_json", "serde_path_to_error", - "sha2 0.9.9", + "sha2", "thiserror", "url", ] [[package]] name = "once_cell" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" [[package]] name = "opaque-debug" @@ -1635,18 +1632,30 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" dependencies = [ "bitflags", "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -1655,9 +1664,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.72" +version = "0.9.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" dependencies = [ "autocfg", "cc", @@ -1688,12 +1697,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.2", + "parking_lot_core 0.9.3", ] [[package]] @@ -1712,9 +1721,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1860,9 +1869,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -1900,9 +1909,9 @@ checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "poise" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2eb79ba8241eb65b549e778e22a242ea30f5829f7487f10d8d95cfff9a4729" +checksum = "8af8ef2efaa133d674482f40665db3424cb2c5660a2707918c869603c843b7ad" dependencies = [ "async-trait", "derivative", @@ -1918,9 +1927,9 @@ dependencies = [ [[package]] name = "poise_macros" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b786b4bdc58345204469420c306d8c638e465b4b1ecad7e27bf9c8a45096cf" +checksum = "94d99712c7e3cef666f344ccf5c5c729939331096d16c35eba3275028191a1af" dependencies = [ "darling", "proc-macro2", @@ -1946,13 +1955,11 @@ version = "0.1.0" dependencies = [ "chrono", "chrono-tz 0.5.3", - "env_logger", "lazy_static", "log", "num-integer", "regex", "serde", - "serde_json", "serenity", "sqlx", "tokio", @@ -1966,11 +1973,11 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1988,9 +1995,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -2054,7 +2061,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.6", + "getrandom 0.2.7", ] [[package]] @@ -2077,18 +2084,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" +checksum = "685d58625b6c2b83e4cc88a27c4bf65adb7b6b16dbdc413e515c9405b47432ab" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" +checksum = "a043824e29c94169374ac5183ac0ed43f5724dc4556b19568007486bd840fa1f" dependencies = [ "proc-macro2", "quote", @@ -2097,9 +2104,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -2117,9 +2124,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "reminder_rs" @@ -2155,6 +2162,7 @@ dependencies = [ "base64", "chrono", "chrono-tz 0.5.3", + "csv", "lazy_static", "log", "oauth2", @@ -2163,7 +2171,6 @@ dependencies = [ "rocket", "rocket_dyn_templates", "serde", - "serde_json", "serenity", "sqlx", ] @@ -2179,9 +2186,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", "bytes", @@ -2203,20 +2210,21 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", - "rustls 0.20.4", + "rustls 0.20.6", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-rustls 0.23.3", - "tokio-util 0.6.9", + "tokio-rustls 0.23.4", + "tokio-util 0.7.3", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.22.3", + "webpki-roots 0.22.4", "winreg", ] @@ -2259,8 +2267,8 @@ dependencies = [ [[package]] name = "rocket" -version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#49d138de14074d40fb9223467434a5626782f51a" +version = "0.5.0-rc.2" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#7275df9fdfab84c493c0fe4cc3f16e66018f2f14" dependencies = [ "async-stream", "async-trait", @@ -2276,7 +2284,7 @@ dependencies = [ "memchr", "multer", "num_cpus", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project-lite", "rand 0.8.5", "ref-cast", @@ -2286,10 +2294,10 @@ dependencies = [ "serde_json", "state", "tempfile", - "time 0.3.9", + "time 0.3.11", "tokio", "tokio-stream", - "tokio-util 0.7.1", + "tokio-util 0.7.3", "ubyte", "version_check", "yansi", @@ -2297,8 +2305,8 @@ dependencies = [ [[package]] name = "rocket_codegen" -version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#49d138de14074d40fb9223467434a5626782f51a" +version = "0.5.0-rc.2" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#7275df9fdfab84c493c0fe4cc3f16e66018f2f14" dependencies = [ "devise", "glob", @@ -2312,8 +2320,8 @@ dependencies = [ [[package]] name = "rocket_dyn_templates" -version = "0.1.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#49d138de14074d40fb9223467434a5626782f51a" +version = "0.1.0-rc.2" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#7275df9fdfab84c493c0fe4cc3f16e66018f2f14" dependencies = [ "glob", "normpath", @@ -2324,11 +2332,12 @@ dependencies = [ [[package]] name = "rocket_http" -version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#49d138de14074d40fb9223467434a5626782f51a" +version = "0.5.0-rc.2" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#7275df9fdfab84c493c0fe4cc3f16e66018f2f14" dependencies = [ "cookie", "either", + "futures", "http", "hyper", "indexmap", @@ -2338,15 +2347,15 @@ dependencies = [ "percent-encoding", "pin-project-lite", "ref-cast", - "rustls 0.20.4", + "rustls 0.20.6", "rustls-pemfile", "serde", "smallvec", "stable-pattern", "state", - "time 0.3.9", + "time 0.3.11", "tokio", - "tokio-rustls 0.23.3", + "tokio-rustls 0.23.4", "uncased", ] @@ -2385,9 +2394,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.4" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", @@ -2397,24 +2406,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "0.3.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" +checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" dependencies = [ "base64", ] [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "a0a5f7c728f5d284929a1cccb5bc19884422bfe6ef4d6c409da2c41838983fcf" [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -2427,12 +2436,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi 0.3.9", + "windows-sys", ] [[package]] @@ -2492,9 +2501,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" dependencies = [ "serde_derive", ] @@ -2511,9 +2520,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" dependencies = [ "proc-macro2", "quote", @@ -2522,11 +2531,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa", + "itoa 1.0.2", "ryu", "serde", ] @@ -2542,9 +2551,9 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -2558,7 +2567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa", + "itoa 1.0.2", "ryu", "serde", ] @@ -2581,13 +2590,13 @@ dependencies = [ "futures", "mime", "mime_guess", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "percent-encoding", "reqwest", "serde", "serde-value", "serde_json", - "time 0.3.9", + "time 0.3.11", "tokio", "tracing", "typemap_rev", @@ -2617,19 +2626,6 @@ dependencies = [ "digest 0.10.3", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - [[package]] name = "sha2" version = "0.10.2" @@ -2682,9 +2678,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "socket2" @@ -2765,7 +2761,7 @@ dependencies = [ "hashlink", "hex", "indexmap", - "itoa", + "itoa 1.0.2", "libc", "log", "memchr", @@ -2779,7 +2775,7 @@ dependencies = [ "serde", "serde_json", "sha-1 0.10.0", - "sha2 0.10.2", + "sha2", "smallvec", "sqlformat", "sqlx-rt", @@ -2804,7 +2800,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "sha2 0.10.2", + "sha2", "sqlx-core", "sqlx-rt", "syn", @@ -2833,9 +2829,9 @@ dependencies = [ [[package]] name = "state" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" dependencies = [ "loom", ] @@ -2864,13 +2860,13 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -2889,9 +2885,9 @@ dependencies = [ [[package]] name = "tera" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3cac831b615c25bcef632d1cabf864fa05813baad3d526829db18eb70e8b58d" +checksum = "7c9783d6ff395ae80cf17ed9a25360e7ba37742a79fa8fddabb073c5c7c8856d" dependencies = [ "chrono", "chrono-tz 0.6.1", @@ -2920,18 +2916,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -2949,21 +2945,22 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi 0.3.9", ] [[package]] name = "time" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" dependencies = [ - "itoa", + "itoa 1.0.2", "libc", "num_threads", "serde", @@ -2978,9 +2975,9 @@ checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -2993,17 +2990,17 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ "bytes", "libc", "memchr", - "mio 0.8.2", + "mio 0.8.4", "num_cpus", "once_cell", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3013,9 +3010,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -3045,20 +3042,20 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.23.3" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4151fda0cf2798550ad0b34bcfc9b9dcc2a9d2471c895c68f3a8818e54f2389e" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.20.4", + "rustls 0.20.6", "tokio", "webpki 0.22.0", ] [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite", @@ -3067,9 +3064,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", @@ -3081,9 +3078,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", @@ -3104,15 +3101,15 @@ dependencies = [ [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if 1.0.0", "log", @@ -3123,9 +3120,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" dependencies = [ "proc-macro2", "quote", @@ -3134,19 +3131,19 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" dependencies = [ - "lazy_static", + "once_cell", "valuable", ] [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -3155,13 +3152,13 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +checksum = "3a713421342a5a666b7577783721d3117f1b69a393df803ee17bb73b1e122a59" dependencies = [ "ansi_term", - "lazy_static", "matchers", + "once_cell", "regex", "sharded-slab", "smallvec", @@ -3190,7 +3187,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls 0.20.4", + "rustls 0.20.6", "sha-1 0.10.0", "thiserror", "url", @@ -3212,24 +3209,24 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ubyte" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42756bb9e708855de2f8a98195643dff31a97f0485d90d8467b39dc24be9e8fe" +checksum = "a58e29f263341a29bb79e14ad7fda5f63b1c7e48929bad4c685d7876b1d04e94" dependencies = [ "serde", ] [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" [[package]] name = "uncased" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0" +checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" dependencies = [ "serde", "version_check", @@ -3296,15 +3293,21 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" dependencies = [ "tinyvec", ] @@ -3317,9 +3320,9 @@ checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "unicode_categories" @@ -3409,9 +3412,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasi" @@ -3421,9 +3424,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -3431,9 +3434,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -3446,9 +3449,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -3458,9 +3461,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3468,9 +3471,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -3481,15 +3484,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", @@ -3526,9 +3529,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.22.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" +checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" dependencies = [ "webpki 0.22.0", ] @@ -3578,9 +3581,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ "windows_aarch64_msvc", "windows_i686_gnu", @@ -3591,33 +3594,33 @@ dependencies = [ [[package]] name = "windows_aarch64_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "winreg" @@ -3646,6 +3649,6 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" +checksum = "20b578acffd8516a6c3f2a1bdefc1ec37e547bb4e0fb8b6b01a4cafc886b4442" diff --git a/Cargo.toml b/Cargo.toml index 1a07122..6dc6a42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ rmp-serde = "0.15" rand = "0.7" levenshtein = "1.0" sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "bigdecimal", "chrono"]} -base64 = "0.13.0" +base64 = "0.13" [dependencies.postman] path = "postman" diff --git a/postman/Cargo.toml b/postman/Cargo.toml index c17d5d5..c72fdbc 100644 --- a/postman/Cargo.toml +++ b/postman/Cargo.toml @@ -7,12 +7,10 @@ edition = "2021" tokio = { version = "1", features = ["process", "full"] } regex = "1.4" log = "0.4" -env_logger = "0.8" chrono = "0.4" chrono-tz = { version = "0.5", features = ["serde"] } lazy_static = "1.4" num-integer = "0.1" serde = "1.0" -serde_json = "1.0" sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "bigdecimal", "chrono", "json"]} serenity = { version = "0.11.1", default-features = false, features = ["builder", "cache", "client", "gateway", "http", "model", "utils", "rustls_backend"] } diff --git a/postman/src/sender.rs b/postman/src/sender.rs index 138d3c7..0a641b3 100644 --- a/postman/src/sender.rs +++ b/postman/src/sender.rs @@ -226,7 +226,6 @@ impl Into for Embed { } } -#[derive(Debug)] pub struct Reminder { id: u32, @@ -566,7 +565,7 @@ UPDATE `channels` SET paused = 0, paused_until = NULL WHERE `channel` = ? }; if let Err(e) = result { - error!("Error sending {:?}: {:?}", self, e); + error!("Error sending reminder {}: {:?}", self.id, e); if let Error::Http(error) = e { if error.status_code() == Some(StatusCode::NOT_FOUND) { diff --git a/web/Cargo.toml b/web/Cargo.toml index 41771a2..6045c1e 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -12,10 +12,10 @@ oauth2 = "4" log = "0.4" reqwest = "0.11" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", "chrono", "json"] } chrono = "0.4" chrono-tz = "0.5" lazy_static = "1.4.0" rand = "0.7" base64 = "0.13" +csv = "1.1" diff --git a/web/src/consts.rs b/web/src/consts.rs index da09229..906c574 100644 --- a/web/src/consts.rs +++ b/web/src/consts.rs @@ -26,12 +26,8 @@ use serenity::model::prelude::AttachmentType; lazy_static! { pub static ref DEFAULT_AVATAR: AttachmentType<'static> = ( - include_bytes!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../assets/", - env!("WEBHOOK_AVATAR", "WEBHOOK_AVATAR not provided for compilation") - )) as &[u8], - env!("WEBHOOK_AVATAR"), + include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/../assets/webhook.jpg")) as &[u8], + "webhook.jpg", ) .into(); pub static ref SUBSCRIPTION_ROLES: HashSet = HashSet::from_iter( diff --git a/web/src/lib.rs b/web/src/lib.rs index 10fdb41..783658d 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -150,6 +150,11 @@ pub async fn initialize( routes::dashboard::guild::get_reminders, routes::dashboard::guild::edit_reminder, routes::dashboard::guild::delete_reminder, + routes::dashboard::export::export_reminders, + routes::dashboard::export::export_reminder_templates, + routes::dashboard::export::export_todos, + routes::dashboard::export::import_reminders, + routes::dashboard::export::import_todos, ], ) .launch() diff --git a/web/src/routes/dashboard/export.rs b/web/src/routes/dashboard/export.rs new file mode 100644 index 0000000..b0005bf --- /dev/null +++ b/web/src/routes/dashboard/export.rs @@ -0,0 +1,375 @@ +use csv::{QuoteStyle, WriterBuilder}; +use rocket::{ + http::CookieJar, + serde::json::{json, Json, Value as JsonValue}, + State, +}; +use serenity::{ + client::Context, + model::id::{ChannelId, GuildId}, +}; +use sqlx::{MySql, Pool}; + +use crate::routes::dashboard::{ImportBody, ReminderCsv, ReminderTemplateCsv, TodoCsv}; + +#[get("/api/guild//export/reminders")] +pub async fn export_reminders( + id: u64, + cookies: &CookieJar<'_>, + ctx: &State, + pool: &State>, +) -> JsonValue { + check_authorization!(cookies, ctx.inner(), id); + + let mut csv_writer = WriterBuilder::new().quote_style(QuoteStyle::Always).from_writer(vec![]); + + let channels_res = GuildId(id).channels(&ctx.inner()).await; + + match channels_res { + Ok(channels) => { + let channels = channels + .keys() + .into_iter() + .map(|k| k.as_u64().to_string()) + .collect::>() + .join(","); + + let result = sqlx::query_as_unchecked!( + ReminderCsv, + "SELECT + reminders.attachment, + reminders.attachment_name, + reminders.avatar, + channels.channel, + reminders.content, + reminders.embed_author, + reminders.embed_author_url, + reminders.embed_color, + reminders.embed_description, + reminders.embed_footer, + reminders.embed_footer_url, + reminders.embed_image_url, + reminders.embed_thumbnail_url, + reminders.embed_title, + reminders.embed_fields, + reminders.enabled, + reminders.expires, + reminders.interval_seconds, + reminders.interval_months, + reminders.name, + reminders.restartable, + reminders.tts, + reminders.username, + reminders.utc_time + FROM reminders + LEFT JOIN channels ON channels.id = reminders.channel_id + WHERE FIND_IN_SET(channels.channel, ?)", + channels + ) + .fetch_all(pool.inner()) + .await; + + match result { + Ok(reminders) => { + reminders.iter().for_each(|reminder| { + csv_writer.serialize(reminder).unwrap(); + }); + + match csv_writer.into_inner() { + Ok(inner) => match String::from_utf8(inner) { + Ok(encoded) => { + json!({ "body": encoded }) + } + + Err(e) => { + warn!("Failed to write UTF-8: {:?}", e); + + json!({"error": "Failed to write UTF-8"}) + } + }, + + Err(e) => { + warn!("Failed to extract CSV: {:?}", e); + + json!({"error": "Failed to extract CSV"}) + } + } + } + + Err(e) => { + warn!("Failed to complete SQL query: {:?}", e); + + json!({"error": "Failed to query reminders"}) + } + } + } + + Err(e) => { + warn!("Could not fetch channels from {}: {:?}", id, e); + + json!({"error": "Failed to get guild channels"}) + } + } +} + +#[put("/api/guild//export/reminders", data = "")] +pub async fn import_reminders( + id: u64, + cookies: &CookieJar<'_>, + body: Json, + ctx: &State, + pool: &State>, +) -> JsonValue { + check_authorization!(cookies, ctx.inner(), id); + + match base64::decode(&body.body) { + Ok(body) => { + let mut reader = csv::Reader::from_reader(body.as_slice()); + + for result in reader.deserialize::() { + match result { + Ok(record) => {} + + Err(e) => { + warn!("Couldn't deserialize CSV row: {:?}", e); + } + } + } + + json!({"error": "Not implemented"}) + } + + Err(_) => { + json!({"error": "Malformed base64"}) + } + } +} + +#[get("/api/guild//export/todos")] +pub async fn export_todos( + id: u64, + cookies: &CookieJar<'_>, + ctx: &State, + pool: &State>, +) -> JsonValue { + check_authorization!(cookies, ctx.inner(), id); + + let mut csv_writer = WriterBuilder::new().quote_style(QuoteStyle::Always).from_writer(vec![]); + + match sqlx::query_as_unchecked!( + TodoCsv, + "SELECT value, CONCAT('#', channels.channel) AS channel_id FROM todos + LEFT JOIN channels ON todos.channel_id = channels.id + INNER JOIN guilds ON todos.guild_id = guilds.id + WHERE guilds.guild = ?", + id + ) + .fetch_all(pool.inner()) + .await + { + Ok(todos) => { + todos.iter().for_each(|todo| { + csv_writer.serialize(todo).unwrap(); + }); + + match csv_writer.into_inner() { + Ok(inner) => match String::from_utf8(inner) { + Ok(encoded) => { + json!({ "body": encoded }) + } + + Err(e) => { + warn!("Failed to write UTF-8: {:?}", e); + + json!({"error": "Failed to write UTF-8"}) + } + }, + + Err(e) => { + warn!("Failed to extract CSV: {:?}", e); + + json!({"error": "Failed to extract CSV"}) + } + } + } + Err(e) => { + warn!("Could not fetch templates from {}: {:?}", id, e); + + json!({"error": "Failed to query templates"}) + } + } +} + +#[put("/api/guild//export/todos", data = "")] +pub async fn import_todos( + id: u64, + cookies: &CookieJar<'_>, + body: Json, + ctx: &State, + pool: &State>, +) -> JsonValue { + check_authorization!(cookies, ctx.inner(), id); + + let channels_res = GuildId(id).channels(&ctx.inner()).await; + + match channels_res { + Ok(channels) => match base64::decode(&body.body) { + Ok(body) => { + let mut reader = csv::Reader::from_reader(body.as_slice()); + + let query_placeholder = "(?, (SELECT id FROM channels WHERE channel = ?), (SELECT id FROM guilds WHERE guild = ?))"; + let mut query_params = vec![]; + + for result in reader.deserialize::() { + match result { + Ok(record) => match record.channel_id { + Some(channel_id) => { + let channel_id = channel_id.split_at(1).1; + + match channel_id.parse::() { + Ok(channel_id) => { + if channels.contains_key(&ChannelId(channel_id)) { + query_params.push((record.value, Some(channel_id), id)); + } else { + return json!({ + "error": + format!("Invalid channel ID {}", channel_id) + }); + } + } + + Err(_) => { + return json!({ + "error": format!("Invalid channel ID {}", channel_id) + }); + } + } + } + + None => { + query_params.push((record.value, None, id)); + } + }, + + Err(e) => { + warn!("Couldn't deserialize CSV row: {:?}", e); + + return json!({"error": "Deserialize error. Aborted"}); + } + } + } + + let _ = sqlx::query!( + "DELETE FROM todos WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", + id + ) + .execute(pool.inner()) + .await; + + let query_str = format!( + "INSERT INTO todos (value, channel_id, guild_id) VALUES {}", + vec![query_placeholder].repeat(query_params.len()).join(",") + ); + let mut query = sqlx::query(&query_str); + + for param in query_params { + query = query.bind(param.0).bind(param.1).bind(param.2); + } + + let res = query.execute(pool.inner()).await; + + match res { + Ok(_) => { + json!({}) + } + + Err(e) => { + warn!("Couldn't execute todo query: {:?}", e); + + json!({"error": "An unexpected error occured."}) + } + } + } + + Err(_) => { + json!({"error": "Malformed base64"}) + } + }, + + Err(e) => { + warn!("Couldn't fetch channels for guild {}: {:?}", id, e); + + json!({"error": "Couldn't fetch channels."}) + } + } +} + +#[get("/api/guild//export/reminder_templates")] +pub async fn export_reminder_templates( + id: u64, + cookies: &CookieJar<'_>, + ctx: &State, + pool: &State>, +) -> JsonValue { + check_authorization!(cookies, ctx.inner(), id); + + let mut csv_writer = WriterBuilder::new().quote_style(QuoteStyle::Always).from_writer(vec![]); + + match sqlx::query_as_unchecked!( + ReminderTemplateCsv, + "SELECT + name, + attachment, + attachment_name, + avatar, + content, + embed_author, + embed_author_url, + embed_color, + embed_description, + embed_footer, + embed_footer_url, + embed_image_url, + embed_thumbnail_url, + embed_title, + embed_fields, + tts, + username + FROM reminder_template WHERE guild_id = (SELECT id FROM guilds WHERE guild = ?)", + id + ) + .fetch_all(pool.inner()) + .await + { + Ok(templates) => { + templates.iter().for_each(|template| { + csv_writer.serialize(template).unwrap(); + }); + + match csv_writer.into_inner() { + Ok(inner) => match String::from_utf8(inner) { + Ok(encoded) => { + json!({ "body": encoded }) + } + + Err(e) => { + warn!("Failed to write UTF-8: {:?}", e); + + json!({"error": "Failed to write UTF-8"}) + } + }, + + Err(e) => { + warn!("Failed to extract CSV: {:?}", e); + + json!({"error": "Failed to extract CSV"}) + } + } + } + Err(e) => { + warn!("Could not fetch templates from {}: {:?}", id, e); + + json!({"error": "Failed to query templates"}) + } + } +} diff --git a/web/src/routes/dashboard/mod.rs b/web/src/routes/dashboard/mod.rs index 5c9b5fb..a04ee50 100644 --- a/web/src/routes/dashboard/mod.rs +++ b/web/src/routes/dashboard/mod.rs @@ -13,6 +13,7 @@ use crate::{ Database, Error, }; +pub mod export; pub mod guild; pub mod user; @@ -60,6 +61,28 @@ pub struct ReminderTemplate { username: Option, } +#[derive(Serialize, Deserialize)] +pub struct ReminderTemplateCsv { + #[serde(default = "template_name_default")] + name: String, + attachment: Option>, + attachment_name: Option, + avatar: Option, + content: String, + embed_author: String, + embed_author_url: Option, + embed_color: u32, + embed_description: String, + embed_footer: String, + embed_footer_url: Option, + embed_image_url: Option, + embed_thumbnail_url: Option, + embed_title: String, + embed_fields: Option, + tts: bool, + username: Option, +} + #[derive(Deserialize)] pub struct DeleteReminderTemplate { id: u32, @@ -105,6 +128,36 @@ pub struct Reminder { utc_time: NaiveDateTime, } +#[derive(Serialize, Deserialize)] +pub struct ReminderCsv { + #[serde(with = "base64s")] + attachment: Option>, + attachment_name: Option, + avatar: Option, + channel: u64, + content: String, + embed_author: String, + embed_author_url: Option, + embed_color: u32, + embed_description: String, + embed_footer: String, + embed_footer_url: Option, + embed_image_url: Option, + embed_thumbnail_url: Option, + embed_title: String, + embed_fields: Option, + enabled: bool, + expires: Option, + interval_seconds: Option, + interval_months: Option, + #[serde(default = "name_default")] + name: String, + restartable: bool, + tts: bool, + username: Option, + utc_time: NaiveDateTime, +} + #[derive(Deserialize)] pub struct PatchReminder { uid: String, @@ -220,13 +273,22 @@ pub struct DeleteReminder { uid: String, } +#[derive(Deserialize)] +pub struct ImportBody { + body: String, +} + +#[derive(Serialize, Deserialize)] +pub struct TodoCsv { + value: String, + channel_id: Option, +} + async fn create_database_channel( ctx: impl AsRef, channel: ChannelId, pool: impl Executor<'_, Database = Database> + Copy, ) -> Result { - println!("{:?}", channel); - let row = sqlx::query!("SELECT webhook_token, webhook_id FROM channels WHERE channel = ?", channel.0) .fetch_one(pool) diff --git a/web/src/routes/login.rs b/web/src/routes/login.rs index 0c83c04..d5894c9 100644 --- a/web/src/routes/login.rs +++ b/web/src/routes/login.rs @@ -25,7 +25,6 @@ pub async fn discord_login( // Set the desired scopes. .add_scope(Scope::new("identify".to_string())) .add_scope(Scope::new("guilds".to_string())) - .add_scope(Scope::new("email".to_string())) // Set the PKCE code challenge. .set_pkce_challenge(pkce_challenge) .url(); diff --git a/web/static/img/support/iemanager/edit_spreadsheet.png b/web/static/img/support/iemanager/edit_spreadsheet.png new file mode 100644 index 0000000..931ffe8 Binary files /dev/null and b/web/static/img/support/iemanager/edit_spreadsheet.png differ diff --git a/web/static/img/support/iemanager/format_text.png b/web/static/img/support/iemanager/format_text.png new file mode 100644 index 0000000..0a60089 Binary files /dev/null and b/web/static/img/support/iemanager/format_text.png differ diff --git a/web/static/img/support/iemanager/import.png b/web/static/img/support/iemanager/import.png new file mode 100644 index 0000000..9e2bc74 Binary files /dev/null and b/web/static/img/support/iemanager/import.png differ diff --git a/web/static/img/support/iemanager/select_export.png b/web/static/img/support/iemanager/select_export.png new file mode 100644 index 0000000..8dfedd3 Binary files /dev/null and b/web/static/img/support/iemanager/select_export.png differ diff --git a/web/static/img/support/iemanager/sheets_settings.png b/web/static/img/support/iemanager/sheets_settings.png new file mode 100644 index 0000000..4cbc649 Binary files /dev/null and b/web/static/img/support/iemanager/sheets_settings.png differ diff --git a/web/static/js/main.js b/web/static/js/main.js index 9d6d082..5fafcf5 100644 --- a/web/static/js/main.js +++ b/web/static/js/main.js @@ -12,6 +12,10 @@ const $createTemplateBtn = $createReminder.querySelector("button#createTemplate" const $loadTemplateBtn = document.querySelector("button#load-template"); const $deleteTemplateBtn = document.querySelector("button#delete-template"); const $templateSelect = document.querySelector("select#templateSelect"); +const $exportBtn = document.querySelector("button#export-data"); +const $importBtn = document.querySelector("button#import-data"); +const $downloader = document.querySelector("a#downloader"); +const $uploader = document.querySelector("input#uploader"); let channels = []; let guildNames = {}; @@ -670,6 +674,39 @@ function has_source(string) { } } +$uploader.addEventListener("change", (ev) => { + const urlTail = document.querySelector('input[name="exportSelect"]:checked').value; + + new Promise((resolve) => { + let fileReader = new FileReader(); + fileReader.onload = (e) => resolve(fileReader.result); + fileReader.readAsDataURL($uploader.files[0]); + }).then((dataUrl) => { + fetch(`/dashboard/api/guild/${guildId()}/export/${urlTail}`, { + method: "PUT", + body: JSON.stringify({ body: dataUrl.split(",")[1] }), + }).then(() => { + delete $uploader.files[0]; + }); + }); +}); + +$importBtn.addEventListener("click", () => { + $uploader.click(); +}); + +$exportBtn.addEventListener("click", () => { + const urlTail = document.querySelector('input[name="exportSelect"]:checked').value; + + fetch(`/dashboard/api/guild/${guildId()}/export/${urlTail}`) + .then((response) => response.json()) + .then((data) => { + $downloader.href = + "data:text/plain;charset=utf-8," + encodeURIComponent(data.body); + $downloader.click(); + }); +}); + $createReminderBtn.addEventListener("click", async () => { $createReminderBtn.querySelector("span.icon > i").classList = [ "fas fa-spinner fa-spin", @@ -834,7 +871,7 @@ document.addEventListener("remindersLoaded", () => { }); }); - const fileInput = document.querySelectorAll("input[type=file]"); + const fileInput = document.querySelectorAll("input.file-input[type=file]"); fileInput.forEach((element) => { element.addEventListener("change", () => { diff --git a/web/templates/dashboard.html.tera b/web/templates/dashboard.html.tera index c01e793..4a56955 100644 --- a/web/templates/dashboard.html.tera +++ b/web/templates/dashboard.html.tera @@ -177,38 +177,41 @@ diff --git a/web/templates/errors/500.html.tera b/web/templates/errors/500.html.tera index 0bae3b5..ed86651 100644 --- a/web/templates/errors/500.html.tera +++ b/web/templates/errors/500.html.tera @@ -5,5 +5,5 @@ {% set show_contact = True %} {% set page_title = "An Error Has Occurred" %} - {% set page_subtitle = "A server error has occurred. Please contact me and I will try and resolve this" %} + {% set page_subtitle = "A server error has occurred. Please retry, or ask in our Discord." %} {% endblock %} diff --git a/web/templates/privacy.html.tera b/web/templates/privacy.html.tera index d99d5d4..6898472 100644 --- a/web/templates/privacy.html.tera +++ b/web/templates/privacy.html.tera @@ -49,7 +49,7 @@

Who your data is shared with

- Your data may also be guarded by the privacy policies of MEGA, our backup provider, and + Your data is also guarded by the privacy policies of MEGA, our backup provider, and Hetzner, our hosting provider.

@@ -68,7 +68,7 @@

Reminders deleted with /del or via the dashboard are removed from the live database - instantly, but may persist in backups. + instantly, but may persist in backups for up to a year.

diff --git a/web/templates/support/iemanager.html.tera b/web/templates/support/iemanager.html.tera index 007daa1..b139817 100644 --- a/web/templates/support/iemanager.html.tera +++ b/web/templates/support/iemanager.html.tera @@ -14,13 +14,75 @@

Export your data

- You can create reminders with the /remind command. -
- Fill out the "time" and "content" fields. If you wish, press on "Optional" to view other options - for the reminder. + You can export data associated with your server from the dashboard. The data will export as a CSV + file. The CSV file can then be edited and imported to bulk edit server data.

+
+
+
+

Import data

+

+ You can import previous exports or modified exports. When importing a file, existing data + will be overwritten. +

+
+
+
+ +
+
+
+

Edit your data

+

+ The CSV can be edited either as a text file or in a spreadsheet editor such as LibreOffice Calc. To + set up LibreOffice Calc for editing, do the following: +

+
    +
  1. + Export data from dashboard. +
    + Selecting export button +
    +
  2. +
  3. + Open the file in LibreOffice. During the import dialogue, select "Format quoted field as text". +
    + Selecting format button +
    +
  4. +
  5. + Make edits to the spreadsheet. You can add, edit, and remove rows for reminders. Don't remove the title row. +
    + Editing spreadsheet +
    +
  6. +
  7. + Save the edited CSV file and import it on the dashboard. +
    + Import new reminders +
    +
  8. +
+ Other spreadsheet tools can also be used to edit exports, as long as they are properly configured: +
    +
  • + Google Sheets: Create a new blank spreadsheet. Select File >> Import >> Upload >> export.csv. + Use the following import settings: +
    + Google sheets import settings +
    +
  • +
  • + Excel (including Excel Online): Avoid using Excel. Excel will not correctly import channels, or give + clear options to correct imports. +
  • +
+
+
+
+ {% endblock %} diff --git a/web/templates/terms.html.tera b/web/templates/terms.html.tera index 9eee18f..fb74fbd 100644 --- a/web/templates/terms.html.tera +++ b/web/templates/terms.html.tera @@ -20,11 +20,12 @@
Violating the Terms of Service may result in receiving a permanent ban from the Discord server, permanent restriction on your usage of Reminder Bot, or removal of some or all of your content on - Reminder Bot or the Discord server. + Reminder Bot or the Discord server. None of these will necessarily be preceded or succeeded by a warning + or notice.

- The Terms of Service may be updated at any time. Notice will be provided via the Discord server. You - should consider the Terms of Service to be a guideline for appropriate behaviour. + The Terms of Service may be updated. Notice will be provided via the Discord server. You + should consider the Terms of Service to be a strong for appropriate behaviour.

@@ -37,6 +38,12 @@
  • Do not use the bot to harass other Discord users
  • Do not use the bot to transmit malware or other illegal content
  • Do not use the bot to send more than 15 messages during a 60 second period
  • +
  • + Do not attempt to circumvent restrictions imposed by the bot or website, including trying to access + data of other users, circumvent Patreon restrictions, or uploading files and creating reminders that + are too large for the bot to send or process. Some or all of these actions may be illegal in your + country +