From d56f2bc39145334779321eac6dbdcd843e3cadc8 Mon Sep 17 00:00:00 2001 From: bral <54455457+bralbral@users.noreply.github.com> Date: Sat, 23 Sep 2023 21:29:46 +0400 Subject: [PATCH] customized messages && errors; updated readme.md (#1) --- README.MD | 2 ++ deploy/example.config.yaml | 28 ++++++++++++++++++++++++- src/__main__.py | 7 ++++++- src/bot/handlers/admins/router.py | 12 +++++++---- src/bot/handlers/misc.py | 8 +++++--- src/bot/handlers/users.py | 15 +++++++++++--- src/bot/utils/setup_dispatcher.py | 8 +++++++- src/config/__init__.py | 5 +++-- src/config/models.py | 34 +++++++++++++++++++++++++++++++ 9 files changed, 104 insertions(+), 15 deletions(-) diff --git a/README.MD b/README.MD index bb13c39..3036325 100644 --- a/README.MD +++ b/README.MD @@ -24,6 +24,8 @@ Admin can answer to message by reply. The answer will be sent to the person who If the transfer is successful, the administrator will be notified. +You can [customize the bot's responses](./deploy/example.config.yaml#12), or use default values. + ## Deploy ### Install from source diff --git a/deploy/example.config.yaml b/deploy/example.config.yaml index a73e2d2..20cedec 100644 --- a/deploy/example.config.yaml +++ b/deploy/example.config.yaml @@ -3,4 +3,30 @@ bot: token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # chat id for redirect messages -chat_id: -100XXXXXXXXXXXXX \ No newline at end of file +chat_id: -100XXXXXXXXXXXXX + +# Fill variables below as you want, or use default values. +# You can use HTML tags provided by the sulguk package. +# https://github.com/Tishka17/sulguk#readme + +#messages: +# notify_user_about_success_deliver: ✅ Please wait for response. +# help_message: | +#

+# 👋 Hello! +#

+#

+# I can redirect to recipient text, audios, voice messages, images, files to recipient. +#

+# +#

+# Just send your message and wait for a response! +#

+# notify_admin_about_success_answer: ✅ Answered. +# +#errors: +# unsupported_type: ❌ Unsupported message type.
Please check /help command. +# too_long_message_text: ❌ Too long message text. +# too_long_message_caption: ❌ Too long message caption. +# copy_message: ❌ Error during copying +# extract_user_id: ❌ Error during extract_id diff --git a/src/__main__.py b/src/__main__.py index d7d06cf..a9248f1 100755 --- a/src/__main__.py +++ b/src/__main__.py @@ -21,7 +21,12 @@ async def main() -> None: config: Config = load_config(config_path=os.path.join(ROOT_DIR, "config.yaml")) - dp: Dispatcher = setup_dispatcher(logger=logger, chat_id=config.chat_id) + dp: Dispatcher = setup_dispatcher( + logger=logger, + chat_id=config.chat_id, + messages=config.messages, + errors=config.errors, + ) bot: Bot = await setup_bot(config=config.bot) await logger.ainfo("Starting bot") diff --git a/src/bot/handlers/admins/router.py b/src/bot/handlers/admins/router.py index a5574dd..e9512cb 100644 --- a/src/bot/handlers/admins/router.py +++ b/src/bot/handlers/admins/router.py @@ -6,26 +6,30 @@ from .utils import extract_id from src.bot.filters import FilterByChatID +from src.config import Errors +from src.config import Messages router = Router(name="admins") @router.message(FilterByChatID(), F.reply_to_message) # type: ignore -async def reply_to_user(message: Message, bot: Bot, **kwargs): +async def reply_to_user( + message: Message, bot: Bot, messages: Messages, errors: Errors, **kwargs +): try: user_id = extract_id(message.reply_to_message) except ValueError as ex: - await message.reply(f"❌ Error during extract_id: {str(ex)}") + await message.reply(text=f"{errors.extract_user_id} {str(ex)}") return try: await bot.copy_message( from_chat_id=message.chat.id, chat_id=user_id, message_id=message.message_id ) - await message.reply(text="✅ Answered.") + await message.reply(text=messages.notify_admin_about_success_answer) except TelegramAPIError as ex: - await message.reply(f"❌ Error during copying: {str(ex)}") + await message.reply(text=f"{errors.copy_message} {str(ex)}") __all__ = ["router"] diff --git a/src/bot/handlers/misc.py b/src/bot/handlers/misc.py index b2fbe84..2946bd1 100644 --- a/src/bot/handlers/misc.py +++ b/src/bot/handlers/misc.py @@ -4,7 +4,7 @@ from aiogram.types import Message from sulguk import SULGUK_PARSE_MODE -from src.constants import START_MESSAGE +from src.config import Messages logger = structlog.stdlib.get_logger() router = Router(name="misc") @@ -13,9 +13,11 @@ @router.message( Command("start", "help"), ) # type: ignore -async def start_help_handler(message: Message, **kwargs) -> None: +async def start_help_handler(message: Message, messages: Messages, **kwargs) -> None: await message.answer( - START_MESSAGE, disable_web_page_preview=True, parse_mode=SULGUK_PARSE_MODE + messages.help_message, + disable_web_page_preview=True, + parse_mode=SULGUK_PARSE_MODE, ) diff --git a/src/bot/handlers/users.py b/src/bot/handlers/users.py index 802e24d..b19f6d7 100644 --- a/src/bot/handlers/users.py +++ b/src/bot/handlers/users.py @@ -5,6 +5,9 @@ from aiogram.types import Message from sulguk import SULGUK_PARSE_MODE +from src.config import Errors +from src.config import Messages + router = Router(name="users") @@ -14,6 +17,8 @@ async def handle_user_message( message: Message, bot: Bot, chat_id: int, + messages: Messages, + errors: Errors, **kwargs, ): if message.content_type not in ( @@ -26,7 +31,7 @@ async def handle_user_message( ContentType.VOICE, ): await message.reply( - text="❌ Unsupported message type.
Please check /help command.", + text=errors.unsupported_type, parse_mode=SULGUK_PARSE_MODE, ) @@ -37,7 +42,7 @@ async def handle_user_message( if message.text: if len(message.text) > 4000: - await message.reply("❌ Too long message text") + await message.reply(text=errors.too_long_message_text) return message_text = f"
#id{message.from_user.id}
" + message.html_text @@ -47,6 +52,10 @@ async def handle_user_message( ) else: + if len(message.caption) > 1000: + await message.reply(text=errors.too_long_message_caption) + return + caption = message.caption if message.caption else "" caption += f"
#id{message.from_user.id}
" @@ -58,7 +67,7 @@ async def handle_user_message( parse_mode=SULGUK_PARSE_MODE, ) - await message.reply(text="✅ Please wait for response.") + await message.reply(text=messages.notify_user_about_success_deliver) return diff --git a/src/bot/utils/setup_dispatcher.py b/src/bot/utils/setup_dispatcher.py index c1cfe9f..68b44b5 100644 --- a/src/bot/utils/setup_dispatcher.py +++ b/src/bot/utils/setup_dispatcher.py @@ -5,13 +5,19 @@ from src.bot.handlers import register_handlers from src.bot.middlewares import LoggerMiddleware +from src.config import Errors +from src.config import Messages -def setup_dispatcher(logger: BoundLogger, chat_id: int) -> Dispatcher: +def setup_dispatcher( + logger: BoundLogger, chat_id: int, messages: Messages, errors: Errors +) -> Dispatcher: dp: Dispatcher = Dispatcher( storage=MemoryStorage(), logger=logger, chat_id=chat_id, + messages=messages, + errors=errors, events_isolation=SimpleEventIsolation(), ) dp.message.middleware(LoggerMiddleware(logger=logger)) diff --git a/src/config/__init__.py b/src/config/__init__.py index 91bb69c..a8573a3 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -1,6 +1,7 @@ from .models import BotConfig from .models import Config from .utils import load_config +from src.config.models import Errors +from src.config.models import Messages - -__all__ = ["BotConfig", "Config", "load_config"] +__all__ = ["BotConfig", "Config", "Errors", "Messages", "load_config"] diff --git a/src/config/models.py b/src/config/models.py index becc2dc..b8ca2a7 100644 --- a/src/config/models.py +++ b/src/config/models.py @@ -1,3 +1,4 @@ +from pydantic import Field from pydantic import SecretStr from pydantic_settings import BaseSettings @@ -10,6 +11,37 @@ class BotConfig(BaseSettings): token: SecretStr +class Messages(BaseSettings): + notify_user_about_success_deliver: str = Field( + default="✅ Please wait for response." + ) + help_message: str = Field( + default=""" +

+ 👋 Hello! +

+

+ I can redirect to recipient text, audios, voice messages, images, files to recipient. +

+ +

+ Just send your message and wait for a response! +

+ """ + ) + notify_admin_about_success_answer: str = Field(default="✅ Answered.") + + +class Errors(BaseSettings): + unsupported_type: str = Field( + default="❌ Unsupported message type.
Please check /help command." + ) + too_long_message_text: str = Field(default="❌ Too long message text.") + too_long_message_caption: str = Field(default="❌ Too long message caption.") + copy_message: str = Field(default="❌ Error during copying") + extract_user_id: str = Field(default="❌ Error during extract_id") + + class Config(BaseSettings): """ All in one config @@ -17,6 +49,8 @@ class Config(BaseSettings): bot: BotConfig chat_id: int + messages: Messages = Messages() + errors: Errors = Errors() __all__ = ["BotConfig", "Config"]