1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00

💥 Massive progress here!

This commit is contained in:
Steffo 2021-04-14 04:12:54 +02:00
parent ab1de9a86f
commit fb3153a694
Signed by: steffo
GPG key ID: 6965406171929D01
5 changed files with 135 additions and 230 deletions

Binary file not shown.

105
poetry.lock generated
View file

@ -81,7 +81,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]] [[package]]
name = "docutils" name = "docutils"
version = "0.17" version = "0.16"
description = "Docutils -- Python Documentation Utilities" description = "Docutils -- Python Documentation Utilities"
category = "dev" category = "dev"
optional = false optional = false
@ -223,7 +223,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "6.2.2" version = "6.2.3"
description = "pytest: simple powerful testing with Python" description = "pytest: simple powerful testing with Python"
category = "dev" category = "dev"
optional = false optional = false
@ -284,7 +284,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
[[package]] [[package]]
name = "royalnet" name = "royalnet"
version = "6.1.4" version = "6.2.10"
description = "A multipurpose bot framework" description = "A multipurpose bot framework"
category = "main" category = "main"
optional = false optional = false
@ -317,7 +317,7 @@ python-versions = "*"
[[package]] [[package]]
name = "sphinx" name = "sphinx"
version = "3.5.3" version = "3.5.4"
description = "Python documentation generator" description = "Python documentation generator"
category = "dev" category = "dev"
optional = false optional = false
@ -327,7 +327,7 @@ python-versions = ">=3.5"
alabaster = ">=0.7,<0.8" alabaster = ">=0.7,<0.8"
babel = ">=1.3" babel = ">=1.3"
colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""}
docutils = ">=0.12" docutils = ">=0.12,<0.17"
imagesize = "*" imagesize = "*"
Jinja2 = ">=2.3" Jinja2 = ">=2.3"
packaging = "*" packaging = "*"
@ -348,13 +348,14 @@ test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"]
[[package]] [[package]]
name = "sphinx-rtd-theme" name = "sphinx-rtd-theme"
version = "0.5.1" version = "0.5.2"
description = "Read the Docs theme for Sphinx" description = "Read the Docs theme for Sphinx"
category = "dev" category = "dev"
optional = false optional = false
python-versions = "*" python-versions = "*"
[package.dependencies] [package.dependencies]
docutils = "<0.17"
sphinx = "*" sphinx = "*"
[package.extras] [package.extras]
@ -433,7 +434,7 @@ test = ["pytest"]
[[package]] [[package]]
name = "sqlalchemy" name = "sqlalchemy"
version = "1.4.5" version = "1.4.7"
description = "Database Abstraction Library" description = "Database Abstraction Library"
category = "main" category = "main"
optional = false optional = false
@ -509,7 +510,7 @@ brotli = ["brotlipy (>=0.6.0)"]
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.8" python-versions = "^3.8"
content-hash = "bcc3b7e2bfc0ff9a9b9c044e613a4f2dd99047173dd9b66e0e13c39d08e6a9d9" content-hash = "f393839bc9bc0910f6ca4e3e1441fe69242dceb10ff23afd14ca97c80e6f1bff"
[metadata.files] [metadata.files]
alabaster = [ alabaster = [
@ -549,8 +550,8 @@ colorama = [
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
] ]
docutils = [ docutils = [
{file = "docutils-0.17-py2.py3-none-any.whl", hash = "sha256:a71042bb7207c03d5647f280427f14bfbd1a65c9eb84f4b341d85fafb6bb4bdf"}, {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{file = "docutils-0.17.tar.gz", hash = "sha256:e2ffeea817964356ba4470efba7c2f42b6b0de0b04e66378507e3e2504bbff4c"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
] ]
greenlet = [ greenlet = [
{file = "greenlet-1.0.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2"}, {file = "greenlet-1.0.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2"},
@ -730,8 +731,8 @@ pyparsing = [
{file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"},
] ]
pytest = [ pytest = [
{file = "pytest-6.2.2-py3-none-any.whl", hash = "sha256:b574b57423e818210672e07ca1fa90aaf194a4f63f3ab909a2c67ebb22913839"}, {file = "pytest-6.2.3-py3-none-any.whl", hash = "sha256:6ad9c7bdf517a808242b998ac20063c41532a570d088d77eec1ee12b0b5574bc"},
{file = "pytest-6.2.2.tar.gz", hash = "sha256:9d1edf9e7d0b84d72ea3dbcdfd22b35fb543a5e8f2a60092dd578936bf63d7f9"}, {file = "pytest-6.2.3.tar.gz", hash = "sha256:671238a46e4df0f3498d1c3270e5deb9b32d25134c99b7d75370a68cfbe9b634"},
] ]
pytest-asyncio = [ pytest-asyncio = [
{file = "pytest-asyncio-0.14.0.tar.gz", hash = "sha256:9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700"}, {file = "pytest-asyncio-0.14.0.tar.gz", hash = "sha256:9882c0c6b24429449f5f969a5158b528f39bde47dc32e85b9f0403965017e700"},
@ -746,8 +747,8 @@ requests = [
{file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
] ]
royalnet = [ royalnet = [
{file = "royalnet-6.1.4-py3-none-any.whl", hash = "sha256:d9d3650b13dbfc5f8b93fd2dc66cdc742dec571d624b1a3294d4b066ae7766ef"}, {file = "royalnet-6.2.10-py3-none-any.whl", hash = "sha256:794d2f2c5d319a1649cf97355d7ad07c0ad36df4d96b4ad534eb1dc1c4a39caa"},
{file = "royalnet-6.1.4.tar.gz", hash = "sha256:8005c706c533046bebdcf9b8a1517da5c0e3f8cfaed9d33460cb15854f7d57b9"}, {file = "royalnet-6.2.10.tar.gz", hash = "sha256:1a3f87b77fccce8df7571fcd0d8fbc5837b9f173a6d15c5e1e3e679a377b8ba5"},
] ]
rsa = [ rsa = [
{file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"},
@ -758,12 +759,12 @@ snowballstemmer = [
{file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"},
] ]
sphinx = [ sphinx = [
{file = "Sphinx-3.5.3-py3-none-any.whl", hash = "sha256:3f01732296465648da43dec8fb40dc451ba79eb3e2cc5c6d79005fd98197107d"}, {file = "Sphinx-3.5.4-py3-none-any.whl", hash = "sha256:2320d4e994a191f4b4be27da514e46b3d6b420f2ff895d064f52415d342461e8"},
{file = "Sphinx-3.5.3.tar.gz", hash = "sha256:ce9c228456131bab09a3d7d10ae58474de562a6f79abb3dc811ae401cf8c1abc"}, {file = "Sphinx-3.5.4.tar.gz", hash = "sha256:19010b7b9fa0dc7756a6e105b2aacd3a80f798af3c25c273be64d7beeb482cb1"},
] ]
sphinx-rtd-theme = [ sphinx-rtd-theme = [
{file = "sphinx_rtd_theme-0.5.1-py2.py3-none-any.whl", hash = "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"}, {file = "sphinx_rtd_theme-0.5.2-py2.py3-none-any.whl", hash = "sha256:4a05bdbe8b1446d77a01e20a23ebc6777c74f43237035e76be89699308987d6f"},
{file = "sphinx_rtd_theme-0.5.1.tar.gz", hash = "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5"}, {file = "sphinx_rtd_theme-0.5.2.tar.gz", hash = "sha256:32bd3b5d13dc8186d7a42fc816a23d32e83a4827d7d9882948e7b837c232da5a"},
] ]
sphinxcontrib-applehelp = [ sphinxcontrib-applehelp = [
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
@ -790,40 +791,40 @@ sphinxcontrib-serializinghtml = [
{file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"},
] ]
sqlalchemy = [ sqlalchemy = [
{file = "SQLAlchemy-1.4.5-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c3810ebcf1d42c532c8f5c3f442c705d94442a27a32f2df5344f0857306ab321"}, {file = "SQLAlchemy-1.4.7-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:e9c2aaaa9738ba3334262734bd25d9b2d6ea446400f815bbdea17571b9e6d8fb"},
{file = "SQLAlchemy-1.4.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7481f9c2c832a3bf37c80bee44d91ac9938b815cc06f7e795b976e300914aab9"}, {file = "SQLAlchemy-1.4.7-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:94fece3fdc777fbf37378513414bcf19ae89e1b598edf33d957a2898991d714f"},
{file = "SQLAlchemy-1.4.5-cp27-cp27m-win32.whl", hash = "sha256:94040a92b6676f9ffdab6c6b479b3554b927a635c90698c761960b266b04fc88"}, {file = "SQLAlchemy-1.4.7-cp27-cp27m-win32.whl", hash = "sha256:58075eab5e32daf51e637ac88c63057c3a5e84602cfeb30db4258838ef6f7a2b"},
{file = "SQLAlchemy-1.4.5-cp27-cp27m-win_amd64.whl", hash = "sha256:02b039e0e7e6de2f15ea2d2de3995e31a170e700ec0b37b4eded662171711d19"}, {file = "SQLAlchemy-1.4.7-cp27-cp27m-win_amd64.whl", hash = "sha256:8df743c79181ecc6aadaf10569d452ef3eda06764fe0adc4ea981a48c01e1ad5"},
{file = "SQLAlchemy-1.4.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f16801795f1ffe9472360589a04301018c79e4582a85e68067275bb4f765e4e2"}, {file = "SQLAlchemy-1.4.7-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb69a2d93c1a98a8d4ca24a8012ade4b771087dddbe077ad4ef4911d7f17185d"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:82f11b679df91275788be6734dd4a9dfa29bac67b85326992609f62b05bdab37"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d10117c9ce096bd6fb9a13c6fad274982f7889028e22a05719a6d219e2cf977e"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a08027ae84efc563f0f2f341dda572eadebeca38c0ae028a009988f27e9e6230"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:abf18c62c4740d7199e443537066904789052d6d165cb279eb91bea35ea42ec4"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:70a1387396ea5b3022539b560c287daf79403d8b4b365f89b56d660e625a4457"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:8672ff62c9d48f62aa17bb806a591cdfed801d139eecbcf9224bffb80f6fdc30"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4f7ce3bfdab6520554af4a5b1df4513d45388624d015ba4d921daf48ce1d6503"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8ecabd4cead9a582e2ffa7a3918bc31155d5c24b1fd16ed617171f913c438da1"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:08943201a1e3c6238e48f4d5d56c27ea1e1b39d3d9f36a9d81fc3cfb0e1b83bd"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e98934855337d76aa7726f444b0fa597a462271a95d01bc050644d88e1ee5aae"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-win32.whl", hash = "sha256:fbb0fda1c574975807aceb0e2332e0ecfe9e5656c191ed482c1a5eafe7a33823"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-win32.whl", hash = "sha256:6adb07e199781457b75f4773e63577a2898f95141f030b956a2a186055f24e76"},
{file = "SQLAlchemy-1.4.5-cp36-cp36m-win_amd64.whl", hash = "sha256:8d6a9feb5efd2fdab25c6d5a0a5589fed9d789f5ec57ec12263fd0e60ce1dea6"}, {file = "SQLAlchemy-1.4.7-cp36-cp36m-win_amd64.whl", hash = "sha256:d81a68df4f3eee490b66ba990648d3c77cbf2475291ef92aa4e05ef541ecfd66"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:c22bfac8d3b955cdb13f0fcd6343156bf56d925196cf7d9ab9ce9f61d3f1e11c"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ef6d98d5b51eb826516499429e059872b61e272cb44630ca8de87650242d07d8"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7c0c7bb49167ac738ca6ee6e7f94a9988a7e4e261d8da335341e8c8c8f3b2e9b"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d5ef5619d421f8a86af874f867d17d823cd970ad0f2ae7c30723beb16922b4d6"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:344b58b4b4193b72e8b768a51ef6eb5a4c948ce313a0f23e2ea081e71ce8ac0e"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:c74310f13e5a113ef658345e2cedf9aa1fcb8b9a588e07d54c083c7fc71edf42"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:48540072f43b3c080159ec1f24a4b014c0ee83d3b73795399974aa358a8cf71b"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:069fcda89c7d168382f674b5b566643f1420e4e7704c00cced2579675deb4eed"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:81badd7d3e0e6aba70a5d1b50fabe8112e9835a6fdb0684054c3fe5378ce0d01"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:673cb375deb17e1561340710f428b33c27a11980d991a2ac88d7bf1c623faa0b"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:a103294583383660d9e06dbd82037dc8e94c184bdcb27b2be44ae4457dafc6b4"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-win32.whl", hash = "sha256:aea57c7a5a4135abc10f81ce433b23325cbb9648a5dcb0ac1af1cdd413f7d0cb"},
{file = "SQLAlchemy-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5361e25181b9872d6906c8c9be7dc05cb0a0951d71ee59ee5a71c1deb301b8a8"}, {file = "SQLAlchemy-1.4.7-cp37-cp37m-win_amd64.whl", hash = "sha256:6913ea108e7583f2d7ba4bc9cf4f2b1e0cdacf7e66e4cdc04192f870e64306ff"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7f5087104c3c5af11ea59e49ae66c33ca98b14a47d3796ae97498fca53f84aef"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:72152b64508dd807ba2a26d9dfc4da450d0ba1808c9f96ddbc397c435735fac3"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:11e7a86209f69273e75d2dd64b06c0c2660e39cd942fce2170515c404ed7358a"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9de4c84ea180c07f1d4010db2cfdbf9fe67bf7caafcfb1053644c8c03bfa3fd0"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8301ecf3e819eb5dbc171e84654ff60872807775301a55fe35b0ab2ba3742031"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:89860d594cb3256718d74ff7406a405a890eac71bcc044b3ba6868850d934a48"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:44e11a06168782b6d485daef197783366ce7ab0d5eea0066c899ae06cef47bbc"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5d84442d85491dc473bf99f4d90ad45dd2e5539743f4d1216b15ba26575ba572"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6f8fdad2f335d2f3ca2f3ee3b01404f7abcf519b03de2c510f1f42d16e39ffb4"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:fdd1e4ed5d526aa4c7a01ed2157d01f0234eaecdb04b1c3b5084d0902986be9f"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-win32.whl", hash = "sha256:f62c57ceadedeb8e7b98b48ac4d684bf2b0f73b9d882fed3ca260d9aedf6403f"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-win32.whl", hash = "sha256:3a022a7985a49cacf21e2a73bab083e4852943466d250d932554650d705fcc62"},
{file = "SQLAlchemy-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:301d0cd6ef1dc73b607748183da857e712d6f743de8d92b1e1f8facfb0ba2aa2"}, {file = "SQLAlchemy-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:a7f450cbab9670949e7d9f0eac1dd93eaaffce319608bf4b863f0b751decef42"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:915d4fa08776c0252dc5a34fa15c6490f66f411ea1ac9492022f98875d6baf20"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2bfadb3279f51252565baed9aa071c1bef875fcde60bf4a172136289ac208804"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7de84feb31af3d8fdf819cac2042928d0b60d3cb16f49c4b2f48d88db46e79f6"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1d1172a9e5ead90d9299ccad8c5eecf40372a3721ff82fc4b4ee42835baf4659"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:45b091ccbf94374ed14abde17e9a04522b0493a17282eaaf4383efdd413f5243"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bea07faab746743c8d82650b51129ff2705d53a0094161cfa6145e7ce77b9644"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:4df07161897191ed8d4a0cfc92425c81296160e5c5f76c9256716d3085172883"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a3a40d2a0cb2ca2886f8f2fe768e83aeca489a162c8233974b9b2e429827ed85"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ee4ddc904fb6414b5118af5b8d45e428aac2ccda01326b2ba2fe4354b0d8d1ae"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:50b1cb7c9f6f0bbc68c06453d66d4a34ca75ba60bce61d49bf007edfd2621d0a"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-win32.whl", hash = "sha256:2f11b5783933bff55291ca06496124347627d211ff2e509e846af1c35de0a3fb"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-win32.whl", hash = "sha256:d26d8a3865c9f33d7b3b356a577c7f26c499a9f080ae33e4282a65a8a2170cef"},
{file = "SQLAlchemy-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:0ee0054d4a598d2920cae14bcbd33e200e02c5e3b47b902627f8cf5d4c9a2a4b"}, {file = "SQLAlchemy-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:606ac6a7640cc642fd53c5e693c560ad9fc21ef97aa7e799eb96b6d7f28ad723"},
{file = "SQLAlchemy-1.4.5.tar.gz", hash = "sha256:1294f05916c044631fd626a4866326bbfbd17f62bd37510d000afaef4b35bd74"}, {file = "SQLAlchemy-1.4.7.tar.gz", hash = "sha256:84115f97d88c8ccf26db81b7997c5f5de9ae360e0785ef859d0987794495f0a9"},
] ]
telethon = [ telethon = [
{file = "Telethon-1.21.1-py3-none-any.whl", hash = "sha256:df643fc988708ad16d16de834ffa12ad4bfa3f956473d835c8158e2283b885ea"}, {file = "Telethon-1.21.1-py3-none-any.whl", hash = "sha256:df643fc988708ad16d16de834ffa12ad4bfa3f956473d835c8158e2283b885ea"},

View file

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "royalnet-telethon" name = "royalnet-telethon"
version = "0.2.0" version = "0.3.4"
description = "A Telethon-based frontend for the royalnet.engineer module." description = "A Telethon-based frontend for the royalnet.engineer module."
authors = ["Stefano Pigozzi <me@steffo.eu>"] authors = ["Stefano Pigozzi <me@steffo.eu>"]
license = "AGPL-3.0-or-later" license = "AGPL-3.0-or-later"
@ -14,12 +14,11 @@ classifiers = [
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
"Operating System :: OS Independent", "Operating System :: OS Independent",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Topic :: Terminals",
] ]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.8" python = "^3.8"
royalnet = "^6.1.2" royalnet = "~6.2.10"
Telethon = "^1.21.1" Telethon = "^1.21.1"
click = "^7.1.2" click = "^7.1.2"

View file

@ -1,67 +0,0 @@
# Special imports
from __future__ import annotations
import royalnet.royaltyping as t
# External imports
import logging
import importlib
import click
import asyncio
import royalnet.engineer as engi
# Internal imports
from .pda import TelethonPDA
# Special global objects
log = logging.getLogger(__name__)
# Code
@click.command()
@click.option("-p", "--pack", "packs", multiple=True)
@click.option("-i", "--api-id", "api_id", required=True, type=int)
@click.option("-h", "--api-hash", "api_hash", required=True)
@click.option("-t", "--token", "token", required=True)
@click.option("-u", "--username", "username", required=True)
def main(packs: t.List[str], token: str, api_id: int, api_hash: str, username: str):
log.debug("Creating PDA...")
pda = TelethonPDA(tg_api_id=api_id, tg_api_hash=api_hash, bot_username=username)
for pack in packs:
log.debug(f"Importing module: {pack!r}")
try:
pack = importlib.import_module(pack)
except ImportError as e:
log.error(f"Skipping {pack!r}: {e!r}")
continue
for attribute in dir(pack):
log.debug(f"Getting attribute: {attribute!r}")
value = pack.__getattribute__(attribute)
log.debug(f"Attribute is: {value!r}")
if isinstance(value, engi.PartialCommand):
log.debug(f"Attribute is a PartialCommand, registering it as: {value.f.__name__!r}")
pda.register_partial(part=value, names=[value.f.__name__])
elif isinstance(value, engi.Conversation):
log.debug(f"Attribute is a Conversation, registering it...")
pda.register_conversation(conv=value)
log.debug("Getting event loop...")
loop = asyncio.get_event_loop()
log.debug(f"Event loop is: {loop!r}")
log.debug("Running the PDA until interrupted...")
try:
loop.run_until_complete(pda.run(bot_token=token))
except KeyboardInterrupt:
log.debug("Got an interrupt, shutting down...")
exit(0)
log.fatal("PDA stopped unexpectedly, shutting down...")
exit(1)
if __name__ == "__main__":
main()

View file

@ -6,7 +6,6 @@ from __future__ import annotations
import royalnet.royaltyping as t import royalnet.royaltyping as t
import logging import logging
import asyncio
import royalnet.engineer as engi import royalnet.engineer as engi
import telethon as tt import telethon as tt
import telethon.tl.custom as tlc import telethon.tl.custom as tlc
@ -18,34 +17,35 @@ log = logging.getLogger(__name__)
class TelethonPDAMode(enum.Enum): class TelethonPDAMode(enum.Enum):
"""
.. todo:: Document this.
"""
GLOBAL = enum.auto() GLOBAL = enum.auto()
CHAT = enum.auto() CHAT = enum.auto()
USER = enum.auto() USER = enum.auto()
CHAT_USER = enum.auto() CHAT_USER = enum.auto()
class TelethonPDA: class TelethonPDAImplementation(engi.ConversationListImplementation):
""" """
A PDA which handles :mod:`royalnet` input and output using a Telegram bot as a source. .. todo:: Document this.
""" """
def __init__(self, def _partialcommand_pattern(self, partial) -> str:
tg_api_id: int, if partial.syntax:
tg_api_hash: str, return rf"^/{{name}}(?:@{self.bot_username})?\s+{{syntax}}$"
bot_username: str, else:
mode: TelethonPDAMode = TelethonPDAMode.CHAT_USER, return rf"^/{{name}}(?:@{self.bot_username})?$"
):
"""
Create a new :class:`.TelethonPDA` .
Get API properties `here <https://my.telegram.org/apps>`_. @property
def namespace(self):
return "telethon"
:param tg_api_id: The Telegram ``api_id``. def __init__(self, name: str, tg_api_id: int, tg_api_hash: str, bot_username: str, bot_token: str,
:param tg_api_hash: The Telegram ``api_hash``. mode: TelethonPDAMode = TelethonPDAMode.CHAT_USER, extensions = None):
:param mode: The mode to use for mapping dispensers.
"""
log.debug(f"Creating new TelethonPDA...") super().__init__(name=name, extensions=extensions)
self.dispensers: dict[t.Any, engi.Dispenser] = {} self.dispensers: dict[t.Any, engi.Dispenser] = {}
""" """
@ -58,24 +58,43 @@ class TelethonPDA:
:class:`~royalnet.engineer.dispenser.Dispenser`. :class:`~royalnet.engineer.dispenser.Dispenser`.
""" """
self.client: tt.TelegramClient = tt.TelegramClient("bot", api_id=tg_api_id, api_hash=tg_api_hash)
"""
The :mod:`telethon` Telegram _client that this PDA will use to interface with Telegram.
"""
self._register_events()
self.mode: TelethonPDAMode = mode self.mode: TelethonPDAMode = mode
""" """
The mode to use for mapping dispensers. The mode to use for mapping dispensers.
""" """
self.bot_username: str = bot_username self.tg_api_id: int = tg_api_id
"""
.. todo:: Document this.
"""
def _register_events(self): self.tg_api_hash: str = tg_api_hash
self.client.add_event_handler(callback=self._message_new, event=tt.events.NewMessage()) """
self.client.add_event_handler(callback=self._message_edit, event=tt.events.MessageEdited()) .. todo:: Document this.
self.client.add_event_handler(callback=self._message_delete, event=tt.events.MessageDeleted()) """
self.bot_username: str = bot_username
"""
.. todo:: Document this.
"""
self.bot_token: str = bot_token
"""
.. todo:: Document this.
"""
def _register_events(self, client):
"""
.. todo:: Document this.
"""
self.log.info("Registering Telethon events...")
self.log.debug("Registering NewMessage event...")
client.add_event_handler(callback=self._message_new, event=tt.events.NewMessage())
self.log.debug("Registering MessageEdited event...")
client.add_event_handler(callback=self._message_edit, event=tt.events.MessageEdited())
self.log.debug("Registering MessageDeleted event...")
client.add_event_handler(callback=self._message_delete, event=tt.events.MessageDeleted())
# self._client.add_event_handler(callback=self._message_read, _event=tt.events.MessageRead()) # self._client.add_event_handler(callback=self._message_read, _event=tt.events.MessageRead())
# self._client.add_event_handler(callback=self._chat_action, _event=tt.events.ChatAction()) # self._client.add_event_handler(callback=self._chat_action, _event=tt.events.ChatAction())
# self._client.add_event_handler(callback=self._user_update, _event=tt.events.UserUpdate()) # self._client.add_event_handler(callback=self._user_update, _event=tt.events.UserUpdate())
@ -84,6 +103,10 @@ class TelethonPDA:
# self._client.add_event_handler(callback=self._album, _event=tt.events.Album()) # self._client.add_event_handler(callback=self._album, _event=tt.events.Album())
def _determine_key(self, event: tlc.message.Message): def _determine_key(self, event: tlc.message.Message):
"""
.. todo:: Document this.
"""
if self.mode == TelethonPDAMode.GLOBAL: if self.mode == TelethonPDAMode.GLOBAL:
return None return None
elif self.mode == TelethonPDAMode.USER: elif self.mode == TelethonPDAMode.USER:
@ -102,101 +125,50 @@ class TelethonPDA:
raise TypeError("Invalid mode") raise TypeError("Invalid mode")
async def _message_new(self, event: tlc.message.Message): async def _message_new(self, event: tlc.message.Message):
"""
.. todo:: Document this.
"""
await self.put_projectile( await self.put_projectile(
key=self._determine_key(event), key=self._determine_key(event),
proj=TelegramMessageReceived(event=event), projectile=TelegramMessageReceived(event=event),
) )
async def _message_edit(self, event: tlc.message.Message): async def _message_edit(self, event: tlc.message.Message):
"""
.. todo:: Document this.
"""
await self.put_projectile( await self.put_projectile(
key=self._determine_key(event), key=self._determine_key(event),
proj=TelegramMessageEdited(event=event), projectile=TelegramMessageEdited(event=event),
) )
async def _message_delete(self, event: tlc.message.Message): async def _message_delete(self, event: tlc.message.Message):
"""
.. todo:: Document this.
"""
await self.put_projectile( await self.put_projectile(
key=self._determine_key(event), key=self._determine_key(event),
proj=TelegramMessageDeleted(event=event), projectile=TelegramMessageDeleted(event=event),
) )
async def run(self, bot_token: str) -> t.NoReturn: async def run(self) -> t.NoReturn:
""" client = tt.TelegramClient(
Run the main loop of the :class:`.ConsolePDA` for ``cycles`` cycles, or unlimited cycles if the parameter is "bot",
:data:`True`. api_id=self.tg_api_id,
""" api_hash=self.tg_api_hash
# Login to the Telegram API )
self.client: tt.TelegramClient = await self.client.start(bot_token=bot_token)
await self.client.connect()
await self.client.get_me()
await self.client.catch_up()
await self.client.run_until_disconnected()
def register_conversation(self, conv: engi.Conversation) -> None: await client.start(bot_token=self.bot_token)
""" try:
Register a new conversation in the PDA. self._register_events(client)
await client.run_until_disconnected()
:param conv: The conversation to register. finally:
""" await client.disconnect()
log.info(f"Registering conversation: {conv!r}")
self.conversations.append(conv)
def unregister_conversation(self, conv: engi.Conversation) -> None:
"""
Unregister a conversation from the PDA.
:param conv: The conversation to unregister.
"""
log.info(f"Unregistering conversation: {conv!r}")
self.conversations.remove(conv)
def register_partial(self, part: engi.PartialCommand, names: t.List[str]) -> engi.Command:
"""
Register a new :class:`~royalnet.engineer.command.PartialCommand` in the PDA, converting it to a
:class:`royalnet.engineer.Command` in the process.
:param part: The :class:`~royalnet.engineer.command.PartialCommand` to register.
:param names: The :attr:`~royalnet.engineer.command.Command.names` to register the command with.
:return: The resulting :class:`~royalnet.engineer.command.Command`.
"""
log.debug(f"Completing partial: {part!r}")
if part.syntax:
command = part.complete(pattern=rf"^/{{name}}(?:@{self.bot_username})?\s+{{syntax}}$", names=names)
else:
command = part.complete(pattern=rf"^/{{name}}(?:@{self.bot_username})?$", names=names)
self.register_conversation(command)
return command
async def put_projectile(self, key: t.Any, proj: engi.Projectile) -> None:
"""
Insert a new projectile into the dispenser.
:param key: The key of the dispenser to interact with.
:param proj: The projectile to put in the dispenser.
"""
if key not in self.dispensers:
log.debug(f"Dispenser not found, creating one...")
self.dispensers[key] = engi.Dispenser()
dispenser = self.dispensers[key]
log.debug("Getting running loop...")
loop = asyncio.get_running_loop()
for conversation in self.conversations:
log.debug(f"Creating run task for: {conversation!r}")
loop.create_task(dispenser.run(conversation, _pda=self), name=f"{repr(conversation)}")
log.debug("Running a _event loop cycle...")
await asyncio.sleep(0)
log.debug(f"Putting projectile {proj!r} in dispenser {dispenser!r}...")
await dispenser.put(proj)
log.debug("Awaiting another _event loop cycle...")
await asyncio.sleep(0)
# Objects exported by this module
__all__ = ( __all__ = (
"TelethonPDA", "TelethonPDAImplementation",
) )