From 254081a286375016b70cf2fc76339879305bcb37 Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 27 Nov 2025 16:54:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B5=A0=E9=80=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/xiuxian/main.py | 63 ++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index fd4f74e..37786bb 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -561,7 +561,7 @@ class XiuxianPlugin(MessagePluginInterface): ok, msg = await self._cmd_give_stone(bot, sender, roomid, content) return ok, msg if cmd == "赠送": - ok, msg = await self._cmd_give_item(bot, sender, roomid, content) + ok, msg = await self._cmd_give_item(bot, sender, roomid, content, message) return ok, msg if cmd == "创建门派": ok, msg = await self._cmd_clan_create(bot, sender, roomid, content) @@ -1786,24 +1786,49 @@ class XiuxianPlugin(MessagePluginInterface): return True, "赠与成功" - async def _cmd_give_item(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: + async def _cmd_give_item(self, bot: WechatAPIClient, sender: str, roomid: str, content: str, message: Dict[str, Any]) -> Tuple[bool, str]: parts = content.strip().split() - if len(parts) < 3: - # client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", 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, "道友施法有误,指令格式不对" - target = parts[0].lstrip("@") - item_name = parts[1] - try: - qty = int(parts[2]) - except Exception: - # client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", sender) - # if self.revoke: - # self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + if len(parts) < 1: return False, "道友施法有误,指令格式不对" + msg = message.get("full_wx_msg") + xml = getattr(msg, "msg_source", None) if msg else None + target_wxid = None + if roomid and xml: + try: + import xml.etree.ElementTree as ET + import re + root = ET.fromstring(xml) + at_el = root.find('.//atuserlist') + text = (at_el.text if at_el is not None else '').strip() + text = text.strip(',') + text = re.sub(r'\s+', '', text) + at_set = set(text.split(',')) + at_set.discard('') + if len(at_set) != 1: + await self._send_text_with_status(bot, sender, roomid, "请@一个明确的目标进行赠送", 90) + return False, "目标无效" + target_wxid = next(iter(at_set)) + tokens = [t for t in parts if not t.startswith('@')] + if len(tokens) < 2: + return False, "道友施法有误,指令格式不对" + item_name = tokens[0] + try: + qty = int(tokens[1]) + except Exception: + return False, "道友施法有误,指令格式不对" + except Exception: + pass + if not target_wxid: + if len(parts) < 3: + return False, "道友施法有误,指令格式不对" + target_wxid = parts[0].lstrip('@') + item_name = parts[1] + try: + qty = int(parts[2]) + except Exception: + return False, "道友施法有误,指令格式不对" giver = self._get_player(sender, roomid or "") - receiver = self._get_player(target, roomid or "") + receiver = self._get_player(target_wxid, 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: @@ -1820,16 +1845,16 @@ class XiuxianPlugin(MessagePluginInterface): giver["inventory"] = inv_g receiver["inventory"] = inv_r if self.xdb: - ok = self.xdb.transfer_item(sender, target, item_name, qty) + ok = self.xdb.transfer_item(sender, target_wxid, item_name, qty) if not ok: await self._send_text_with_status(bot, sender, roomid, "物品转移不成", 90) return False, "转移失败" self.redis_db.invalidate_player(sender, giver.get("group_id", "")) - self.redis_db.invalidate_player(target, receiver.get("group_id", "")) + self.redis_db.invalidate_player(target_wxid, receiver.get("group_id", "")) self._save_player(giver) self._save_player(receiver) self._rate_set(sender, roomid or "", "赠送") - await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {target} 赠送 {item_name} × {qty}", 90) + await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {receiver.get("dao_name", "")} 赠送 {item_name} × {qty}", 90) return True, "赠送成功" async def _cmd_clan_create(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: