Przeglądaj źródła

Refactor TextRouter to use EventHandler

Librellium 3 miesięcy temu
rodzic
commit
10108f841b
1 zmienionych plików z 72 dodań i 52 usunięć
  1. 72 52
      anonflow/bot/routers/text.py

+ 72 - 52
anonflow/bot/routers/text.py

@@ -5,24 +5,29 @@ from aiogram.enums import ChatType
 from aiogram.exceptions import TelegramBadRequest, TelegramForbiddenError
 from aiogram.types import Message
 
+from anonflow.bot.utils.event_handler import EventHandler
 from anonflow.bot.utils.message_manager import MessageManager
 from anonflow.bot.utils.template_renderer import TemplateRenderer
 from anonflow.config import Config
-from anonflow.moderation import ModerationExecutor
+from anonflow.moderation import ModerationDecisionEvent, ModerationExecutor
 
 
 class TextRouter(Router):
-    def __init__(self,
-                 config: Config,
-                 message_manager: MessageManager,
-                 template_renderer: TemplateRenderer,
-                 moderation_executor: Optional[ModerationExecutor] = None):
+    def __init__(
+        self,
+        config: Config,
+        message_manager: MessageManager,
+        template_renderer: TemplateRenderer,
+        moderation_executor: Optional[ModerationExecutor] = None,
+        event_handler: Optional[EventHandler] = None,
+    ):
         super().__init__()
 
         self.config = config
         self.message_manager = message_manager
         self.renderer = template_renderer
         self.executor = moderation_executor
+        self.event_handler = event_handler
 
         self._register_handlers()
 
@@ -31,66 +36,81 @@ class TextRouter(Router):
         async def on_text(message: Message, bot: Bot):
             reply_to_message = message.reply_to_message
 
-            if message.chat.id == self.config.forwarding.moderation_chat_id\
-                and reply_to_message and reply_to_message.from_user.is_bot:
-                    result = self.message_manager.get(reply_to_message.message_id)
+            moderation = self.config.moderation.enabled
+            moderation_passed = not moderation
 
-                    if result:
-                        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 self.renderer.render("messages/users/send/success.j2", message=message)
+            moderation_chat_ids = self.config.forwarding.moderation_chat_ids
+            publication_channel_ids = self.config.forwarding.publication_channel_ids
+
+            if (
+                message.chat.id in moderation_chat_ids
+                and reply_to_message
+                and reply_to_message.from_user.is_bot
+            ):
+                result = self.message_manager.get(reply_to_message.message_id)
+
+                if result:
+                    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 self.renderer.render(
+                                "messages/users/send/success.j2", message=message
                             )
-                        except (TelegramBadRequest, TelegramForbiddenError) as e:
-                            await message.answer(
-                                await self.renderer.render("messages/users/send/failure.j2", message=message, exception=e)
+                        )
+                    except (TelegramBadRequest, TelegramForbiddenError) as e:
+                        await message.answer(
+                            await self.renderer.render(
+                                "messages/users/send/failure.j2",
+                                message=message,
+                                exception=e,
                             )
-            elif message.chat.type == ChatType.PRIVATE and "text" in self.config.forwarding.types:
+                        )
+            elif (
+                message.chat.type == ChatType.PRIVATE
+                and "text" in self.config.forwarding.types
+            ):
                 try:
                     group_message_id = None
-                    targets = {
-                        self.config.forwarding.moderation_chat_id: True
-                    }
-
-                    moderation_passed = False
-                    if self.config.moderation.enabled:
-                        sent_message = await message.answer(
-                            await self.renderer.render("messages/users/moderation/pending.j2", message=message)
-                        )
-                        async for event in self.executor.process_message(message.text):
-                            if event.type == "moderation_decision":
-                                if event.result.status == "APPROVE":
-                                    moderation_passed = True
-                                elif event.result.status == "REJECT":
-                                    await message.answer(
-                                        await self.renderer.render("messages/users/moderation/rejected.j2", message=message)
-                                    )
-
-                        await sent_message.delete()
-                    else:
-                        moderation_passed = True
-
-                    if moderation_passed:
-                        targets[self.config.forwarding.publication_chat_id] = False
+                    targets = {}
+                    if moderation_chat_ids:
+                        for chat_id in moderation_chat_ids:
+                            targets[chat_id] = True
+
+                    if moderation:
+                        async for event in self.executor.process_message(message):
+                            if isinstance(event, ModerationDecisionEvent):
+                                moderation_passed = event.approved
+                            await self.event_handler.handle(event, message)
+
+                    if publication_channel_ids and moderation_passed:
+                        for channel_id in publication_channel_ids:
+                            targets[channel_id] = False
 
                     for target, save_message_id in targets.items():
                         reply_to_message_id = message.message_id
                         msg = await bot.send_message(
                             target,
-                            await self.renderer.render("messages/channel/text.j2", message=message),
-                            parse_mode="HTML"
+                            await self.renderer.render(
+                                "messages/channel/text.j2", message=message
+                            )
                         )
 
                         if save_message_id:
                             group_message_id = msg.message_id
 
-                    self.message_manager.add(reply_to_message_id, group_message_id, message.chat.id)
-                    if moderation_passed:
-                        await message.answer(
-                            await self.renderer.render("messages/users/send/success.j2", message=message)
-                        )
+                    self.message_manager.add(
+                        reply_to_message_id, group_message_id, message.chat.id
+                    )
                 except (TelegramBadRequest, TelegramForbiddenError) as e:
                     await message.answer(
-                        await self.renderer.render("messages/users/send/failure.j2", message=message, exception=e)
-                    )
+                        await self.renderer.render(
+                            "messages/users/send/failure.j2",
+                            message=message,
+                            exception=e,
+                        )
+                    )