diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index a03df9d..b701e66 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -268,8 +268,8 @@ class XiuxianPlugin(MessagePluginInterface): try: name, mult = item.split(":") self.spirit_roots.append((name, float(mult))) - except Exception: - pass + except Exception as e: + self.LOG.warning(f"解析灵根配置失败: {item}, 错误: {e}") lb_cfg = cfg.get("leaderboard", {}) leaderboard_key = lb_cfg.get("key", "xiuxian:zset:leaderboard:cultivation") @@ -284,8 +284,8 @@ class XiuxianPlugin(MessagePluginInterface): try: n, t, p = s.split(":") self.shop_items.append({"name": n, "type": t, "price": int(p)}) - except Exception: - pass + except Exception as e: + self.LOG.warning(f"解析商品配置失败: {s}, 错误: {e}") pts_cfg = cfg.get("points_exchange", {}) self.point_to_stone_rate = int(pts_cfg.get("point_to_stone_rate", 10)) @@ -305,8 +305,8 @@ class XiuxianPlugin(MessagePluginInterface): try: n, v = s.split(":") self.realm_score_map[n] = int(v) - except Exception: - pass + except Exception as e: + self.LOG.warning(f"解析境界分值配置失败: {s}, 错误: {e}") layer_up_cfg = self._config.get("Xiuxian", {}).get("layer_up", {}) self.layer_threshold_map = {} @@ -314,8 +314,8 @@ class XiuxianPlugin(MessagePluginInterface): try: n, v = s.split(":") self.layer_threshold_map[n] = int(v) - except Exception: - pass + except Exception as e: + self.LOG.warning(f"解析层级阈值配置失败: {s}, 错误: {e}") # 解析突破阶段配置 stage_cfg = self._config.get("Xiuxian", {}).get("breakthrough_stages", {}) @@ -330,8 +330,8 @@ class XiuxianPlugin(MessagePluginInterface): "rate": float(rate), "target": target } - except Exception: - pass + except Exception as e: + self.LOG.warning(f"解析突破阶段配置失败: {p}, 错误: {e}") self.LOG.info(f"[{self.name}] 插件初始化完成,指令:{self._commands}") return True @@ -487,8 +487,8 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: try: self.xdb.create_player(player) - except Exception: - pass + except Exception as e: + logger.warning(f"创建玩家数据库记录失败: {e}, user_id={sender}") self._save_player(player) self._rate_set(sender, "注册修仙") # 初始化境界排行榜分值 @@ -727,19 +727,35 @@ class XiuxianPlugin(MessagePluginInterface): fields[k] = player[k] try: self.xdb.update_player_fields(player.get("user_id"), fields) - except Exception: - pass + except Exception as e: + logger.warning(f"更新玩家字段失败: {e}, user_id={player.get('user_id')}") self.redis_db.save_player(player) def _get_player_with_cache(self, user_id: str, group_id: str) -> Optional[Dict[str, Any]]: + """从缓存或数据库获取玩家数据,并补充缺失字段""" p = self.redis_db.get_player(user_id, group_id) if p: return p if self.xdb: dbp = self.xdb.get_player(user_id) if dbp and dbp.get("group_id", "") == group_id: - dbp.setdefault("spirit_root_mult", 1.0) - dbp.setdefault("inventory", {}) + # 补充spirit_root_mult:根据spirit_root名称查找对应的倍率 + if "spirit_root_mult" not in dbp: + spirit_root_name = dbp.get("spirit_root", "凡灵根") + mult = 1.0 + for name, m in self.spirit_roots: + if name == spirit_root_name: + mult = m + break + dbp["spirit_root_mult"] = mult + # 补充inventory:从数据库读取背包数据 + if "inventory" not in dbp: + try: + items = self.xdb.get_inventory(user_id) + dbp["inventory"] = {item["name"]: item["quantity"] for item in items} + except Exception as e: + logger.warning(f"读取背包数据失败: {e}") + dbp["inventory"] = {} self.redis_db.save_player(dbp) return dbp return None @@ -921,17 +937,40 @@ class XiuxianPlugin(MessagePluginInterface): return False, "未注册" player = self._check_status_update(player) points = int(player.get("cultivation_points", 0)) - inv = player.get("inventory") or {} + # 优化:从数据库读取最新的背包数据,确保数据准确性 + pill_item_count = 0 + if self.xdb: + try: + items = self.xdb.get_inventory(sender) + for item in items: + if item["name"] == self.bt_pill_item: + pill_item_count = item["quantity"] + break + except Exception as e: + logger.warning(f"读取背包数据失败: {e}, user_id={sender}") + # 降级到使用内存中的inventory + inv = player.get("inventory") or {} + pill_item_count = inv.get(self.bt_pill_item, 0) + else: + inv = player.get("inventory") or {} + pill_item_count = inv.get(self.bt_pill_item, 0) + # 读取当前瓶颈配置 cur_realm = player.get("realm", "炼气1层") prefix, layer = self._parse_realm(cur_realm) - stage_key = f"{prefix}10层" - stage_conf = self.break_config.get(stage_key) - if not stage_conf: - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender) + # 优化:检查是否真的达到10层 + if layer is None or layer < 10: + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界为{cur_realm},需达到{prefix}10层才能突破", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "未到瓶颈" + stage_key = f"{prefix}10层" + stage_conf = self.break_config.get(stage_key) + if not stage_conf: + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未配置突破路径", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + return False, "未配置突破" pill_conf = stage_conf.get("pill") if not pill_conf: client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "丹药路径未配置", sender) @@ -943,12 +982,14 @@ class XiuxianPlugin(MessagePluginInterface): if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "修为不足" - if inv.get(self.bt_pill_item, 0) <= 0: + if pill_item_count <= 0: client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"缺少丹药:{self.bt_pill_item}", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "缺少丹药" - inv[self.bt_pill_item] = inv.get(self.bt_pill_item, 0) - 1 + # 更新内存中的inventory(用于缓存) + inv = player.get("inventory") or {} + inv[self.bt_pill_item] = pill_item_count - 1 player["inventory"] = inv player["cultivation_points"] = points - pill_conf["cost"] if self.xdb: @@ -956,8 +997,8 @@ class XiuxianPlugin(MessagePluginInterface): self.xdb.remove_item(sender, self.bt_pill_item, 1) self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) - except Exception: - pass + except Exception as e: + logger.warning(f"突破时更新数据库失败: {e}, user_id={sender}") roll = random.random() if roll < pill_conf["rate"]: # 成功,更新境界并排行榜 @@ -989,13 +1030,19 @@ class XiuxianPlugin(MessagePluginInterface): # 读取当前瓶颈配置 cur_realm = player.get("realm", "炼气1层") prefix, layer = self._parse_realm(cur_realm) - stage_key = f"{prefix}10层" - stage_conf = self.break_config.get(stage_key) - if not stage_conf: - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender) + # 优化:检查是否真的达到10层 + if layer is None or layer < 10: + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界为{cur_realm},需达到{prefix}10层才能强行突破", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "未到瓶颈" + stage_key = f"{prefix}10层" + stage_conf = self.break_config.get(stage_key) + if not stage_conf: + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未配置突破路径", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + return False, "未配置突破" hard_conf = stage_conf.get("hard") if not hard_conf: client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "强行路径未配置", sender) @@ -1012,8 +1059,8 @@ class XiuxianPlugin(MessagePluginInterface): try: self.xdb.update_player_fields(sender, {"cultivation_points": player["cultivation_points"]}) self.redis_db.invalidate_player(sender, player.get("group_id", "")) - except Exception: - pass + except Exception as e: + logger.warning(f"强行突破时更新数据库失败: {e}, user_id={sender}") roll = random.random() if roll < hard_conf["rate"]: self._set_realm(sender, player, hard_conf["target"])