diff --git a/chagpt-adapter/config.yaml b/chagpt-adapter/config.yaml index 2740a1c..9e05b33 100644 --- a/chagpt-adapter/config.yaml +++ b/chagpt-adapter/config.yaml @@ -1,6 +1,6 @@ server: port: 8080 - #proxied: http://127.0.0.1:7890 +# proxied: http://127.0.0.1:7890 password: 'xxx' think_reason: true debug: false diff --git a/game_task/game_chatgpt_qa.py b/game_task/game_chatgpt_qa.py index 08e3ecd..2326f27 100644 --- a/game_task/game_chatgpt_qa.py +++ b/game_task/game_chatgpt_qa.py @@ -63,9 +63,9 @@ def game_question_json(question): return message_task_json(prompt, question) -def game_answer_json(answar): +def game_answer_json(answer): prompt = "你是一个益智百科问答大师,可以根据用户回答的答案进行判断,并且对问题(question)答案(answer)进行打分,打分时请参考最高分要求(top_score),告知用户能获得多少分,请在description中描述打分理由,请只返回JSON格式的内容:格式要求如下(请不要加上markdown 的符号):{\"question\": \"哪个国家最早将玫瑰与爱情联系起来?\", \"score\":\"1\", \"answer\": \"波斯\",\"description\":\"描述问题答案的原因\"}" - return message_task_json(prompt, answar) + return message_task_json(prompt, answer) if __name__ == '__main__': diff --git a/game_task/game_task_encyclopedia.py b/game_task/game_task_encyclopedia.py index 1b5c061..f39a286 100644 --- a/game_task/game_task_encyclopedia.py +++ b/game_task/game_task_encyclopedia.py @@ -1,7 +1,4 @@ -import json import random -import schedule -import time from datetime import datetime import pymysql @@ -9,20 +6,18 @@ from game_task.game_chatgpt_qa import game_question_json, game_answer_json # 数据库连接配置 db_config = { - 'host': '192.168.2.32', # 替换为你的MariaDB服务器地址 - 'user': 'root', # 替换为你的MariaDB用户名 - 'password': 'lw123456', # 替换为你的MariaDB密码 + 'host': '192.168.2.32', + 'user': 'root', + 'password': 'lw123456', 'database': 'message_archive', 'charset': 'utf8mb4', 'cursorclass': pymysql.cursors.DictCursor } - # 连接数据库 def get_db_connection(): return pymysql.connect(**db_config) - # 添加群聊 def add_group(group_id, player_id): conn = get_db_connection() @@ -33,22 +28,13 @@ def add_group(group_id, player_id): (group_id,) ) conn.commit() - return ( - f"🎉 好消息来啦!\n" - f"🌟 群 {group_id} 已成功加入\n" - f"🎈 大家快来一起玩吧!" - ) + return True # 添加成功 except pymysql.err.IntegrityError: - return ( - f"😄 嘿,小伙伴\n" - f"🌈 群 {group_id} 已经在了\n" - f"🎶 快来一起开心吧!" - ) + return True # 已存在也视为成功 finally: cursor.close() conn.close() - # 获取所有群聊ID def get_group_ids(): conn = get_db_connection() @@ -60,55 +46,44 @@ def get_group_ids(): cursor.close() conn.close() - -# 开始游戏(使用 player_id) -def start_game(group_id, player_id, player_name="未知玩家"): +# 确保游戏启动(自动初始化群聊和玩家) +def ensure_game_started(group_id, player_id, player_name="未知玩家"): conn = get_db_connection() cursor = conn.cursor() try: - # 确保群聊存在 + # 检查并添加群聊 cursor.execute("SELECT group_id FROM t_encyclopedia_groups WHERE group_id = %s", (group_id,)) if not cursor.fetchone(): - return ( - f"😅 哎呀,小朋友\n" - f"🌼 群 {group_id} 还没准备好\n" - f"🎀 先用 /addgroup 添加哦!" - ) + add_group(group_id, player_id) - cursor.execute( - "INSERT INTO t_encyclopedia_players (player_id, group_id, player_name) VALUES (%s, %s, %s)", - (player_id, group_id, player_name) - ) - conn.commit() - return ( - f"🎉 欢迎加入,{player_name}!\n" - f"🌟 已就位\n" - f"🎈 群 {group_id} 等你来玩\n" - f"🌈 快来接任务吧!指令: /gettask" - ) - except pymysql.err.IntegrityError: + # 检查并添加玩家 cursor.execute( "SELECT player_name FROM t_encyclopedia_players WHERE group_id = %s AND player_id = %s", (group_id, player_id) ) - existing_name = cursor.fetchone()['player_name'] - return ( - f"😄 你好呀,{existing_name}\n" - f"🌼 已加入游戏 {group_id}\n" - f"🎶 快来一起乐呵吧! \n" - f"🌈 快来接任务吧!指令: /gettask" - ) + existing_player = cursor.fetchone() + if not existing_player: + cursor.execute( + "INSERT INTO t_encyclopedia_players (player_id, group_id, player_name) VALUES (%s, %s, %s)", + (player_id, group_id, player_name) + ) + conn.commit() + return ( + f"🎉 欢迎加入,{player_name}!\n" + f"🌟 已就位\n" + f"🎈 群 {group_id} 等你来玩\n" + f"🌈 快来接任务吧!指令: /t" + ) + return None # 已存在则无需额外反馈 finally: cursor.close() conn.close() - -# 随机分配任务(支持指定玩家) +# 随机分配任务 def assign_random_task(group_id, player_id=None): conn = get_db_connection() cursor = conn.cursor() try: - # 获取当前群聊的玩家列表 cursor.execute("SELECT player_id, player_name FROM t_encyclopedia_players WHERE group_id = %s", (group_id,)) players = cursor.fetchall() if not players: @@ -118,52 +93,45 @@ def assign_random_task(group_id, player_id=None): f"🎈 快叫朋友来玩吧!" ) - # 如果指定了 player_id,检查其是否在群聊中 if player_id: player_dict = {p['player_id']: p['player_name'] for p in players} if player_id not in player_dict: return ( f"😅 嘿,小朋友\n" f"🌟 ID: {player_id} 还没加入群 {group_id}\n" - f"🎈 用 /start 先报名吧!" + f"🎈 用 /s 先报名吧!" ) holder_id = player_id holder_name = player_dict[player_id] else: - # 未指定 player_id 时,随机选择 holder = random.choice(players) holder_id = holder['player_id'] holder_name = holder['player_name'] - # 使用内部方法获取任务 - task = game_question_json("请从不同的学科领域(历史学:古代历史、近现代史、战争与政治、文化遗产与考古学;生物学:进化论、动植物学、基因与遗传学、生态学;化学:有机化学、无机化学、生物化学、环境化学;地理学:人文地理、自然地理、地质学、气候变化;文学:古典文学、现代文学、小说与戏剧、诗歌与散文;艺术:美术、音乐、戏剧与舞蹈、电影与媒体;哲学:西方哲学、东方哲学、道德与伦理学、逻辑与认识论;社会学:人类学、心理学、政治学、经济学;计算机科学:编程语言、人工智能、数据科学、网络与安全;工程学:机械工程、电气工程、化学工程、土木工程;医学:解剖学、生理学、临床医学、药学与护理;体育:球类运动、奥林匹克运动、运动心理学、健身与营养;宗教与神话:世界宗教、神话与民间故事、宗教哲学;语言学:语法与词汇、语言习得、方言与语言变异;经济学:宏观经济学、微观经济学、国际贸易、金融与投资;法律:民法与刑法、国际法、知识产权法、环境法)生成一个全新问题。") - + task = game_question_json("请从不同的学科领域生成一个全新问题。") question = task["question"] answer = task["answer"] score = int(task["score"]) description = task.get("description", "") - # 插入任务 cursor.execute( "INSERT INTO t_encyclopedia_active_tasks (group_id, question, answer, score, description, holder_id) VALUES (%s, %s, %s, %s, %s, %s)", (group_id, question, answer, score, description, holder_id) ) conn.commit() - # 获取分配的任务ID cursor.execute( "SELECT active_task_id FROM t_encyclopedia_active_tasks WHERE group_id = %s AND question = %s AND holder_id = %s ORDER BY assigned_at DESC LIMIT 1", (group_id, question, holder_id) ) active_task_id = cursor.fetchone()['active_task_id'] - # 根据是否指定玩家,返回不同消息 if player_id: return ( f"🎁 {holder_name},你的新任务来啦!\n" f"🎈 问题:{question}\n" f"🌈 群 {group_id} 等你作答\n" - f"🎀 任务ID: task_{active_task_id}\n" + f"🎀 任务ID: {active_task_id}\n" f"🌼 积分:{score}" ) else: @@ -172,20 +140,18 @@ def assign_random_task(group_id, player_id=None): f"🌟 幸运玩家:{holder_name} \n" f"🎈 问题:{question}\n" f"🌈 群 {group_id} 等你抢答\n" - f"🎀 任务ID: task_{active_task_id}\n" + f"🎀 任务ID: {active_task_id}\n" f"🌼 积分:{score}" ) finally: cursor.close() conn.close() - -# 提交答案并计分(错误扣1分) +# 提交答案并计分 def submit_answer(group_id, player_id, task_id, answer): conn = get_db_connection() cursor = conn.cursor() try: - # 检查玩家是否存在并获取名称 cursor.execute("SELECT player_name FROM t_encyclopedia_players WHERE group_id = %s AND player_id = %s", (group_id, player_id)) player_row = cursor.fetchone() @@ -193,12 +159,11 @@ def submit_answer(group_id, player_id, task_id, answer): return ( f"😅 嘿,小朋友\n" f"🌟 ID: {player_id} 还没加入群 {group_id}\n" - f"🎈 用 /start 先报名吧!" + f"🎈 用 /s 先报名吧!" ) player_name = player_row['player_name'] - # 检查任务ID是否为纯数字 if not task_id.isdigit(): return ( f"😅 哎呀,小调皮\n" @@ -210,7 +175,6 @@ def submit_answer(group_id, player_id, task_id, answer): active_task_id = int(task_id) - # 检查任务是否存在并获取任务详情 cursor.execute( "SELECT question, answer, score, holder_id, status FROM t_encyclopedia_active_tasks WHERE group_id = %s AND active_task_id = %s", (group_id, active_task_id) @@ -233,21 +197,17 @@ def submit_answer(group_id, player_id, task_id, answer): question, correct_answer_db, top_score, holder_id, _ = task_data['question'], task_data['answer'].lower(), \ task_data['score'], task_data['holder_id'], task_data['status'] - # 获取持有者名称 cursor.execute("SELECT player_name FROM t_encyclopedia_players WHERE group_id = %s AND player_id = %s", (group_id, holder_id)) holder_name = cursor.fetchone()['player_name'] - # 调用内部方法校验答案 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: - # 答对 situation cursor.execute( "UPDATE t_encyclopedia_players SET points = points + %s WHERE group_id = %s AND player_id = %s", (points, group_id, player_id) @@ -273,12 +233,11 @@ def submit_answer(group_id, player_id, task_id, answer): f"🎀 提示:{description}" ) else: - # 答错 situation,任务保持 pending 状态,允许其他玩家继续抢答 cursor.execute( "UPDATE t_encyclopedia_players SET points = GREATEST(points - 1, 0) WHERE group_id = %s AND player_id = %s", (group_id, player_id) ) - points = -1 # 记录惩罚分 + points = -1 message = ( f"😅 {player_name} 有点小遗憾!\n" f"🌼 任务:{question}\n" @@ -286,10 +245,9 @@ def submit_answer(group_id, player_id, task_id, answer): f"🌟 正确答案:{correct_answer_db}\n" f"🌈 扣 1 分,别灰心!\n" f"🎀 提示:{description}\n" - f"🌟 任务 task_{active_task_id} 仍可抢答哦!" + f"🌟 任务ID: {active_task_id} 仍可抢答哦!" ) - # 记录提交历史 cursor.execute( "INSERT INTO t_encyclopedia_task_history (group_id, active_task_id, player_id, answer, is_correct, points_earned) VALUES (%s, %s, %s, %s, %s, %s)", (group_id, active_task_id, player_id, answer, is_correct, points) @@ -306,7 +264,7 @@ def submit_answer(group_id, player_id, task_id, answer): f"🌈 比如:1\n" f"🎀 再试一次吧!" ) - except Exception as e : + except Exception as e: print(f"submit_answer:{e}") return ( f"😅 哎呀,小调皮\n" @@ -315,12 +273,10 @@ def submit_answer(group_id, player_id, task_id, answer): f"🌈 比如:1\n" f"🎀 再试一次吧!" ) - finally: cursor.close() conn.close() - # 显示排行榜 def show_rank(group_id, player_id): conn = get_db_connection() @@ -345,7 +301,6 @@ def show_rank(group_id, player_id): cursor.close() conn.close() - # 显示当前活跃任务 def show_active_tasks(group_id, player_id): conn = get_db_connection() @@ -362,7 +317,7 @@ def show_active_tasks(group_id, player_id): return ( f"😄 群 {group_id} 现在很平静\n" f"🌟 没有活跃任务哦\n" - f"🎈 用 /gettask 拿一个吧!" + f"🎈 用 /t 拿一个吧!" ) task_text = f"🎉 群 {group_id} 当前活跃任务:\n" for task in tasks: @@ -376,8 +331,7 @@ def show_active_tasks(group_id, player_id): cursor.close() conn.close() - -# 列举所有未完成任务及其所属者 +# 列举所有未完成任务 def list_uncompleted_tasks(group_id, player_id): conn = get_db_connection() cursor = conn.cursor() @@ -393,7 +347,7 @@ def list_uncompleted_tasks(group_id, player_id): return ( f"😄 群 {group_id} 任务都完成啦\n" f"🌟 目前没有未完成任务\n" - f"🎈 用 /gettask 再来一个吧!" + f"🎈 用 /t 再来一个吧!" ) task_text = f"🎉 群 {group_id} 所有未完成任务列表:\n" for task in tasks: @@ -407,41 +361,59 @@ def list_uncompleted_tasks(group_id, player_id): cursor.close() conn.close() - # 定时任务:整点触发,排除23:00-08:00 def run_random_task_assignment(group_id): current_hour = datetime.now().hour - if current_hour >= 23 or current_hour < 9: # 排除23:00-08:00 + if current_hour >= 23 or current_hour < 9: print(f"{datetime.now()} 群 {group_id} 当前时间 {current_hour}:00 在23:00-08:00区间,跳过任务发放") return - result = assign_random_task(group_id) # 不传入 player_id,保持随机 + result = assign_random_task(group_id) print(f"{datetime.now()} {result}") - # 处理群聊消息 def game_process_message(group_id, player_id, message, player_name="未知玩家"): - if message == "/start": - return start_game(group_id, player_id, player_name) - elif message == "/tasks": + # 自动初始化群聊和玩家 + init_message = ensure_game_started(group_id, player_id, player_name) + + if message == "/s": # 可选:显式加入游戏 + return init_message if init_message else ( + f"😄 你好呀,{player_name}\n" + f"🌼 已加入游戏 {group_id}\n" + f"🎶 快来一起乐呵吧!\n" + f"🌈 指令:/t 获取任务" + ) + elif message == "/ts": # 查看活跃任务 + if init_message: + return init_message + "\n🌟 用 /ts 查看当前任务吧!" return show_active_tasks(group_id, player_id) - elif message == "/list": + elif message == "/l": # 列出未完成任务 + if init_message: + return init_message + "\n🌟 用 /l 查看未完成任务吧!" return list_uncompleted_tasks(group_id, player_id) - elif message.startswith("/answer"): + elif message.startswith("/a"): # 提交答案 + if init_message: + return init_message + "\n🌟 用 /a [任务ID] [答案] 提交答案吧!" parts = message.split(" ", 2) if len(parts) < 3: return ( f"😅 哎呀,小朋友\n" f"🌟 格式不对哦\n" - f"🎈 正确用法:/answer [任务ID] [答案]\n" - f"🌈 例如:/answer 1 钒(Vanadium)" + f"🎈 正确用法:/a [任务ID] [答案]\n" + f"🌈 例如:/a 1 钒" ) task_id, answer = parts[1], parts[2] return submit_answer(group_id, player_id, task_id, answer) - elif message == "/rank": + elif message == "/r": # 查看排行榜 + if init_message: + return init_message + "\n🌟 用 /r 查看排行榜吧!" return show_rank(group_id, player_id) - elif message.startswith("/addgroup"): + elif message == "/ag": # 可选:手动添加群聊 + if init_message: + return init_message # 已自动添加 return add_group(group_id, player_id) - elif message == "/gettask": + elif message == "/t": # 获取任务 + if init_message: + return init_message + "\n🌟 已为你准备任务:" current_hour = datetime.now().hour if current_hour >= 23 or current_hour < 9: return ( @@ -449,34 +421,30 @@ def game_process_message(group_id, player_id, message, player_name="未知玩家 f"🌙 太晚啦,小伙伴们休息中\n" f"🌞 9点到22点再来玩吧!" ) - return assign_random_task(group_id, player_id) # 传入 player_id + return assign_random_task(group_id, player_id) else: return ( f"😄 嘿,小调皮\n" f"🌟 指令不对哦\n" f"🎈 可用指令:\n" - f"🌈 /start - 加入游戏\n" - f"🎀 /tasks - 查看活跃任务\n" - f"🌼 /list - 未完成任务\n" - f"🌟 /answer [任务ID] [答案] - 提交答案\n" - f"🎈 /addgroup - 添加群聊\n" - f"🌈 /gettask - 主动拿任务\n" - f"🎀 /rank - 查看排行榜" + f"🌈 /s - 加入游戏(可选)\n" + f"🎀 /ts - 查看活跃任务\n" + f"🌼 /l - 未完成任务\n" + f"🌟 /a [任务ID] [答案] - 提交答案\n" + f"🎈 /ag - 添加群聊(可选)\n" + f"🌈 /t - 主动拿任务\n" + f"🎀 /r - 查看排行榜" ) - # 设置定时任务 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("47530198896@chatroom", "player1001", "/start", "玩家1")) - # print(game_process_message("47530198896@chatroom", "player1002", "/start", "玩家2")) - # print(game_process_message("47530198896@chatroom", "player1001", "/gettask")) - # 玩家2 抢答玩家1的任务 - print(game_process_message("45317011307@chatroom", "Jyunere", "/answer 18 罗马斗兽场")) \ No newline at end of file + # 测试用例 + 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")) # 查看排行榜 \ No newline at end of file