Index: Cargo.lock ================================================================== --- Cargo.lock +++ Cargo.lock @@ -64,20 +64,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "async-compression" -version = "0.3.8" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443ccbb270374a2b1055fc72da40e1f237809cd6bb0e97e66d264cd138473a6" +checksum = "f2bf394cfbbe876f0ac67b13b6ca819f9c9f2fb9ec67223cceb1555fbab1c31a" dependencies = [ "brotli", "flate2", "futures-core", "memchr", "pin-project-lite", - "tokio 1.15.0", + "tokio 1.16.1", ] [[package]] name = "atoi" version = "0.4.0" @@ -96,30 +96,33 @@ "chrono", "derive_builder 0.10.2", "diligent-date-parser", "never", "quick-xml 0.22.0", - "serde 1.0.135", + "serde 1.0.136", +] + +[[package]] +name = "autocfg" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.1.0", ] [[package]] name = "autocfg" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" - -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" +checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" dependencies = [ "addr2line", "cc", "cfg-if 1.0.0", "libc", @@ -233,11 +236,11 @@ checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ "libc", "num-integer", "num-traits 0.2.14", - "serde 1.0.135", + "serde 1.0.136", "time", "winapi 0.3.9", ] [[package]] @@ -256,11 +259,11 @@ checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" dependencies = [ "lazy_static", "nom 5.1.2", "rust-ini", - "serde 1.0.135", + "serde 1.0.136", "serde-hjson", "serde_json", "toml", "yaml-rust", ] @@ -284,22 +287,22 @@ "cookie", "failure", "idna 0.1.5", "log", "publicsuffix", - "serde 1.0.135", + "serde 1.0.136", "serde_json", "time", "try_from", "url 1.7.2", ] [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", ] @@ -333,13 +336,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" [[package]] name = "crc32fast" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if 1.0.0", ] [[package]] @@ -347,11 +350,11 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.6", + "crossbeam-utils 0.8.7", ] [[package]] name = "crossbeam-deque" version = "0.7.4" @@ -367,11 +370,11 @@ name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cfg-if 0.1.10", "crossbeam-utils 0.7.2", "lazy_static", "maybe-uninit", "memoffset", @@ -389,34 +392,34 @@ "maybe-uninit", ] [[package]] name = "crossbeam-queue" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b979d76c9fcb84dffc80a73f7290da0f83e4c95773494674cb44b76d13a7a110" +checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.6", + "crossbeam-utils 0.8.7", ] [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cfg-if 0.1.10", "lazy_static", ] [[package]] name = "crossbeam-utils" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ "cfg-if 1.0.0", "lazy_static", ] @@ -723,13 +726,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", "futures-executor", "futures-io", @@ -738,23 +741,23 @@ "futures-util", ] [[package]] name = "futures-channel" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -764,13 +767,13 @@ "num_cpus", ] [[package]] name = "futures-executor" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", "futures-util", ] @@ -780,48 +783,48 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" dependencies = [ "futures-core", - "lock_api 0.4.5", + "lock_api 0.4.6", "parking_lot 0.11.2", ] [[package]] name = "futures-io" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-sink" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -889,23 +892,23 @@ "tokio-io", ] [[package]] name = "h2" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9de88456263e249e241fcd211d3954e2c9b0ef7ccfc235a444eb367cae3689" +checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" dependencies = [ "bytes 1.1.0", "fnv", "futures-core", "futures-sink", "futures-util", "http 0.2.6", "indexmap", "slab", - "tokio 1.15.0", + "tokio 1.16.1", "tokio-util", "tracing", ] [[package]] @@ -1005,13 +1008,13 @@ "pin-project-lite", ] [[package]] name = "httparse" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "9100414882e15fb7feccb4897e5f0ff0ff1ca7d1a86a23208ada4d7a18e6c6c4" [[package]] name = "httpdate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1047,27 +1050,27 @@ "want 0.2.0", ] [[package]] name = "hyper" -version = "0.14.16" +version = "0.14.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +checksum = "043f0e083e9901b6cc658a77d1eb86f4fc650bbb977a4337dd63192826aa85dd" dependencies = [ "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.10", + "h2 0.3.11", "http 0.2.6", "http-body 0.4.4", "httparse", "httpdate", - "itoa 0.4.8", + "itoa 1.0.1", "pin-project-lite", "socket2", - "tokio 1.15.0", + "tokio 1.16.1", "tower-service", "tracing", "want 0.3.0", ] @@ -1089,13 +1092,13 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes 1.1.0", - "hyper 0.14.16", + "hyper 0.14.17", "native-tls", - "tokio 1.15.0", + "tokio 1.16.1", "tokio-native-tls", ] [[package]] name = "ident_case" @@ -1129,11 +1132,11 @@ name = "indexmap" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "hashbrown", ] [[package]] name = "instant" @@ -1218,13 +1221,13 @@ "static_assertions", ] [[package]] name = "libc" -version = "0.2.113" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "linked-hash-map" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1239,13 +1242,13 @@ "scopeguard", ] [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] [[package]] @@ -1290,11 +1293,11 @@ name = "memoffset" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] name = "mime" version = "0.3.16" @@ -1322,11 +1325,11 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] name = "mio" version = "0.6.23" @@ -1450,13 +1453,13 @@ "version_check", ] [[package]] name = "ntapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" dependencies = [ "winapi 0.3.9", ] [[package]] @@ -1463,11 +1466,11 @@ name = "num-integer" version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-traits 0.2.14", ] [[package]] name = "num-traits" @@ -1482,11 +1485,11 @@ name = "num-traits" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] name = "num_cpus" version = "1.13.1" @@ -1542,11 +1545,11 @@ name = "openssl-sys" version = "0.9.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "cc", "libc", "pkg-config", "vcpkg", ] @@ -1576,11 +1579,11 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", - "lock_api 0.4.5", + "lock_api 0.4.6", "parking_lot_core 0.8.5", ] [[package]] name = "parking_lot_core" @@ -1719,11 +1722,11 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "libc", "rand_chacha 0.1.1", "rand_core 0.4.2", "rand_hc 0.1.0", "rand_isaac", @@ -1763,11 +1766,11 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.3.1", ] [[package]] name = "rand_chacha" @@ -1887,11 +1890,11 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.4.2", ] [[package]] name = "rand_xorshift" @@ -1980,11 +1983,11 @@ "hyper-tls 0.3.2", "log", "mime", "mime_guess", "native-tls", - "serde 1.0.135", + "serde 1.0.136", "serde_json", "serde_urlencoded 0.5.5", "time", "tokio 0.1.22", "tokio-executor", @@ -2006,27 +2009,27 @@ "base64 0.13.0", "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.10", + "h2 0.3.11", "http 0.2.6", "http-body 0.4.4", - "hyper 0.14.16", + "hyper 0.14.17", "hyper-tls 0.5.0", "ipnet", "js-sys", "lazy_static", "log", "mime", "native-tls", "percent-encoding 2.1.0", "pin-project-lite", - "serde 1.0.135", + "serde 1.0.136", "serde_json", "serde_urlencoded 0.7.1", - "tokio 1.15.0", + "tokio 1.16.1", "tokio-native-tls", "tokio-util", "url 2.2.2", "wasm-bindgen", "wasm-bindgen-futures", @@ -2045,26 +2048,26 @@ "reqwest 0.9.24", ] [[package]] name = "rsstg" -version = "0.2.7" +version = "0.2.8" dependencies = [ "anyhow", "atom_syndication", "chrono", "config", - "futures 0.3.19", + "futures 0.3.21", "futures-util", "lazy_static", "regex", "reqwest 0.11.9", "rss", "sedregex", "sqlx", "telegram-bot", - "tokio 1.15.0", + "tokio 1.16.1", ] [[package]] name = "rust-ini" version = "0.13.0" @@ -2108,13 +2111,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09d3c15d814eda1d6a836f2f2b56a6abc1446c8a34351cb3180d3db92ffe4ce" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -2121,13 +2124,13 @@ "security-framework-sys", ] [[package]] name = "security-framework-sys" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e90dd10c41c6bfc633da6e0c659bd25d31e0791e5974ac42970267d59eba87f7" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", ] @@ -2161,13 +2164,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" [[package]] name = "serde" -version = "1.0.135" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf9235533494ea2ddcdb794665461814781c53f19d87b76e571a1c35acbad2b" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] @@ -2187,33 +2190,33 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" dependencies = [ "ordered-float", - "serde 1.0.135", + "serde 1.0.136", ] [[package]] name = "serde_derive" -version = "1.0.135" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dcde03d87d4c973c04be249e7d8f0b35db1c848c487bd43032808e59dd8328d" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" dependencies = [ "itoa 1.0.1", "ryu", - "serde 1.0.135", + "serde 1.0.136", ] [[package]] name = "serde_urlencoded" version = "0.5.5" @@ -2220,11 +2223,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" dependencies = [ "dtoa", "itoa 0.4.8", - "serde 1.0.135", + "serde 1.0.136", "url 1.7.2", ] [[package]] name = "serde_urlencoded" @@ -2233,11 +2236,11 @@ checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", "itoa 1.0.1", "ryu", - "serde 1.0.135", + "serde 1.0.136", ] [[package]] name = "sha-1" version = "0.9.8" @@ -2285,13 +2288,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "socket2" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f82496b90c36d70af5fcd482edaa2e0bd16fade569de1330405fecbbdac736b" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi 0.3.9", ] @@ -2329,12 +2332,12 @@ "byteorder", "bytes 1.1.0", "chrono", "crc", "crossbeam-channel", - "crossbeam-queue 0.3.3", - "crossbeam-utils 0.8.6", + "crossbeam-queue 0.3.4", + "crossbeam-utils 0.8.7", "dirs", "either", "futures-channel", "futures-core", "futures-intrusive", @@ -2350,11 +2353,11 @@ "memchr", "once_cell", "parking_lot 0.11.2", "percent-encoding 2.1.0", "rand 0.8.4", - "serde 1.0.135", + "serde 1.0.136", "serde_json", "sha-1", "sha2", "smallvec 1.8.0", "sqlformat", @@ -2391,11 +2394,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8061cbaa91ee75041514f67a09398c65a64efed72c90151ecd47593bad53da99" dependencies = [ "native-tls", "once_cell", - "tokio 1.15.0", + "tokio 1.16.1", "tokio-native-tls", ] [[package]] name = "static_assertions" @@ -2467,16 +2470,16 @@ name = "telegram-bot" version = "0.9.0" source = "git+https://github.com/telegram-rs/telegram-bot#65ad5cfd578e9a1260ce6daac714eb2153c0bec7" dependencies = [ "bytes 1.1.0", - "futures 0.3.19", - "hyper 0.14.16", + "futures 0.3.21", + "hyper 0.14.17", "hyper-tls 0.5.0", "multipart", "telegram-bot-raw", - "tokio 1.15.0", + "tokio 1.16.1", "tracing", "tracing-futures", ] [[package]] @@ -2483,11 +2486,11 @@ name = "telegram-bot-raw" version = "0.9.0" source = "git+https://github.com/telegram-rs/telegram-bot#65ad5cfd578e9a1260ce6daac714eb2153c0bec7" dependencies = [ "bytes 1.1.0", - "serde 1.0.135", + "serde 1.0.136", "serde-value", "serde_derive", "serde_json", ] @@ -2569,13 +2572,13 @@ "tokio-timer", ] [[package]] name = "tokio" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ "bytes 1.1.0", "libc", "memchr", "mio 0.7.14", @@ -2643,11 +2646,11 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio 1.15.0", + "tokio 1.16.1", ] [[package]] name = "tokio-reactor" version = "0.1.12" @@ -2673,11 +2676,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" dependencies = [ "futures-core", "pin-project-lite", - "tokio 1.15.0", + "tokio 1.16.1", ] [[package]] name = "tokio-sync" version = "0.1.8" @@ -2740,20 +2743,20 @@ "bytes 1.1.0", "futures-core", "futures-sink", "log", "pin-project-lite", - "tokio 1.15.0", + "tokio 1.16.1", ] [[package]] name = "toml" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" dependencies = [ - "serde 1.0.135", + "serde 1.0.136", ] [[package]] name = "tower-service" version = "0.3.1" @@ -2760,36 +2763,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" dependencies = [ "lazy_static", ] [[package]] @@ -2847,13 +2850,13 @@ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-xid" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" Index: Cargo.toml ================================================================== --- Cargo.toml +++ Cargo.toml @@ -1,8 +1,8 @@ [package] name = "rsstg" -version = "0.2.7" +version = "0.2.8" authors = ["arcade"] edition = "2018" [dependencies] anyhow = "*" Index: src/command.rs ================================================================== --- src/command.rs +++ src/command.rs @@ -1,10 +1,9 @@ use anyhow::{bail, Context, Result}; use crate::core::Core; use regex::Regex; use sedregex::ReplaceCommand; -use telegram_bot; lazy_static! { static ref RE_USERNAME: Regex = Regex::new(r"^@[a-zA-Z][a-zA-Z0-9_]+$").unwrap(); static ref RE_LINK: Regex = Regex::new(r"^https?://[a-zA-Z.0-9-]+/[-_a-zA-Z.0-9/?=]+$").unwrap(); static ref RE_IV_HASH: Regex = Regex::new(r"^[a-f0-9]{14}$").unwrap(); @@ -22,16 +21,16 @@ pub async fn command(core: &Core, sender: telegram_bot::UserId, command: Vec<&str>) -> Result<()> { core.send( match &command[1].parse::() { Err(err) => format!("I need a number.\n{}", &err).into(), Ok(number) => match command[0] { - "/check" => core.check(&number, sender, false).await + "/check" => core.check(number, sender, false).await .context("Channel check failed.")?, - "/clean" => core.clean(&number, sender).await?, - "/enable" => core.enable(&number, sender).await?.into(), - "/delete" => core.delete(&number, sender).await?, - "/disable" => core.disable(&number, sender).await?.into(), + "/clean" => core.clean(number, sender).await?, + "/enable" => core.enable(number, sender).await?.into(), + "/delete" => core.delete(number, sender).await?, + "/disable" => core.disable(number, sender).await?.into(), _ => bail!("Command {} not handled.", &command[0]), }, }, Some(sender), None)?; Ok(()) } @@ -47,20 +46,20 @@ &command[2..] }, "/add" => &command[1..], _ => bail!("Passing {} is not possible here.", command[1]), }; - let mut i_command = command.into_iter(); + let mut i_command = command.iter(); let (channel, url, iv_hash, url_re) = ( i_command.next().context(at_least)?, i_command.next().context(at_least)?, i_command.next(), i_command.next()); - if ! RE_USERNAME.is_match(&channel) { + if ! RE_USERNAME.is_match(channel) { bail!("Usernames should be something like \"@\\[a\\-zA\\-Z]\\[a\\-zA\\-Z0\\-9\\_]+\", aren't they?\nNot {:?}", &channel); }; - if ! RE_LINK.is_match(&url) { + if ! RE_LINK.is_match(url) { bail!("Link should be a link to atom/rss feed, something like \"https://domain/path\".\nNot {:?}", &url); } let iv_hash = match iv_hash { Some(hash) => { match *hash { @@ -100,8 +99,8 @@ user = true; }; }; if ! me { bail!("I need to be admin on that channel."); }; if ! user { bail!("You should be admin on that channel."); }; - core.send(core.update(source_id, channel, channel_id, url, iv_hash, url_re, sender).await?, Some(sender), None)?; + core.send(core.update(source_id, channel, channel_id, url, iv_hash, url_re, sender.into()).await?, Some(sender), None)?; Ok(()) } Index: src/core.rs ================================================================== --- src/core.rs +++ src/core.rs @@ -1,54 +1,49 @@ use anyhow::{anyhow, bail, Context, Result}; -use atom_syndication; use chrono::DateTime; -use config; -use reqwest; use sqlx::{ postgres::PgPoolOptions, Row, }; -use rss; use std::{ borrow::Cow, collections::{ BTreeMap, HashSet, }, sync::{Arc, Mutex}, }; -use telegram_bot; #[derive(Clone)] pub struct Core { - owner: i64, - api_key: String, + //owner: i64, + //api_key: String, owner_chat: telegram_bot::UserId, pub tg: telegram_bot::Api, pub my: telegram_bot::User, pool: sqlx::Pool, sources: Arc>>>, } impl Core { - pub async fn new(settings: config::Config) -> Result { + pub async fn new(settings: config::Config) -> Result> { let owner = settings.get_int("owner")?; let api_key = settings.get_str("api_key")?; let tg = telegram_bot::Api::new(&api_key); - let core = Core { - owner: owner, - api_key: api_key.clone(), + let core = Arc::new(Core { + //owner, + //api_key: api_key.clone(), my: tg.send(telegram_bot::GetMe).await?, - tg: tg, + tg, owner_chat: telegram_bot::UserId::new(owner), pool: PgPoolOptions::new() .max_connections(5) .connect_timeout(std::time::Duration::new(300, 0)) .idle_timeout(std::time::Duration::new(60, 0)) .connect_lazy(&settings.get_str("pg")?)?, sources: Arc::new(Mutex::new(HashSet::new())), - }; + }); let clone = core.clone(); tokio::spawn(async move { if let Err(err) = &clone.autofetch().await { if let Err(err) = clone.send(&format!("🛑 {:?}", err), None, None) { eprintln!("Autofetch error: {}", err); @@ -120,20 +115,17 @@ let status = response.status(); let content = response.bytes().await?; match rss::Channel::read_from(&content[..]) { Ok(feed) => { for item in feed.items() { - match item.link() { - Some(link) => { - let date = match item.pub_date() { - Some(feed_date) => DateTime::parse_from_rfc2822(feed_date), - None => DateTime::parse_from_rfc3339(&item.dublin_core_ext().unwrap().dates()[0]), - }?; - let url = link; - posts.insert(date.clone(), url.into()); - }, - None => {} + if let Some(link) = item.link() { + let date = match item.pub_date() { + Some(feed_date) => DateTime::parse_from_rfc2822(feed_date), + None => DateTime::parse_from_rfc3339(&item.dublin_core_ext().unwrap().dates()[0]), + }?; + let url = link; + posts.insert(date, url.into()); } }; }, Err(err) => match err { rss::Error::InvalidStartTag => { @@ -140,11 +132,11 @@ let feed = atom_syndication::Feed::read_from(&content[..]) .with_context(|| format!("Problem opening feed url:\n{}\n{}", &url, status))?; for item in feed.entries() { let date = item.published().unwrap(); let url = item.links()[0].href(); - posts.insert(date.clone(), url.into()); + posts.insert(*date, url.into()); }; }, rss::Error::Eof => (), _ => bail!("Unsupported or mangled content:\n{:?}\n{:#?}\n{:#?}\n", &url, err, status) } @@ -151,11 +143,11 @@ }; for (date, url) in posts.iter() { let mut conn = self.pool.acquire().await .with_context(|| format!("Check post fetch conn:\n{:?}", &self.pool))?; let post_url: Cow = match url_re { - Some(ref x) => x.execute(url).into(), + Some(ref x) => x.execute(url), None => url.into(), }; let row = sqlx::query("select exists(select true from rsstg_post where url = $1 and source_id = $2) as exists;") .bind(&*post_url) .bind(*id) @@ -261,13 +253,13 @@ 0 => { Ok("Source not found.") }, _ => { Err(anyhow!("Database error.")) }, } } - pub async fn update(&self, update: Option, channel: &str, channel_id: i64, url: &str, iv_hash: Option<&str>, url_re: Option<&str>, owner: S) -> Result<&str> - where S: Into { - let owner = owner.into(); + pub async fn update(&self, update: Option, channel: &str, channel_id: i64, url: &str, iv_hash: Option<&str>, url_re: Option<&str>, owner: i64) -> Result<&str> { + //where S: Into { + //let owner = owner.into(); let mut conn = self.pool.acquire().await .with_context(|| format!("Update fetch conn:\n{:?}", &self.pool))?; match match update { @@ -283,31 +275,31 @@ .bind(iv_hash) .bind(owner) .bind(channel) .bind(url_re) .execute(&mut conn).await { - Ok(_) => return Ok(match update { + Ok(_) => Ok(match update { Some(_) => "Channel updated.", None => "Channel added.", }), Err(sqlx::Error::Database(err)) => { match err.downcast::().routine() { Some("_bt_check_unique", ) => { - return Ok("Duplicate key.") + Ok("Duplicate key.") }, Some(_) => { - return Ok("Database error.") + Ok("Database error.") }, None => { - return Ok("No database error extracted.") + Ok("No database error extracted.") }, - }; + } }, Err(err) => { bail!("Sorry, unknown error:\n{:#?}\n", err); }, - }; + } } async fn autofetch(&self) -> Result<()> { let mut delay = chrono::Duration::minutes(1); let mut now; @@ -331,14 +323,12 @@ if let Err(err) = clone.send(&format!("🛑 {:?}", err), None, None) { eprintln!("Check error: {}", err); }; }; }); - } else { - if next_fetch - now < delay { - delay = next_fetch - now; - } + } else if next_fetch - now < delay { + delay = next_fetch - now; } }; queue.clear(); tokio::time::sleep(delay.to_std()?).await; delay = chrono::Duration::minutes(1); Index: src/main.rs ================================================================== --- src/main.rs +++ src/main.rs @@ -1,12 +1,9 @@ mod command; mod core; -use config; use futures::StreamExt; -use tokio; -use telegram_bot; #[macro_use] extern crate lazy_static; use anyhow::Result; @@ -24,43 +21,36 @@ loop { reply_to = None; match stream.next().await { Some(update) => { - if let Err(err) = handle(update?, &core, &mut reply_to).await { + if let Err(err) = handle(update?, &core, &reply_to).await { core.send(&format!("🛑 {:?}", err), reply_to, None)?; }; }, None => { - core.send(&format!("🛑 None error."), None, None)?; + core.send("🛑 None error.".to_string(), None, None)?; } }; } } async fn handle(update: telegram_bot::Update, core: &core::Core, mut _reply_to: &Option) -> Result<()> { - match update.kind { - telegram_bot::UpdateKind::Message(message) => { - match message.kind { - telegram_bot::MessageKind::Text { ref data, .. } => { - let sender = message.from.id; - let words: Vec<&str> = data.split_whitespace().collect(); - match match words[0] { - "/check" | "/clean" | "/enable" | "/delete" | "/disable" => command::command(core, sender, words).await, - "/start" => command::start(core, sender).await, - "/list" => command::list(core, sender).await, - "/add" | "/update" => command::update(core, sender, words).await, - _ => Ok(()), - } { - Err(err) => core.send(&format!("🛑 {:?}", err), Some(sender), None)?, - Ok(()) => {}, - }; - }, - _ => { - }, - }; - }, - _ => {}, + if let telegram_bot::UpdateKind::Message(message) = update.kind { + if let telegram_bot::MessageKind::Text { ref data, .. } = message.kind { + let sender = message.from.id; + let words: Vec<&str> = data.split_whitespace().collect(); + match match words[0] { + "/check" | "/clean" | "/enable" | "/delete" | "/disable" => command::command(core, sender, words).await, + "/start" => command::start(core, sender).await, + "/list" => command::list(core, sender).await, + "/add" | "/update" => command::update(core, sender, words).await, + _ => Ok(()), + } { + Err(err) => core.send(&format!("🛑 {:?}", err), Some(sender), None)?, + Ok(()) => {}, + }; + }; }; Ok(()) }