Files
abot/db/encyclopedia.py

154 lines
6.3 KiB
Python

# -*- coding: utf-8 -*-
from typing import Dict, List, Optional, Tuple
from db.base import BaseDBOperator
from db.connection import DBConnectionManager
class EncyclopediaDB(BaseDBOperator):
"""百科答题游戏相关数据库操作"""
def __init__(self, db_manager: DBConnectionManager):
super().__init__(db_manager)
def add_group(self, group_id: str) -> bool:
"""添加群组"""
sql = "INSERT INTO t_encyclopedia_groups (group_id) VALUES (%s)"
return self.execute_update(sql, (group_id,))
def check_group_exists(self, group_id: str) -> bool:
"""检查群组是否存在"""
sql = "SELECT 1 FROM t_encyclopedia_groups WHERE group_id = %s"
result = self.execute_query(sql, (group_id,), fetch_one=True)
return result is not None
def add_player(self, player_id: str, group_id: str, player_name: str) -> bool:
"""添加玩家"""
sql = """
INSERT INTO t_encyclopedia_players (player_id, group_id, player_name)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE player_name = VALUES(player_name)
"""
return self.execute_update(sql, (player_id, group_id, player_name))
def get_active_task(self, group_id: str) -> Optional[Dict]:
"""获取群组的活跃任务"""
sql = """
SELECT active_task_id, group_id, question, answer, score, description, holder_id, assigned_at, status
FROM t_encyclopedia_active_tasks
WHERE group_id = %s AND status = 'pending'
ORDER BY assigned_at DESC
LIMIT 1
"""
return self.execute_query(sql, (group_id,), fetch_one=True)
def add_task_history(self, group_id: str, task_id: int, player_id: str,
answer: str, is_correct: bool, points_earned: int) -> bool:
"""添加任务历史记录"""
sql = """
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)
"""
params = (group_id, task_id, player_id, answer, 1 if is_correct else 0, points_earned)
return self.execute_update(sql, params)
def get_player_ranking(self, group_id: str, limit: int = 10) -> List[Dict]:
"""获取玩家排名"""
sql = """
SELECT player_name, points
FROM t_encyclopedia_players
WHERE group_id = %s
ORDER BY points DESC
LIMIT %s
"""
return self.execute_query(sql, (group_id, limit)) or []
def create_active_task(self, group_id: str, question: str, answer: str,
score: int, description: str, holder_id: str) -> Optional[int]:
"""创建活跃任务"""
sql = """
INSERT INTO t_encyclopedia_active_tasks
(group_id, question, answer, score, description, holder_id)
VALUES (%s, %s, %s, %s, %s, %s)
"""
if self.execute_update(sql, (group_id, question, answer, score, description, holder_id)):
# 获取最新创建的任务ID
get_id_sql = """
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
"""
result = self.execute_query(get_id_sql, (group_id, question, holder_id), fetch_one=True)
return result['active_task_id'] if result else None
return None
def update_player_points(self, player_id: str, group_id: str, points: int) -> bool:
"""更新玩家积分"""
if points > 0:
sql = """
UPDATE t_encyclopedia_players
SET points = points + %s
WHERE group_id = %s AND player_id = %s
"""
else:
sql = """
UPDATE t_encyclopedia_players
SET points = GREATEST(points + %s, 0)
WHERE group_id = %s AND player_id = %s
"""
return self.execute_update(sql, (points, group_id, player_id))
def complete_task(self, active_task_id: int) -> bool:
"""完成任务"""
sql = """
UPDATE t_encyclopedia_active_tasks
SET status = 'completed'
WHERE active_task_id = %s
"""
return self.execute_update(sql, (active_task_id,))
def get_player(self, player_id: str, group_id: str) -> Optional[Dict]:
"""获取玩家信息"""
sql = """
SELECT player_id, player_name, points
FROM t_encyclopedia_players
WHERE group_id = %s AND player_id = %s
"""
return self.execute_query(sql, (group_id, player_id), fetch_one=True)
def get_all_groups(self) -> List[str]:
"""获取所有群组ID"""
sql = "SELECT group_id FROM t_encyclopedia_groups"
results = self.execute_query(sql)
return [row['group_id'] for row in results] if results else []
def get_all_players_in_group(self, group_id: str) -> List[Dict]:
"""获取群组中的所有玩家"""
sql = "SELECT player_id, player_name FROM t_encyclopedia_players WHERE group_id = %s"
return self.execute_query(sql, (group_id,)) or []
def get_active_tasks_in_group(self, group_id: str) -> List[Dict]:
"""获取群组中的所有活跃任务"""
sql = """
SELECT a.active_task_id, a.question, p.player_name, p.player_id
FROM t_encyclopedia_active_tasks a
JOIN t_encyclopedia_players p ON a.holder_id = p.player_id AND a.group_id = p.group_id
WHERE a.group_id = %s AND a.status = 'pending'
"""
return self.execute_query(sql, (group_id,)) or []
def get_task_by_id(self, group_id: str, task_id: int) -> Optional[Dict]:
"""根据ID获取任务"""
sql = """
SELECT question, answer, score, holder_id, status
FROM t_encyclopedia_active_tasks
WHERE group_id = %s AND active_task_id = %s
"""
return self.execute_query(sql, (group_id, task_id), fetch_one=True)
def get_task_holder(self, group_id: str, holder_id: str) -> Optional[Dict]:
"""获取任务持有者信息"""
sql = "SELECT player_name FROM t_encyclopedia_players WHERE group_id = %s AND player_id = %s"
return self.execute_query(sql, (group_id, holder_id), fetch_one=True)