积分转账功能,使用用户积分

This commit is contained in:
liuwei
2025-04-09 13:06:50 +08:00
parent ea720c4c12
commit df51dc268e

View File

@@ -7,6 +7,7 @@ import xml.etree.ElementTree as ET
from wcferry import Wcf
from db.connection import DBConnectionManager
from db.points_db import PointsDBOperator, PointSource
from plugin_common.message_plugin_interface import MessagePluginInterface
from plugin_common.plugin_interface import PluginStatus
from utils.decorator.plugin_decorators import plugin_stats_decorator
@@ -57,6 +58,9 @@ class PointTradePlugin(MessagePluginInterface):
self.message_util = context.get("message_util")
self.gbm = context.get("gbm")
self.db_manager = DBConnectionManager.get_instance()
# 初始化积分数据库操作类
self.points_db = PointsDBOperator(self.db_manager)
self.db_pool = self.db_manager.mysql_pool
@@ -136,63 +140,46 @@ class PointTradePlugin(MessagePluginInterface):
group_id = roomid
try:
# 查询发信人的记录
sender_result = self._get_user_record(trader_wxid, group_id)
if not sender_result:
wcf.send_text(f"❌打赏失败!\n没有找到你的记录,无法进行打赏!",
(roomid if roomid else sender), sender)
return True, "发送者记录不存在"
sender_user_id = sender_result['id']
sender_wx_id = sender_result['wx_id']
sender_wx_nick_name = sender_result['wx_nick_name']
sender_current_points = int(sender_result['points'])
# 检查发信人积分是否足够
if sender_current_points < reward_points:
wcf.send_text(
f"打赏失败!\n你的积分不足以进行打赏!当前积分:{sender_current_points},你需要 {reward_points} 积分。",
(roomid if roomid else sender), sender)
return True, "积分不足"
# 查询被打赏人的记录
recipient_result = self._get_user_record_by_nick(target_wxid, group_id)
if not recipient_result:
wcf.send_text(
f"❌打赏失败!\n接收人[{target_wxid}]无法收取积分",
(roomid if roomid else sender), sender)
return True, "接收者记录不存在"
recipient_user_id = recipient_result['id']
recipient_wx_id = recipient_result['wx_id']
recipient_wx_nick_name = recipient_result['wx_nick_name']
recipient_current_points = int(recipient_result['points'])
# 使用 SQL 增量更新积分
self._update_user_points(sender_user_id, -reward_points, group_id) # 减少发送者积分
self._update_user_points(recipient_user_id, reward_points, group_id) # 增加接收者积分
# 获取更新后的积分值用于显示
updated_sender = self._get_user_record(trader_wxid, group_id)
updated_recipient = self._get_user_record_by_nick(target_wxid, group_id)
new_sender_points = int(updated_sender['points']) if updated_sender else sender_current_points
new_recipient_points = int(updated_recipient['points']) if updated_recipient else recipient_current_points
# 使用新的积分系统进行转账
success, result = self.points_db.transfer_points(
trader_wxid, target_wxid, group_id,
reward_points, f"积分转账命令执行"
)
if not success:
error_msg = result.get("error", "未知错误")
if "积分不足" in error_msg:
current_points = result.get("current_points", 0)
wcf.send_text(
f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。",
(roomid if roomid else sender), sender)
else:
wcf.send_text(
f"转账失败!\n{error_msg}",
(roomid if roomid else sender), sender)
return True, f"转账失败: {error_msg}"
# 获取转账后的积分信息
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"👤{sender_wx_nick_name} 转给 👤{recipient_wx_nick_name} {reward_points} 积分\n"
f"👤{sender_wx_nick_name} 当前积分: {new_sender_points}\n"
f"👤{recipient_wx_nick_name} 当前积分: {new_recipient_points}"
f"👤{from_user_name} 转给 👤{to_user_name} {reward_points} 积分\n"
f"👤{from_user_name} 当前积分: {from_user.get('total_points', 0)}\n"
f"👤{to_user_name} 当前积分: {to_user.get('total_points', 0)}"
)
wcf.send_text(output, (roomid if roomid else sender), sender)
return True, "转账成功"
except mysql.connector.Error as e:
self.LOG.error(f"积分交易出错: {e}")
wcf.send_text(f"❌积分交易失败!请稍后重试。错误: {str(e)}",
(roomid if roomid else sender), sender)
return True, f"数据库错误: {str(e)}"
except Exception as e:
self.LOG.error(f"积分交易出错: {e}")
wcf.send_text(f"❌积分交易失败!请稍后重试。错误: {str(e)}",