Przeglądaj źródła

Add EventHandler

Librellium 3 miesięcy temu
rodzic
commit
60701cf4f3
1 zmienionych plików z 73 dodań i 0 usunięć
  1. 73 0
      anonflow/bot/utils/event_handler.py

+ 73 - 0
anonflow/bot/utils/event_handler.py

@@ -0,0 +1,73 @@
+from aiogram import Bot
+from aiogram.types import ChatIdUnion, Message
+from aiogram.exceptions import TelegramBadRequest
+from contextlib import suppress
+from typing import Dict
+
+from anonflow.config import Config
+from anonflow.moderation.models import (
+    Events,
+    ExecutorDeletionEvent,
+    ModerationDecisionEvent,
+    ModerationStartedEvent,
+)
+
+from .template_renderer import TemplateRenderer
+
+
+class EventHandler:
+    def __init__(self, bot: Bot, config: Config, template_renderer: TemplateRenderer):
+        self.bot = bot
+        self.config = config
+        self.renderer = template_renderer
+
+        self._messages: Dict[ChatIdUnion, Message] = {}
+
+    async def handle(self, event: Events, message: Message):
+        moderation_chat_ids = self.config.forwarding.moderation_chat_ids
+
+        if isinstance(event, ModerationStartedEvent):
+            self._messages[message.chat.id] = await message.answer(
+                await self.renderer.render(
+                    "messages/users/moderation/pending.j2",
+                    message=message
+                )
+            )
+        elif isinstance(event, ModerationDecisionEvent):
+            with suppress(TelegramBadRequest):
+                if message.chat.id in self._messages:
+                    await self._messages.get(message.chat.id).delete()
+            if event.approved:
+                await message.answer(
+                    await self.renderer.render(
+                        "messages/users/send/success.j2",
+                        message=message,
+                    )
+                )
+            else:
+                await message.answer(
+                    await self.renderer.render(
+                        "messages/users/moderation/rejected.j2",
+                        message=message,
+                    )
+                )
+        elif isinstance(event, ExecutorDeletionEvent) and moderation_chat_ids:
+            for chat_id in moderation_chat_ids:
+                if event.success:
+                    await message.bot.send_message(
+                        chat_id,
+                        await self.renderer.render(
+                            "messages/staff/deletion/success.j2",
+                            message=message,
+                            message_id=event.message_id,
+                        )
+                    )
+                else:
+                    await message.bot.send_message(
+                        chat_id,
+                        await self.renderer.render(
+                            "messages/staff/deletion/failure.j2",
+                            message=message,
+                            message_id=event.message_id,
+                        )
+                    )