Files
abot/game_task/game_task_encyclopedia.py
2025-03-19 09:55:08 +08:00

429 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import random
from datetime import datetime
from typing import Dict, List, Optional
from game_task.game_chatgpt_qa import game_question_json, game_answer_json
from db.connection import DBConnectionManager
from db.encyclopedia import EncyclopediaDB
# 获取数据库连接管理器的单例
db_manager = DBConnectionManager.get_instance()
encyclopedia_db = EncyclopediaDB(db_manager)
# 添加群聊
def add_group(group_id, player_id):
try:
result = encyclopedia_db.add_group(group_id)
if result:
message = f"🎉 群 {group_id} 已就位,准备开燥!"
else:
message = f"🌟 群 {group_id} 早就蓄势待发啦!"
return {"message": message, "player_id": player_id}
except Exception as e:
print(f"添加群聊出错: {e}")
message = f"🌟 群 {group_id} 早就蓄势待发啦!"
return {"message": message, "player_id": player_id}
# 获取所有群聊ID
def get_group_ids():
try:
return encyclopedia_db.get_all_groups()
except Exception as e:
print(f"获取群聊ID出错: {e}")
return []
# 确保游戏启动(自动初始化群聊和玩家)
def ensure_game_started(group_id, player_id, player_name="未知玩家"):
try:
# 检查并添加群聊
if not encyclopedia_db.check_group_exists(group_id):
add_group(group_id, player_id)
# 检查并添加玩家
player = encyclopedia_db.get_player(player_id, group_id)
if not player:
encyclopedia_db.add_player(player_id, group_id, player_name)
message = (
f"🎉 哇塞,{player_name} 你来啦!\n"
f"🌟 群 {group_id} 瞬间燃爆!\n"
f"🎈 快来接任务,秀翻全场!指令: /t"
)
return {"message": message, "player_id": player_id}
return {"message": None, "player_id": player_id}
except Exception as e:
print(f"确保游戏启动出错: {e}")
return {"message": None, "player_id": player_id}
# 随机分配任务
def assign_random_task(group_id, player_id=None):
try:
# 获取群内所有玩家
players = encyclopedia_db.get_all_players_in_group(group_id)
if not players:
message = (
f"😔 哎呀,群 {group_id} 静悄悄\n"
f"🌟 快拉小伙伴来嗨吧!"
)
return {"message": message, "player_id": player_id}
if player_id:
player_dict = {p['player_id']: p['player_name'] for p in players}
if player_id not in player_dict:
message = (
f"😅 嘿,{player_id} 你谁啊?\n"
f"🌟 先用 /s 报名,不然没法玩哦!"
)
return {"message": message, "player_id": player_id}
holder_id = player_id
holder_name = player_dict[player_id]
else:
holder = random.choice(players)
holder_id = holder['player_id']
holder_name = holder['player_name']
task = game_question_json("请出题!")
category = task["category"]
question = task["question"]
answer = task["answer"]
score = int(task["score"])
description = task.get("description", "")
# 创建活跃任务
active_task_id = encyclopedia_db.create_active_task(
group_id, question, answer, score, description, holder_id
)
if not active_task_id:
message = f"😔 任务创建失败,请稍后再试!"
return {"message": message, "player_id": player_id}
if player_id:
message = (
f"🎁 {holder_name},你的专属任务闪亮登场!\n"
f"🎀 任务ID: {active_task_id}\n"
f"🎈 问题:[{category}]{question}\n"
f"🌼 积分:{score}\n"
f"🌈 快上答案:/a {active_task_id} 答案"
)
else:
message = (
f"🎁 新任务来袭,够不够刺激?\n"
f"🎀 任务ID: {active_task_id}\n"
f"🌟 幸运鹅:{holder_name}\n"
f"🎈 问题:[{category}]{question}\n"
f"🌼 积分:{score}\n"
f"🌈 抢答格式:/a {active_task_id} 答案"
)
return {"message": message, "player_id": holder_id}
except Exception as e:
print(f"分配任务出错: {e}")
message = f"😔 任务分配出错,请稍后再试!"
return {"message": message, "player_id": player_id}
# 提交答案并计分
def submit_answer(group_id, player_id, task_id, answer):
try:
# 获取玩家信息
player = encyclopedia_db.get_player(player_id, group_id)
if not player:
message = (
f"😅 嘿,{player_id} 你是路人甲吗?\n"
f"🌟 用 /s 先加入群 {group_id} 吧!"
)
return {"message": message, "player_id": player_id}
player_name = player['player_name']
if not task_id.isdigit():
message = (
f"😅 喂任务ID得是数字好吗\n"
f"🌟 比如1\n"
f"🎈 别瞎搞,重新来!"
)
return {"message": message, "player_id": player_id}
active_task_id = int(task_id)
# 获取任务信息
task_data = encyclopedia_db.get_task_by_id(group_id, active_task_id)
if not task_data:
message = (
f"😔 哎哟,任务 task_{active_task_id} 不翼而飞啦!\n"
f"🌼 可能被别人抢先一步咯!"
)
return {"message": message, "player_id": player_id}
if task_data['status'] == 'completed':
message = (
f"😄 哈哈,你慢了一步!\n"
f"🌟 任务 task_{active_task_id} 已经完结\n"
f"🎈 快去抢新任务吧!"
)
return {"message": message, "player_id": player_id}
question = task_data['question']
correct_answer_db = task_data['answer'].lower()
top_score = task_data['score']
holder_id = task_data['holder_id']
# 获取任务持有者信息
holder = encyclopedia_db.get_task_holder(group_id, holder_id)
holder_name = holder['player_name'] if holder else "未知玩家"
answer_json = {"question": question, "top_score": str(top_score), "answer": answer}
result = game_answer_json(answer_json)
points = int(result["score"])
description = result["description"]
is_correct = points > 0
if is_correct:
# 更新玩家积分
encyclopedia_db.update_player_points(player_id, group_id, points)
# 完成任务
encyclopedia_db.complete_task(active_task_id)
if player_id == holder_id:
message = (
f"🎉 {player_name} 你是天才吗?\n"
f"🌟 任务:{question}\n"
f"🎈 答对啦,简直无敌!\n"
f"🌈 奖励:{points}\n"
f"🎀 彩蛋:{description}"
)
else:
message = (
f"🎉 {player_name} 抢答王上线!\n"
f"🌟 任务:{question}\n"
f"🎈 原主:{holder_name} 被你截胡啦!\n"
f"🌈 狂揽 {points} 分,太骚了!\n"
f"🎀 彩蛋:{description}"
)
else:
# 扣除积分
encyclopedia_db.update_player_points(player_id, group_id, -1)
points = -1
message = (
f"😅 {player_name} 你这是要笑死我吗?\n"
f"🌼 任务:{question}\n"
f"🎈 你答:{answer}\n"
f"🌟 正确答案:{correct_answer_db}\n"
f"🌈 扣 1 分,别哭哦!\n"
f"🎀 提示:{description}\n"
f"🌟 任务ID: {active_task_id} 还能抢救一下!"
)
# 添加任务历史记录
encyclopedia_db.add_task_history(
group_id, active_task_id, player_id, answer, is_correct, points
)
return {"message": message, "player_id": player_id}
except ValueError as e:
print(f"submit_answer:{e}")
message = (
f"😅 喂任务ID得是数字懂吗\n"
f"🌟 比如1\n"
f"🎈 重来,别皮!"
)
return {"message": message, "player_id": player_id}
except Exception as e:
print(f"submit_answer:{e}")
message = (
f"😅 出错了任务ID得是数字哦\n"
f"🌟 比如1\n"
f"🎈 再试一次吧!"
)
return {"message": message, "player_id": player_id}
# 显示排行榜
def show_rank(group_id, player_id):
try:
# 获取排行榜
ranks = encyclopedia_db.get_player_ranking(group_id, 10)
if not ranks:
message = (
f"😔 群 {group_id} 冷冷清清\n"
f"🌟 快来一起燥起来吧!"
)
return {"message": message, "player_id": player_id}
rank_text = f"🎉 群 {group_id} 排行榜Top 10来啦\n"
for i, row in enumerate(ranks, 1):
rank_text += f"🐓 {i}. {row['player_name']}: {row['points']}\n"
return {"message": rank_text, "player_id": player_id}
except Exception as e:
print(f"显示排行榜出错: {e}")
message = f"😔 获取排行榜出错,请稍后再试!"
return {"message": message, "player_id": player_id}
# 显示当前活跃任务
def show_active_tasks(group_id, player_id):
try:
# 获取活跃任务
tasks = encyclopedia_db.get_active_tasks_in_group(group_id)
if not tasks:
message = (
f"😄 群 {group_id} 现在一片祥和\n"
f"🌟 没任务?快用 /t 搞一个!"
)
return {"message": message, "player_id": player_id}
task_text = f"🎉 群 {group_id} 活跃任务速递:\n"
for task in tasks:
task_text += (
f"🌈 任务ID: task_{task['active_task_id']}\n"
f"🎀 问题:{task['question']}\n"
f"🌼 大佬:{task['player_name']}\n"
)
return {"message": task_text, "player_id": player_id}
except Exception as e:
print(f"显示活跃任务出错: {e}")
message = f"😔 获取活跃任务出错,请稍后再试!"
return {"message": message, "player_id": player_id}
# 列举所有未完成任务
def list_uncompleted_tasks(group_id, player_id):
try:
# 获取未完成任务
tasks = encyclopedia_db.get_active_tasks_in_group(group_id)
if not tasks:
message = (
f"😄 群 {group_id} 全员开挂?\n"
f"🌟 没未完成任务,快用 /t 再战!"
)
return {"message": message, "player_id": player_id}
task_text = f"🎉 群 {group_id} 未完成任务大曝光:\n"
for task in tasks:
task_text += (
f"🌈 任务ID: task_{task['active_task_id']}\n"
f"🎀 问题:{task['question']}\n"
f"🌼 主人:{task['player_name']}\n"
)
return {"message": task_text, "player_id": player_id}
except Exception as e:
print(f"列举未完成任务出错: {e}")
message = f"😔 获取未完成任务出错,请稍后再试!"
return {"message": message, "player_id": player_id}
# 定时任务整点触发排除23:00-08:00
def run_random_task_assignment(group_id):
current_hour = datetime.now().hour
if current_hour >= 23 or current_hour < 9:
message = (
f"😴 现在 {current_hour}:00小伙伴们都睡啦\n"
f"🌙 9点到22点再来嗨吧"
)
print(f"{datetime.now()}{group_id} 当前时间 {current_hour}:00 在23:00-08:00区间跳过任务发放")
return {"message": message, "player_id": None}
result = assign_random_task(group_id)
print(f"{datetime.now()} {result['message']}")
return result
# 处理群聊消息
def game_process_message(group_id, player_id, message, player_name="未知玩家"):
init_result = ensure_game_started(group_id, player_id, player_name)
init_message = init_result["message"]
player_id = init_result["player_id"]
if message == "/s": # 可选:显式加入游戏
if init_message:
return {"message": init_message, "player_id": player_id}
message = (
f"😄 嘿,{player_name} 你来啦!\n"
f"🌼 已加入群 {group_id} 的狂欢\n"
f"🎶 快用 /t 开干吧!"
)
return {"message": message, "player_id": player_id}
elif message == "/ts": # 查看活跃任务
if init_message:
message = init_message + "\n🌟 用 /ts 看看当前任务吧!"
return {"message": message, "player_id": player_id}
return show_active_tasks(group_id, player_id)
elif message == "/l": # 列出未完成任务
if init_message:
message = init_message + "\n🌟 用 /l 查未完成任务哦!"
return {"message": message, "player_id": player_id}
return list_uncompleted_tasks(group_id, player_id)
elif message.startswith("/a"): # 提交答案
if init_message:
message = init_message + "\n🌟 用 /a [任务ID] [答案] 放大招吧!"
return {"message": message, "player_id": player_id}
parts = message.split(" ", 2)
if len(parts) < 3:
message = (
f"😅 喂,格式不对啊!\n"
f"🌟 正确姿势:/a [任务ID] [答案]\n"
f"🎈 比如:/a 1 钒"
)
return {"message": message, "player_id": player_id}
task_id, answer = parts[1], parts[2]
return submit_answer(group_id, player_id, task_id, answer)
elif message == "/r": # 查看排行榜
if init_message:
message = init_message + "\n🌟 用 /r 看看谁是大佬!"
return {"message": message, "player_id": player_id}
return show_rank(group_id, player_id)
elif message == "/ag": # 可选:手动添加群聊
if init_message:
return {"message": init_message, "player_id": player_id}
return add_group(group_id, player_id)
elif message == "/t": # 获取任务
if init_message:
message = init_message + "\n🌟 已为你准备好任务,快接招!"
return {"message": message, "player_id": player_id}
current_hour = datetime.now().hour
if current_hour >= 23 or current_hour < 9:
message = (
f"😴 现在 {current_hour}:00\n"
f"🌙 太晚啦,大家都睡了!\n"
f"🌞 9点到22点再来嗨吧"
)
return {"message": message, "player_id": player_id}
return assign_random_task(group_id, player_id)
else:
message = (
f"😄 嘿,二货!\n"
f"🌟 指令玩错啦!\n"
f"🎈 快试试这些:\n"
f"🌈 /s - 加入狂欢(可选)\n"
f"🎀 /ts - 看活跃任务\n"
f"🌼 /l - 未完成任务\n"
f"🌟 /a [任务ID] [答案] - 提交答案\n"
f"🎈 /ag - 加群(可选)\n"
f"🌈 /t - 抢任务\n"
f"🎀 /r - 谁是大佬"
)
return {"message": message, "player_id": player_id}
# 设置定时任务
def setup_schedule():
group_ids = get_group_ids()
for gid in group_ids:
run_random_task_assignment(group_id=gid)
# 主程序
if __name__ == "__main__":
# 测试用例
print(game_process_message("45317011307@chatroom", "Jyunere", "/t")) # 新用户获取任务
print(game_process_message("45317011307@chatroom", "Jyunere", "/a 18 罗马斗兽场")) # 提交答案
print(game_process_message("45317011307@chatroom", "Jyunere", "/r")) # 查看排行榜