aibot / APP /webhook.py
Pikilap's picture
feat(命令): 重构机器人消息处理并添加静音/解除静音命令,包括更新忽略文件、优化消息格式和错误处理、实现静音和解除静音命令以及增强命令处理逻辑
cd182cf
from fastapi import Request, Response
import telebot
from handlers import (
handle_message, handle_model_selection,
handle_model_page_navigation, handle_reset_db_verification,
)
from commands import (
handle_mute_command, handle_set_command, handle_clear_command, handle_reset_db_command,
handle_json_command, handle_id_command, handle_unmute_command
)
import logging
async def root():
return {"message": "BOT 正在运行"}
async def telegram_webhook(request: Request, token: str, bot, thread_local):
if token != bot.token:
return Response(status_code=403)
try:
body = await request.json()
update = telebot.types.Update.de_json(body)
bot_username = bot.get_me().username
if update.callback_query:
callback_query = update.callback_query
if callback_query.data.startswith('resetdb_verify_'):
handle_reset_db_verification(callback_query, bot, thread_local)
elif callback_query.data.startswith('set_model_'):
handle_model_selection(callback_query, bot, thread_local)
elif callback_query.data.startswith('model_page_'):
handle_model_page_navigation(callback_query, bot, thread_local)
elif update.message:
message = update.message
if should_process_message(message, bot, bot_username):
if message.text and message.text.startswith('.set'):
handle_set_command(message, bot, thread_local)
elif message.text and message.text.startswith('.clear'):
handle_clear_command(message, bot, thread_local)
elif message.text and message.text.startswith('.resetdb'):
handle_reset_db_command(message, bot, thread_local)
elif message.text and message.text.startswith('.json'):
handle_json_command(message, bot)
elif message.text and message.text.startswith('.id'):
handle_id_command(message, bot)
elif message.text and message.text.startswith('.mute'):
handle_mute_command(message, bot, thread_local)
elif message.text and message.text.startswith('.unmute'):
handle_unmute_command(message, bot, thread_local)
else:
handle_message(message, bot, thread_local)
logging.info("Webhook 已处理")
return Response(status_code=200)
except Exception as e:
logging.error(f"Webhook 处理失败: {e}", exc_info=True)
return Response(status_code=500)
def should_process_message(message: telebot.types.Message, bot, bot_username):
direct_commands = [".set", ".clear", ".resetdb", ".json", ".id", ".mute", ".unmute"]
if message.chat.type == 'private':
return True
elif message.chat.type in ['group', 'supergroup']:
if message.reply_to_message and message.reply_to_message.from_user.id == bot.get_me().id:
return True
elif message.text:
at_mention = f"@{bot_username}"
if at_mention in message.text:
return True
for command in direct_commands:
if message.text.startswith(command):
return True
elif message.photo:
return True
return False