From 64e7e82712dd9ade1fa0e93e5e443b2968774e1e Mon Sep 17 00:00:00 2001 From: liuwei Date: Mon, 20 Apr 2026 11:44:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A7=AF=E5=88=86=E6=B5=81?= =?UTF-8?q?=E6=B0=B4=E5=86=99=E5=85=A5=E4=B8=BA=E6=98=B5=E7=A7=B0=E4=BC=98?= =?UTF-8?q?=E5=85=88=E5=B9=B6=E8=A6=86=E7=9B=96=E6=89=93=E5=8A=AB/?= =?UTF-8?q?=E4=BF=9D=E9=87=8A=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/points_db.py | 44 ++++++++++++++++++++++++++++++------- plugins/point_trade/main.py | 43 ++++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 20 deletions(-) diff --git a/db/points_db.py b/db/points_db.py index f4ec22b..4d643e2 100644 --- a/db/points_db.py +++ b/db/points_db.py @@ -321,8 +321,16 @@ class PointsDBOperator(BaseDBOperator): self.LOG.error(f"扣除用户积分失败: {e}") return False, {"error": str(e)} - def transfer_points(self, from_user_id: str, to_user_id: str, group_id: str, - points: int, description: str = None) -> Tuple[bool, Dict]: + def transfer_points( + self, + from_user_id: str, + to_user_id: str, + group_id: str, + points: int, + description: str = None, + from_user_name: str = None, + to_user_name: str = None, + ) -> Tuple[bool, Dict]: """ 转移积分从一个用户到另一个用户 @@ -332,6 +340,8 @@ class PointsDBOperator(BaseDBOperator): group_id: 群组ID points: 积分数量 description: 描述 + from_user_name: 转出用户展示名(可选,优先用于流水描述) + to_user_name: 转入用户展示名(可选,优先用于流水描述) Returns: (成功标志, 结果信息) @@ -340,10 +350,15 @@ class PointsDBOperator(BaseDBOperator): return False, {"error": "积分必须为正数"} try: + # 流水描述统一使用“昵称优先,ID兜底”策略: + # 1. 业务层可显式传入昵称; + # 2. 未传时回落到 user_id,确保兼容旧调用方。 + from_display_name = str(from_user_name or from_user_id) + to_display_name = str(to_user_name or to_user_id) # 先扣除转出用户积分 success, result = self.deduct_points( from_user_id, group_id, points, - PointSource.TRADE, f"转账给用户 {to_user_id}: {description}" + PointSource.TRADE, f"转账给用户 {to_display_name}: {description}" ) if not success: @@ -352,14 +367,14 @@ class PointsDBOperator(BaseDBOperator): # 再增加转入用户积分 success, to_result = self.add_points( to_user_id, group_id, points, - PointSource.TRADE, f"收到用户 {from_user_id} 的转账: {description}" + PointSource.TRADE, f"收到用户 {from_display_name} 的转账: {description}" ) if not success: # 如果增加失败,回滚扣除操作 self.add_points( from_user_id, group_id, points, - PointSource.TRADE, f"转账失败退回: {description}" + PointSource.TRADE, f"转账失败退回: {description}", ) return False, to_result @@ -634,7 +649,14 @@ class PointsDBOperator(BaseDBOperator): self.LOG.error(f"检查用户在押状态失败: {e}") return None - def bailout_user(self, prisoner_id: str, bailout_user_id: str, group_id: str) -> Tuple[bool, str]: + def bailout_user( + self, + prisoner_id: str, + bailout_user_id: str, + group_id: str, + prisoner_name: str = None, + bailout_user_name: str = None, + ) -> Tuple[bool, str]: """保释用户 Returns: (bool, str): (是否成功, 错误信息) @@ -647,7 +669,13 @@ class PointsDBOperator(BaseDBOperator): # 扣除保释金 success, result = self.transfer_points( - bailout_user_id, "SYSTEM", group_id, 30, "保释金" + bailout_user_id, + "SYSTEM", + group_id, + 30, + f"为{str(prisoner_name or prisoner_id)}支付保释金", + from_user_name=bailout_user_name, + to_user_name="系统", ) if not success: return False, result.get("error", "保释失败") @@ -662,4 +690,4 @@ class PointsDBOperator(BaseDBOperator): return True, "保释成功" except Exception as e: self.LOG.error(f"保释用户失败: {e}") - return False, f"保释失败: {str(e)}" \ No newline at end of file + return False, f"保释失败: {str(e)}" diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index 5cb2063..15b64c1 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -209,10 +209,21 @@ class PointTradePlugin(MessagePluginInterface): group_id = roomid try: + # 先解析双方昵称,再执行转账: + # 这样流水入库时可以直接使用昵称,避免写入 wxid。 + from_user_info = self._get_user_record(trader_wxid, group_id) + to_user_info = self._get_user_record(target_wxid, group_id) + + from_user_name = from_user_info.get('wx_nick_name', trader_wxid) if from_user_info else trader_wxid + to_user_name = to_user_info.get('wx_nick_name', target_wxid) if to_user_info else target_wxid + # 使用积分系统进行转账 success, result = self.points_db.transfer_points( trader_wxid, target_wxid, group_id, - reward_points, f"积分转账命令执行" + reward_points, + "积分转账命令执行", + from_user_name=from_user_name, + to_user_name=to_user_name, ) if not success: @@ -236,13 +247,6 @@ class PointTradePlugin(MessagePluginInterface): from_user = result.get("from_user", {}) to_user = result.get("to_user", {}) - # 获取用户昵称 - from_user_info = self._get_user_record(trader_wxid, group_id) - to_user_info = self._get_user_record(target_wxid, group_id) - - from_user_name = from_user_info.get('wx_nick_name', trader_wxid) if from_user_info else trader_wxid - to_user_name = to_user_info.get('wx_nick_name', target_wxid) if to_user_info else target_wxid - output = ( f"✅积分转账成功!\n" f"👤{from_user_name} 转给 👤{to_user_name} {reward_points} 积分\n" @@ -644,13 +648,19 @@ class PointTradePlugin(MessagePluginInterface): # 执行积分转移(从目标到打劫者) success, result = self.points_db.transfer_points( target_wxid, robber_wxid, roomid, - actual_rob_amount, f"被{robber_name}打劫" + actual_rob_amount, + f"被{robber_name}打劫", + from_user_name=target_name, + to_user_name=robber_name, ) # 执行抽水(从目标到SYSTEM) tax_success, tax_result = self.points_db.transfer_points( target_wxid, "SYSTEM", roomid, - tax_amount, f"打劫抽水" + tax_amount, + "打劫抽水", + from_user_name=target_name, + to_user_name="系统", ) if success and tax_success: @@ -685,7 +695,10 @@ class PointTradePlugin(MessagePluginInterface): # 记录积分变动 success, result = self.points_db.transfer_points( robber_wxid, target_wxid, roomid, - penalty_amount, f"打劫{target_name}失败的惩罚" + penalty_amount, + f"打劫{target_name}失败的惩罚", + from_user_name=robber_name, + to_user_name=target_name, ) if success: @@ -768,7 +781,13 @@ class PointTradePlugin(MessagePluginInterface): bailout_name = bailout_info.get('wx_nick_name', bailout_wxid) if bailout_info else bailout_wxid # 执行保释 - success, message = self.points_db.bailout_user(prisoner_wxid, bailout_wxid, roomid) + success, message = self.points_db.bailout_user( + prisoner_wxid, + bailout_wxid, + roomid, + prisoner_name=prisoner_name, + bailout_user_name=bailout_name, + ) if success: output = (