群级别用户维护

This commit is contained in:
liuwei
2025-11-24 10:00:07 +08:00
parent 665b59e143
commit ea71fc0931
2 changed files with 22 additions and 21 deletions

View File

@@ -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:

View File

@@ -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