154 lines
6.3 KiB
Python
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) |