428th-exchange-bot/bot/handlers/manager.py
Artemii Peretiachenko 8f6d2c07d6 Initial commit: 428th exchange Telegram bot.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 18:19:53 +02:00

91 lines
3 KiB
Python

from __future__ import annotations
import logging
from aiogram import F, Router
from aiogram.enums import ChatType
from aiogram.filters import Command
from aiogram.types import Message, MessageReactionUpdated
from bot.services.relay import GENERAL_TOPIC_ID, RelayService, is_relayable_content
logger = logging.getLogger(__name__)
def build_manager_router(manager_group_id: int) -> Router:
router = Router(name="manager")
@router.message(
Command("del"),
F.chat.id == manager_group_id,
F.chat.type == ChatType.SUPERGROUP,
)
async def manager_del(message: Message, relay: RelayService) -> None:
"""Reply to a relayed message with /del to remove it on both sides."""
if relay.is_self(message.from_user.id if message.from_user else None):
return
topic_id = message.message_thread_id
if topic_id is None or topic_id == GENERAL_TOPIC_ID:
return
if message.reply_to_message is None:
return
try:
deleted = await relay.delete_paired_from_manager(message.bot, message)
except Exception:
logger.exception("Failed to delete paired message in topic %s", topic_id)
return
if deleted:
try:
await message.delete()
except Exception:
pass
@router.message(
F.chat.id == manager_group_id,
F.chat.type == ChatType.SUPERGROUP,
)
async def manager_message(message: Message, relay: RelayService) -> None:
if relay.is_self(message.from_user.id if message.from_user else None):
return
topic_id = message.message_thread_id
if topic_id is None or topic_id == GENERAL_TOPIC_ID:
return
if not is_relayable_content(message):
return
try:
await relay.relay_manager_to_client(message.bot, message)
except Exception:
logger.exception("Failed to relay manager message in topic %s", topic_id)
@router.edited_message(
F.chat.id == manager_group_id,
F.chat.type == ChatType.SUPERGROUP,
)
async def manager_edited(message: Message, relay: RelayService) -> None:
if relay.is_self(message.from_user.id if message.from_user else None):
return
topic_id = message.message_thread_id
if topic_id is None or topic_id == GENERAL_TOPIC_ID:
return
if not is_relayable_content(message):
return
try:
await relay.relay_manager_edit(message.bot, message)
except Exception:
logger.exception("Failed to relay manager edit in topic %s", topic_id)
@router.message_reaction(F.chat.id == manager_group_id)
async def manager_reaction(event: MessageReactionUpdated, relay: RelayService) -> None:
try:
await relay.relay_reaction(event.bot, event)
except Exception:
logger.exception(
"Failed to relay manager reaction on message %s",
event.message_id,
)
return router