From 57c2a00042cc8d8e1c6030e09e07400e0da74c2a Mon Sep 17 00:00:00 2001 From: ngfchl Date: Mon, 6 Jul 2026 20:58:06 +0800 Subject: [PATCH] fix: handle trivia answers --- handlers/fun.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/handlers/fun.py b/handlers/fun.py index 440389e..d8facea 100644 --- a/handlers/fun.py +++ b/handlers/fun.py @@ -3,7 +3,7 @@ import asyncio import logging from telegram import Update -from telegram.ext import ContextTypes, CommandHandler, MessageHandler, filters +from telegram.ext import ApplicationHandlerStop, ContextTypes, CommandHandler, MessageHandler, filters from db.models import Action from services.game_service import ( @@ -67,6 +67,7 @@ async def cmd_trivia(update: Update, context: ContextTypes.DEFAULT_TYPE): text += f"{i}. {opt}\n" text += f"\nšŸ’” čÆ·å›žå¤åŗå·ęˆ–ē­”ę”ˆę–‡å­—" context.user_data["trivia_answer"] = q["a"] + context.user_data["trivia_options"] = q["opts"] reply = await update.message.reply_text(text) asyncio.create_task(auto_delete(update.message)) asyncio.create_task(auto_delete(reply)) @@ -104,6 +105,48 @@ async def cmd_rank(update: Update, context: ContextTypes.DEFAULT_TYPE): asyncio.create_task(auto_delete(reply)) +async def handle_trivia_answer(update: Update, context: ContextTypes.DEFAULT_TYPE): + """处理 /trivia åŽēš„ē”Øęˆ·ē­”é¢˜ć€‚""" + msg = update.effective_message + user = update.effective_user + if not msg or not msg.text or not user or user.is_bot: + return + + correct_answer = context.user_data.get("trivia_answer") + options = context.user_data.get("trivia_options") or [] + if not correct_answer: + return + + raw_answer = msg.text.strip() + answer = raw_answer + if raw_answer.isdigit(): + idx = int(raw_answer) - 1 + if 0 <= idx < len(options): + answer = options[idx] + + result = await check_trivia_answer(user.id, user.username or user.first_name or str(user.id), answer, correct_answer) + context.user_data.pop("trivia_answer", None) + context.user_data.pop("trivia_options", None) + + if result["correct"]: + text = ( + "āœ… å›žē­”ę­£ē”®ļ¼\n" + f"šŸŽÆ ę­£ē”®ē­”ę”ˆļ¼š{correct_answer}\n" + f"šŸ“Š å½“å‰ē§Æåˆ†ļ¼š{result['score']}\n" + f"šŸ”„ čæžå‡»ļ¼š{result['streak']}" + ) + else: + text = ( + "āŒ å›žē­”é”™čÆÆ\n" + f"šŸŽÆ ę­£ē”®ē­”ę”ˆļ¼š{correct_answer}\n" + f"šŸ“Š å½“å‰ē§Æåˆ†ļ¼š{result['score']}" + ) + reply = await msg.reply_text(text) + asyncio.create_task(auto_delete(msg)) + asyncio.create_task(auto_delete(reply)) + raise ApplicationHandlerStop + + async def auto_delete(message, seconds=60): try: await asyncio.sleep(seconds) @@ -117,4 +160,5 @@ def register_fun(app): app.add_handler(CommandHandler("trivia", cmd_trivia, filters.ChatType.GROUPS)) app.add_handler(CommandHandler("score", cmd_score, filters.ChatType.GROUPS)) app.add_handler(CommandHandler("rank", cmd_rank, filters.ChatType.GROUPS)) + app.add_handler(MessageHandler(filters.TEXT & filters.ChatType.GROUPS & ~filters.COMMAND, handle_trivia_answer), group=-1) app.add_handler(MessageHandler(filters.TEXT & filters.ChatType.GROUPS, handle_trigger), group=2)