bot/adapters/tg.py

126 lines
No EOL
4.9 KiB
Python

import asyncio
import logging
import sys
from os import getenv
from aiogram import Bot, Dispatcher, Router
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart, Command
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram import F
from core.inline import handle_inline_query
from core.mc import handle_mc_status_command
from core.middleware.rikki import RikkiMiddleware
from core.post_to_fedi import router as fedi_router
from core.bitflip import handle_bitflip_command
from core.link import handle_links
from core.post_to_fedi import handle_auth, handle_post_to_fedi
from core.promote import handle_promote_command
from core.repeater import MessageRepeater
from core.report_links import report_broken_links
from core.simple import handle_start_command, handle_baka, dummy_handler, handle_info_command, handle_ping_command, \
handle_tips_command, handle_about_command
from core.actions import handle_actions, handle_reverse_actions
from core.stats import handle_stats_command
from core.middleware.stats import MessageStatsMiddleware
from core.unpin import handle_unpin_channel_message
from core.rikki_hit import handle_query_hit_command
TOKEN = getenv("BOT_TOKEN")
class TelegramAdapter:
def __init__(self):
self.dp = Dispatcher()
self.stats_middleware = MessageStatsMiddleware()
self.hit_middleware = RikkiMiddleware()
self._setup_middleware()
self._setup_handlers()
def _setup_handlers(self):
"""Register handlers with core module functions"""
# Create router
router = Router()
actions_router = Router()
repeater_router = Router()
unpin_router = Router()
dummy_router = Router()
# Register handlers on router
router.message(CommandStart())(handle_start_command)
router.message(Command('info'))(handle_info_command)
router.message(Command('about'))(handle_about_command)
router.message(Command('ping'))(handle_ping_command)
router.message(Command('tips'))(handle_tips_command)
router.message(Command('query_hit'))(handle_query_hit_command)
# bitflip 模块
router.message(Command('bitflip'))(handle_bitflip_command)
# promote 模块
router.message(Command('t'))(handle_promote_command)
# stats 模块
router.message(Command('stats'))(handle_stats_command)
# fedi 模块
router.message(Command('fauth'))(handle_auth)
router.message(Command('post'))(handle_post_to_fedi)
# link 模块
router.message(Command('report_broken_links'))(report_broken_links)
router.message(F.text.contains('http') & ~F.text.contains('/report_broken_links'))(handle_links)
# mc 模块
router.message(Command('mc'))(handle_mc_status_command) # 这个模块
# unpin 模块
# 不知道为什么检测不到频道的消息被置顶这个事件,暂时认为所有的频道消息都是被置顶的
unpin_router.message(F.chat.type.in_({'group', 'supergroup'}) & F.sender_chat & (
F.sender_chat.type == 'channel'))(
handle_unpin_channel_message)
# repeater 模块
repeater_router.message(F.chat.type.in_({'group', 'supergroup'}))(MessageRepeater().handle_message)
router.message(F.text == '我是笨蛋')(handle_baka)
router.inline_query()(handle_inline_query)
# 捕获所有其他消息
dummy_router.message(F.chat.type.in_({'group', 'supergroup'}))(dummy_handler)
# actions 模块
actions_router.message(F.chat.type.in_({'group', 'supergroup'}) & F.text.startswith('/'))(handle_actions)
actions_router.message(F.chat.type.in_({'group', 'supergroup'}) & F.text.startswith('\\'))(handle_reverse_actions)
# Include router in dispatcher
self.dp.include_router(unpin_router)
# 通用的路由
self.dp.include_router(router)
self.dp.include_router(actions_router)
# 处理联邦宇宙认证相关
self.dp.include_router(fedi_router)
self.dp.include_router(repeater_router)
self.dp.include_router(dummy_router)
def _setup_middleware(self):
"""注册中间件"""
self.dp.message.middleware(self.stats_middleware)
self.dp.message.middleware(self.hit_middleware)
async def start(self):
"""Start the Telegram bot"""
session = None
if getenv("HTTPS_PROXY"):
session = AiohttpSession(proxy=getenv("HTTPS_PROXY"))
bot = Bot(
token=TOKEN,
default=DefaultBotProperties(parse_mode=ParseMode.HTML),
session=session
)
await self.dp.start_polling(bot)
async def main() -> None:
adapter = TelegramAdapter()
await adapter.start()
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
asyncio.run(main())