mirror of
https://github.com/woodchen-ink/Q58Bot.git
synced 2025-07-18 13:52:07 +08:00
refactor(bot_commands): 将命令处理函数整合到一个函数中
将关键词和白名单命令的处理逻辑合并到新的`handle_command`函数中,简化了事件处理并重构了代码结构。修改了`guard.py`以使用新的命令处理结构,并移除了未使用的函数引用。 refactor(guard): 重构消息处理和命令处理器 重构了消息处理和命令处理器的事件监听器,移除了限速器的不必要使用,并优化了消息处理逻辑。更新了命令处理器的事件模式,以便更有效地处理命令。
This commit is contained in:
parent
48d7df5b5d
commit
3746b4743b
@ -6,6 +6,9 @@ from telethon.tl.types import BotCommand
|
|||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
__all__ = ['register_commands', 'handle_command', 'get_keywords', 'get_whitelist']
|
||||||
|
|
||||||
|
|
||||||
KEYWORDS_FILE = '/app/data/keywords.json'
|
KEYWORDS_FILE = '/app/data/keywords.json'
|
||||||
WHITELIST_FILE = '/app/data/whitelist.json'
|
WHITELIST_FILE = '/app/data/whitelist.json'
|
||||||
ADMIN_ID = int(os.environ.get('ADMIN_ID'))
|
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])
|
await execute_keyword_command(event, command[0], command[1])
|
||||||
else:
|
else:
|
||||||
await event.reply(f"请输入你要{command[0][1:]}的关键词:")
|
await event.reply(f"请输入你要{command[0][1:]}的关键词:")
|
||||||
|
|
||||||
async with client.conversation(sender) as conv:
|
async with client.conversation(sender) as conv:
|
||||||
response = await conv.get_response()
|
response = await conv.get_response()
|
||||||
await execute_keyword_command(event, command[0], response.text)
|
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])
|
await execute_whitelist_command(event, command[0], command[1])
|
||||||
else:
|
else:
|
||||||
await event.reply(f"请输入你要{command[0][1:]}的域名:")
|
await event.reply(f"请输入你要{command[0][1:]}的域名:")
|
||||||
|
|
||||||
async with client.conversation(sender) as conv:
|
async with client.conversation(sender) as conv:
|
||||||
response = await conv.get_response()
|
response = await conv.get_response()
|
||||||
await execute_whitelist_command(event, command[0], response.text)
|
await execute_whitelist_command(event, command[0], response.text)
|
||||||
@ -134,3 +135,17 @@ def get_keywords():
|
|||||||
|
|
||||||
def get_whitelist():
|
def get_whitelist():
|
||||||
return load_json(WHITELIST_FILE)
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
45
src/guard.py
45
src/guard.py
@ -5,7 +5,8 @@ import time
|
|||||||
from telethon import TelegramClient, events
|
from telethon import TelegramClient, events
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from link_filter import LinkFilter
|
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')
|
BOT_TOKEN = os.environ.get('BOT_TOKEN')
|
||||||
@ -23,16 +24,6 @@ link_filter = LinkFilter('/app/data/keywords.json', '/app/data/whitelist.json')
|
|||||||
# 限速器
|
# 限速器
|
||||||
class RateLimiter:
|
class RateLimiter:
|
||||||
def __init__(self, max_calls, period):
|
def __init__(self, max_calls, period):
|
||||||
"""
|
|
||||||
初始化RateLimiter类的实例。
|
|
||||||
|
|
||||||
参数:
|
|
||||||
max_calls (int): 限制的最大调用次数。
|
|
||||||
period (float): 限定的时间周期(秒)。
|
|
||||||
|
|
||||||
该构造函数设置了速率限制器的基本参数,并初始化了一个双端队列,
|
|
||||||
用于跟踪调用的时间点,以 enforcement of the rate limiting policy。
|
|
||||||
"""
|
|
||||||
# 限制的最大调用次数
|
# 限制的最大调用次数
|
||||||
self.max_calls = max_calls
|
self.max_calls = max_calls
|
||||||
# 限定的时间周期(秒)
|
# 限定的时间周期(秒)
|
||||||
@ -85,30 +76,32 @@ async def process_message(event, client):
|
|||||||
notification = await event.respond("已撤回该消息。注:已发送的推广链接不要多次发送,置顶已有项目的推广链接也会自动撤回。")
|
notification = await event.respond("已撤回该消息。注:已发送的推广链接不要多次发送,置顶已有项目的推广链接也会自动撤回。")
|
||||||
asyncio.create_task(delete_message_after_delay(client, event.chat_id, notification, 30 * 60))
|
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():
|
async def start_bot():
|
||||||
client = TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e')
|
client = TelegramClient('bot', api_id=6, api_hash='eb06d4abfb49dc3eeb1aeb98ae0f581e')
|
||||||
await client.start(bot_token=BOT_TOKEN)
|
await client.start(bot_token=BOT_TOKEN)
|
||||||
|
|
||||||
@client.on(events.NewMessage(pattern='/add|/delete|/list'))
|
client.add_event_handler(command_handler, events.NewMessage(pattern='/add|/delete|/list|/addwhite|/delwhite|/listwhite'))
|
||||||
async def keyword_handler(event):
|
client.add_event_handler(message_handler, events.NewMessage())
|
||||||
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)
|
|
||||||
|
|
||||||
logger.info("TeleGuard is running...")
|
logger.info("TeleGuard is running...")
|
||||||
await client.run_until_disconnected()
|
await client.run_until_disconnected()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 主函数
|
# 主函数
|
||||||
def run():
|
def run():
|
||||||
while True:
|
while True:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user