refactor(bot_commands): 将命令处理函数整合到一个函数中

将关键词和白名单命令的处理逻辑合并到新的`handle_command`函数中,简化了事件处理并重构了代码结构。修改了`guard.py`以使用新的命令处理结构,并移除了未使用的函数引用。

refactor(guard): 重构消息处理和命令处理器

重构了消息处理和命令处理器的事件监听器,移除了限速器的不必要使用,并优化了消息处理逻辑。更新了命令处理器的事件模式,以便更有效地处理命令。
This commit is contained in:
wood 2024-09-04 16:22:54 +08:00
parent 48d7df5b5d
commit 3746b4743b
2 changed files with 36 additions and 28 deletions

View File

@ -6,6 +6,9 @@ from telethon.tl.types import BotCommand
import logging
import json
__all__ = ['register_commands', 'handle_command', 'get_keywords', 'get_whitelist']
KEYWORDS_FILE = '/app/data/keywords.json'
WHITELIST_FILE = '/app/data/whitelist.json'
ADMIN_ID = int(os.environ.get('ADMIN_ID'))
@ -54,7 +57,6 @@ async def handle_keyword_command(event, client):
await execute_keyword_command(event, command[0], command[1])
else:
await event.reply(f"请输入你要{command[0][1:]}的关键词:")
async with client.conversation(sender) as conv:
response = await conv.get_response()
await execute_keyword_command(event, command[0], response.text)
@ -98,7 +100,6 @@ async def handle_whitelist_command(event, client):
await execute_whitelist_command(event, command[0], command[1])
else:
await event.reply(f"请输入你要{command[0][1:]}的域名:")
async with client.conversation(sender) as conv:
response = await conv.get_response()
await execute_whitelist_command(event, command[0], response.text)
@ -134,3 +135,17 @@ def get_keywords():
def get_whitelist():
return load_json(WHITELIST_FILE)
async def handle_command(event, client):
sender = await event.get_sender()
if sender.id != ADMIN_ID:
return
command = event.message.text.split(maxsplit=1)
if command[0].lower() in ['/add', '/delete', '/list']:
await handle_keyword_command(event, client)
elif command[0].lower() in ['/addwhite', '/delwhite', '/listwhite']:
await handle_whitelist_command(event, client)

View File

@ -5,7 +5,8 @@ import time
from telethon import TelegramClient, events
from collections import deque
from link_filter import LinkFilter
from bot_commands import handle_keyword_command, handle_whitelist_command, get_keywords
from bot_commands import handle_command, get_keywords
# 环境变量
BOT_TOKEN = os.environ.get('BOT_TOKEN')
@ -23,16 +24,6 @@ link_filter = LinkFilter('/app/data/keywords.json', '/app/data/whitelist.json')
# 限速器
class RateLimiter:
def __init__(self, max_calls, period):
"""
初始化RateLimiter类的实例
参数:
max_calls (int): 限制的最大调用次数
period (float): 限定的时间周期
该构造函数设置了速率限制器的基本参数并初始化了一个双端队列
用于跟踪调用的时间点 enforcement of the rate limiting policy
"""
# 限制的最大调用次数
self.max_calls = max_calls
# 限定的时间周期(秒)
@ -85,29 +76,31 @@ async def process_message(event, client):
notification = await event.respond("已撤回该消息。注:已发送的推广链接不要多次发送,置顶已有项目的推广链接也会自动撤回。")
asyncio.create_task(delete_message_after_delay(client, event.chat_id, notification, 30 * 60))
async def command_handler(event):
if event.is_private and event.sender_id == ADMIN_ID:
await handle_command(event, event.client)
if event.raw_text.startswith(('/add', '/delete', '/list')):
link_filter.reload_keywords()
elif event.raw_text.startswith(('/addwhite', '/delwhite', '/listwhite')):
link_filter.reload_whitelist()
async def message_handler(event):
if not event.is_private or event.sender_id != ADMIN_ID:
async with rate_limiter:
await process_message(event, event.client)
# 启动机器人函数
async def start_bot():
client = TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e')
await client.start(bot_token=BOT_TOKEN)
@client.on(events.NewMessage(pattern='/add|/delete|/list'))
async def keyword_handler(event):
await handle_keyword_command(event, client)
link_filter.reload_keywords() # 重新加载关键词
@client.on(events.NewMessage(pattern='/addwhite|/delwhite|/listwhite'))
async def whitelist_handler(event):
await handle_whitelist_command(event, client)
link_filter.reload_whitelist() # 重新加载白名单
@client.on(events.NewMessage(pattern=''))
async def message_handler(event):
if not event.is_private or event.sender_id != ADMIN_ID:
async with rate_limiter:
await process_message(event, client)
client.add_event_handler(command_handler, events.NewMessage(pattern='/add|/delete|/list|/addwhite|/delwhite|/listwhite'))
client.add_event_handler(message_handler, events.NewMessage())
logger.info("TeleGuard is running...")
await client.run_until_disconnected()
# 主函数
def run():