优化积分流水写入为昵称优先并覆盖打劫/保释场景
This commit is contained in:
@@ -321,8 +321,16 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
self.LOG.error(f"扣除用户积分失败: {e}")
|
self.LOG.error(f"扣除用户积分失败: {e}")
|
||||||
return False, {"error": str(e)}
|
return False, {"error": str(e)}
|
||||||
|
|
||||||
def transfer_points(self, from_user_id: str, to_user_id: str, group_id: str,
|
def transfer_points(
|
||||||
points: int, description: str = None) -> Tuple[bool, Dict]:
|
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
|
group_id: 群组ID
|
||||||
points: 积分数量
|
points: 积分数量
|
||||||
description: 描述
|
description: 描述
|
||||||
|
from_user_name: 转出用户展示名(可选,优先用于流水描述)
|
||||||
|
to_user_name: 转入用户展示名(可选,优先用于流水描述)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
(成功标志, 结果信息)
|
(成功标志, 结果信息)
|
||||||
@@ -340,10 +350,15 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
return False, {"error": "积分必须为正数"}
|
return False, {"error": "积分必须为正数"}
|
||||||
|
|
||||||
try:
|
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(
|
success, result = self.deduct_points(
|
||||||
from_user_id, group_id, points,
|
from_user_id, group_id, points,
|
||||||
PointSource.TRADE, f"转账给用户 {to_user_id}: {description}"
|
PointSource.TRADE, f"转账给用户 {to_display_name}: {description}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
@@ -352,14 +367,14 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
# 再增加转入用户积分
|
# 再增加转入用户积分
|
||||||
success, to_result = self.add_points(
|
success, to_result = self.add_points(
|
||||||
to_user_id, group_id, points,
|
to_user_id, group_id, points,
|
||||||
PointSource.TRADE, f"收到用户 {from_user_id} 的转账: {description}"
|
PointSource.TRADE, f"收到用户 {from_display_name} 的转账: {description}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
# 如果增加失败,回滚扣除操作
|
# 如果增加失败,回滚扣除操作
|
||||||
self.add_points(
|
self.add_points(
|
||||||
from_user_id, group_id, points,
|
from_user_id, group_id, points,
|
||||||
PointSource.TRADE, f"转账失败退回: {description}"
|
PointSource.TRADE, f"转账失败退回: {description}",
|
||||||
)
|
)
|
||||||
return False, to_result
|
return False, to_result
|
||||||
|
|
||||||
@@ -634,7 +649,14 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
self.LOG.error(f"检查用户在押状态失败: {e}")
|
self.LOG.error(f"检查用户在押状态失败: {e}")
|
||||||
return None
|
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:
|
Returns:
|
||||||
(bool, str): (是否成功, 错误信息)
|
(bool, str): (是否成功, 错误信息)
|
||||||
@@ -647,7 +669,13 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
|
|
||||||
# 扣除保释金
|
# 扣除保释金
|
||||||
success, result = self.transfer_points(
|
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:
|
if not success:
|
||||||
return False, result.get("error", "保释失败")
|
return False, result.get("error", "保释失败")
|
||||||
@@ -662,4 +690,4 @@ class PointsDBOperator(BaseDBOperator):
|
|||||||
return True, "保释成功"
|
return True, "保释成功"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.error(f"保释用户失败: {e}")
|
self.LOG.error(f"保释用户失败: {e}")
|
||||||
return False, f"保释失败: {str(e)}"
|
return False, f"保释失败: {str(e)}"
|
||||||
|
|||||||
@@ -209,10 +209,21 @@ class PointTradePlugin(MessagePluginInterface):
|
|||||||
group_id = roomid
|
group_id = roomid
|
||||||
|
|
||||||
try:
|
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(
|
success, result = self.points_db.transfer_points(
|
||||||
trader_wxid, target_wxid, group_id,
|
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:
|
if not success:
|
||||||
@@ -236,13 +247,6 @@ class PointTradePlugin(MessagePluginInterface):
|
|||||||
from_user = result.get("from_user", {})
|
from_user = result.get("from_user", {})
|
||||||
to_user = result.get("to_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 = (
|
output = (
|
||||||
f"✅积分转账成功!\n"
|
f"✅积分转账成功!\n"
|
||||||
f"👤{from_user_name} 转给 👤{to_user_name} {reward_points} 积分\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(
|
success, result = self.points_db.transfer_points(
|
||||||
target_wxid, robber_wxid, roomid,
|
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)
|
# 执行抽水(从目标到SYSTEM)
|
||||||
tax_success, tax_result = self.points_db.transfer_points(
|
tax_success, tax_result = self.points_db.transfer_points(
|
||||||
target_wxid, "SYSTEM", roomid,
|
target_wxid, "SYSTEM", roomid,
|
||||||
tax_amount, f"打劫抽水"
|
tax_amount,
|
||||||
|
"打劫抽水",
|
||||||
|
from_user_name=target_name,
|
||||||
|
to_user_name="系统",
|
||||||
)
|
)
|
||||||
|
|
||||||
if success and tax_success:
|
if success and tax_success:
|
||||||
@@ -685,7 +695,10 @@ class PointTradePlugin(MessagePluginInterface):
|
|||||||
# 记录积分变动
|
# 记录积分变动
|
||||||
success, result = self.points_db.transfer_points(
|
success, result = self.points_db.transfer_points(
|
||||||
robber_wxid, target_wxid, roomid,
|
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:
|
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
|
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:
|
if success:
|
||||||
output = (
|
output = (
|
||||||
|
|||||||
Reference in New Issue
Block a user