From 28d282619e4a30041a6d0ea35e6dcfd928a14a10 Mon Sep 17 00:00:00 2001 From: liuwei Date: Tue, 25 Nov 2025 10:52:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8C=87=E4=BB=A4=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=9B=9E=E5=A4=8D=E7=8A=B6=E6=80=81=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E7=94=A8=E6=88=B7=E8=BF=87=E5=BA=A6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/xiuxian/main.py | 521 +++++++++++++++++++++------------------- 1 file changed, 271 insertions(+), 250 deletions(-) diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index 25cbd56..762d73c 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -26,8 +26,10 @@ from db.xiuxian_db import XiuxianDB from db.points_db import PointsDBOperator, PointSource from datetime import timezone + class XiuxianRedisDB: """修仙插件的 Redis 访问封装:玩家缓存、限流键与排行榜。""" + def __init__(self, db_manager: DBConnectionManager): self.db_manager = db_manager self.player_prefix = "xiuxian:cache:player:" @@ -54,7 +56,7 @@ class XiuxianRedisDB: if isinstance(data, bytes): data = data.decode("utf-8") return json.loads(data) - + # 兼容旧格式:xiuxian:cache:player:{user_id} old_key = f"{self.player_prefix}{user_id}" data = r.get(old_key) @@ -82,7 +84,7 @@ class XiuxianRedisDB: group_id = player.get("group_id", "") new_key = f"{self.player_prefix}{group_id}:{user_id}" old_key = f"{self.player_prefix}{user_id}" - + # 保存到新格式 r.set(new_key, json.dumps(player, ensure_ascii=False)) # 删除旧格式(如果存在),确保数据一致性 @@ -137,7 +139,7 @@ class XiuxianRedisDB: now = datetime.now(timezone.utc) date_str = now.strftime("%Y-%m-%d") date_key = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}:date:{date_str}" - + key_no_date = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}" if r.exists(date_key) == 1 or r.exists(key_no_date) == 1: return True @@ -251,7 +253,7 @@ class XiuxianPlugin(MessagePluginInterface): self.LOG.error(f"修仙表结构初始化失败: {e}") cfg = self._config.get("Xiuxian", {}) - self._commands = cfg.get("command", ["注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜"]) + self._commands = cfg.get("command", ["注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜"]) self.command_format = cfg.get("command-format", "注册修仙 道号 | 我的状态 | 闭关 | 出关 | 聚灵 数量 | 排行榜") self.enable = cfg.get("enable", True) @@ -289,7 +291,7 @@ class XiuxianPlugin(MessagePluginInterface): cult_cfg = cfg.get("cultivation", {}) self.base_rate_per_hour = cult_cfg.get("base_rate_per_hour", 100) - self.spirit_roots_cfg = cult_cfg.get("spirit_roots", ["凡灵根:1.0", "天灵根:2.0"]) + self.spirit_roots_cfg = cult_cfg.get("spirit_roots", ["凡灵根:1.0", "天灵根:2.0"]) self.spirit_roots = [] for item in self.spirit_roots_cfg: try: @@ -342,7 +344,8 @@ class XiuxianPlugin(MessagePluginInterface): else: mn, q = kv, "1" mats[mn.strip()] = int(q.strip()) - self.recipes[name] = {"materials": mats, "stone": int(stone_part.strip()), "rate": float(rate_part.strip())} + self.recipes[name] = {"materials": mats, "stone": int(stone_part.strip()), + "rate": float(rate_part.strip())} except Exception as e: self.LOG.warning(f"解析配方失败: {r}, 错误: {e}") @@ -365,14 +368,14 @@ class XiuxianPlugin(MessagePluginInterface): "渡劫": "50000000,80,飞升丹,0.02,0.001,2.0", "真仙": "0,100,,0,0,0" } - + self.realm_score_map = {} # 境界分值映射 self.layer_threshold_map = {} # 每层修为阈值 self.break_config = {} # 突破配置:{境界10层: {pill: {...}, hard: {...}}} - + # 境界顺序(用于计算下一个境界) realm_order = ["炼气", "筑基", "金丹", "元婴", "化神", "合体", "大乘", "渡劫", "真仙"] - + self.LOG.info(f"开始解析境界配置,共{len(realms_cfg)}个境界") for realm_name, config_str in realms_cfg.items(): try: @@ -381,22 +384,22 @@ class XiuxianPlugin(MessagePluginInterface): if len(parts) < 6: self.LOG.warning(f"境界配置格式错误: {realm_name}={config_str}") continue - + layer_threshold = int(parts[0].strip()) realm_score = int(parts[1].strip()) pill_item = parts[2].strip() if parts[2].strip() else None pill_rate = float(parts[3].strip()) if parts[3].strip() else 0.0 hard_rate = float(parts[4].strip()) if parts[4].strip() else 0.0 hard_multiplier = float(parts[5].strip()) if parts[5].strip() else 2.0 - + # 存储层级阈值和境界分值 self.layer_threshold_map[realm_name] = layer_threshold self.realm_score_map[realm_name] = realm_score - + # 计算突破要求:达到10层需要9层×每层阈值 breakthrough_cost = 9 * layer_threshold hard_breakthrough_cost = int(breakthrough_cost * hard_multiplier) - + # 计算下一个境界 next_realm = None if realm_name != "真仙": @@ -406,12 +409,12 @@ class XiuxianPlugin(MessagePluginInterface): next_realm = realm_order[current_idx + 1] except ValueError: pass - + # 构建突破配置 if next_realm and layer_threshold > 0: stage_key = f"{realm_name}10层" self.break_config[stage_key] = {} - + # 丹药突破路径 if pill_item and pill_rate > 0: self.break_config[stage_key]["pill"] = { @@ -420,7 +423,7 @@ class XiuxianPlugin(MessagePluginInterface): "target": f"{next_realm}1层", "item": pill_item } - + # 强行突破路径 if hard_rate > 0: self.break_config[stage_key]["hard"] = { @@ -428,10 +431,10 @@ class XiuxianPlugin(MessagePluginInterface): "rate": hard_rate, "target": f"{next_realm}2层" } - + except Exception as e: self.LOG.warning(f"解析境界配置失败: {realm_name}={config_str}, 错误: {e}") - + self.LOG.info(f"境界配置解析完成:层级阈值{len(self.layer_threshold_map)}个,突破配置{len(self.break_config)}个") self.LOG.info(f"[{self.name}] 插件初始化完成,指令:{self._commands}") return True @@ -478,67 +481,97 @@ class XiuxianPlugin(MessagePluginInterface): return False, "不匹配的命令" if not self.redis_db: - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "❌ 天道失序,仙府未初始化(Redis)", sender) + text = "❌ 天道失序,仙府未初始化(Redis)" + self._compose_status_text(sender, roomid) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), text, + sender) if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, + new_msg_id, 5) return False, "Redis未初始化" # 限流:默认按用户+群维度;历练按用户全局维度 - + if self.redis_db.check_rate_limited(sender, roomid or "", cmd): - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 道友莫急,天道有序,稍候再试", sender) + text = "⚠️ 道友莫急,天道有序,稍候再试" + self._compose_status_text(sender, roomid) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), text, + sender) if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, + new_msg_id, 5) return False, "限流" if cmd == "注册修仙": - return await self._cmd_register(bot, sender, roomid, content) + ok, msg = await self._cmd_register(bot, sender, roomid, content) + return ok, msg if cmd in ("修仙帮助", "帮助", "help", "修仙指令", "指令"): - return await self._cmd_help(bot, sender, roomid) + ok, msg = await self._cmd_help(bot, sender, roomid) + return ok, msg if cmd in ("积分购石", "积分换灵石"): - return await self._cmd_points_to_stone(bot, sender, roomid, content) + ok, msg = await self._cmd_points_to_stone(bot, sender, roomid, content) + return ok, msg if cmd == "我的状态": - return await self._cmd_status(bot, sender, roomid) + ok, msg = await self._cmd_status(bot, sender, roomid) + return ok, msg if cmd == "闭关": - return await self._cmd_cultivate(bot, sender, roomid) + ok, msg = await self._cmd_cultivate(bot, sender, roomid) + return ok, msg if cmd == "出关": - return await self._cmd_finish_cultivate(bot, sender, roomid) + ok, msg = await self._cmd_finish_cultivate(bot, sender, roomid) + return ok, msg if cmd == "聚灵": - return await self._cmd_gather(bot, sender, roomid, content) + ok, msg = await self._cmd_gather(bot, sender, roomid, content) + return ok, msg if cmd == "排行榜": - return await self._cmd_leaderboard(bot, sender, roomid) + ok, msg = await self._cmd_leaderboard(bot, sender, roomid) + return ok, msg if cmd == "修仙签到": - return await self._cmd_signin(bot, sender, roomid) + ok, msg = await self._cmd_signin(bot, sender, roomid) + return ok, msg if cmd == "坊市": - return await self._cmd_shop(bot, sender, roomid) + ok, msg = await self._cmd_shop(bot, sender, roomid) + return ok, msg if cmd == "购买": - return await self._cmd_buy(bot, sender, roomid, content) + ok, msg = await self._cmd_buy(bot, sender, roomid, content) + return ok, msg if cmd == "出售": - return await self._cmd_sell(bot, sender, roomid, content) + ok, msg = await self._cmd_sell(bot, sender, roomid, content) + return ok, msg if cmd == "乾坤袋": - return await self._cmd_bag(bot, sender, roomid) + ok, msg = await self._cmd_bag(bot, sender, roomid) + return ok, msg if cmd in ("使用", "服用"): - return await self._cmd_use(bot, sender, roomid, content) + ok, msg = await self._cmd_use(bot, sender, roomid, content) + return ok, msg if cmd == "出门历练": - return await self._cmd_expedition(bot, sender, roomid) + ok, msg = await self._cmd_expedition(bot, sender, roomid) + return ok, msg if cmd == "炼丹": - return await self._cmd_alchemy(bot, sender, roomid, content) + ok, msg = await self._cmd_alchemy(bot, sender, roomid, content) + return ok, msg if cmd == "突破": - return await self._cmd_breakthrough(bot, sender, roomid) + ok, msg = await self._cmd_breakthrough(bot, sender, roomid) + return ok, msg if cmd == "强行突破": - return await self._cmd_force_breakthrough(bot, sender, roomid) + ok, msg = await self._cmd_force_breakthrough(bot, sender, roomid) + return ok, msg if cmd == "劫掠": - return await self._cmd_rob(bot, sender, roomid, content) + ok, msg = await self._cmd_rob(bot, sender, roomid, content) + return ok, msg if cmd == "赠与": - return await self._cmd_give_stone(bot, sender, roomid, content) + ok, msg = await self._cmd_give_stone(bot, sender, roomid, content) + return ok, msg if cmd == "赠送": - return await self._cmd_give_item(bot, sender, roomid, content) + ok, msg = await self._cmd_give_item(bot, sender, roomid, content) + return ok, msg if cmd == "创建门派": - return await self._cmd_clan_create(bot, sender, roomid, content) + ok, msg = await self._cmd_clan_create(bot, sender, roomid, content) + return ok, msg if cmd == "加入门派": - return await self._cmd_clan_join(bot, sender, roomid, content) + ok, msg = await self._cmd_clan_join(bot, sender, roomid, content) + return ok, msg if cmd == "退出门派": - return await self._cmd_clan_exit(bot, sender, roomid) + ok, msg = await self._cmd_clan_exit(bot, sender, roomid) + return ok, msg return False, "未知命令" @@ -606,10 +639,13 @@ class XiuxianPlugin(MessagePluginInterface): self._save_player(player) self._rate_set(sender, roomid or "", "注册修仙") # 初始化境界排行榜分值 - self.redis_db.leaderboard_realm_add(sender, float(self._realm_score(player["realm"])) ) - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 入道已定,道号:{dao_name}\n灵根:{root_name}", sender) + self.redis_db.leaderboard_realm_add(sender, float(self._realm_score(player["realm"]))) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), + f"✅ 入道已定,道号:{dao_name}\n灵根:{root_name}", + sender) if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, + 10) return True, "注册成功" async def _cmd_help(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -640,7 +676,8 @@ class XiuxianPlugin(MessagePluginInterface): # self._rate_set(sender, "帮助") return True, "帮助" - async def _cmd_points_to_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: + async def _cmd_points_to_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[ + bool, str]: if not self.points_db: # client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "系统未初始化积分模块", sender) # if self.revoke: @@ -682,9 +719,8 @@ class XiuxianPlugin(MessagePluginInterface): player["spirit_stone"] = int(player.get("spirit_stone", 0)) + stones_gain self._save_player(player) self._rate_set(sender, roomid or "", "积分购石") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 积分化石,消耗{pts},得灵石{stones_gain}({rate}分=1石)", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, + f"✅ 积分化石,消耗{pts},得灵石{stones_gain}({rate}分=1石)", 10) return True, "积分购石" async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -709,12 +745,44 @@ class XiuxianPlugin(MessagePluginInterface): f"💎 灵石:{player.get('spirit_stone')}枚\n" f"💚 状态:{status_cn}" ) - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), msg, sender) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), msg, + sender) if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20) + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, + 20) self._rate_set(sender, roomid or "", "我的状态") return True, "状态展示" + def _compose_status_text(self, sender: str, roomid: str) -> str: + player = self._get_player_with_cache(sender, roomid or "") + if not player: + return "" + player = self._check_status_update(player) + status_code = player.get("status") + status_cn = { + "Idle": "空闲", + "Cultivating": "闭关", + "Unstable_Qi": "气息不稳", + "Injured": "受伤保护", + "Expedition": "历练" + }.get(status_code, str(status_code)) + return ( + f"\n—— 当前状态 ——\n" + f"📇 道号:{player.get('dao_name')}【{player.get('spirit_root')}】\n" + f"✨ 境界:{player.get('realm')}(修为:{player.get('cultivation_points')}点)\n" + f"💎 灵石:{player.get('spirit_stone')}枚\n" + f"💚 状态:{status_cn}" + ) + + async def _send_text_with_status(self, bot: WechatAPIClient, sender: str, roomid: str, main_text: str, + revoke_seconds: int = 10): + status_text = self._compose_status_text(sender, roomid) + text = main_text + (status_text if status_text else "") + client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, text, sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, + revoke_seconds) + async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: player = self._get_player_with_cache(sender, roomid or "") if not player: @@ -731,23 +799,19 @@ class XiuxianPlugin(MessagePluginInterface): return False, "重复闭关" if status not in ("Idle", "Injured"): status_cn = { - "Idle": "空闲", - "Cultivating": "闭关", - "Unstable_Qi": "气息不稳", - "Injured": "受伤保护", - "Expedition": "历练" + "Idle": "空闲", + "Cultivating": "闭关", + "Unstable_Qi": "气息不稳", + "Injured": "受伤保护", + "Expedition": "历练" }.get(status, str(status)) - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"当前状态[{status_cn}]不宜闭关", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + await self._send_text_with_status(bot, sender, roomid, f"当前状态[{status_cn}]不宜闭关", 10) return False, "状态不可闭关" player["status"] = "Cultivating" player["last_cultivate_time"] = datetime.now(timezone.utc).isoformat() self._save_player(player) self._rate_set(sender, roomid or "", "闭关") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "✅ 已入静闭关,期间天道护持,不可被劫", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, "✅ 已入静闭关,期间天道护持,不可被劫", 10) return True, "闭关成功" async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -790,9 +854,9 @@ class XiuxianPlugin(MessagePluginInterface): self._auto_layer_up(sender, player) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self._rate_set(sender, roomid or "", "出关") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 出关一朝,修为进益:{gain}({duration_hours:.1f}小时)\n现有修为:{player['cultivation_points']}\n状态:气息未平 {self.unstable_qi_minutes}分钟", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20) + await self._send_text_with_status(bot, sender, roomid, + f"✅ 出关一朝,修为进益:{gain}({duration_hours:.1f}小时)\n现有修为:{player['cultivation_points']}\n状态:气息未平 {self.unstable_qi_minutes}分钟", + 10) return True, "出关结算" async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: @@ -845,9 +909,7 @@ class XiuxianPlugin(MessagePluginInterface): self._auto_layer_up(sender, player) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self._rate_set(sender, roomid or "", "聚灵") - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 灵气入体,消耗灵石{qty},修为涨{gain}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 灵气入体,消耗灵石{qty},修为涨{gain}", 10) return True, "聚灵成功" async def _cmd_leaderboard(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -861,9 +923,8 @@ class XiuxianPlugin(MessagePluginInterface): mark = "你" if uid == sender else "" lines.append(f"{rank}. {nick} - 修为 {cp} {mark}") rank += 1 - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), + "\n".join(lines), sender) self._rate_set(sender, roomid or "", "排行榜") return True, "排行榜" @@ -873,7 +934,8 @@ class XiuxianPlugin(MessagePluginInterface): def _save_player(self, player: Dict[str, Any]): if self.xdb: fields = {} - for k in ("group_id","dao_name","realm","spirit_root","cultivation_points","spirit_stone","status","status_until","last_cultivate_time","clan_id"): + for k in ("group_id", "dao_name", "realm", "spirit_root", "cultivation_points", "spirit_stone", "status", + "status_until", "last_cultivate_time", "clan_id"): if k in player: fields[k] = player[k] try: @@ -993,18 +1055,14 @@ class XiuxianPlugin(MessagePluginInterface): player["spirit_stone"] = int(player.get("spirit_stone", 0)) + reward self._save_player(player) self._rate_set(sender, roomid or "", "签到") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵运昌盛,获灵石{reward}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 灵运昌盛,获灵石{reward}", 10) return True, "签到成功" async def _cmd_shop(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: lines = ["🛒 坊市陈列"] for item in self.shop_items: lines.append(f"{item['name']} [{item['type']}] - {item['price']}灵石") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20) + await self._send_text_with_status(bot, sender, roomid, "\n".join(lines), 10) self._rate_set(sender, roomid or "", "坊市") return True, "坊市" @@ -1049,15 +1107,14 @@ class XiuxianPlugin(MessagePluginInterface): player["inventory"] = inv if self.xdb: try: - 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) + 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 self._save_player(player) self._rate_set(sender, roomid or "", "购买") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已购得 {item_name} × {qty}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已购得 {item_name} × {qty}", 10) return True, "购买成功" async def _cmd_sell(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: @@ -1088,14 +1145,13 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: try: self.xdb.remove_item(sender, item_name, qty) - self.xdb.update_player_fields(sender, player.get("group_id", ""), {"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) self._rate_set(sender, roomid or "", "出售") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已出手 {item_name} × {qty},入账灵石{revenue}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已出手 {item_name} × {qty},入账灵石{revenue}", 10) return True, "出售成功" async def _cmd_bag(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -1118,9 +1174,7 @@ class XiuxianPlugin(MessagePluginInterface): else: for it in items: lines.append(f"{it['name']} × {it['quantity']}") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20) + await self._send_text_with_status(bot, sender, roomid, "\n".join(lines), 10) self._rate_set(sender, roomid or "", "背包") return True, "背包" @@ -1129,11 +1183,14 @@ class XiuxianPlugin(MessagePluginInterface): if not player: return False, "道友尚未踏入仙途,请先发送:注册修仙 道号" if self.redis_db.check_rate_limited(sender, "__global__", "出门历练"): - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 天机不可泄,今日行程已定,稍候再试", sender) + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else 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) + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, + new_msg_id, 5) return False, "限流" - + player = self._check_status_update(player) st = player.get("status", "Idle") if st in ("Cultivating", "Injured", "Expedition"): @@ -1276,7 +1333,11 @@ class XiuxianPlugin(MessagePluginInterface): player["status_until"] = final_until if self.xdb: try: - self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"], "cultivation_points": player.get("cultivation_points", 0), "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"], + "cultivation_points": player.get("cultivation_points", 0), + "status": player.get("status"), + "status_until": player.get("status_until")}) for k, v in mats_gain.items(): self.xdb.add_item(sender, k, "材料", v) except Exception: @@ -1289,9 +1350,7 @@ class XiuxianPlugin(MessagePluginInterface): msg = f"✅ 行走四方所得:灵石{total_stones_delta},修为{cult_gain},材料:{mats_text}\n遭遇:{'、'.join(happened)}" else: msg = f"✅ 行走四方所得:灵石{total_stones_delta},材料:{mats_text}\n遭遇:{'、'.join(happened)}" - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, msg, sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 90) + await self._send_text_with_status(bot, sender, roomid, msg, 10) return True, "历练成功" async def _cmd_use(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: @@ -1317,9 +1376,7 @@ class XiuxianPlugin(MessagePluginInterface): pass self._save_player(player) self._rate_set(sender, roomid or "", "使用") - 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, 10) + await self._send_text_with_status(bot, sender, roomid, "✅ 符文已启,本次聚灵更为顺畅", 10) return True, "使用聚灵符" if item_name == "回气丹": status = player.get("status", "Idle") @@ -1336,9 +1393,7 @@ class XiuxianPlugin(MessagePluginInterface): pass self._save_player(player) self._rate_set(sender, roomid or "", "使用") - 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, 10) + await self._send_text_with_status(bot, sender, roomid, "✅ 服下回气丹,气息平稳,恢复空闲", 10) return True, "服用回气丹" # 灵根提升丹药 upgrade_map = { @@ -1372,19 +1427,17 @@ class XiuxianPlugin(MessagePluginInterface): player["spirit_root_mult"] = mult self._save_player(player) self._rate_set(sender, roomid or "", "使用") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵根蜕变,当前灵根:{target}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 灵根蜕变,当前灵根:{target}", 10) return True, "灵根提升成功" else: # 失败,受伤保护 player["status"] = "Injured" - player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])) .isoformat() + player["status_until"] = ( + datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])).isoformat() self._save_player(player) self._rate_set(sender, roomid or "", "使用") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌ 灵根淬炼失利,灵气反噬,受伤{rule['injured_min']}分钟", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, + f"❌ 灵根淬炼失利,灵气反噬,受伤{rule['injured_min']}分钟", 10) return False, "灵根提升失败" return False, "不可使用的物品" @@ -1429,10 +1482,13 @@ class XiuxianPlugin(MessagePluginInterface): player["inventory"] = inv if fail > 0: player["status"] = "Unstable_Qi" - player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat() + 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, player.get("group_id", ""), {"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(): @@ -1443,9 +1499,8 @@ class XiuxianPlugin(MessagePluginInterface): self._save_player(player) self._rate_set(sender, roomid or "", "炼丹") msg = f"✅ 丹炉开盖,成丹{success},走丹{fail}" - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, msg, sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, msg, 10) + return True, "炼丹完成" async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -1457,38 +1512,33 @@ class XiuxianPlugin(MessagePluginInterface): return False, "道友尚未踏入仙途,请先发送:注册修仙 道号" player = self._check_status_update(player) points = int(player.get("cultivation_points", 0)) - + # 读取当前瓶颈配置 cur_realm = player.get("realm", "炼气1层") prefix, layer = self._parse_realm(cur_realm) # 优化:检查是否真的达到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) + await self._send_text_with_status(bot, sender, roomid, f"当前境界:{cur_realm},唯有至{prefix}10层方可冲关", + 10) 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) + await self._send_text_with_status(bot, sender, roomid, "此境瓶颈暂未开示,无法突破", 10) 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) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + await self._send_text_with_status(bot, sender, roomid, "丹道途径未明,暂不可试", 10) + return False, "未配置" - + # 从配置中获取丹药名称 pill_item_name = pill_conf.get("item") if not pill_item_name: - 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) + await self._send_text_with_status(bot, sender, roomid, "缺少突破丹药的指引", 10) + return False, "丹药未配置" - + # 优化:从数据库读取最新的背包数据,确保数据准确性 pill_item_count = 0 if self.xdb: @@ -1506,16 +1556,14 @@ class XiuxianPlugin(MessagePluginInterface): else: inv = player.get("inventory") or {} pill_item_count = inv.get(pill_item_name, 0) - + if points < pill_conf["cost"]: - 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) + await self._send_text_with_status(bot, sender, roomid, "底蕴未满,暂不可冲关", 10) + return False, "修为不足" if pill_item_count <= 0: - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"丹药未备:{pill_item_name}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + await self._send_text_with_status(bot, sender, roomid, f"丹药未备:{pill_item_name}", 10) + return False, "缺少丹药" # 更新内存中的inventory(用于缓存) inv = player.get("inventory") or {} @@ -1525,7 +1573,8 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: try: self.xdb.remove_item(sender, pill_item_name, 1) - self.xdb.update_player_fields(sender, player.get("group_id", ""), {"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}") @@ -1535,17 +1584,15 @@ class XiuxianPlugin(MessagePluginInterface): self._set_realm(sender, player, pill_conf["target"]) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self._rate_set(sender, roomid or "", "突破") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 雷霆破关,晋至{pill_conf['target']}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 雷霆破关,晋至{pill_conf['target']}", 10) + return True, "突破成功" else: # 失败时也要保存玩家数据 self._save_player(player) self._rate_set(sender, roomid or "", "突破") - 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) + await self._send_text_with_status(bot, sender, roomid, "❌ 闭关未成,功亏一篑", 10) + return False, "突破失败" async def _cmd_force_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: @@ -1562,32 +1609,30 @@ class XiuxianPlugin(MessagePluginInterface): prefix, layer = self._parse_realm(cur_realm) # 优化:检查是否真的达到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) + await self._send_text_with_status(bot, sender, roomid, + f"当前境界:{cur_realm},至{prefix}10层方能冒险强行冲关", 10) + 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) + await self._send_text_with_status(bot, sender, roomid, "此境瓶颈暂未开示,无法强行冲关", 10) + 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) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + await self._send_text_with_status(bot, sender, roomid, "强行之法未载,难以施为", 10) + return False, "未配置" if points < hard_conf["cost"]: - 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) + await self._send_text_with_status(bot, sender, roomid, "底蕴不足,强行为之只会贻害", 10) + return False, "修为不足" player["cultivation_points"] = points - hard_conf["cost"] if self.xdb: try: - self.xdb.update_player_fields(sender, player.get("group_id", ""), {"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}") @@ -1596,17 +1641,15 @@ class XiuxianPlugin(MessagePluginInterface): self._set_realm(sender, player, hard_conf["target"]) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self._rate_set(sender, roomid or "", "强行突破") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 硬撼瓶颈,勉强晋至{hard_conf['target']}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 硬撼瓶颈,勉强晋至{hard_conf['target']}", 10) + return True, "强行突破成功" else: # 失败时也要保存玩家数据 self._save_player(player) self._rate_set(sender, roomid or "", "强行突破") - 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) + await self._send_text_with_status(bot, sender, roomid, "❌ 强行冲关失败,灵气反噬!", 10) + return False, "强行突破失败" async def _cmd_rob(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: @@ -1633,24 +1676,20 @@ class XiuxianPlugin(MessagePluginInterface): # 新手保护:不可劫掠炼气期 def_prefix, _ = self._parse_realm(defender.get("realm", "炼气1层")) if def_prefix == "炼气": - 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) + await self._send_text_with_status(bot, sender, roomid, "对方新入仙途,天道庇护,暂不可劫", 10) + return False, "新手保护" if defender.get("status") in ("Cultivating", "Injured"): - 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) + await self._send_text_with_status(bot, sender, roomid, "对方正受天道护持或闭关参悟,切莫打扰", 10) + return False, "目标保护" if roomid and (attacker.get("group_id") != roomid or defender.get("group_id") != roomid): - 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) + await self._send_text_with_status(bot, sender, roomid, "只可在同一仙门之境内行劫", 10) + return False, "跨群" if attacker.get("clan_id") and defender.get("clan_id") and attacker.get("clan_id") == defender.get("clan_id"): - 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) + await self._send_text_with_status(bot, sender, roomid, "同门手足,不可相互劫掠", 10) + return False, "同门" a_pts = int(attacker.get("cultivation_points", 0)) d_pts = int(defender.get("cultivation_points", 0)) @@ -1666,79 +1705,79 @@ class XiuxianPlugin(MessagePluginInterface): defender["spirit_stone"] = d_stones - gain attacker["spirit_stone"] = int(attacker.get("spirit_stone", 0)) + gain defender["status"] = "Injured" - defender["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.injured_minutes))).isoformat() + 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"), 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"]}) + 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) self._save_player(attacker) self._rate_set(sender, roomid or "", "劫掠") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 劫掠得手,入账灵石{gain}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 劫掠得手,入账灵石{gain}", 10) if roomid: - g_client_msg_id, g_create_time, g_new_msg_id = await bot.send_text_message(roomid, f"{sender} 劫掠 {target} 得手,目标陷入重创,暂受天道庇护", [target]) + g_client_msg_id, g_create_time, g_new_msg_id = await bot.send_text_message(roomid, + f"{sender} 劫掠 {target} 得手,目标陷入重创,暂受天道庇护", + [target]) if self.revoke: self.revoke.add_message_to_revoke(roomid, g_client_msg_id, g_create_time, g_new_msg_id, 10) return True, "劫掠成功" else: self._rate_set(sender, roomid or "", "劫掠") - 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) + await self._send_text_with_status(bot, sender, roomid, "❌ 劫掠受挫,风声紧,暂且退去", 10) + return False, "劫掠失败" async def _cmd_give_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: parts = content.strip().split() if len(parts) < 2: - 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) + await self._send_text_with_status(bot, sender, roomid, "格式:赠与 目标 数量", 10) + return False, "命令格式错误" target = parts[0].lstrip("@") try: qty = int(parts[1]) except Exception: - 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) + await self._send_text_with_status(bot, sender, roomid, "格式:赠与 目标 数量", 10) + return False, "命令格式错误" giver = self._get_player_with_cache(sender, roomid or "") receiver = self._get_player_with_cache(target, roomid or "") if not giver or not receiver: - 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) + await self._send_text_with_status(bot, sender, roomid, "需双方皆踏入仙途", 10) + return False, "道友尚未踏入仙途,请先发送:注册修仙 道号" if not giver.get("clan_id") or giver.get("clan_id") != receiver.get("clan_id"): - 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) + await self._send_text_with_status(bot, sender, roomid, "灵石只可同门相赠", 10) + return False, "不同门" stones = int(giver.get("spirit_stone", 0)) if qty <= 0 or stones < qty: - 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) + await self._send_text_with_status(bot, sender, roomid, "灵石不足或数量有误", 10) + return False, "灵石不够,修行不可强行为之" giver["spirit_stone"] = stones - qty receiver["spirit_stone"] = int(receiver.get("spirit_stone", 0)) + qty if self.xdb: try: - 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"]}) + 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 self._save_player(giver) self._save_player(receiver) self._rate_set(sender, roomid or "", "赠与") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 相赠灵石 {qty}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {target} 相赠灵石 {qty}", 10) + return True, "赠与成功" async def _cmd_give_item(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: @@ -1766,9 +1805,8 @@ class XiuxianPlugin(MessagePluginInterface): return False, "道友尚未踏入仙途,请先发送:注册修仙 道号" inv_g = giver.get("inventory") or {} if inv_g.get(item_name, 0) < qty or qty <= 0: - 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) + await self._send_text_with_status(bot, sender, roomid, "乾坤袋物品不足或数量有误", 10) + return False, "物品不足" inv_r = receiver.get("inventory") or {} inv_g[item_name] = inv_g.get(item_name, 0) - qty @@ -1778,26 +1816,20 @@ class XiuxianPlugin(MessagePluginInterface): if self.xdb: ok = self.xdb.transfer_item(sender, target, item_name, qty) if not ok: - 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) + await self._send_text_with_status(bot, sender, roomid, "物品转移不成", 10) return False, "转移失败" self.redis_db.invalidate_player(sender, giver.get("group_id", "")) self.redis_db.invalidate_player(target, receiver.get("group_id", "")) self._save_player(giver) self._save_player(receiver) self._rate_set(sender, roomid or "", "赠送") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠送 {item_name} × {qty}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {target} 赠送 {item_name} × {qty}", 10) return True, "赠送成功" async def _cmd_clan_create(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: name = content.strip() if not name: - 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) + await self._send_text_with_status(bot, sender, roomid, "格式:创建门派 名称", 10) return False, "命令格式错误" player = self._get_player_with_cache(sender, roomid or "") if not player: @@ -1808,17 +1840,13 @@ class XiuxianPlugin(MessagePluginInterface): prefix, _ = self._parse_realm(player.get("realm", "炼气1层")) allowed = {"元婴", "化神", "合体", "大乘", "渡劫", "真仙"} if prefix not in allowed: - 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) + await self._send_text_with_status(bot, sender, roomid, "唯元婴以上方可立宗开派", 10) return False, "境界不足" clan_id = None if self.xdb: clan_id = self.xdb.create_clan(name, roomid or "", sender) if clan_id is None: - 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) + await self._send_text_with_status(bot, sender, roomid, "此门已在或因故未成", 10) return False, "门派失败" if player and clan_id is not None: player["clan_id"] = int(clan_id) @@ -1830,31 +1858,27 @@ class XiuxianPlugin(MessagePluginInterface): pass self._save_player(player) self._rate_set(sender, roomid or "", "创建门派") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 山门立成:{name}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 山门立成:{name}", 10) + return True, "创建门派" async def _cmd_clan_join(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: name = content.strip() if not name: - 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) + await self._send_text_with_status(bot, sender, roomid, "格式:加入门派 名称", 10) + return False, "命令格式错误" player = self._get_player_with_cache(sender, roomid or "") if not player: - 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) + await self._send_text_with_status(bot, sender, roomid, "道友尚未踏入仙途,请先发送:注册修仙 道号", 10) + return False, "道友尚未踏入仙途,请先发送:注册修仙 道号" cid = None if self.xdb: cid = self.xdb.get_clan_id(roomid or "", name) if not cid: - 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) + await self._send_text_with_status(bot, sender, roomid, "世间无此门派", 10) + return False, "门派不存在" player["clan_id"] = int(cid) if isinstance(cid, str) else cid if self.xdb: @@ -1865,17 +1889,15 @@ class XiuxianPlugin(MessagePluginInterface): pass self._save_player(player) self._rate_set(sender, roomid or "", "加入门派") - client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已拜入:{name}", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已拜入:{name}", 10) + return True, "加入门派" async def _cmd_clan_exit(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: player = self._get_player_with_cache(sender, roomid or "") if not player: - 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) + await self._send_text_with_status(bot, sender, roomid, "道友尚未踏入仙途,请先发送:注册修仙 道号", 10) + return False, "未注册" player["clan_id"] = None if self.xdb: @@ -1886,7 +1908,6 @@ class XiuxianPlugin(MessagePluginInterface): pass self._save_player(player) self._rate_set(sender, roomid or "", "退出门派") - 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, 10) - return True, "退出门派" \ No newline at end of file + await self._send_text_with_status(bot, sender, roomid, "✅ 已离出山门", 10) + + return True, "退出门派"