Przeglądaj źródła

Refactor message answers to work with TemplateRenderer

Librellium 3 miesięcy temu
rodzic
commit
49e45ca31d

+ 5 - 0
podslv21_bot/bot/routers/__init__.py

@@ -0,0 +1,5 @@
+from .media import MediaRouter
+from .start import StartRouter
+from .text import TextRouter
+
+__all__ = ["MediaRouter", "StartRouter", "TextRouter"]

+ 25 - 8
podslv21_bot/bot/routers/media.py

@@ -7,7 +7,8 @@ from aiogram.enums import ChatType
 from aiogram.exceptions import TelegramBadRequest, TelegramForbiddenError
 from aiogram.types import InputMediaPhoto, InputMediaVideo, Message
 
-from podslv21_bot.bot.message_manager import MessageManager
+from podslv21_bot.bot.utils.message_manager import MessageManager
+from podslv21_bot.bot.utils.template_renderer import TemplateRenderer
 from podslv21_bot.config import Config
 from podslv21_bot.moderation import ModerationExecutor
 
@@ -16,12 +17,14 @@ class MediaRouter(Router):
     def __init__(self,
                  config: Config,
                  message_manager: MessageManager,
-                 executor: Optional[ModerationExecutor] = None):
+                 template_renderer: TemplateRenderer,
+                 moderation_executor: Optional[ModerationExecutor] = None):
         super().__init__()
 
         self.config = config
         self.message_manager = message_manager
-        self.executor = executor
+        self.renderer = template_renderer
+        self.executor = moderation_executor
 
         self.media_groups: Dict[int, List[str]] = {}
         self.media_groups_tasks: Dict[int, asyncio.Task] = {}
@@ -75,7 +78,9 @@ class MediaRouter(Router):
                             self.config.forwarding.moderation_chat_id: True
                         }
 
-                        sent_message = await message.answer("Сообщение отправлено на модерацию...")
+                        sent_message = await message.answer(
+                            await self.renderer.render("messages/moderation/pending.j2", message)
+                        )
                         if len(messages) > 1:
                             media = []
                             for msg in messages:
@@ -85,7 +90,11 @@ class MediaRouter(Router):
                                             if event.result.status == "PASS":
                                                 moderation_passed = True
                                             elif event.result.status == "REJECT":
-                                                await sent_message.edit_text("Сообщение не прошло модерацию.")
+                                                await message.answer(
+                                                    await self.renderer.render("messages/moderation/rejected.j2", message)
+                                                )
+
+                                    await sent_message.delete()
 
                                 media.append(get_media(msg))
 
@@ -110,7 +119,11 @@ class MediaRouter(Router):
                                         if event.result.status == "PASS":
                                             moderation_passed = True
                                         elif event.result.status == "REJECT":
-                                            await sent_message.edit_text("Сообщение не прошло модерацию.")
+                                            await message.answer(
+                                                await self.renderer.render("messages/moderation/rejected.j2", message)
+                                            )
+
+                                await sent_message.delete()
 
                             targets[self.config.forwarding.publication_chat_id] = False
 
@@ -130,9 +143,13 @@ class MediaRouter(Router):
 
                         self.message_manager.add(reply_to_message_id, group_message_id, message.chat.id)
                         if moderation_passed:
-                            await message.answer("Сообщение успешно отправлено!")
+                            await message.answer(
+                                await self.renderer.render("messages/send/success.j2", message)
+                            )
                 except (TelegramBadRequest, TelegramForbiddenError) as e:
-                    await message.answer(f'Не удалось отправить сообщение: "{e}"')
+                    await message.answer(
+                        await self.renderer.render("messages/send/success.j2", message)
+                    )
 
             media_group_id = message.media_group_id
 

+ 9 - 7
podslv21_bot/bot/routers/start.py

@@ -2,18 +2,20 @@ from aiogram import Router
 from aiogram.filters import CommandStart
 from aiogram.types import Message
 
+from podslv21_bot.bot.utils.template_renderer import TemplateRenderer
+
 
 class StartRouter(Router):
