From b6ab9c8888866b1fcaa93584c015a7e80b2558fe Mon Sep 17 00:00:00 2001 From: Pavel Kirilin Date: Tue, 21 Feb 2023 19:56:36 +0000 Subject: [PATCH] Added docker building. --- .dockerignore | 2 +- .gitlab-ci.yml | 40 +- Cargo.lock | 665 +++++++++++++++++- Cargo.toml | 5 +- Dockerfile | 5 + README.md | 38 + helm/.helmignore | 23 + helm/Chart.yaml | 24 + helm/templates/NOTES.txt | 22 + helm/templates/_helpers.tpl | 62 ++ helm/templates/deployment.yaml | 68 ++ helm/templates/ingress.yaml | 61 ++ helm/templates/service.yaml | 15 + helm/templates/serviceaccount.yaml | 12 + helm/templates/tests/test-connection.yaml | 15 + helm/values.yaml | 89 +++ logo.png | Bin 0 -> 127872 bytes src/args.rs | 15 +- .../filters/{chain.rs => filtered_handler.rs} | 7 + src/bot/filters/groups.rs | 1 - src/bot/filters/message_fitlers.rs | 25 +- src/bot/filters/mod.rs | 4 +- src/bot/handlers/basic/currency_converter.rs | 176 +++++ src/bot/handlers/basic/help.rs | 2 +- src/bot/handlers/basic/mod.rs | 1 + src/bot/handlers/fun/blyaficator.rs | 1 + src/bot/handlers/fun/greeter.rs | 16 +- src/bot/main.rs | 95 ++- src/main.rs | 44 +- src/server/main.rs | 7 +- src/server/templates/mod.rs | 11 + 31 files changed, 1476 insertions(+), 75 deletions(-) create mode 100644 README.md create mode 100644 helm/.helmignore create mode 100644 helm/Chart.yaml create mode 100644 helm/templates/NOTES.txt create mode 100644 helm/templates/_helpers.tpl create mode 100644 helm/templates/deployment.yaml create mode 100644 helm/templates/ingress.yaml create mode 100644 helm/templates/service.yaml create mode 100644 helm/templates/serviceaccount.yaml create mode 100644 helm/templates/tests/test-connection.yaml create mode 100644 helm/values.yaml create mode 100644 logo.png rename src/bot/filters/{chain.rs => filtered_handler.rs} (76%) delete mode 100644 src/bot/filters/groups.rs create mode 100644 src/bot/handlers/basic/currency_converter.rs diff --git a/.dockerignore b/.dockerignore index 94a969d..4154867 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,3 @@ /target .env -Dockerfile \ No newline at end of file +Dockerfile diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index af96580..d9f3709 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,6 +7,8 @@ # See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence stages: - test + - build + - deploy .test-template: tags: @@ -39,14 +41,50 @@ fmt: - pre-commit run fmt -av build_img: + stage: build tags: - kube only: - - master + refs: + - master + changes: + - "src/**/*" + - "Cargo.toml" + - "Cargo.lock" image: name: r.j3ss.co/img entrypoint: [""] + script: - img login --password "${DOCKER_PASSWORD}" --username "${DOCKER_USER}" "${DOCKER_REGISTRY}" - img build --no-console -t docker.le-memese.com/bots/s3bot:latest . - img push docker.le-memese.com/bots/s3bot:latest + +deploy: + stage: deploy + tags: + - kube + only: + refs: + - master + needs: + - build_img + image: + name: alpine/helm:3.7.1 + entrypoint: ["/bin/sh", "-c"] + environment: + name: prod + action: start + url: "https://s3bot.le-memese.com" + script: + - helm + upgrade + s3bot + ./deploy/helm + --install + --wait + --create-namespace + --atomic + --timeout 2m + --namespace "$NAMESPACE" + -f "$HELM_CONFIG" diff --git a/Cargo.lock b/Cargo.lock index 48e9db9..f7f525a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,7 +72,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.8.5", "sha1 0.10.5", "smallvec", "tokio", @@ -230,7 +230,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom", + "getrandom 0.2.8", "once_cell", "version_check", ] @@ -333,6 +333,19 @@ dependencies = [ "toml", ] +[[package]] +name = "async-compression" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-trait" version = "0.1.64" @@ -554,6 +567,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -774,6 +797,15 @@ dependencies = [ "libc", ] +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fern" version = "0.6.1" @@ -801,6 +833,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.1.0" @@ -810,6 +857,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures" version = "0.3.26" @@ -909,6 +966,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.8" @@ -931,7 +999,7 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -947,6 +1015,7 @@ dependencies = [ "grammers-mtsender", "grammers-session", "grammers-tl-types", + "html5ever", "locate-locale", "log", "md5", @@ -964,7 +1033,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "573508524fd529ced63fe827fb89629a186414541fd9e645fef9ba499fc69c63" dependencies = [ "aes", - "getrandom", + "getrandom 0.2.8", "glass_pumpkin", "hmac", "num-bigint", @@ -982,7 +1051,7 @@ dependencies = [ "bytes", "crc32fast", "flate2", - "getrandom", + "getrandom 0.2.8", "grammers-crypto", "grammers-tl-types", "log", @@ -1108,6 +1177,20 @@ dependencies = [ "digest 0.9.0", ] +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "http" version = "0.2.8" @@ -1119,6 +1202,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + [[package]] name = "http-range" version = "0.1.5" @@ -1143,6 +1237,43 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" +[[package]] +name = "hyper" +version = "0.14.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -1187,6 +1318,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "io-lifetimes" version = "1.0.5" @@ -1197,6 +1337,12 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "ipnet" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" + [[package]] name = "is-terminal" version = "0.4.3" @@ -1322,6 +1468,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + [[package]] name = "md5" version = "0.7.0" @@ -1386,6 +1552,30 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + [[package]] name = "nom" version = "7.1.3" @@ -1405,7 +1595,7 @@ dependencies = [ "autocfg", "num-integer", "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -1449,6 +1639,51 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" +dependencies = [ + "bitflags", + "cfg-if", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "os_info" version = "3.6.0" @@ -1495,7 +1730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e0b28ace46c5a396546bcf443bf422b57049617433d8854227352a4a9b24e7" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1524,6 +1759,63 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.9" @@ -1548,6 +1840,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1601,6 +1899,20 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + [[package]] name = "rand" version = "0.8.5" @@ -1608,8 +1920,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -1619,7 +1941,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -1628,7 +1959,25 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", ] [[package]] @@ -1679,6 +2028,70 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "reqwest" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" +dependencies = [ + "async-compression", + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-rustls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi 0.3.9", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -1702,6 +2115,18 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + [[package]] name = "ryu" version = "1.0.12" @@ -1726,14 +2151,26 @@ dependencies = [ "futures", "grammers-client", "grammers-session", + "lazy_static", "log", - "rand", + "rand 0.8.5", "rayon", + "regex", + "reqwest", "serde", "serde_json", "tokio", ] +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -1746,6 +2183,39 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" version = "1.0.16" @@ -1843,6 +2313,12 @@ dependencies = [ "libc", ] +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "slab" version = "0.4.7" @@ -1868,6 +2344,38 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "string_cache" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + [[package]] name = "strsim" version = "0.10.0" @@ -1891,6 +2399,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.9", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + [[package]] name = "termcolor" version = "1.2.0" @@ -1984,6 +2517,27 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + [[package]] name = "tokio-util" version = "0.7.7" @@ -2007,6 +2561,12 @@ dependencies = [ "serde", ] +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + [[package]] name = "tracing" version = "0.1.37" @@ -2028,6 +2588,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + [[package]] name = "typenum" version = "1.16.0" @@ -2070,6 +2636,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.3.1" @@ -2081,12 +2653,40 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" @@ -2124,6 +2724,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -2153,6 +2765,26 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "winapi" version = "0.2.8" @@ -2277,6 +2909,15 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "zstd" version = "0.12.3+zstd.1.5.2" diff --git a/Cargo.toml b/Cargo.toml index bc66a3b..fbc8a78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,11 +18,14 @@ dotenvy = "^0.15.6" dyn-clone = "1.0.10" fern = { version = "0.6.1", features = ["chrono", "colored"] } futures = "0.3.26" -grammers-client = { version = "0.4.0", features = ["markdown"] } +grammers-client = { version = "0.4.0", features = ["markdown", "html"] } grammers-session = "0.4.0" +lazy_static = "1.4.0" log = "0.4.17" rand = "0.8.5" rayon = "1.6.1" +regex = "1.7.1" +reqwest = { version = "0.11.14", features = ["gzip", "json", "tokio-rustls"] } serde = { version = "1.0.152", features = ["derive"] } serde_json = "1.0.93" tokio = { version = "1.25.0", features = [ diff --git a/Dockerfile b/Dockerfile index 5449539..9c43cb2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /app COPY Cargo.toml Cargo.lock askama.toml ./ COPY src ./src COPY static ./static +# Build binary in release mode. RUN cargo build --release --all-features FROM debian:bullseye-20230109-slim as base @@ -16,12 +17,16 @@ RUN apt-get update \ COPY static ./static +# Copy built binary to a new image. COPY --from=builder /app/target/release/s3bot /usr/local/bin/ ENTRYPOINT ["/usr/local/bin/s3bot"] FROM base as rootless +# Create a user and make the image rootless. So no one +# can escalate privileges even if they have access to +# container. RUN useradd --create-home -u 1000 --user-group s3bot WORKDIR /home/s3bot RUN mv /static ./static diff --git a/README.md b/README.md new file mode 100644 index 0000000..37a940e --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +
+ +

