From 03d5333cc2c24a8be374e244d65c35f3d4ac44bf Mon Sep 17 00:00:00 2001 From: Hinrich Mahler Date: Sun, 28 Feb 2021 10:14:09 +0100 Subject: [PATCH] v1.0 --- .gitignore | 32 ++ .gitlab-ci.yml | 29 ++ .gitmodules | 3 + .pre-commit-config.yaml | 37 ++ CHANGES.rst | 9 + README.rst | 42 ++- bot.ini | 3 + bot/__init__.py | 2 + bot/admin.py | 433 ++++++++++++++++++++++++ bot/basic.py | 112 ++++++ bot/constants.py | 102 ++++++ bot/pauseweeks.py | 191 +++++++++++ bot/setnext.py | 195 +++++++++++ bot/setup.py | 112 ++++++ bot/utils.py | 185 ++++++++++ docs/Makefile | 20 ++ docs/make.bat | 35 ++ docs/requirements-docs.txt | 3 + docs/source/_static | 1 + docs/source/bot.basic.rst | 7 + docs/source/bot.constants.rst | 7 + docs/source/bot.rst | 10 + docs/source/bot.setnext.rst | 7 + docs/source/bot.setup.rst | 7 + docs/source/bot.utils.rst | 7 + docs/source/changelog.rst | 1 + docs/source/conf.py | 99 ++++++ docs/source/index.rst | 13 + docs/source/userguide.rst | 57 ++++ logo/AkaBlasBot-no-background-black.png | Bin 0 -> 34003 bytes logo/AkaBlasBot-no-background-black.svg | 151 +++++++++ logo/AkaBlasBot-no-background.png | Bin 0 -> 46390 bytes logo/AkaBlasBot-no-background.svg | 151 +++++++++ logo/AkaBlasBot.ico | Bin 0 -> 14311 bytes logo/AkaBlasBot.png | Bin 0 -> 98386 bytes logo/AkaBlasBot.svg | 182 ++++++++++ main.py | 47 +++ pyproject.toml | 10 + requirements-dev.txt | 6 + requirements.txt | 5 + setup.cfg | 12 + 41 files changed, 2324 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .gitmodules create mode 100644 .pre-commit-config.yaml create mode 100644 CHANGES.rst create mode 100644 bot.ini create mode 100644 bot/__init__.py create mode 100644 bot/admin.py create mode 100644 bot/basic.py create mode 100644 bot/constants.py create mode 100644 bot/pauseweeks.py create mode 100644 bot/setnext.py create mode 100644 bot/setup.py create mode 100644 bot/utils.py create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements-docs.txt create mode 160000 docs/source/_static create mode 100644 docs/source/bot.basic.rst create mode 100644 docs/source/bot.constants.rst create mode 100644 docs/source/bot.rst create mode 100644 docs/source/bot.setnext.rst create mode 100644 docs/source/bot.setup.rst create mode 100644 docs/source/bot.utils.rst create mode 100644 docs/source/changelog.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/userguide.rst create mode 100644 logo/AkaBlasBot-no-background-black.png create mode 100644 logo/AkaBlasBot-no-background-black.svg create mode 100644 logo/AkaBlasBot-no-background.png create mode 100644 logo/AkaBlasBot-no-background.svg create mode 100644 logo/AkaBlasBot.ico create mode 100644 logo/AkaBlasBot.png create mode 100644 logo/AkaBlasBot.svg create mode 100644 main.py create mode 100644 pyproject.toml create mode 100644 requirements-dev.txt create mode 100644 requirements.txt create mode 100644 setup.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ae0a3e --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ + # Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# Unit test / coverage reports (not currently used) +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +.pytest_cache +nosetests.xml +coverage.xml +*,cover +.coveralls.yml +.mypy_cache + +# Sphinx documentation +docs/build/ + +# Pickle and log files +abb* + +# Saved headers +/headers/*.png + +# Pycharm +.idea/ + +# virtual environment +venv/ +/env/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..82e2c12 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,29 @@ +stages: + - pages + +pages: + stage: pages + + variables: + GIT_SUBMODULE_STRATEGY: recursive + + rules: + - if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "dev"' + changes: + - "**/*.rst" + - "**/*.py" + + image: python:3.8-slim + + script: + - apt-get update + - apt-get install -y git + - python -W ignore -m pip install --upgrade pip + - python -W ignore -m pip install -r docs/requirements-docs.txt + - python -W ignore -m pip install -r requirements.txt + - sphinx-build docs/source docs/build/html + - mv docs/build/html public + + artifacts: + paths: + - public diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2429abb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docs/source/_static"] + path = docs/source/_static + url = https://github.com/Bibo-Joshi/sphinx_rtd_theme diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..4d0e0a3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,37 @@ +# Make sure that +# * the revs specified here match requirements-dev.txt +# * the makefile checks the same files as pre-commit +# * MyPy gets all dependencies as additional dependencies +repos: +- repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + args: + - --diff + - --check +- repo: https://gitlab.com/pycqa/flake8 + rev: 3.8.1 + hooks: + - id: flake8 +- repo: https://github.com/PyCQA/pylint + rev: pylint-2.6.0 + hooks: + - id: pylint + language: python + language_version: python3.8 + files: ^(main|bot/.*)\.py$ + args: + - --rcfile=setup.cfg +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v0.790 + hooks: + - id: mypy + language: python + language_version: python3.8 + additional_dependencies: + - python-telegram-bot>=13.3,<14.0 + - git+https://github.com/python-telegram-bot/ptbcontrib.git@5eda3817f8a4ee196dfa37efd5775ed00c7b047c + - pytz + - rapidfuzz==1.1.1 + files: ^(main|bot/.*)\.py$ \ No newline at end of file diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..a7fe251 --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,9 @@ +========= +Changelog +========= + +Version 1.0 +=========== +*Released 2021-02-28* + +Initial version. diff --git a/README.rst b/README.rst index a0f332f..a1b3cc3 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,44 @@ AkaBlas-Bot =========== -Simple Telegram bot designed to help the board of AkaBlas. +.. image:: https://img.shields.io/badge/read%20the-user%20guide-orange?logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmlld0JveD0iLTEgLTI1NiAxNjY1LjMyODIgMTUzNiIKICAgaWQ9InN2ZzMwMjUiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45Mi40ICg1ZGE2ODljMzEzLCAyMDE5LTAxLTE0KSIKICAgd2lkdGg9IjE2NjUuMzI4MiIKICAgaGVpZ2h0PSIxNTM2IgogICBzb2RpcG9kaTpkb2NuYW1lPSJCb29rX2ZvbnRfYXdlc29tZS5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcSGlucmljaFxEZXNrdG9wXEJvb2tfZm9udF9hd2Vzb21lLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjUuNzYwMDAwMiIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjUuNzYwMDAwMiI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMzAzNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczMwMzMiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTkiCiAgICAgaWQ9Im5hbWVkdmlldzMwMzEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMDkzMTIzNDM4IgogICAgIGlua3NjYXBlOmN4PSI5MDguNDE4NzIiCiAgICAgaW5rc2NhcGU6Y3k9IjcxNC4xMzg4NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzAyNSIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOmN1cnJlbnRDb2xvciIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGlkPSJwYXRoMzAyOSIKICAgICBkPSJtIDE2MzguNTIxNyw5NCBxIDQwLDU3IDE4LDEyOSBsIC0yNzUsOTA2IHEgLTE5LDY0IC03Ni41LDEwNy41IC01Ny41LDQzLjUgLTEyMi41LDQzLjUgSCAyNTkuNTIxNzQgcSAtNzcsMCAtMTQ4LjUsLTUzLjUgUSAzOS41MjE3MzksMTE3MyAxMS41MjE3MzksMTA5NSBxIC0yNCwtNjcgLTEuOTk5OTk5OSwtMTI3IDAsLTQgMi45OTk5OTk5LC0yNyAzLC0yMyA0LC0zNyAxLC04IC0zLC0yMS41IC0zLjk5OTk5OTksLTEzLjUgLTMsLTE5LjUgMiwtMTEgOCwtMjEgNiwtMTAgMTYuNSwtMjMuNSAxMC41LC0xMy41IDE2LjUsLTIzLjUgMjMsLTM4IDQ1LC05MS41IDIyLjAwMDAwMSwtNTMuNSAzMC4wMDAwMDEsLTkxLjUgMywtMTAgMC41LC0zMCAtMi41LC0yMCAtMC41LC0yOCAzLC0xMSAxNywtMjggMTQsLTE3IDE3LC0yMyAyMSwtMzYgNDIsLTkyIDIxLC01NiAyNSwtOTAgMSwtOSAtMi41LC0zMiAtMy41LC0yMyAwLjUsLTI4IDQsLTEzIDIyLC0zMC41IDE4LC0xNy41IDIyLC0yMi41IDE5LC0yNiA0Mi41LC04NC41IDIzLjUsLTU4LjUgMjcuNSwtOTYuNSAxLC04IC0zLC0yNS41IC00LC0xNy41IC0yLC0yNi41IDIsLTggOSwtMTggNywtMTAgMTgsLTIzIDExLC0xMyAxNywtMjEgOCwtMTIgMTYuNSwtMzAuNSA4LjUsLTE4LjUgMTUsLTM1IDYuNSwtMTYuNSAxNiwtMzYgOS41LC0xOS41IDE5LjUsLTMyIDEwLC0xMi41IDI2LjUsLTIzLjUgMTYuNSwtMTEgMzYsLTExLjUgMTkuNSwtMC41IDQ3LjUsNS41IGwgLTEsMyBxIDM4LC05IDUxLC05IGggNzYwLjk5OTk2IHEgNzQsMCAxMTQsNTYgNDAsNTYgMTgsMTMwIGwgLTI3NCw5MDYgcSAtMzYsMTE5IC03MS41LDE1My41IC0zNS41LDM0LjUgLTEyOC41LDM0LjUgSCAxNTUuNTIxNzQgcSAtMjcsMCAtMzgsMTUgLTExLDE2IC0xLDQzIDI0LDcwIDE0NCw3MCBoIDkyMi45OTk5NiBxIDI5LDAgNTYsLTE1LjUgMjcsLTE1LjUgMzUsLTQxLjUgbCAzMDAsLTk4NyBxIDcsLTIyIDUsLTU3IDM4LDE1IDU5LDQzIHogTSA1NzQuNTIxNzQsOTYgcSAtNCwxMyAyLDIyLjUgNiw5LjUgMjAsOS41IGggNjA3Ljk5OTk2IHEgMTMsMCAyNS41LC05LjUgMTIuNSwtOS41IDE2LjUsLTIyLjUgbCAyMSwtNjQgcSA0LC0xMyAtMiwtMjIuNSAtNiwtOS41IC0yMCwtOS41IEggNjM3LjUyMTc0IHEgLTEzLDAgLTI1LjUsOS41IC0xMi41LDkuNSAtMTYuNSwyMi41IHogbSAtODMsMjU2IHEgLTQsMTMgMiwyMi41IDYsOS41IDIwLDkuNSBoIDYwNy45OTk5NiBxIDEzLDAgMjUuNSwtOS41IDEyLjUsLTkuNSAxNi41LC0yMi41IGwgMjEsLTY0IHEgNCwtMTMgLTIsLTIyLjUgLTYsLTkuNSAtMjAsLTkuNSBIIDU1NC41MjE3NCBxIC0xMywwIC0yNS41LDkuNSAtMTIuNSw5LjUgLTE2LjUsMjIuNSB6IiAvPgo8L3N2Zz4K + :target: https://hirschheissich.gitlab.io/akablas-bot/userguide + :alt: User Guide + +.. image:: https://img.shields.io/badge/python-3.8+-blue?logo=python&logoColor=white + :target: https://www.python.org/doc/versions/ + :alt: Supported Python versions + +.. image:: https://img.shields.io/badge/backend-python--telegram--bot-blue + :target: https://python-telegram-bot.org/ + :alt: Backend: python-telegram-bot + +.. image:: https://img.shields.io/badge/documentation-is%20here-orange?logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmlld0JveD0iLTEgLTI1NiAxNjY1LjMyODIgMTUzNiIKICAgaWQ9InN2ZzMwMjUiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45Mi40ICg1ZGE2ODljMzEzLCAyMDE5LTAxLTE0KSIKICAgd2lkdGg9IjE2NjUuMzI4MiIKICAgaGVpZ2h0PSIxNTM2IgogICBzb2RpcG9kaTpkb2NuYW1lPSJCb29rX2ZvbnRfYXdlc29tZS5zdmciCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0iQzpcVXNlcnNcSGlucmljaFxEZXNrdG9wXEJvb2tfZm9udF9hd2Vzb21lLnBuZyIKICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjUuNzYwMDAwMiIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjUuNzYwMDAwMiI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMzAzNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczMwMzMiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxODAwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwNTkiCiAgICAgaWQ9Im5hbWVkdmlldzMwMzEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjAuMDkzMTIzNDM4IgogICAgIGlua3NjYXBlOmN4PSI5MDguNDE4NzIiCiAgICAgaW5rc2NhcGU6Y3k9IjcxNC4xMzg4NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii05IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzAyNSIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOmN1cnJlbnRDb2xvciIKICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgIGlkPSJwYXRoMzAyOSIKICAgICBkPSJtIDE2MzguNTIxNyw5NCBxIDQwLDU3IDE4LDEyOSBsIC0yNzUsOTA2IHEgLTE5LDY0IC03Ni41LDEwNy41IC01Ny41LDQzLjUgLTEyMi41LDQzLjUgSCAyNTkuNTIxNzQgcSAtNzcsMCAtMTQ4LjUsLTUzLjUgUSAzOS41MjE3MzksMTE3MyAxMS41MjE3MzksMTA5NSBxIC0yNCwtNjcgLTEuOTk5OTk5OSwtMTI3IDAsLTQgMi45OTk5OTk5LC0yNyAzLC0yMyA0LC0zNyAxLC04IC0zLC0yMS41IC0zLjk5OTk5OTksLTEzLjUgLTMsLTE5LjUgMiwtMTEgOCwtMjEgNiwtMTAgMTYuNSwtMjMuNSAxMC41LC0xMy41IDE2LjUsLTIzLjUgMjMsLTM4IDQ1LC05MS41IDIyLjAwMDAwMSwtNTMuNSAzMC4wMDAwMDEsLTkxLjUgMywtMTAgMC41LC0zMCAtMi41LC0yMCAtMC41LC0yOCAzLC0xMSAxNywtMjggMTQsLTE3IDE3LC0yMyAyMSwtMzYgNDIsLTkyIDIxLC01NiAyNSwtOTAgMSwtOSAtMi41LC0zMiAtMy41LC0yMyAwLjUsLTI4IDQsLTEzIDIyLC0zMC41IDE4LC0xNy41IDIyLC0yMi41IDE5LC0yNiA0Mi41LC04NC41IDIzLjUsLTU4LjUgMjcuNSwtOTYuNSAxLC04IC0zLC0yNS41IC00LC0xNy41IC0yLC0yNi41IDIsLTggOSwtMTggNywtMTAgMTgsLTIzIDExLC0xMyAxNywtMjEgOCwtMTIgMTYuNSwtMzAuNSA4LjUsLTE4LjUgMTUsLTM1IDYuNSwtMTYuNSAxNiwtMzYgOS41LC0xOS41IDE5LjUsLTMyIDEwLC0xMi41IDI2LjUsLTIzLjUgMTYuNSwtMTEgMzYsLTExLjUgMTkuNSwtMC41IDQ3LjUsNS41IGwgLTEsMyBxIDM4LC05IDUxLC05IGggNzYwLjk5OTk2IHEgNzQsMCAxMTQsNTYgNDAsNTYgMTgsMTMwIGwgLTI3NCw5MDYgcSAtMzYsMTE5IC03MS41LDE1My41IC0zNS41LDM0LjUgLTEyOC41LDM0LjUgSCAxNTUuNTIxNzQgcSAtMjcsMCAtMzgsMTUgLTExLDE2IC0xLDQzIDI0LDcwIDE0NCw3MCBoIDkyMi45OTk5NiBxIDI5LDAgNTYsLTE1LjUgMjcsLTE1LjUgMzUsLTQxLjUgbCAzMDAsLTk4NyBxIDcsLTIyIDUsLTU3IDM4LDE1IDU5LDQzIHogTSA1NzQuNTIxNzQsOTYgcSAtNCwxMyAyLDIyLjUgNiw5LjUgMjAsOS41IGggNjA3Ljk5OTk2IHEgMTMsMCAyNS41LC05LjUgMTIuNSwtOS41IDE2LjUsLTIyLjUgbCAyMSwtNjQgcSA0LC0xMyAtMiwtMjIuNSAtNiwtOS41IC0yMCwtOS41IEggNjM3LjUyMTc0IHEgLTEzLDAgLTI1LjUsOS41IC0xMi41LDkuNSAtMTYuNSwyMi41IHogbSAtODMsMjU2IHEgLTQsMTMgMiwyMi41IDYsOS41IDIwLDkuNSBoIDYwNy45OTk5NiBxIDEzLDAgMjUuNSwtOS41IDEyLjUsLTkuNSAxNi41LC0yMi41IGwgMjEsLTY0IHEgNCwtMTMgLTIsLTIyLjUgLTYsLTkuNSAtMjAsLTkuNSBIIDU1NC41MjE3NCBxIC0xMywwIC0yNS41LDkuNSAtMTIuNSw5LjUgLTE2LjUsMjIuNSB6IiAvPgo8L3N2Zz4K + :target: https://hirschheissich.gitlab.io/akablas-bot/ + :alt: Documentation + +.. image:: https://img.shields.io/badge/chat%20on-Telegram-blue?logo=telegram + :target: https://t.me/AkaBlasBot + :alt: Telegram Chat + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code Style Black + +German +------ + +Ein Telegram Bot, der dem Vorstand der »Akademische Bläservereinigung an der TU Braunschweig« helfen soll, den Überblick darüber zu behalten, welches Register gerade den Probenraum fegen muss. + +Auf Telegram ist er als `@AkaBlasBot `_ zu finden. + +Eine Kurzanleitung gibt es `hier `_. + +English +------- + +A simple Telegram bot designed to help the board of »Akademische Bläservereinigung an der TU Braunschweig« remember, which instrument groups turn it is to clean the rehersal room. + +Find it on Telegram as `@AkaBlasBot `_. + +A quickstart guide in german can be found `here `_. diff --git a/bot.ini b/bot.ini new file mode 100644 index 0000000..dda9328 --- /dev/null +++ b/bot.ini @@ -0,0 +1,3 @@ +[yourls-bot] +token = bot_token +admins_chat_id = 123456789 diff --git a/bot/__init__.py b/bot/__init__.py new file mode 100644 index 0000000..56fafa5 --- /dev/null +++ b/bot/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/bot/admin.py b/bot/admin.py new file mode 100644 index 0000000..cafed06 --- /dev/null +++ b/bot/admin.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains utility functionality for adding & removing users & groups to/from the +allowed users.""" +from typing import cast, Match, List, Union + +from ptbcontrib.roles import Roles, BOT_DATA_KEY, Role, RolesHandler +from telegram import ( + Update, + Chat, + Message, + InlineKeyboardButton, + InlineKeyboardMarkup, + CallbackQuery, + InlineQueryResultArticle, + InputTextMessageContent, + User, + ChosenInlineResult, + InlineQuery, +) +from telegram.ext import ( + CallbackContext, + ConversationHandler, + CommandHandler, + MessageHandler, + Filters, + CallbackQueryHandler, + InlineQueryHandler, + ChosenInlineResultHandler, + TypeHandler, +) + +from bot.constants import ( + WATCHER_ROLE, + USER_GUIDE, + BOARD_ROLE, + PROMOTE_USER, + ADD_USER, + PROMOTE_USER_PATTERN, + ADD_USER_PATTERN, +) +from bot.utils import str2bool, chat2str + +GET_UID_STATE = 'get_user_id' +SELECT_ROLE_STATE = 'select_role' +KICK_USER_STATE = 'kick_user' + + +def subscribe_unsubscribe(update: Update, context: CallbackContext) -> None: + """ + Subscribes/Unsubscribes the group to the weekly messages by adding to to the + :attr:`bot.constants.WATCHER_ROLE` role. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + watcher_role = cast(Roles, context.bot_data[BOT_DATA_KEY])[WATCHER_ROLE] + chat_id = cast(Chat, update.effective_chat).id + if chat_id in watcher_role.chat_ids: + watcher_role.kick_member(chat_id) + text = ( + 'Diese Gruppe erhält keine wöchtentlichen Nachrichten mehr und kann auch den Befehl ' + '/fegen nicht mehr nutzen.' + ) + else: + watcher_role.add_member(chat_id) + text = ( + 'Diese Gruppe erhält nun jeden Dienstag eine Nachricht mit dem aktuellen Register und ' + 'kann auch den Befehl /fegen nutzen.' + ) + cast(Message, update.effective_message).reply_text(text) + + +def chat_migration(update: Update, context: CallbackContext) -> None: + """ + Handles migration of groups to super groups by replacing the chat id in the roles if necessary. + For completeness sake informs the group. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + message = cast(Message, update.effective_message) + + # Get old and new chat ids + old_id = message.migrate_from_chat_id or message.chat_id + new_id = message.migrate_to_chat_id or message.chat_id + + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + inform = False + for role_name in [WATCHER_ROLE, BOARD_ROLE]: + role = roles[role_name] + if old_id in role.chat_ids: + role.kick_member(old_id) + role.add_member(new_id) + inform = True + + if inform: + context.bot.send_message( + chat_id=new_id, + text=( + 'Nur zur Info: Diese Gruppe ist gerade zur Supergroup geworden. Ich habe die ' + 'Änderung notiert. Es sollte weiterhin alles funktionieren.' + ), + ) + + +def list_members(update: Update, context: CallbackContext) -> None: + """ + Gives an overview over the :attr:`bot.constants.BOARD_ROLE` and + :attr:`bot.constants.WATCHER_ROLE` roles. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + text = ( + 'Die folgenden Nutzer und Gruppen sind Administratoren:\n\n{admins}\n\n' + 'Die folgenden Nutzer und Gruppen sind Zuschauer:\n\n{watchers}\n\n' + 'Was genau der Unterschied zwischen Administratoren und Zuschauern ist, steht in der ' + 'Anleitung.' + ) + keyboard = InlineKeyboardMarkup.from_button( + InlineKeyboardButton('Anleitung 🤖', url=USER_GUIDE), + ) + + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + admins: List[str] = [] + watchers: List[str] = [] + for list_, chat_ids in [ + (admins, roles[BOARD_ROLE].chat_ids), + (watchers, roles[WATCHER_ROLE].chat_ids), + ]: + list_.extend(chat2str(chat_id, context.bot) for chat_id in chat_ids) + + text = text.format(admins=', '.join(admins) or '-', watchers=', '.join(watchers) or '-') + cast(Message, update.effective_message).reply_text(text=text, reply_markup=keyboard) + + +def timeout(update: Update, _: CallbackContext) -> None: + """ + Informs the user that the current operation has timed out. + + Args: + update: The incoming Telegram update. + _: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + if not update.effective_user: + return + update.effective_user.send_message('Timeout! Operation abgebrochen.') + + +def add_user_start(update: Update, _: CallbackContext) -> str: + """ + Initializes the add user conversation and asks for the ID of the user to add. + + Args: + update: The incoming Telegram update. + _: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + cast(Message, update.effective_message).reply_text( + 'Wer soll den Bot denn benutzen dürfen? Leite mir eine Nachricht des Nutzers weiter ' + 'oder schicke mir seine Telegram ID.' + ) + return GET_UID_STATE + + +def add_user_get_uid(update: Update, context: CallbackContext) -> Union[str, int]: + """ + Tries to read the user ID. + + Args: + update: The incoming Telegram update. + context: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + message = cast(Message, update.effective_message) + + if message.forward_date: + if not message.forward_from: + message.reply_text( + "Der Nutzer erlaubt anscheinend nicht, dass seine Kontaktdaten in " + "weitergeleiteten Nachrichten angezeigt werden. Deswegen kann ich die ID nicht " + "auslesen. Schicke mir bitte die ID direkt.", + ) + return GET_UID_STATE + + user_id = int(message.forward_from.id) + else: + user_id = int(cast(str, message.text)) + + if user_id in roles[BOARD_ROLE].chat_ids: + message.reply_text('Der Nutzer ist bereits Administrator. Nichts zu tun.') + return ConversationHandler.END + if user_id in roles[WATCHER_ROLE].chat_ids: + message.reply_text( + 'Der Nutzer ist bereits ein Zuschauer. Soll er zum Administrator hochgestuft werden?', + reply_markup=InlineKeyboardMarkup.from_row( + [ + InlineKeyboardButton( + text='Ja', callback_data=PROMOTE_USER.format(True, user_id) + ), + InlineKeyboardButton( + text='Nein', callback_data=PROMOTE_USER.format(False, user_id) + ), + ] + ), + ) + return SELECT_ROLE_STATE + message.reply_text( + ( + 'Soll der Nutzer Zuschauer oder Administrator werden? Den Unterschied erklärt die ' + 'Anleitung.' + ), + reply_markup=InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + text='Zuschauer', callback_data=ADD_USER.format(WATCHER_ROLE, user_id) + ), + InlineKeyboardButton( + text='Admin', callback_data=ADD_USER.format(BOARD_ROLE, user_id) + ), + ], + [InlineKeyboardButton('Anleitung 🤖', url=USER_GUIDE)], + ] + ), + ) + return SELECT_ROLE_STATE + + +def add_user_promote_user(update: Update, context: CallbackContext) -> int: + """ + Promotes a user to admin, if selected. + + Args: + update: The incoming Telegram update. + context: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + message = cast(Message, update.effective_message) + match = cast(Match, context.match) + promote = str2bool(match.group(1)) + user_id = int(match.group(2)) + + cast(CallbackQuery, update.callback_query).answer() + if promote: + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + roles[WATCHER_ROLE].kick_member(user_id) + roles[BOARD_ROLE].add_member(user_id) + message.edit_text('Der Nutzer ist nun Administrator!') + else: + message.edit_text('Okay. Nichts passiert.') + return ConversationHandler.END + + +def add_user_add_user(update: Update, context: CallbackContext) -> int: + """ + Adds a user to the selected role. + + Args: + update: The incoming Telegram update. + context: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + message = cast(Message, update.effective_message) + match = cast(Match, context.match) + role_name = match.group(1) + user_id = int(match.group(2)) + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + + cast(CallbackQuery, update.callback_query).answer() + roles[role_name].add_member(user_id) + message.edit_text('Alles klar, ist erledigt!') + return ConversationHandler.END + + +def kick_user_start(update: Update, _: CallbackContext) -> str: + """ + Initializes the kick user conversation and asks the user to go to inline mode to select a + user. + + Args: + update: The incoming Telegram update. + _: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + cast(Message, update.effective_message).reply_text( + 'Wer soll rausfliegen? Klicke den Knopf unten und wähle einen Nutzer aus.', + reply_markup=InlineKeyboardMarkup.from_button( + InlineKeyboardButton('Klick Mich 👆', switch_inline_query_current_chat='') + ), + ) + return GET_UID_STATE + + +def kick_user_select_user(update: Update, context: CallbackContext) -> str: + """ + Shows the list of currently allowed users. + + Args: + update: The incoming Telegram update. + context: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + results = [] + current_user_id = cast(User, update.effective_user).id + for description, chat_ids in [ + ('Administrator', roles[BOARD_ROLE].chat_ids), + ('Zuschauer', roles[WATCHER_ROLE].chat_ids), + ]: + for chat_id in chat_ids: + if chat_id == current_user_id: + continue + + # For new we just don't worry about flood limits here ... + name = chat2str(chat_id, context.bot) + article = InlineQueryResultArticle( + id=str(chat_id), + title=name, + input_message_content=InputTextMessageContent(name), + description=f'({description})', + ) + + results.append(article) + + cast(InlineQuery, update.inline_query).answer( + results, auto_pagination=True, cache_time=0 # type: ignore[arg-type] + ) + return KICK_USER_STATE + + +def kick_user_kick_user(update: Update, context: CallbackContext) -> int: + """ + Kicks the selected user and confirms the action. + + Args: + update: The incoming Telegram update. + context: The context as provided by the :class:`telegram.ext.Dispatcher`. + + Returns: + The next state. + + """ + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + for role_name in (WATCHER_ROLE, BOARD_ROLE): + role = roles[role_name] + role.kick_member(int(cast(ChosenInlineResult, update.chosen_inline_result).result_id)) + cast(User, update.effective_user).send_message('Der Nutzer wurde entfernt.') + return ConversationHandler.END + + +def build_add_user_conversation_handler(board_role: Role) -> ConversationHandler: + """ + Gives a conversation handler that allows to add a user. Will only be accessible to the bot + board. + + Args: + board_role: The :attr:`bot.constants.BOARD_ROLE` role. + + """ + return ConversationHandler( + entry_points=[ + RolesHandler(CommandHandler('nutzer_hinzufuegen', add_user_start), roles=board_role) + ], + states={ + GET_UID_STATE: [ + MessageHandler( + Filters.forwarded | Filters.regex(r'^\s*\d+\s*$'), add_user_get_uid + ), + ], + SELECT_ROLE_STATE: [ + CallbackQueryHandler(add_user_promote_user, pattern=PROMOTE_USER_PATTERN), + CallbackQueryHandler(add_user_add_user, pattern=ADD_USER_PATTERN), + ], + ConversationHandler.TIMEOUT: [MessageHandler(Filters.all, timeout)], + }, + conversation_timeout=30, + fallbacks=[], + ) + + +def build_kick_user_conversation_handler(board_role: Role) -> ConversationHandler: + """ + Gives a conversation handler that allows to kick a user. Will only be accessible to the bot + board. + + Args: + board_role: The :attr:`bot.constants.BOARD_ROLE` role. + + """ + return ConversationHandler( + entry_points=[ + RolesHandler(CommandHandler('nutzer_entfernen', kick_user_start), roles=board_role) + ], + states={ + GET_UID_STATE: [InlineQueryHandler(kick_user_select_user)], + KICK_USER_STATE: [ChosenInlineResultHandler(kick_user_kick_user)], + ConversationHandler.TIMEOUT: [TypeHandler(Update, timeout)], + }, + conversation_timeout=30, + fallbacks=[], + per_chat=False, + ) diff --git a/bot/basic.py b/bot/basic.py new file mode 100644 index 0000000..5e43a27 --- /dev/null +++ b/bot/basic.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains functionality for basic commands and functionality.""" +import datetime as dtm +import time +from typing import cast, Union, Literal, Set + +from ptbcontrib.roles import BOT_DATA_KEY, Roles +from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton, Message +from telegram.error import RetryAfter +from telegram.ext import CallbackContext + +from bot.constants import USER_GUIDE, PAUSED_KEY, PAUSED_WEEKS_KEY, WATCHER_ROLE, BOARD_ROLE +from bot.utils import next_sweep_text, iter_tuesdays, next_tuesday, previous_tuesday + + +def info(update: Update, _: CallbackContext) -> None: + """ + Returns some info about the bot. + + Args: + update: The Telegram update. + _: The callback context as provided by the dispatcher. + """ + text = ( + 'Hi! Ich bin der AkaBlas Bot und hier, um den Vorstand der AkaBlas zu unterstützen.' + ' Falls Du nicht im Vorstand oder vom Vorstand autorisiert bist, werde ich Dich ignorieren' + ' müssen ...' + '\n\nFür mehr Details, besuche mich doch auf meiner Homepage 🙂.' + ) + + keyboard = InlineKeyboardMarkup.from_column( + [ + InlineKeyboardButton('Anleitung 🤖', url=USER_GUIDE), + InlineKeyboardButton('AkaBlas e.V. 🎶', url='https://akablas.de'), + ] + ) + + cast(Message, update.effective_message).reply_text(text, reply_markup=keyboard) + + +def next_sweep(update: Update, context: CallbackContext) -> None: + """ + Tells the user who's turn on cleaning the rehearsal room it is on the upcoming tuesday and the + one after. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + cast(Message, update.effective_message).reply_text(next_sweep_text(context)) + + +def pause_unpause(update: Update, context: CallbackContext) -> None: + """ + Pauses or unpauses the bot. Informs the user about the result. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + message = cast(Message, update.effective_message) + paused = cast(Union[Literal[False], dtm.date], context.bot_data[PAUSED_KEY]) + if not paused: + context.bot_data[PAUSED_KEY] = dtm.date.today() + message.reply_text('Proben pausiert. Die wöchtentlichen Nachrichten werden ausgesetzt.') + return + + paused_weeks = cast(Set[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]) + context.bot_data[PAUSED_KEY] = False + paused_weeks |= set(iter_tuesdays(next_tuesday(paused), previous_tuesday(dtm.date.today()))) + + swipe_text = next_sweep_text(context) + message.reply_text( + f'Probem werden fortgesetzt. Die wöchentlichen Nachrichten werden wieder gesendet. ' + f'Mit Fegen sind dran:\n\n{swipe_text}' + ) + + +def weekly_job(context: CallbackContext) -> None: + """ + If not currently paused, sends a message to all groups in the :attr:`bot.constants.BOARD_ROLE` + and :attr:`bot.constants.WATCHER_ROLE` roles + + Args: + context: The callback context as provided by the dispatcher. + + """ + paused = cast(Union[bool, dtm.date], context.bot_data[PAUSED_KEY]) + if paused or dtm.date.today() in cast(Set[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]): + return + + text = next_sweep_text(context) + roles = cast(Roles, context.bot_data[BOT_DATA_KEY]) + chat_ids = roles[WATCHER_ROLE].chat_ids | roles[BOARD_ROLE].chat_ids + for group in (chat_id for chat_id in chat_ids if chat_id < 0): + try: + context.bot.send_message(chat_id=group, text=text) + # Very low level flood control. + # Should to the trick, as we're not expecting much traffic + time.sleep(0.2) + except RetryAfter as exc: + # Still, just to be sure + time.sleep(exc.retry_after + 1) + context.bot.send_message(chat_id=group, text=text) + except Exception as exc: # pylint: disable=W0703 + try: + context.dispatcher.dispatch_error(update=None, error=exc) + except Exception: # pylint: disable=W0703 + pass diff --git a/bot/constants.py b/bot/constants.py new file mode 100644 index 0000000..b759897 --- /dev/null +++ b/bot/constants.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains constants used throughout the bot.""" +from typing import List +import pytz + +INSTRUMENTS: List['str'] = [ + 'Flöten & Oboen', + 'Klarinetten', + 'Altsaxsophone', + 'Tenorsaxophone, Baritonsaxophone', + 'Trompeten', + 'Flügelhörner', + 'Tenorhörner, Hörner, Baritone, Fagotte', + 'Posaunen', + 'Tuben, Gitarren, Bässe', +] +""" +List[:obj:`str`]: List of instrument groups in the order that they be assigned to swipe the +rehearsal room. +""" + + +HOMEPAGE: str = 'https://hirschheissich.gitlab.io/akablas-bot/' +""":obj:`str`: Homepage of this bot.""" +USER_GUIDE: str = f'{HOMEPAGE}userguide.html' +""":obj:`str`: User guide for this bot.""" +TIMEZONE: pytz.BaseTzInfo = pytz.timezone('Europe/Berlin') +""":class:`pytz.BaseTzInfo`: Timezone object for Europe/Berlin""" + + +# Keys +LAST_SWEEP_KEY = 'offset' +""" +:obj:`str`: Key for the ``bot_data``. The corresponding value is expected to be a tuple of + :obj:`datetime.date` and :obj:`int`, where the latter is an index of :attr:`INSTRUMENTS` + stating which instrument groups turn to swipe it was at the specified date of the last + rehearsal. +""" +PAUSED_WEEKS_KEY = 'paused_weeks' +""" +:obj:`str`: Key for the ``bot_data``. The corresponding value is expected to be a set of + :obj:`datetime.date` objects specifying tuesdays without rehearsal. +""" +PAUSED_KEY = 'paused' +""" +:obj:`str`: Key for the ``bot_data``. The corresponding value is expected to be a + :obj:`datetime.date` indicating the start of the pause, if rehearsals are paused, or + :obj:`False`. +""" +BOARD_ROLE = 'board_role' +""" +:obj:`str`: Name of the :class:`ptbcontrib.roles.Role` for the board. +""" +WATCHER_ROLE = 'watcher_role' +""" +:obj:`str`: Name of the :class:`ptbcontrib.roles.Role` for the watchers, i.e. chats that can see + who's turn it is for swiping but can't administrate the bot. +""" + +# Callback Data +PROMOTE_USER: str = 'promote_user {} {}' +""" +:obj:`str`: Callback data to promote a user. Use as ``PROMOTE_USER.format(promote_bool, user_id)``. +""" +PROMOTE_USER_PATTERN: str = r'^promote_user (True|False) (\d+)$' +""" +:obj:`str`: Callback data to catch :attr:`PROMOTE_USER`. The boolean and user id will be available + as matches. +""" +ADD_USER: str = 'add_user {} {}' +""" +:obj:`str`: Callback data to add a user. Use as ``ADD_USER.format(role_name, user_id)``. +""" +ADD_USER_PATTERN: str = rf'^add_user ({BOARD_ROLE}|{WATCHER_ROLE}) (\d+)$' +""" +:obj:`str`: Callback data to catch :attr:`ADD_USER`. The selected role and user id will be + available as matches. +""" +PAUSE_BUTTON: str = 'pause_button {} {}' +""" +:obj:`str`: Callback data to pause a week. Use as ``PAUSE_BUTTON.format(date.isoformat(), paused)`` +""" +PAUSE_BUTTON_PATTERN: str = r'^pause_button (\d{4}-\d{2}-\d{2}) (True|False)$' +""" +:obj:`str`: Callback data to catch :attr:`PAUSE_BUTTON_PATTERN`. The selected tuesday and whether a + rehearsal should take place or not will be available as matches. +""" +PAUSE_NAVIGATION_BUTTON: str = 'pause_nav_button {}' +""" +:obj:`str`: Callback data to navigate between weeks while pausing a weeks. Use as + ``PAUSE_NAVIGATION_BUTTON.format(date.isoformat())``. +""" +PAUSE_NAVIGATION_BUTTON_PATTERN: str = r'^pause_nav_button (\d{4}-\d{2}-\d{2})$' +""" +:obj:`str`: Callback data to catch :attr:`PAUSE_NAVIGATION_BUTTON`. The selected tuesday will be + available as match. +""" +PAUSE_NAVIGATION_DONE: str = 'pause_navigation_done' +""" +:obj:`str`: Callback data to finish pausing weeks. +""" diff --git a/bot/pauseweeks.py b/bot/pauseweeks.py new file mode 100644 index 0000000..617908c --- /dev/null +++ b/bot/pauseweeks.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains functionality for pausing weeks.""" +import datetime as dtm +from typing import cast, Union, Match, Set + +from ptbcontrib.roles import Role, RolesHandler +from telegram import ( + Update, + InlineKeyboardMarkup, + InlineKeyboardButton, + Message, +) +from telegram.ext import ( + CallbackContext, + ConversationHandler, + CommandHandler, + CallbackQueryHandler, +) + +from bot.constants import ( + PAUSED_KEY, + PAUSED_WEEKS_KEY, + PAUSE_BUTTON, + PAUSE_NAVIGATION_BUTTON, + PAUSE_NAVIGATION_DONE, + PAUSE_BUTTON_PATTERN, + PAUSE_NAVIGATION_BUTTON_PATTERN, +) +from bot.utils import next_tuesday, iter_tuesdays, pprint, str2bool, parse_pprint + +SELECTING_STATE = 'selecting_weeks_state' +SELECTION_TEXT = ( + 'Bitte wähle aus, an welchen Dienstagen eine Probe stattfindet. Wenn Du fertig bist, ' + 'klicke auf »Fertig«.' +) + + +def build_keyboard(start_date: dtm.date, context: CallbackContext) -> InlineKeyboardMarkup: + """ + Builds the keyboard to be displayed for pausing weeks. + + Args: + start_date (:obj:`datetime.date`): The date of the first tuesday to be displayed. + context (:class:`telegram.ext.CallbackContext`): The context as provided by the dispatcher. + + Returns: + :class:`telegram.InlineKeyboardMarkup`: The keyboard. + """ + paused_weeks = cast(Set[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]) + buttons = [] + for tuesday in iter_tuesdays(start_date, start_date + dtm.timedelta(days=5 * 7)): + paused = tuesday in paused_weeks + buttons.append( + [ + InlineKeyboardButton( + text=f'{pprint(tuesday)} {"⏸" if paused else "▶️"}', + callback_data=PAUSE_BUTTON.format(tuesday.isoformat(), not paused), + ) + ] + ) + navigation_buttons = [] + previous = start_date - dtm.timedelta(days=7 * 5) + nxt = start_date + dtm.timedelta(days=7 * 5) + if previous > dtm.date.today(): + navigation_buttons.append( + InlineKeyboardButton( + text='« Zurück', callback_data=PAUSE_NAVIGATION_BUTTON.format(previous.isoformat()) + ) + ) + + navigation_buttons.append( + InlineKeyboardButton( + text='Weiter »', callback_data=PAUSE_NAVIGATION_BUTTON.format(nxt.isoformat()) + ) + ) + buttons.append(navigation_buttons) + buttons.append([InlineKeyboardButton(text='Fertig ✔️', callback_data=PAUSE_NAVIGATION_DONE)]) + + return InlineKeyboardMarkup(buttons) + + +def start(update: Update, context: CallbackContext) -> Union[str, int]: + """ + Starts the conversation and asks the user to go to inline mode to select the instrument. + + Args: + update: The Telegram update. + context: The callback context as provided by the dispatcher. + + Returns: + The next state. + """ + message = cast(Message, update.effective_message) + paused = cast(Union[bool, dtm.date], context.bot_data[PAUSED_KEY]) + if paused: + message.reply_text( + 'Aktuell finden keine Problem statt. Bitte versuch es noch einmal, wenn es wieder ' + 'Probem gibt.' + ) + return ConversationHandler.END + + reply_markup = build_keyboard(next_tuesday(dtm.date.today(), allow_today=False), context) + + message.reply_text(SELECTION_TEXT, reply_markup=reply_markup) + return SELECTING_STATE + + +def parse_week_selection(update: Update, context: CallbackContext) -> str: + """ + Parses the users selection of a week to (un-)pause and updates the keyboard. + + Args: + update: The Telegram update. + context: The callback context as provided by the dispatcher. + + Returns: + The next state. + """ + match = cast(Match, context.match) + message = cast(Message, update.effective_message) + keyboard = cast(InlineKeyboardMarkup, message.reply_markup) + + selected_tuesday = dtm.date.fromisoformat(match.group(1)) + paused = str2bool(match.group(2)) + paused_weeks = cast(Set[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]) + if paused: + paused_weeks.add(selected_tuesday) + else: + paused_weeks.discard(selected_tuesday) + + first_tuesday = parse_pprint(keyboard.inline_keyboard[0][0].text.split()[0]) + reply_markup = build_keyboard(first_tuesday, context) + message.edit_text(text=SELECTION_TEXT, reply_markup=reply_markup) + return SELECTING_STATE + + +def navigate_weeks(update: Update, context: CallbackContext) -> str: + """ + Parses the users selection for navigating weeks and updates the message accordingly. + + Args: + update: The Telegram update. + context: The callback context as provided by the dispatcher. + + Returns: + The next state. + """ + selected_tuesday = dtm.date.fromisoformat(cast(Match, context.match).group(1)) + message = cast(Message, update.effective_message) + reply_markup = build_keyboard(selected_tuesday, context) + message.edit_text(text=SELECTION_TEXT, reply_markup=reply_markup) + return SELECTING_STATE + + +def finish_pausing_weeks(update: Update, _: CallbackContext) -> int: + """ + Ends the pausing of weeks. + + Args: + update: The Telegram update. + _: The callback context as provided by the dispatcher. + + Returns: + The next state. + """ + cast(Message, update.effective_message).edit_text('Alles klar, ist notiert. 🤓') + return ConversationHandler.END + + +def build_pause_weeks_conversation(board_role: Role) -> ConversationHandler: + """ + Builds the :class:`telegram.ext.ConversationHandler` to pause specific weeks. Will only be + available to the :attr:`bot.constants.BOARD_ROLE` role. + + Args: + board_role: The :attr:`bot.constants.BOARD_ROLE` role. + + """ + return ConversationHandler( + entry_points=[RolesHandler(CommandHandler('proben_aussetzen', start), roles=board_role)], + states={ + SELECTING_STATE: [ + CallbackQueryHandler(parse_week_selection, pattern=PAUSE_BUTTON_PATTERN), + CallbackQueryHandler(navigate_weeks, pattern=PAUSE_NAVIGATION_BUTTON_PATTERN), + CallbackQueryHandler(finish_pausing_weeks, pattern=PAUSE_NAVIGATION_DONE), + ], + }, + conversation_timeout=60, + fallbacks=[], + ) diff --git a/bot/setnext.py b/bot/setnext.py new file mode 100644 index 0000000..aaede72 --- /dev/null +++ b/bot/setnext.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains functionality for changing the order of instrument groups.""" +import datetime as dtm +from typing import cast, Union, List, Set + +from rapidfuzz import process +from ptbcontrib.roles import Role, RolesHandler +from telegram import ( + Update, + InlineKeyboardMarkup, + InlineKeyboardButton, + Message, + InlineQuery, + ChosenInlineResult, + User, + InlineQueryResultArticle, + InputTextMessageContent, +) +from telegram.ext import ( + CallbackContext, + ConversationHandler, + CommandHandler, + InlineQueryHandler, + ChosenInlineResultHandler, + Filters, + MessageHandler, +) + +from bot.constants import ( + PAUSED_KEY, + PAUSED_WEEKS_KEY, + INSTRUMENTS, + LAST_SWEEP_KEY, +) +from bot.utils import next_tuesday, iter_tuesdays, pprint + +SELECTING = 'selecting_state' +PARSING_SELECTION = 'parsing_selection' + + +def inline_query_results( + instruments: Union[List[str], str] = None +) -> List[InlineQueryResultArticle]: + """ + Builds a list of :class:`telegram.InlineQueryResultArticle` to show as reply to an inline + query. The IDs will be the index of the instrument groups in :attr:`INSTRUMENTS`. + + Args: + instruments: Pass to only allow the specified instruments. Must be a subset of + :attr:`INSTRUMENTS`. + + """ + if instruments is None: + effective_instruments = INSTRUMENTS + elif isinstance(instruments, str): + effective_instruments = [instruments] + else: + effective_instruments = instruments + + return [ + InlineQueryResultArticle( + id=str(INSTRUMENTS.index(instrument)), + title=instrument, + input_message_content=InputTextMessageContent(instrument), + ) + for instrument in effective_instruments + ] + + +def start(update: Update, context: CallbackContext) -> Union[str, int]: + """ + Starts the conversation and asks the user to go to inline mode to select the instrument. + + Args: + update: The Telegram update. + context: The callback context as provided by the dispatcher. + """ + message = cast(Message, update.effective_message) + paused = cast(Union[bool, dtm.date], context.bot_data[PAUSED_KEY]) + if paused: + message.reply_text( + 'Aktuell finden keine Problem statt. Bitte komm zurück, wenn es wieder Probem gibt.' + ) + return ConversationHandler.END + + paused_weeks = cast(List[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]) + next_td = next_tuesday(dtm.date.today(), allow_today=False) + if next_td not in paused_weeks: + effective_date = next_td + else: + candidates = [ + td + for td in iter_tuesdays(min(paused_weeks), max(paused_weeks)) + if td not in paused_weeks + ] + candidates.append(next_tuesday(max(paused_weeks))) + effective_date = min(candidates) + + text = ( + f'Um für den {pprint(effective_date)} eine bestimmet Instrumentengruppe zu ' + f'bestrafen, klicke bitte auf den Knopf unten und suche Dir ein Register aus.\n\n' + f'Um abzubrechen, sage einfach /abbruch.' + ) + keyboard = InlineKeyboardMarkup.from_button( + InlineKeyboardButton('Klick mich! 👆', switch_inline_query_current_chat='') + ) + + message.reply_text(text, reply_markup=keyboard) + return SELECTING + + +def offer_section(update: Update, _: CallbackContext) -> str: + """ + Shows the user a list of available instrument groups. If there is an inline query, the nearest + match is extracted with fuzzy matching. + + Args: + update: The incoming Telegram Update. + _: The callback context as provided by the dispatcher. + + """ + inline_query = cast(InlineQuery, update.inline_query) + query = inline_query.query.strip() + instruments = process.extractOne(query, INSTRUMENTS)[0] if query else None + inline_query.answer( + results=inline_query_results(instruments), # type: ignore[arg-type] + auto_pagination=True, + cache_time=0, + ) + return PARSING_SELECTION + + +def parse_selection(update: Update, context: CallbackContext) -> int: + """ + Parses the chosen instrument groups and saves the setting. + + Args: + update: The incoming Telegram Update. + context: The callback context as provided by the dispatcher. + + """ + chosen_inline_result = cast(ChosenInlineResult, update.chosen_inline_result) + chosen_idx = int(chosen_inline_result.result_id) + nxt_td = next_tuesday(dtm.date.today(), allow_today=False) + context.bot_data[LAST_SWEEP_KEY] = ( + nxt_td, + chosen_idx, + ) + cast(User, update.effective_user).send_message('Ist notiert! ✍️') + + paused_weeks = cast(Set, context.bot_data[PAUSED_WEEKS_KEY]) + for tuesday in paused_weeks.copy(): + if tuesday < nxt_td: + paused_weeks.discard(tuesday) + + return ConversationHandler.END + + +def abort(update: Update, _: CallbackContext) -> int: + """ + Abort the conversation. + + Args: + update: The incoming Telegram Update. + _: The callback context as provided by the dispatcher. + + """ + cast(User, update.effective_user).send_message('Vorgang abgebrochen.') + return ConversationHandler.END + + +def build_conversation(board_role: Role) -> ConversationHandler: + """ + Builds the :class:`telegram.ext.ConversationHandler` to set the instrument group for the next + sweep. + + Args: + board_role: The :attr:`bot.constants.BOARD_ROLE` role. + + """ + return ConversationHandler( + entry_points=[RolesHandler(CommandHandler('setze_naechsten', start), roles=board_role)], + states={ + SELECTING: [InlineQueryHandler(offer_section)], + PARSING_SELECTION: [ChosenInlineResultHandler(parse_selection)], + ConversationHandler.TIMEOUT: [ + MessageHandler(Filters.all, abort), + InlineQueryHandler(abort), + ], + }, + per_chat=False, # b/c InlineQuery/ChoseInlineResult don't have an effective chat + conversation_timeout=60, + fallbacks=[CommandHandler('abbruch', abort)], + ) diff --git a/bot/setup.py b/bot/setup.py new file mode 100644 index 0000000..7be3b1a --- /dev/null +++ b/bot/setup.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains functions that register the handlers.""" +import datetime as dtm +import warnings +from typing import cast + +from ptbcontrib.roles import setup_roles, RolesHandler +from telegram.ext import ( + Dispatcher, + CommandHandler, + JobQueue, + Filters, + MessageHandler, +) + +from bot.admin import ( + subscribe_unsubscribe, + list_members, + chat_migration, + build_add_user_conversation_handler, + build_kick_user_conversation_handler, +) +from bot.basic import info, next_sweep, weekly_job, pause_unpause +from bot.constants import BOARD_ROLE, WATCHER_ROLE, LAST_SWEEP_KEY, PAUSED_WEEKS_KEY, PAUSED_KEY +from bot.pauseweeks import build_pause_weeks_conversation +from bot.setnext import build_conversation +from bot.utils import next_tuesday + +# B/C we know what we're doing +warnings.filterwarnings('ignore', message="If 'per_", module='telegram.ext.conversationhandler') +warnings.filterwarnings( + 'ignore', + message="BasePersistence.insert_bot does not handle objects", + module='telegram.ext.basepersistence', +) +warnings.filterwarnings( + 'ignore', + message="BasePersistence.replace_bot does not handle objects", + module='telegram.ext.basepersistence', +) + + +def setup_dispatcher(dispatcher: Dispatcher, admin: int) -> None: + """ + Registers the different handlers, prepares ``chat/user/bot_data`` etc. + + Args: + dispatcher: The dispatcher. + admin: The admins Telegram chat ID. + + """ + # Set up roles + roles = setup_roles(dispatcher) + roles.add_admin(admin) + if WATCHER_ROLE not in roles: + roles.add_role(name=WATCHER_ROLE) + if BOARD_ROLE not in roles: + roles.add_role(name=BOARD_ROLE, child_roles=roles[WATCHER_ROLE]) + + # Set up weekly job + cast(JobQueue, dispatcher.job_queue).run_daily(weekly_job, time=dtm.time(20, 30), days=(1,)) + + # Handle chat migration + dispatcher.add_handler(MessageHandler(Filters.status_update.migrate, chat_migration)) + + # Handlers + dispatcher.add_handler(CommandHandler(['start', 'info', 'help', 'hilfe'], info)) + dispatcher.add_handler( + RolesHandler(CommandHandler('fegen', next_sweep), roles=roles[WATCHER_ROLE]) + ) + dispatcher.add_handler( + RolesHandler( + CommandHandler('pausieren_umschalten', pause_unpause), roles=roles[BOARD_ROLE] + ) + ) + dispatcher.add_handler( + RolesHandler( + CommandHandler( + 'gruppenrechte_aendern', subscribe_unsubscribe, filters=Filters.chat_type.groups + ), + roles=roles[BOARD_ROLE], + ) + ) + dispatcher.add_handler( + RolesHandler(CommandHandler('nutzer_anzeigen', list_members), roles=roles[BOARD_ROLE]) + ) + + dispatcher.add_handler(build_conversation(roles[BOARD_ROLE])) + dispatcher.add_handler(build_add_user_conversation_handler(roles[BOARD_ROLE])) + dispatcher.add_handler(build_kick_user_conversation_handler(roles[BOARD_ROLE])) + dispatcher.add_handler(build_pause_weeks_conversation(roles[BOARD_ROLE])) + + # prepare bot_data + dispatcher.bot_data.setdefault(LAST_SWEEP_KEY, (next_tuesday(dtm.date.today()), 0)) + dispatcher.bot_data.setdefault(PAUSED_WEEKS_KEY, set()) + dispatcher.bot_data.setdefault(PAUSED_KEY, False) + + # Set commands + dispatcher.bot.set_my_commands( + [ + ('fegen', 'Wer ist mit Fegen dran?'), + ('setze_naechsten', 'Nächstes Register setzen'), + ('pausieren_umschalten', 'Proben pausieren/forsetzen'), + ('proben_aussetzen', 'Bestimmte Proben aussetzen'), + ('gruppenrechte_aendern', 'Erlaubt/Verbietet den Bot in der Gruppe'), + ('nutzer_hinzufuegen', 'Neuen Nutzer hinzufügen/hochstufen'), + ('nutzer_entfernen', 'Nutzer entfernen'), + ('nutzer_anzeigen', 'Zeigt die authorisierten Nutzer des Bots'), + ('hilfe', 'Allgemeine Informationen'), + ] + ) diff --git a/bot/utils.py b/bot/utils.py new file mode 100644 index 0000000..b9105e3 --- /dev/null +++ b/bot/utils.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The module contains functionality for changing the order of instrument groups.""" +import datetime as dtm +from typing import cast, Tuple, Iterator, Union, Literal, Set + +from telegram import Chat, Bot, TelegramError +from telegram.ext import CallbackContext + +from bot.constants import TIMEZONE, PAUSED_KEY, PAUSED_WEEKS_KEY, LAST_SWEEP_KEY, INSTRUMENTS + + +def pprint(date: dtm.date) -> str: + """ + Thin wrapper for :meth:`datetime.date.strftime` to achieve consistent formatting. + + Args: + date: The date to format. + + """ + return date.strftime("%d.%m.%y") + + +def parse_pprint(date: str) -> dtm.date: + """ + Reverse operation for :meth:`pprint`. + + Args: + date: The date to format. + + """ + return dtm.datetime.strptime(date, "%d.%m.%y").date() + + +def rehearsal_time(date: dtm.date) -> dtm.time: + """ + Gives the rehearsal time (7:30 pm) as :obj:`datetime.time` object localized as + :attr:`bot.utils.TIMEZONE`. + + Args: + date: The date. + + """ + return TIMEZONE.localize(dtm.datetime.combine(date, dtm.time(19, 30))).timetz() + + +def next_tuesday(date: dtm.date, allow_today: bool = True) -> dtm.date: + """ + Gives the date of the tuesday following the given datetime. + + Args: + date: The date to compute the next tuesday for. + allow_today: If :obj:`True`, the return value may be the same date as the input value. + Otherwise the next week is forced. Defaults to :obj:`True`. + + Returns: + obj:`datetime.date`: The date of the next tuesday + """ + days_ahead = 1 - date.weekday() + # Target day already happened this week + if (allow_today and days_ahead < 0) or (not allow_today and days_ahead <= 0): + days_ahead += 7 + return date + dtm.timedelta(days_ahead) + + +def previous_tuesday(date: dtm.date, allow_today: bool = True) -> dtm.date: + """ + Gives the date of the tuesday before the given datetime. + + Args: + date: The date to compute the next tuesday for. + allow_today: If :obj:`True`, the return value may be the same date as the input value. + Otherwise the next week is forced. Defaults to :obj:`True`. + + Returns: + obj:`datetime.date`: The date of the previous tuesday + """ + next_td = next_tuesday(date=date, allow_today=allow_today) + return next_td if (next_td == date and allow_today) else next_td + dtm.timedelta(days=-7) + + +def iter_tuesdays(from_date: dtm.date, until_date: dtm.date) -> Iterator[dtm.date]: + """ + Gives an iterator allowing to iterate over the tuesdays from :attr:`from_date` to + :attr:`until_date`. Both dates must be tuesdays. + + Note: + Just like for :meth:`range`, :attr:`until_date` will be *not* be included! + + Args: + from_date: The start date. + until_date: The end date. + + """ + if (from_date.weekday(), until_date.weekday()) != (1, 1): + ValueError('Both input dates must be tuesdays.') + current_date = from_date + while current_date < until_date: + yield current_date + current_date = next_tuesday(current_date, allow_today=False) + + +def next_sweep_text(context: CallbackContext, html: bool = True) -> str: + """ + Tells you, whe needs to sweep this week an next. + + Args: + context: The context as provided by the dispatcher. + html: Whether or not to make the output HTML-formatted as expected by + :meth:`telegram.Bot.send_message`. Defaults to :obj:`True`. + """ + if cast(Union[bool, dtm.date], context.bot_data[PAUSED_KEY]): + return 'Aktuell finden keine Proben statt. Es muss nicht gefegt werden.' + + paused_weeks = cast(Set[dtm.date], context.bot_data[PAUSED_WEEKS_KEY]) + init_date, last_idx = cast(Tuple[dtm.date, int], context.bot_data[LAST_SWEEP_KEY]) + + today = dtm.date.today() + tuesday = next_tuesday(today) + number_paused_weeks = sum(td not in paused_weeks for td in iter_tuesdays(init_date, tuesday)) + weeks_passed = last_idx + min((tuesday - init_date).days, 0) / 7 - number_paused_weeks + + if tuesday in paused_weeks: + current = 'Keine Probe.' + else: + current = INSTRUMENTS[int(weeks_passed % len(INSTRUMENTS))] + + next_td = tuesday + dtm.timedelta(7) + if next_td in paused_weeks: + next_week = 'Keine Probe.' + else: + next_weeks_passed = weeks_passed + 1 if tuesday not in paused_weeks else weeks_passed + next_week = INSTRUMENTS[int(next_weeks_passed % len(INSTRUMENTS))] + + current_text = f'{current}' if html else current + next_week_text = f'{next_week}' if html else next_week + + return ( + f'Kommenden Dienstag ({pprint(tuesday)}) - {current_text}\nNächsten Dienstag ' + f'({pprint(next_td)}) - {next_week_text}' + ) + + +def str2bool(str_input: Literal['True', 'False']) -> bool: + """ + Shortcut for converting ``str(boolean_input)`` back to a boolean. + + Args: + str_input: The input. + """ + return str_input == 'True' + + +def chat2str(chat_id: Union[str, int], bot: Bot) -> str: + """ + Given a chat id, returns a string representation of the chat as combination of first name, + last name, username and chat title. + + In case fetching the chat via :meth:`telegram.Bot.get_chat` fails, the output is + ``f'Chat-ID {chat_id}'``. + + Args: + chat_id: The chat id. + bot: The bot. + + Returns: + str: The string representation. + + """ + try: + chat = bot.get_chat(chat_id) + if chat.type == Chat.PRIVATE: + name = ( + f'{chat.first_name} {chat.last_name}' + if chat.last_name + else cast(str, chat.first_name) + ) + else: + name = cast(str, chat.title) + if chat.username: + name = f'{name} (@{chat.username})' + except TelegramError: + name = f'Chat-ID {chat_id}' + + return name diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt new file mode 100644 index 0000000..f20eb57 --- /dev/null +++ b/docs/requirements-docs.txt @@ -0,0 +1,3 @@ +sphinx==3.4.0 +sphinx_rtd_theme +sphinx_autodoc_typehints==1.11.1 diff --git a/docs/source/_static b/docs/source/_static new file mode 160000 index 0000000..accdd52 --- /dev/null +++ b/docs/source/_static @@ -0,0 +1 @@ +Subproject commit accdd52fbf19d45f0e731300ba266d45e04d9762 diff --git a/docs/source/bot.basic.rst b/docs/source/bot.basic.rst new file mode 100644 index 0000000..48e46b6 --- /dev/null +++ b/docs/source/bot.basic.rst @@ -0,0 +1,7 @@ +bot.basic Module +================ + +.. automodule:: bot.basic + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/bot.constants.rst b/docs/source/bot.constants.rst new file mode 100644 index 0000000..9048667 --- /dev/null +++ b/docs/source/bot.constants.rst @@ -0,0 +1,7 @@ +bot.constants Module +==================== + +.. automodule:: bot.constants + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/bot.rst b/docs/source/bot.rst new file mode 100644 index 0000000..39d6fab --- /dev/null +++ b/docs/source/bot.rst @@ -0,0 +1,10 @@ +bot package +=========== + +.. toctree:: + + bot.basic + bot.constants + bot.setnext + bot.setup + bot.utils \ No newline at end of file diff --git a/docs/source/bot.setnext.rst b/docs/source/bot.setnext.rst new file mode 100644 index 0000000..d486ca4 --- /dev/null +++ b/docs/source/bot.setnext.rst @@ -0,0 +1,7 @@ +bot.setnext Module +================== + +.. automodule:: bot.setnext + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/bot.setup.rst b/docs/source/bot.setup.rst new file mode 100644 index 0000000..61c1fe1 --- /dev/null +++ b/docs/source/bot.setup.rst @@ -0,0 +1,7 @@ +bot.setup Module +================ + +.. automodule:: bot.setup + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/bot.utils.rst b/docs/source/bot.utils.rst new file mode 100644 index 0000000..1183771 --- /dev/null +++ b/docs/source/bot.utils.rst @@ -0,0 +1,7 @@ +bot.utils Module +================ + +.. automodule:: bot.utils + :members: + :undoc-members: + :show-inheritance: \ No newline at end of file diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst new file mode 100644 index 0000000..1cb32f6 --- /dev/null +++ b/docs/source/changelog.rst @@ -0,0 +1 @@ +.. include:: ../../CHANGES.rst \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..f3c774f --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,99 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +sys.path.insert(0, os.path.abspath('../..')) + + +# -- Project information ----------------------------------------------------- + +project = 'AkaBlas-Bot' +copyright = '2021, Hinrich Mahler' +author = 'Hinrich Mahler' +master_doc = 'index' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.coverage', + 'sphinx_rtd_theme', + 'sphinx_autodoc_typehints', +] + +# Use intersphinx to reference the python-telegram-bot docs +intersphinx_mapping = { + 'telegram': ('https://python-telegram-bot.readthedocs.io/en/latest/', None), + 'https://docs.python.org/': None, +} + +napoleon_use_admonition_for_examples = True +typehints_fully_qualified = True + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# +# Use custom theme at github.com/Bibo-Joshi/sphinx_trd_theme, akanamen branch +html_theme_path = ['./_static/'] +html_theme = 'sphinx_rtd_theme' +# html_theme_options = { +# 'style_nav_header_background': '#4393BB', +# } + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = '../../logo/AkaBlasBot-no-background.png' + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = '../../logo/AkaBlasBot.ico' + + +# Link to the correct file +html_context = { + "display_gitlab": True, + "gitlab_host": "gitlab.com", + "gitlab_user": "HirschHeissIch", + "gitlab_repo": 'akablas-bot', + "gitlab_version": "master", + "conf_py_path": "/docs/source/", + "source_suffix": '.rst', +} diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..7a5ba04 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,13 @@ +.. include:: ../../README.rst + +.. toctree:: + :hidden: + :caption: For Users + + userguide +.. toctree:: + :hidden: + :caption: For Developers + + bot + changelog diff --git a/docs/source/userguide.rst b/docs/source/userguide.rst new file mode 100644 index 0000000..b11af0f --- /dev/null +++ b/docs/source/userguide.rst @@ -0,0 +1,57 @@ +Kurzanleitung +============= + +Grundfunktionen +--------------- + +Die Hauptaufgabe des Bots ist es, den Vorstand daran zu erinnern, wer fegen muss. Dafür schickt er jeden Dienstag um 20:30 Uhr eine Nachricht an alle dafür registriertern Telegram-Gruppen (mehr dazu unten). + +Die Info kann auch manuell über den Befehl ``/fegen`` abgerufen werden. + +Proben Pausieren +---------------- + +Es gibt zwei Arten, dem Bot mitzuteilen, dass die Proben pausiert sind: + +1. Über den Befehl ``/proben_aussetzen`` können einzelne Wochen pausiert (oder ent-pausiert) werden. An den entsprechenden Dienstagen schickt der Bot keine Nachricht. +2. Über den Befehl ``/pausieren_umschalten`` werden Proben auf unbestimmte Zeit pausiert. Wird der Befehl ``/pausieren_umschalten`` erneut benutzt, werden die Problem fortgesetzt. + + .. note:: + Wochen, die über den Befehle ``/proben_aussezten`` pausiert wurden, *bleiben* in diesem Fall weiterhin pausiert! + +Reihenfolge anpassen +-------------------- + +Ist mal etwas schief gegangen, kann die Reihenfolge der Register über den Befehl ``/setze_naechsten`` angpasst werden. In der nächsten Woche ist dann das ausgewählte Register an der Reihe. Danach geht es mit dem entsprechend nächsten Register weiter. + +Zugriffsrechte +-------------- + +Rollen +###### + +Es gibt zwei Arten von Zugriffsrechten: + +1. Admins. Diese Rolle ist für den Vorstand vorgesehen. Admins können Zugriffsrechte beliebig ändern, Proben pausieren, den Befehl ``/fegen`` ausführen und Gruppen registrieren/entfernen. +2. Zuschauer. Nutzer und Gruppen in dieser Rolle können *nur* den Befehl ``/fegen`` ausführen. Gruppen in dieser Rolle erhalten außerdem die wöchentliche Nachricht. + +Sämtliche Nuzter können über den Befehl ``/nutzer_anzeigen`` angezeigt werden. + +Gruppen für wöchentliche Nachricht registrieren +############################################### + +Damit in einer Telegram-Gruppe die wöchentliche Nachricht erhält, sind zwei Schritte nötig: + +1. Der Bot muss der Gruppe hinzugefügt werden. +2. Ein Admin muss in der Gruppe den Befehl ``/gruppenrechte_aendern`` ausführen. + +Damit die Gruppe die wöchentliche Nachricht nicht mehr erhält, muss der Befehl ``/gruppenrechte_aendern`` erneut von einem Admin ausgeführt werden. Anschließend kann der Bot aus der Gruppe entfernt werden. Alternativ können Admins die Zuschauer-Gruppen auch wie folgt verwalten: + +Zugriffsrechte verwalten +######################## + +Um Nutzer als Admins/Zuschauer hinzuzufügen oder Nutzer/Gruppen als Admin oder Zuschauer zu entfernen stehen die Befehle ``/nutzer_hinzufuegen`` und ``/nutzer_entfernen`` zur Verfügung. Sie können nur von Admins benutzt werden. + + + + diff --git a/logo/AkaBlasBot-no-background-black.png b/logo/AkaBlasBot-no-background-black.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9fff012f9693e401f72261279281ba663e3392 GIT binary patch literal 34003 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

