diff --git a/db/xiuxian_db.py b/db/xiuxian_db.py index 39a7b2c..efcd516 100644 --- a/db/xiuxian_db.py +++ b/db/xiuxian_db.py @@ -37,7 +37,7 @@ class XiuxianDB: """从连接池获取连接。业务层无需手动关闭,with 语法自动释放。""" return self.pool.get_connection() - def get_player(self, user_id: str) -> Optional[Dict[str, Any]]: + def get_player(self, user_id: str, group_id: str) -> Optional[Dict[str, Any]]: """读取玩家核心信息。 Args: @@ -50,8 +50,8 @@ class XiuxianDB: with self._conn() as conn: with conn.cursor(dictionary=True) as cur: cur.execute( - "SELECT user_id, group_id, dao_name, realm, spirit_root, cultivation_points, spirit_stone, status, status_until, last_cultivate_time, clan_id FROM t_xiuxian_player WHERE user_id=%s", - (user_id,) + "SELECT user_id, group_id, dao_name, realm, spirit_root, cultivation_points, spirit_stone, status, status_until, last_cultivate_time, clan_id FROM t_xiuxian_player WHERE user_id=%s AND group_id=%s", + (user_id, group_id) ) return cur.fetchone() except mysql.connector.Error: @@ -86,7 +86,7 @@ class XiuxianDB: except mysql.connector.Error: return False - def update_player_fields(self, user_id: str, fields: Dict[str, Any]) -> bool: + def update_player_fields(self, user_id: str, group_id: str, fields: Dict[str, Any]) -> bool: """增量更新玩家字段。 Args: @@ -108,7 +108,8 @@ class XiuxianDB: cols.append(f"{k}=%s") vals.append(v) vals.append(user_id) - sql = f"UPDATE t_xiuxian_player SET {', '.join(cols)} WHERE user_id=%s" + vals.append(group_id) + sql = f"UPDATE t_xiuxian_player SET {', '.join(cols)} WHERE user_id=%s AND group_id=%s" try: with self._conn() as conn: with conn.cursor() as cur: diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index 04c369b..caa70f8 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -855,7 +855,7 @@ class XiuxianPlugin(MessagePluginInterface): if k in player: fields[k] = player[k] try: - self.xdb.update_player_fields(player.get("user_id"), fields) + self.xdb.update_player_fields(player.get("user_id"), player.get("group_id", ""), fields) except Exception as e: logger.warning(f"更新玩家字段失败: {e}, user_id={player.get('user_id')}") self.redis_db.save_player(player) @@ -866,7 +866,7 @@ class XiuxianPlugin(MessagePluginInterface): if p: return p if self.xdb: - dbp = self.xdb.get_player(user_id) + dbp = self.xdb.get_player(user_id, group_id) if dbp and dbp.get("group_id", "") == group_id: # 补充spirit_root_mult:根据spirit_root名称查找对应的倍率 if "spirit_root_mult" not in dbp: @@ -913,7 +913,7 @@ class XiuxianPlugin(MessagePluginInterface): player["realm"] = new_realm if self.xdb: try: - self.xdb.update_player_fields(user_id, {"realm": new_realm}) + self.xdb.update_player_fields(user_id, player.get("group_id", ""), {"realm": new_realm}) self.redis_db.invalidate_player(user_id, player.get("group_id", "")) except Exception: pass @@ -1020,7 +1020,7 @@ class XiuxianPlugin(MessagePluginInterface): player["inventory"] = inv if self.xdb: try: - self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"]}) self.xdb.add_item(sender, item_name, item.get("type","other"), qty) except Exception: pass @@ -1059,7 +1059,7 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: try: self.xdb.remove_item(sender, item_name, qty) - self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"]}) except Exception: pass self._save_player(player) @@ -1169,7 +1169,7 @@ class XiuxianPlugin(MessagePluginInterface): player["inventory"] = inv if self.xdb: try: - self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"]}) for k, v in mats_gain.items(): self.xdb.add_item(sender, k, "材料", v) except Exception: @@ -1320,7 +1320,7 @@ class XiuxianPlugin(MessagePluginInterface): player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat() if self.xdb: try: - self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"], "status": player.get("status"), "status_until": player.get("status_until")}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"], "status": player.get("status"), "status_until": player.get("status_until")}) if success > 0: self.xdb.add_item(sender, item_name, item_type, success) for mk, nv in need.items(): @@ -1413,7 +1413,7 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: try: self.xdb.remove_item(sender, pill_item_name, 1) - self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"cultivation_points": player["cultivation_points"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) except Exception as e: logger.warning(f"突破时更新数据库失败: {e}, user_id={sender}") @@ -1475,7 +1475,7 @@ class XiuxianPlugin(MessagePluginInterface): player["cultivation_points"] = points - hard_conf["cost"] if self.xdb: try: - self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"cultivation_points": player["cultivation_points"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) except Exception as e: logger.warning(f"强行突破时更新数据库失败: {e}, user_id={sender}") @@ -1557,8 +1557,8 @@ class XiuxianPlugin(MessagePluginInterface): defender["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.injured_minutes))).isoformat() if self.xdb: try: - self.xdb.update_player_fields(defender.get("user_id"), {"spirit_stone": defender["spirit_stone"], "status": defender["status"], "status_until": defender["status_until"]}) - self.xdb.update_player_fields(attacker.get("user_id"), {"spirit_stone": attacker["spirit_stone"]}) + self.xdb.update_player_fields(defender.get("user_id"), defender.get("group_id", ""), {"spirit_stone": defender["spirit_stone"], "status": defender["status"], "status_until": defender["status_until"]}) + self.xdb.update_player_fields(attacker.get("user_id"), attacker.get("group_id", ""), {"spirit_stone": attacker["spirit_stone"]}) except Exception: pass self._save_player(defender) @@ -1616,8 +1616,8 @@ class XiuxianPlugin(MessagePluginInterface): receiver["spirit_stone"] = int(receiver.get("spirit_stone", 0)) + qty if self.xdb: try: - self.xdb.update_player_fields(sender, {"spirit_stone": giver["spirit_stone"]}) - self.xdb.update_player_fields(target, {"spirit_stone": receiver["spirit_stone"]}) + self.xdb.update_player_fields(sender, giver.get("group_id", ""), {"spirit_stone": giver["spirit_stone"]}) + self.xdb.update_player_fields(target, receiver.get("group_id", ""), {"spirit_stone": receiver["spirit_stone"]}) except Exception: pass # 使用_save_player确保同时保存到Redis和MariaDB @@ -1712,7 +1712,7 @@ class XiuxianPlugin(MessagePluginInterface): player["clan_id"] = int(clan_id) if self.xdb: try: - self.xdb.update_player_fields(sender, {"clan_id": player["clan_id"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"clan_id": player["clan_id"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) except Exception: pass @@ -1747,7 +1747,7 @@ class XiuxianPlugin(MessagePluginInterface): player["clan_id"] = int(cid) if isinstance(cid, str) else cid if self.xdb: try: - self.xdb.update_player_fields(sender, {"clan_id": player["clan_id"]}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"clan_id": player["clan_id"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) except Exception: pass @@ -1768,7 +1768,7 @@ class XiuxianPlugin(MessagePluginInterface): player["clan_id"] = None if self.xdb: try: - self.xdb.update_player_fields(sender, {"clan_id": None}) + self.xdb.update_player_fields(sender, player.get("group_id", ""), {"clan_id": None}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) except Exception: pass