diff --git a/.github/workflows/publish_dev.yml b/.github/workflows/publish_dev.yml index 76835dd..7e159db 100644 --- a/.github/workflows/publish_dev.yml +++ b/.github/workflows/publish_dev.yml @@ -133,6 +133,7 @@ jobs: docker login docker.pkg.github.com -u $GITHUB_USERNAME -p $GITHUB_TOKEN touch ${{ env.ROOT_DIR }}/sysblokbot.sqlite touch ${{ env.ROOT_DIR }}/strings.sqlite + touch ${{ env.ROOT_DIR }}/board_credentials.json docker run -dit --name sysblokbot-testing \ --env APP_SOURCE="github CI" --restart unless-stopped \ --env TELEGRAM_ERROR_CHAT_ID="${{ env.TELEGRAM_ERROR_CHAT_ID }}" \ @@ -142,6 +143,7 @@ jobs: -v ${{ env.ROOT_DIR }}/sysblokbot.sqlite:/app/sysblokbot.sqlite \ -v ${{ env.ROOT_DIR }}/strings.sqlite:/app/strings.sqlite \ -v ${{ env.ROOT_DIR }}/persistent_storage.pickle:/app/persistent_storage.pickle \ + -v ${{ env.ROOT_DIR }}/board_credentials.json:/app/board_credentials.json \ docker.pkg.github.com/sysblok/sysblokbot/${{ env.IMAGE_NAME }}:testing - name: Notify us about failure diff --git a/.github/workflows/publish_master.yml b/.github/workflows/publish_master.yml index 6e5df23..a80e1ca 100644 --- a/.github/workflows/publish_master.yml +++ b/.github/workflows/publish_master.yml @@ -136,6 +136,7 @@ jobs: docker login docker.pkg.github.com -u $GITHUB_USERNAME -p $GITHUB_TOKEN touch ${{ env.ROOT_DIR }}/sysblokbot.sqlite touch ${{ env.ROOT_DIR }}/strings.sqlite + touch ${{ env.ROOT_DIR }}/board_credentials.json docker run -dit --name sysblokbot-prod \ --env APP_SOURCE="github CI" --restart unless-stopped \ --env TELEGRAM_ERROR_CHAT_ID="${{ env.TELEGRAM_ERROR_CHAT_ID }}" \ @@ -145,6 +146,7 @@ jobs: -v ${{ env.ROOT_DIR }}/sysblokbot.sqlite:/app/sysblokbot.sqlite \ -v ${{ env.ROOT_DIR }}/strings.sqlite:/app/strings.sqlite \ -v ${{ env.ROOT_DIR }}/persistent_storage.pickle:/app/persistent_storage.pickle \ + -v ${{ env.ROOT_DIR }}/board_credentials.json:/app/board_credentials.json \ docker.pkg.github.com/sysblok/sysblokbot/${{ env.IMAGE_NAME }}:prod - name: Notify us about failure diff --git a/src/bot.py b/src/bot.py index e531465..55690f2 100644 --- a/src/bot.py +++ b/src/bot.py @@ -434,6 +434,12 @@ def init_handlers(self): self.add_admin_handler( "start", CommandCategories.MOST_USED, handlers.start, "начать чат с ботом" ) + self.add_admin_handler( + "get_board_credentials", + CommandCategories.MOST_USED, + lambda update, context: handlers.get_board_credentials(update, context), + "получить пароль от Focalboard", + ) self.add_admin_handler( "help", CommandCategories.MOST_USED, diff --git a/src/tg/handlers/__init__.py b/src/tg/handlers/__init__.py index a5f0a73..f808347 100644 --- a/src/tg/handlers/__init__.py +++ b/src/tg/handlers/__init__.py @@ -35,6 +35,7 @@ # User-facing handlers from .start_handler import start +from .get_board_credentials_handler import get_board_credentials # Plain text message handler from .user_message_handler import ( diff --git a/src/tg/handlers/get_board_credentials_handler.py b/src/tg/handlers/get_board_credentials_handler.py new file mode 100644 index 0000000..17c021a --- /dev/null +++ b/src/tg/handlers/get_board_credentials_handler.py @@ -0,0 +1,50 @@ +import json +import logging +import telegram + +from ...db.db_client import DBClient +from ...strings import load +from .utils import get_sender_id, get_sender_username, reply + + +logger = logging.getLogger(__name__) + + +def get_board_credentials(update: telegram.Update, tg_context): + member = next(( + member for member in DBClient().get_all_members() + if member.telegram == f"@{get_sender_username(update)}" + ), None) + if member is None or not member.trello: + logger.usage( + f'Trello not found for {get_sender_username(update)}, ID={get_sender_id(update)}' + ) + reply(load('get_board_credentials_handler__not_found'), update) + return + try: + print(member.trello) + with open('board_credentials.json', encoding="utf-8") as fin: + try: + board_json = json.loads(fin.read()) + creds = next(( + cred for cred in board_json if cred["trelloUsername"] == member.trello + ), None) + if not creds: + logger.usage( + f'Board creds not found for user {get_sender_username(update)}' + ) + reply(load('get_board_credentials_handler__not_found'), update) + return + logger.usage(f'Board creds found for username {get_sender_username(update)}') + reply( + load( + 'get_board_credentials_handler__found', + username=creds["focalboardUsername"][1:], + password=creds["focalboardPassword"] + ), + update + ) + except json.JSONDecodeError as e: + logger.error(e) + except IOError: + logger.warning(f"Board passwords file not found", exc_info=e)