+ Automated telegram account +

+
+ +This project is an attempt to add some utillities to your account. + +This app uses telegram API and connects to it as a user, not as a bot. To use it, you need to register a new application, and obtain `api hash token` and `application id` from official telegram website. You can do it [here](https://core.telegram.org/api/obtaining_api_id). + + +## How to + +First of all, you need to install [Rust](http://rust-lang.org/). Personally I recommend to use [rustup](https://rustup.rs/). + +Make sure everything is fine by running `cargo --version`. + +1. Compile the app. + ```bash + cargo build --release + ``` + After that command you'll find a compiled binary in `target/release/s3bot`. + +2. Run the compiled binary. + + +## Configuration + +You can configure this app by either command line arguments or with environment variables. + +If you place .env file in current working directory, contents will be loaded as environment variables. + +For additional help please use: + +```bash +s3bot --help +``` \ No newline at end of file diff --git a/helm/.helmignore b/helm/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/helm/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..0978bd7 --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: s3bot +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "latest" diff --git a/helm/templates/NOTES.txt b/helm/templates/NOTES.txt new file mode 100644 index 0000000..d39da69 --- /dev/null +++ b/helm/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "s3bot.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "s3bot.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "s3bot.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "s3bot.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl new file mode 100644 index 0000000..129e6f9 --- /dev/null +++ b/helm/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "s3bot.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "s3bot.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "s3bot.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "s3bot.labels" -}} +helm.sh/chart: {{ include "s3bot.chart" . }} +{{ include "s3bot.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "s3bot.selectorLabels" -}} +app.kubernetes.io/name: {{ include "s3bot.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "s3bot.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "s3bot.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml new file mode 100644 index 0000000..d6d2c0b --- /dev/null +++ b/helm/templates/deployment.yaml @@ -0,0 +1,68 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "s3bot.fullname" . }} + labels: + {{- include "s3bot.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: 1 + {{- end }} + selector: + matchLabels: + {{- include "s3bot.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "s3bot.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "s3bot.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ default 8000 .Values.env.BOT_SERVER_PORT }} + protocol: TCP + livenessProbe: + httpGet: + path: /health + port: http + readinessProbe: + httpGet: + path: /health + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.env }} + env: + {{- range $key, $val := . }} + - name: {{ $key | quote }} + value: {{ $val | quote }} + {{- end }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/helm/templates/ingress.yaml b/helm/templates/ingress.yaml new file mode 100644 index 0000000..b37b206 --- /dev/null +++ b/helm/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "s3bot.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "s3bot.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 0000000..06b58d5 --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "s3bot.fullname" . }} + labels: + {{- include "s3bot.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "s3bot.selectorLabels" . | nindent 4 }} diff --git a/helm/templates/serviceaccount.yaml b/helm/templates/serviceaccount.yaml new file mode 100644 index 0000000..0b01689 --- /dev/null +++ b/helm/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "s3bot.serviceAccountName" . }} + labels: + {{- include "s3bot.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/templates/tests/test-connection.yaml b/helm/templates/tests/test-connection.yaml new file mode 100644 index 0000000..092ba62 --- /dev/null +++ b/helm/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "s3bot.fullname" . }}-test-connection" + labels: + {{- include "s3bot.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "s3bot.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..b6e61d2 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,89 @@ +# Default values for s3bot. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +image: + repository: docker.le-memese.com/bots/s3bot + pullPolicy: Always + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +env: + BOT_SERVER_HOST: "0.0.0.0" + BOT_SERVER_PORT: 8000 + BOT_SERVER_USERNAME: "s3rius_san" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: + {} + # fsGroup: 2000 + +securityContext: + {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: + {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: + {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c18852f0ceba3af1f519e355cb9a9dfac8be13 GIT binary patch literal 127872 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≫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 mxQt4T`Tzg_-&r7zj>PXG;Gbx, + + #[arg( + name = "bot-currency-excluded-chats", + long, + env = "BOT_CURRENCY_EXCLUDED_CHATS", + value_delimiter = ',' + )] + pub currency_excluded_chats: Vec, } #[derive(Clone, Parser, Debug)] diff --git a/src/bot/filters/chain.rs b/src/bot/filters/filtered_handler.rs similarity index 76% rename from src/bot/filters/chain.rs rename to src/bot/filters/filtered_handler.rs index 14f57e7..44fd29f 100644 --- a/src/bot/filters/chain.rs +++ b/src/bot/filters/filtered_handler.rs @@ -4,6 +4,11 @@ use crate::bot::handlers::Handler; use super::base::Filter; +/// This is a structure to match +/// handlers with corresponding filters. +/// +/// It's handy, because for different messages +/// we have different set of rules. #[derive(Clone)] pub struct FilteredHandler { filters: Vec>, @@ -23,6 +28,8 @@ impl FilteredHandler { self } + /// This method performs checks for all filters we have. + /// We run it not in parralel for fast fail strategy. pub fn check(&self, update: &Update) -> bool { for filter in &self.filters { match filter.filter(update) { diff --git a/src/bot/filters/groups.rs b/src/bot/filters/groups.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/bot/filters/groups.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/bot/filters/message_fitlers.rs b/src/bot/filters/message_fitlers.rs index 0c8ea45..f2d973d 100644 --- a/src/bot/filters/message_fitlers.rs +++ b/src/bot/filters/message_fitlers.rs @@ -1,5 +1,7 @@ use grammers_client::Update; +use crate::utils::messages::get_message; + use super::base::Filter; #[allow(dead_code)] @@ -15,9 +17,17 @@ pub enum TextMatchMethod { IMatches, } +/// This filter is used to filter out +/// that marked as silent. +#[derive(Clone)] +pub struct SilentFilter; + +/// This filter checks that current +/// chat is not one of excluded chats. #[derive(Clone)] pub struct ExcludedChatsFilter(pub Vec); +/// This filter checks for message directions. #[derive(Clone)] pub struct MessageDirectionFilter(pub MessageDirection); @@ -31,10 +41,8 @@ impl Filter for ExcludedChatsFilter { Update::CallbackQuery(query) => query.chat().clone(), _ => return Ok(false), }; - if self.0.contains(&a.id()) { - return Ok(false); - } - Ok(true) + // Check that list of excluded chats doesn't contain our chat. + Ok(!self.0.contains(&a.id())) } } @@ -44,6 +52,7 @@ impl Filter for MessageDirectionFilter { let res = matches!( (self.0, message.outgoing()), + // Here we check that message's direction matches the direction we want. (MessageDirection::Outgoing, true) | (MessageDirection::Incoming, false) ); Ok(res) @@ -72,3 +81,11 @@ impl<'a> Filter for TextFilter<'a> { Ok(false) } } + +impl Filter for SilentFilter { + fn filter(&self, update: &Update) -> anyhow::Result { + let Some(message) = get_message(update) else {return Ok(false)}; + // Check that message is not silent. + Ok(!message.silent()) + } +} diff --git a/src/bot/filters/mod.rs b/src/bot/filters/mod.rs index 51fe228..9b169f6 100644 --- a/src/bot/filters/mod.rs +++ b/src/bot/filters/mod.rs @@ -1,3 +1,3 @@ -mod base; -pub mod chain; +pub mod base; +pub mod filtered_handler; pub mod message_fitlers; diff --git a/src/bot/handlers/basic/currency_converter.rs b/src/bot/handlers/basic/currency_converter.rs new file mode 100644 index 0000000..57f854c --- /dev/null +++ b/src/bot/handlers/basic/currency_converter.rs @@ -0,0 +1,176 @@ +use std::{collections::HashMap, time::Duration}; + +use grammers_client::{Client, InputMessage, Update}; +use regex::Regex; + +use crate::{ + bot::{filters::base::Filter, handlers::Handler}, + utils::messages::get_message, +}; + +lazy_static::lazy_static! { + static ref SUPPORTED_CURS: Vec<&'static str> = vec![ + "GBP", + "HUF", + "USD", + "EUR", + "CNY", + "NOK", + "UAH", + "SEK", + "CHF", + "KRW", + "JPY", + "KZT", + "PLN", + "TRY", + "AMD", + "RSD", + ]; + + static ref CONVERTION_ALIASES: HashMap<&'static str, &'static str> = HashMap::from( + [ + // GBP + ("фунт", "GBP"), + // USD + ("бакс", "USD"), + ("доллар", "USD"), + // EUR + ("евро", "EUR"), + // JPY + ("иен", "JPY"), + ("йен", "JPY"), + // KRW + ("вон", "KRW"), + // CHF + ("франк", "CHF"), + // SEK + ("крон", "CHF"), + // CNY + ("юан", "CNY"), + // UAH + ("гривна", "UAH"), + ("гривны", "UAH"), + ("гривен", "UAH"), + ("грiвен", "UAH"), + // KZT + ("тенге", "KZT"), + ("тэнге", "KZT"), + // PLN + ("злот", "PLN"), + // TRY + ("лир", "TRY"), + // AMD + ("драм", "AMD"), + // RSD + ("динар", "RSD"), + ] + ); + + static ref CUR_REGEX: Regex = { + #[allow(clippy::clone_double_ref)] + let a = CONVERTION_ALIASES.keys() + .copied() + .chain(SUPPORTED_CURS.iter().copied()) + .collect::>() + .join("|"); + Regex::new(format!(r"\s*(?P\d+([\.,]\d+)?)\s+(?P{a})").as_str()).unwrap() + }; +} + +#[derive(Clone)] +pub struct CurrencyTextFilter; + +#[derive(Clone)] +pub struct CurrencyConverter { + client: reqwest::Client, +} + +impl CurrencyConverter { + pub fn new() -> anyhow::Result { + let client = reqwest::ClientBuilder::new() + .timeout(Duration::from_secs(2)) + .gzip(true) + .build()?; + Ok(Self { client }) + } +} + +/// This filter check if the message matches regex for currencies. +impl Filter for CurrencyTextFilter { + fn filter(&self, update: &Update) -> anyhow::Result { + let Some(message) = get_message(update) else { + return Ok(false); + }; + Ok(CUR_REGEX.is_match(message.text())) + } +} + +#[async_trait::async_trait] +impl Handler for CurrencyConverter { + async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> { + let Some(message) = get_message(update) else{ return Ok(())}; + let response = self + .client + .get("https://www.cbr-xml-daily.ru/daily_json.js") + .send() + .await? + .error_for_status()? + .json::() + .await?; + + let Some(valutes) = response + .get("Valute") + .and_then(serde_json::Value::as_object) else{ + log::warn!("Can't get valutes fom response."); + return Ok(()); + }; + + let mut calucates = Vec::new(); + + for capture in CUR_REGEX.captures_iter(message.text()) { + // We parse supplied value from message + let Some(num_value) = capture + .name("cur_value") + // Convert match to string. + .map(|mtch| mtch.as_str()) + // Parse it. + .and_then(|val| val.parse::().ok()) else{ + continue; + }; + let cur_name = capture.name("cur_name").map(|mtch| mtch.as_str()); + let Some(cur_name) = cur_name + // We check if the value is an alias. + .and_then(|val| CONVERTION_ALIASES.get(val).copied()) + // get previous value if not. + .or(cur_name) else{ + continue; + }; + let calculated = valutes + .get(cur_name) + .and_then(|info| info.get("Value")) + .map(ToString::to_string) + .and_then(|value| value.as_str().parse::().ok()) + .map(|multiplier| multiplier * num_value); + if let Some(value) = calculated { + calucates.push(format!( + "
{num_value} {cur_name} = {value:.2} RUB

" + )); + } + } + + if !calucates.is_empty() { + let mut bot_response = + String::from("Полагаясь на текущий курс валют могу сказать следующее:\n\n"); + for calc in calucates { + bot_response.push_str(calc.as_str()); + } + message + // We send it as silent, so we can filter this message later. + .reply(InputMessage::html(bot_response).silent(true)) + .await?; + } + + Ok(()) + } +} diff --git a/src/bot/handlers/basic/help.rs b/src/bot/handlers/basic/help.rs index 5f96340..00a96ca 100644 --- a/src/bot/handlers/basic/help.rs +++ b/src/bot/handlers/basic/help.rs @@ -10,7 +10,7 @@ impl Handler for Help { async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> { let Update::NewMessage(message) = update else {return Ok(())}; - message.reply("Хелпа").await?; + message.reply("Я больше не рассказываю что я умею.").await?; Ok(()) } diff --git a/src/bot/handlers/basic/mod.rs b/src/bot/handlers/basic/mod.rs index c1ee8d4..3f81a21 100644 --- a/src/bot/handlers/basic/mod.rs +++ b/src/bot/handlers/basic/mod.rs @@ -1,2 +1,3 @@ +pub mod currency_converter; pub mod get_chat_id; pub mod help; diff --git a/src/bot/handlers/fun/blyaficator.rs b/src/bot/handlers/fun/blyaficator.rs index 6a4ce83..c8660f8 100644 --- a/src/bot/handlers/fun/blyaficator.rs +++ b/src/bot/handlers/fun/blyaficator.rs @@ -6,6 +6,7 @@ use grammers_client::{Client, Update}; const BLYA_WORDS: &[&str] = &[", бля,", ", сука,", ", ёбаный рот,", ", охуеть конечно,"]; +/// It's time to add some бляs. #[derive(Clone)] pub struct Blyaficator; diff --git a/src/bot/handlers/fun/greeter.rs b/src/bot/handlers/fun/greeter.rs index b66c685..fc83bd3 100644 --- a/src/bot/handlers/fun/greeter.rs +++ b/src/bot/handlers/fun/greeter.rs @@ -4,6 +4,17 @@ use rand::seq::IteratorRandom; use crate::bot::handlers::base::Handler; +lazy_static::lazy_static! { + static ref GREETINGS: &'static [&'static str] = &[ + "Привет!", + "Добрый день!", + "Здравствуйте.", + "Приетствую.", + "Доброго времени суток.", + ]; +} + +/// Greeter just replies to greeting messages. #[derive(Clone)] pub struct Greeter; @@ -18,9 +29,8 @@ impl Handler for Greeter { return Ok(()); } - let reply_text = ["Привет!", "Добрый день!", "Здравствуйте.", "Приетствую"] - .into_iter() - .choose(&mut rand::thread_rng()); + // Choose random greeting from the list of greetings. + let reply_text = GREETINGS.iter().choose(&mut rand::thread_rng()).copied(); if let Some(text) = reply_text { message.reply(text).await?; diff --git a/src/bot/main.rs b/src/bot/main.rs index 284f666..c05bb8d 100644 --- a/src/bot/main.rs +++ b/src/bot/main.rs @@ -8,19 +8,30 @@ use tokio::sync::RwLock; use super::{ filters::{ - chain::FilteredHandler, + filtered_handler::FilteredHandler, message_fitlers::{ - ExcludedChatsFilter, MessageDirection, MessageDirectionFilter, TextFilter, - TextMatchMethod, + ExcludedChatsFilter, MessageDirection, MessageDirectionFilter, SilentFilter, + TextFilter, TextMatchMethod, }, }, handlers::{ - basic::{get_chat_id::GetChatId, help::Help}, + basic::{ + currency_converter::{CurrencyConverter, CurrencyTextFilter}, + get_chat_id::GetChatId, + help::Help, + }, fun::{blyaficator::Blyaficator, greeter::Greeter}, Handler, }, }; +/// Authorization function. +/// +/// This function asks for login code and +/// waits for it to become available. +/// +/// Also it validates two-factor authentication +/// password if it was supplied. async fn authorize( args: &BotConfig, client: &Client, @@ -32,18 +43,19 @@ async fn authorize( .await?; let mut code = None; + // Check for code to becom available every second. while code.is_none() { tokio::time::sleep(Duration::from_secs(1)).await; { code = web_code.read().await.clone(); } } - + // Acutal signing in. let signed_in = client.sign_in(&token, &code.unwrap()).await; match signed_in { + // If signing i Err(SignInError::PasswordRequired(password_token)) => { - // Note: this `prompt` method will echo the password in the console. - // Real code might want to use a better way to handle this. + // If the password was not supplied, we use the hint in panic. let hint = password_token.hint().unwrap_or("None"); let password = args .tfa_password @@ -60,48 +72,82 @@ async fn authorize( Ok(()) } +/// This little function is used to execute handlers on updates and print errors +/// if something bad happens. +/// +/// The reason, I created a separate function is simple. I spawn every handler as a +/// separate task and I don't care if fails. async fn handle_with_log(handler: Box, client: Client, update_data: Update) { if let Err(err) = handler.react(&client, &update_data).await { log::error!("{err}"); } } -async fn run(args: BotConfig, client: Client) { +/// Acutal logic on handling updates. +/// +/// This function handles every update we get from telegram +/// and spawns correcsponding handlers. +/// +/// Also, every available handler is defined here. +async fn run(args: BotConfig, client: Client) -> anyhow::Result<()> { let handlers: Vec = vec![ + // Printing help. + FilteredHandler::new(Help).add_filter(TextFilter(&[".h"], TextMatchMethod::IMatches)), + // Greeting my fellow humans. FilteredHandler::new(Greeter) + .add_filter(SilentFilter) .add_filter(MessageDirectionFilter(MessageDirection::Incoming)) .add_filter(TextFilter(&["привет"], TextMatchMethod::IStartsWith)) .add_filter(ExcludedChatsFilter(args.excluded_chats)), - FilteredHandler::new(Help).add_filter(TextFilter(&[".h"], TextMatchMethod::IMatches)), + // Getting chat id. FilteredHandler::new(GetChatId) .add_filter(TextFilter(&[".cid"], TextMatchMethod::IMatches)), + // Make бля fun again. FilteredHandler::new(Blyaficator) .add_filter(TextFilter(&[".bl"], TextMatchMethod::IStartsWith)), + // Handler for converting currecies. + FilteredHandler::new(CurrencyConverter::new()?) + .add_filter(SilentFilter) + .add_filter(ExcludedChatsFilter(args.currency_excluded_chats)) + .add_filter(CurrencyTextFilter), ]; loop { + // Get new update let update = client.next_update().await; if update.is_err() { log::error!("{}", update.unwrap_err()); break; } - if let Some(update_data) = update.unwrap() { - let update_ref = &update_data; - let matched_handlers = handlers - .par_iter() - .filter(move |val| val.check(update_ref)) - .collect::>(); - for handler in matched_handlers { - tokio::spawn(handle_with_log( - handler.handler.clone(), - client.clone(), - update_data.clone(), - )); - } + // We get update if there's no error + let Some(update_data) = update.ok().and_then(|inner|inner) else{ + log::warn!("Empty update is found."); + continue; + }; + // A reference to update, so we can easily move it. + let update_ref = &update_data; + let filtered = handlers + // A parralel iterator over matchers. + .par_iter() + // Here we get all handlers that match filters. + .filter(move |val| val.check(update_ref)) + // For each matched handler we spawn a new task. + .collect::>(); + for handler in filtered { + tokio::spawn(handle_with_log( + handler.handler.clone(), + client.clone(), + update_data.clone(), + )); } } + Ok(()) } +/// The main entrypoint for bot. +/// +/// This function starts bot, performs login and +/// starts endless loop. pub async fn start(args: BotConfig, web_code: Arc>>) -> anyhow::Result<()> { log::info!("Connecting to Telegram..."); let client = Client::connect(Config { @@ -115,17 +161,20 @@ pub async fn start(args: BotConfig, web_code: Arc>>) -> an }, }) .await?; + log::info!("Connected!"); + if client.is_authorized().await? { // If we already authrized, we write random token, so web won't update it. let mut code_writer = web_code.write().await; *code_writer = Some(String::new()); } else { + // If we don't have token, wait for it. authorize(&args, &client, web_code).await?; client.session().save_to_file(args.session_file.as_str())?; } - run(args.clone(), client).await; + run(args.clone(), client).await?; Ok(()) } diff --git a/src/main.rs b/src/main.rs index 1d4ed0d..060f508 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,27 +25,27 @@ async fn main() -> anyhow::Result<()> { let token_lock = Arc::new(RwLock::new(None)); - let bot_token = token_lock.clone(); - let server_token = token_lock.clone(); + [ + // Spawining bot task + tokio::task::spawn(bot::start(args.bot.clone(), token_lock.clone())), + // Spawning server task. + tokio::task::spawn(error_wrap(server::create( + args.server.clone(), + token_lock.clone(), + )?)), + ] + .into_iter() + // Turning all tasks in unirdered futures set. + .collect::>() + // Grab first completed future + .take(1) + // Take the value + .next() + // Await for it to complete + .await + // Unwrap (since we can guarantee that it's not empty). + // Throw all errors by using ??. First for joining task, second from the task itself. + .unwrap()??; - let web_server = server::create(args.server.clone(), server_token)?; - let bot_future = bot::start(args.bot.clone(), bot_token); - - let tasks = [ - tokio::task::spawn(bot_future), - tokio::task::spawn(error_wrap(web_server)), - ]; - - let completed = tasks - .into_iter() - .collect::>() - .take(1) - .collect::>() - .await; - - if let Some(fut) = completed.into_iter().next() { - fut? - } else { - Ok(()) - } + Ok(()) } diff --git a/src/server/main.rs b/src/server/main.rs index 8559ea0..e17691e 100644 --- a/src/server/main.rs +++ b/src/server/main.rs @@ -11,9 +11,10 @@ pub fn create(args: ServerConfig, token: Arc>>) -> anyhow: let addr = (args.host.clone(), args.port); let server = HttpServer::new(move || { App::new() - .wrap(actix_web::middleware::Logger::new( - "\"%r\" \"-\" \"%s\" \"%a\" \"%D\"", - )) + .wrap( + actix_web::middleware::Logger::new("\"%r\" \"-\" \"%s\" \"%a\" \"%D\"") + .exclude("/health"), + ) .app_data(Data::new(token.clone())) .app_data(Data::new(args.clone())) .service(login) diff --git a/src/server/templates/mod.rs b/src/server/templates/mod.rs index d0d2b26..f6b9e03 100644 --- a/src/server/templates/mod.rs +++ b/src/server/templates/mod.rs @@ -1,5 +1,16 @@ use askama::Template; +/// Index pages. +/// +/// This page is used to authenticate users. +/// It has two states: activated or not. +/// +/// It the activated is false, we +/// render two input fields, with telegram code +/// and server's password. +/// +/// If the user is authenticated, we just render +/// some random information. #[derive(Template)] #[template(path = "index.html")] pub struct Index {