-    def __init__(self):
+    def __init__(self, template_renderer: TemplateRenderer):
         super().__init__()
+
+        self.renderer = template_renderer
+
         self._register_handlers()
 
     def _register_handlers(self):
         @self.message(CommandStart())
         async def on_start(message: Message):
-            await message.answer(f"Привет {message.from_user.username}!\nТы можешь отправить мне "
-                                 "сообщение, и я передам его в Подслушано 21 школы, не раскрывая твою личность.\n\n"
-                                 "[Исходный код](https://github.com/librellium/podslv21_bot/) "
-                                 "открыт и находится под лицензией "
-                                 "[MIT](https://github.com/librellium/podslv21_bot/blob/main/LICENSE)",
-                                 parse_mode="Markdown")
+            await message.answer(
+                await self.renderer.render("commands/start.j2", message)
+            )

+ 24 - 9
podslv21_bot/bot/routers/text.py

@@ -5,7 +5,8 @@ from aiogram.enums import ChatType
 from aiogram.exceptions import TelegramBadRequest, TelegramForbiddenError
 from aiogram.types import Message
 
-from podslv21_bot.bot.message_manager import MessageManager
+from podslv21_bot.bot.utils.message_manager import MessageManager
+from podslv21_bot.bot.utils.template_renderer import TemplateRenderer
 from podslv21_bot.config import Config
 from podslv21_bot.moderation import ModerationExecutor
 
@@ -14,12 +15,14 @@ class TextRouter(Router):
     def __init__(self,
                  config: Config,
                  message_manager: MessageManager,
-                 executor: Optional[ModerationExecutor] = None):
+                 template_renderer: TemplateRenderer,
+                 moderation_executor: Optional[ModerationExecutor] = None):
         super().__init__()
 
         self.config = config
         self.message_manager = message_manager
-        self.executor = executor
+        self.renderer = template_renderer
+        self.executor = moderation_executor
 
         self._register_handlers()
 
@@ -36,9 +39,13 @@ class TextRouter(Router):
                         reply_to_message_id, chat_id = result
                         try:
                             await bot.send_message(chat_id, message.text, reply_to_message_id=reply_to_message_id)
-                            await message.answer("Ответ успешно отправлен!")
+                            await message.answer(
+                                await self.renderer.render("messages/send/success.j2", message)
+                            )
                         except (TelegramBadRequest, TelegramForbiddenError) as e:
-                            await message.answer(f'Не удалось отправить ответ: "{e}"')
+                            await message.answer(
+                                await self.renderer.render("messages/send/error.j2", message)
+                            )
             elif message.chat.type == ChatType.PRIVATE and "text" in self.config.forwarding.types:
                 try:
                     group_message_id = None
@@ -48,13 +55,17 @@ class TextRouter(Router):
 
                     moderation_passed = False
                     if self.config.moderation.enabled:
-                        sent_message = await message.answer("Сообщение отправлено на модерацию...")
+                        sent_message = await message.answer(
+                            await self.renderer.render("messages/moderation/pending.j2", message)
+                        )
                         async for event in self.executor.process_message(message.text):
                             if event.type == "moderation_decision":
                                 if event.result.status == "PASS":
                                     moderation_passed = True
                                 elif event.result.status == "REJECT":
-                                    await message.answer("Сообщение не прошло модерацию.")
+                                    await message.answer(
+                                        await self.renderer.render("messages/moderation/rejected.j2", message)
+                                    )
 
                         await sent_message.delete()
                     else:
@@ -76,6 +87,10 @@ class TextRouter(Router):
 
                     self.message_manager.add(reply_to_message_id, group_message_id, message.chat.id)
                     if moderation_passed:
-                        await message.answer("Сообщение успешно отправлено!")
+                        await message.answer(
+                            await self.renderer.render("messages/send/success.j2", message)
+                        )
                 except (TelegramBadRequest, TelegramForbiddenError) as e:
-                    await message.answer(f'Не удалось отправить сообщение: "{e}"')
+                    await message.answer(
+                        await self.renderer.render("messages/send/error.j2", message)
+                    )