QDn#su1( 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 Z{{x@H!|=};K>q*$002ovPDHLkV1g)HzPJDY literal 0 HcmV?d00001 diff --git a/logo/AkaBlasBot-no-background-black.svg b/logo/AkaBlasBot-no-background-black.svg new file mode 100644 index 0000000..cea3d08 --- /dev/null +++ b/logo/AkaBlasBot-no-background-black.svg @@ -0,0 +1,151 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo/AkaBlasBot-no-background.png b/logo/AkaBlasBot-no-background.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fbb2ac6e940013680c3936ac52be0d57593817 GIT binary patch literal 46390 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 literal 0 HcmV?d00001 diff --git a/logo/AkaBlasBot-no-background.svg b/logo/AkaBlasBot-no-background.svg new file mode 100644 index 0000000..67f97f2 --- /dev/null +++ b/logo/AkaBlasBot-no-background.svg @@ -0,0 +1,151 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logo/AkaBlasBot.ico b/logo/AkaBlasBot.ico new file mode 100644 index 0000000000000000000000000000000000000000..ac4281c8529a6c76cfe2b253f4648782656cf3d8 GIT binary patch literal 14311 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�TxP=5T^R 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 literal 0 HcmV?d00001 diff --git a/logo/AkaBlasBot.svg b/logo/AkaBlasBot.svg new file mode 100644 index 0000000..bbf38c0 --- /dev/null +++ b/logo/AkaBlasBot.svg @@ -0,0 +1,182 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main.py b/main.py new file mode 100644 index 0000000..08029a8 --- /dev/null +++ b/main.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""The script that runs the bot.""" +import logging +from configparser import ConfigParser +from telegram import ParseMode +from telegram.ext import Updater, Defaults, PicklePersistence + +from bot.constants import TIMEZONE +from bot.setup import setup_dispatcher # type: ignore[attr-defined] + +# Enable logging +logging.basicConfig( + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + level=logging.WARNING, + # filename='abb.log', +) + +logger = logging.getLogger(__name__) + + +def main() -> None: + """Start the bot.""" + # Read configuration values from bot.ini + config = ConfigParser() + config.read('bot.ini') + token = config['yourls-bot']['token'] + admin = int(config['yourls-bot']['admins_chat_id']) + + # Create the Updater and pass it your bot's token. + defaults = Defaults( + parse_mode=ParseMode.HTML, + disable_notification=True, + disable_web_page_preview=True, + tzinfo=TIMEZONE, + ) + persistence = PicklePersistence(filename='abb.db', single_file=False) + updater = Updater(token, defaults=defaults, persistence=persistence) + setup_dispatcher(dispatcher=updater.dispatcher, admin=admin) + + # Start the Bot + updater.start_polling() + updater.idle() + + +if __name__ == '__main__': + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..04618a2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +[tool.black] +line-length = 99 +target-version = ['py36'] +skip-string-normalization = true + +# We need to force-exclude the negated include pattern +# so that pre-commit run --all-files does the correct thing +# see https://github.com/psf/black/issues/1778 +force-exclude = '^(?!(/bot/.*|main))\.py$' +include = '(main|bot/.*)\.py$' diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..455f11b --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,6 @@ +pre-commit +# Make sure that the versions specified here match the pre-commit settings +black==20.8b1 +flake8==3.8.4 +pylint==2.7.1 +mypy==0.812 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..443a10e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +# Make sure that in pre-commit MyPy gets all dependencies as additional dependencies +python-telegram-bot>=13.3,<14.0 +git+https://github.com/python-telegram-bot/ptbcontrib.git@5eda3817f8a4ee196dfa37efd5775ed00c7b047c +pytz +rapidfuzz==1.1.1 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..776d9a6 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,12 @@ +[flake8] +max-line-length = 99 + +[mypy] +warn_unused_configs = True +disallow_untyped_defs = True +disallow_incomplete_defs = True +disallow_untyped_decorators = True +show_error_codes = True + +[pylint.message-control] +disable = E0401, R0801