From d05d0c09044652c9154b31bc6b51246cf561b74e Mon Sep 17 00:00:00 2001 From: miloszowi Date: Thu, 7 Oct 2021 19:15:53 +0200 Subject: [PATCH] Added inline query handler, updated CHANGELOG, added group name validator --- CHANGELOG.md | 7 ++++ src/app.py | 2 +- src/bot/handler/inlineQueryHandler.py | 46 +++++++++++++++++++++++++++ src/bot/message/messageData.py | 13 +++----- src/config/contents.py | 3 ++ src/validator/groupNameValidator.py | 16 ++++++++++ 6 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 src/bot/handler/inlineQueryHandler.py create mode 100644 src/validator/groupNameValidator.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c14ce3a..fcf55fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log All notable changes to this project will be documented in this file. +## [UNRELEASED] - 07.10.2021 +### Added +- Inline Query for join/leave/everyone +- Validator class for group name + +### Updated +- start command content ## [0.1.0] - 06.10.2021 ### Features - `/join` command diff --git a/src/app.py b/src/app.py index b70a888..4a2c6b4 100755 --- a/src/app.py +++ b/src/app.py @@ -6,7 +6,7 @@ from telegram.ext.dispatcher import Dispatcher from logger import Logger from config.credentials import BOT_TOKEN, PORT, WEBHOOK_URL from bot.handler import (groupsHandler, joinHandler, mentionHandler, leaveHandler, - silentMentionHandler, startHandler) + silentMentionHandler, startHandler, inlineQueryHandler) from bot.handler.abstractHandler import AbstractHandler diff --git a/src/bot/handler/inlineQueryHandler.py b/src/bot/handler/inlineQueryHandler.py new file mode 100644 index 0000000..059c209 --- /dev/null +++ b/src/bot/handler/inlineQueryHandler.py @@ -0,0 +1,46 @@ +from bot.handler.abstractHandler import AbstractHandler +from entity.group import Group +from telegram import InlineQueryResultArticle +from telegram.ext.callbackcontext import CallbackContext +from telegram.ext.commandhandler import CommandHandler +from telegram.ext.inlinequeryhandler import \ + InlineQueryHandler as CoreInlineQueryHandler +from telegram.inline.inputtextmessagecontent import InputTextMessageContent +from telegram.update import Update + + +class InlineQueryHandler(AbstractHandler): + bot_handler: CommandHandler + + def __init__(self) -> None: + self.bot_handler = CoreInlineQueryHandler(self.handle) + + def handle(self, update: Update, context: CallbackContext) -> None: + group_display = update.inline_query.query or Group.default_name + group = '' if group_display == Group.default_name else group_display + + results = [ + InlineQueryResultArticle( + id='everyone', + title='MENTION', + description=f'Mention members in group "{group_display}"', + input_message_content=InputTextMessageContent(f'/everyone {group}') + ), + InlineQueryResultArticle( + id='join', + title='JOIN', + description=f'Joins group "{group_display}"', + input_message_content=InputTextMessageContent(f'/join {group}') + ), + InlineQueryResultArticle( + id='leave', + title='LEAVE', + description=f'Leaves group "{group_display}"', + input_message_content=InputTextMessageContent(f'/leave {group}') + ) + ] + + update.inline_query.answer(results, cache_time=4800) + + def get_bot_handler(self) -> CoreInlineQueryHandler: + return self.bot_handler diff --git a/src/bot/message/messageData.py b/src/bot/message/messageData.py index 49ab6ff..a63420e 100644 --- a/src/bot/message/messageData.py +++ b/src/bot/message/messageData.py @@ -9,6 +9,8 @@ from exception.invalidArgumentException import InvalidArgumentException from telegram.ext.callbackcontext import CallbackContext from telegram.update import Update +from validator.groupNameValidator import GroupNameValidator + @dataclass class MessageData(): @@ -24,16 +26,11 @@ class MessageData(): if context.args and context.args[0] and include_group: group_name = str(context.args[0]).lower() - if not re.match(r"^[A-Za-z]+$", group_name): - raise InvalidArgumentException(re.escape('Group name must contain only letters.')) - if group_name == Group.default_name: - raise InvalidArgumentException(re.escape(f'Group can not be `{Group.default_name}`.')) + GroupNameValidator.validate(group_name) - if len(group_name) > 20: - raise InvalidArgumentException(re.escape(f'Group name length can not be greater than 20.')) - - chat_id += f'~{group_name}' + if group_name is not Group.default_name: + chat_id += f'~{group_name}' user_id = str(update.effective_user.id) diff --git a/src/config/contents.py b/src/config/contents.py index 6ad7118..8a7f81f 100755 --- a/src/config/contents.py +++ b/src/config/contents.py @@ -29,4 +29,7 @@ To see all available groups use: To display all members in a group: `/silent ` + +You can also try to tag me @everyone\_mention\_bot and then enter group name +Possible results will be displayed """ \ No newline at end of file diff --git a/src/validator/groupNameValidator.py b/src/validator/groupNameValidator.py new file mode 100644 index 0000000..3eca5e4 --- /dev/null +++ b/src/validator/groupNameValidator.py @@ -0,0 +1,16 @@ +import re + +from exception.invalidArgumentException import InvalidArgumentException + + +class GroupNameValidator: + + @staticmethod + def validate(group: str) -> None: + group = group.lower() + + if len(group) > 0 and not re.match(r"^[A-Za-z]+$", group): + raise InvalidArgumentException(re.escape('Group name must contain only letters.')) + + if len(group) > 20: + raise InvalidArgumentException(re.escape(f'Group name length can not be greater than 20.'))