From 65ff7b5ba308079ddf0d55a653c525e3f3310d8b Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 17 Apr 2025 14:48:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BD=BF=E7=94=A8=E7=9A=84wc?= =?UTF-8?q?f=20=E7=B1=BB=EF=BC=8C=E4=BD=BF=E7=94=A8self.message=5Futil.sen?= =?UTF-8?q?d=5Ftext=5Fmsg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/point_trade/main.py | 105 ++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 52 deletions(-) diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index c1da9a0..4422acb 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -8,6 +8,7 @@ from wcferry import Wcf from db.connection import DBConnectionManager from db.points_db import PointsDBOperator, PointSource +from message_util import MessageUtil from plugin_common.message_plugin_interface import MessagePluginInterface from plugin_common.plugin_interface import PluginStatus from utils.decorator.plugin_decorators import plugin_stats_decorator @@ -55,7 +56,7 @@ class PointTradePlugin(MessagePluginInterface): # 保存上下文对象 self.wcf = context.get("wcf") self.event_system = context.get("event_system") - self.message_util = context.get("message_util") + self.message_util: MessageUtil = context.get("message_util") self.gbm = context.get("gbm") self.db_manager = DBConnectionManager.get_instance() @@ -71,8 +72,8 @@ class PointTradePlugin(MessagePluginInterface): # 从配置中获取参数 point_trade_config = self._config.get("PointTrade", {}) self._commands = point_trade_config.get("command", - ["积分交易", "积分转账", "转账积分", - "我的积分", "积分排行", "打劫", "保释"]) + ["积分交易", "积分转账", "转账积分", + "我的积分", "积分排行", "打劫", "保释"]) self.command_format = point_trade_config.get("command-format", """ 积分交易指令: 积分转账 积分数 @用户 - 转账给指定用户 @@ -85,7 +86,7 @@ class PointTradePlugin(MessagePluginInterface): # 打劫功能配置 self.rob_success_rate = point_trade_config.get("rob-success-rate", 0.3) # 基础打劫成功率 - self.rob_rate_decay = point_trade_config.get("rob-rate-decay", 0.5) # 积分差距导致的成功率衰减系数 + self.rob_rate_decay = point_trade_config.get("rob-rate-decay", 0.5) # 积分差距导致的成功率衰减系数 self.rob_min_percent = point_trade_config.get("rob-min-percent", 0.1) # 打劫最小百分比 self.rob_max_percent = point_trade_config.get("rob-max-percent", 0.3) # 打劫最大百分比 self.rob_penalty_percent = point_trade_config.get("rob-penalty-percent", 0.2) # 打劫失败惩罚百分比 @@ -148,7 +149,7 @@ class PointTradePlugin(MessagePluginInterface): elif command[0] in self._commands: return self._handle_transfer_points(message) else: - wcf.send_text(f"❌未知命令!{self.command_format}", + self.message_util.send_text_msg(f"❌未知命令!{self.command_format}", (roomid if roomid else sender), sender) return True, "未知命令" @@ -163,20 +164,20 @@ class PointTradePlugin(MessagePluginInterface): # 检查命令格式 if len(command) < 3: - wcf.send_text(f"❌命令格式错误!积分转账 积分数 @用户", + self.message_util.send_text_msg(f"❌命令格式错误!积分转账 积分数 @用户", (roomid if roomid else sender), sender) return True, "命令格式错误" # 检查积分数是否为正整数 if not command[1].isdigit(): - wcf.send_text(f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", + self.message_util.send_text_msg(f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", (roomid if roomid else sender), sender) return True, "积分无效" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - wcf.send_text(f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", + self.message_util.send_text_msg(f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", (roomid if roomid else sender), sender) return True, "转账人无效" @@ -196,11 +197,11 @@ class PointTradePlugin(MessagePluginInterface): error_msg = result.get("error", "未知错误") if "积分不足" in error_msg: current_points = result.get("current_points", 0) - wcf.send_text( + self.message_util.send_text_msg( f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。", (roomid if roomid else sender), sender) else: - wcf.send_text( + self.message_util.send_text_msg( f"❌转账失败!\n{error_msg}", (roomid if roomid else sender), sender) return True, f"转账失败: {error_msg}" @@ -223,12 +224,12 @@ class PointTradePlugin(MessagePluginInterface): f"👤{to_user_name} 当前积分: {to_user.get('total_points', 0)}" ) - wcf.send_text(output, (roomid if roomid else sender), sender) + self.message_util.send_text_msg(output, (roomid if roomid else sender), sender) return True, "转账成功" except Exception as e: self.LOG.error(f"积分交易出错: {e}") - wcf.send_text(f"❌积分交易失败!请稍后重试。错误: {str(e)}", + self.message_util.send_text_msg(f"❌积分交易失败!请稍后重试。错误: {str(e)}", (roomid if roomid else sender), sender) return True, f"处理出错: {str(e)}" @@ -236,14 +237,13 @@ class PointTradePlugin(MessagePluginInterface): """处理查询个人积分命令""" sender = message.get("sender") roomid = message.get("roomid", "") - wcf: Wcf = message.get("wcf") try: # 获取用户积分信息 user_points = self.points_db.get_user_points(sender, roomid) if not user_points: - wcf.send_text(f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", + self.message_util.send_text_msg(f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", (roomid if roomid else sender), sender) return False, "未找到积分记录" @@ -265,16 +265,16 @@ class PointTradePlugin(MessagePluginInterface): # 构建积分详情消息 - 优化格式 source_icons = { - "sign": "📝", "game": "🎮", "trade": "💱", + "sign": "📝", "game": "🎮", "trade": "💱", "rob": "🔫", "bailout": "🔓", "其他": "🔄" } - + source_details = [] for source, points in source_stats.items(): icon = source_icons.get(source, "✨") sign = "+" if points > 0 else "" source_details.append(f"{icon} {source}: {sign}{points}") - + source_text = " | ".join(source_details) if source_details else "暂无记录" # 构建最近交易记录 - 优化格式 @@ -299,12 +299,12 @@ class PointTradePlugin(MessagePluginInterface): f"{recent_txs}" ) - wcf.send_text(output, (roomid if roomid else sender), sender) + self.message_util.send_text_msg(output, (roomid if roomid else sender), sender) return True, "查询积分成功" except Exception as e: self.LOG.error(f"查询积分出错: {e}") - wcf.send_text(f"❌查询积分失败!请稍后重试。错误: {str(e)}", + self.message_util.send_text_msg(f"❌查询积分失败!请稍后重试。错误: {str(e)}", (roomid if roomid else sender), sender) return True, f"处理出错: {str(e)}" @@ -315,7 +315,7 @@ class PointTradePlugin(MessagePluginInterface): wcf: Wcf = message.get("wcf") if not roomid: - wcf.send_text("❌积分排行榜仅在群聊中可用!", sender, "") + self.message_util.send_text_msg("❌积分排行榜仅在群聊中可用!", sender, "") return True, "非群聊环境" try: @@ -323,7 +323,7 @@ class PointTradePlugin(MessagePluginInterface): ranking = self.points_db.get_points_ranking(roomid, 10) if not ranking: - wcf.send_text("❌暂无积分排行数据!请先参与积分活动。", roomid, sender) + self.message_util.send_text_msg("❌暂无积分排行数据!请先参与积分活动。", roomid, sender) return True, "无排行数据" # 构建排行榜消息 @@ -348,12 +348,12 @@ class PointTradePlugin(MessagePluginInterface): f"更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ) - wcf.send_text(output, roomid, sender) + self.message_util.send_text_msg(output, roomid, sender) return True, "查询排行榜成功" except Exception as e: self.LOG.error(f"查询积分排行榜出错: {e}") - wcf.send_text(f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", roomid, sender) + self.message_util.send_text_msg(f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", roomid, sender) return True, f"处理出错: {str(e)}" def at_list(self, xml): @@ -373,9 +373,9 @@ class PointTradePlugin(MessagePluginInterface): # 现在set中存在{''}这种,请过滤掉 atuserlist_set.discard('') self.LOG.info(f"解析到的 @用户列表: {atuserlist_set}") - #如果atuserlist_set 为空,就打印XML + # 如果atuserlist_set 为空,就打印XML if not atuserlist_set: - self.LOG.info(f"解析到的 @用户列表为空,XML:{xml}") + self.LOG.info(f"解析到的 @用户列表为空,XML:{xml}") return atuserlist_set except ET.ParseError as e: self.LOG.error(f"解析 XML 失败: {e}") @@ -457,22 +457,23 @@ class PointTradePlugin(MessagePluginInterface): # 检查是否在群聊中 if not roomid: - wcf.send_text("❌打劫功能仅在群聊中可用!", sender, "") + self.message_util.send_text_msg("❌打劫功能仅在群聊中可用!", sender, "") return True, "非群聊环境" - + # 检查时间限制 - 只允许在18:00-21:00之间打劫 current_hour = datetime.now().hour if current_hour < 18 or current_hour >= 21: - wcf.send_text("❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", roomid, sender) + self.message_util.send_text_msg("❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", roomid, sender) return True, "时间限制" - + # 检查是否在押 prison_status = self.points_db.check_prison_status(sender, roomid) if prison_status: remaining_time = prison_status['end_time'] - datetime.now() hours = int(remaining_time.total_seconds() / 3600) minutes = int((remaining_time.total_seconds() % 3600) / 60) - wcf.send_text(f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", roomid, sender) + self.message_util.send_text_msg(f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", roomid, + sender) return True, "在押状态" # 检查冷却时间 @@ -483,14 +484,14 @@ class PointTradePlugin(MessagePluginInterface): if time_passed < self.rob_cooldown: remaining_time = int(self.rob_cooldown - time_passed) minutes, seconds = divmod(remaining_time, 60) - wcf.send_text(f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", + self.message_util.send_text_msg(f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", roomid, sender) return True, "冷却中" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - wcf.send_text(f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", + self.message_util.send_text_msg(f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", roomid, sender) return True, "目标无效" @@ -499,7 +500,7 @@ class PointTradePlugin(MessagePluginInterface): # 不能打劫自己 if target_wxid == robber_wxid: - wcf.send_text("❌你不能打劫自己!", roomid, sender) + self.message_util.send_text_msg("❌你不能打劫自己!", roomid, sender) return True, "不能打劫自己" try: @@ -508,11 +509,11 @@ class PointTradePlugin(MessagePluginInterface): target_points = self.points_db.get_user_points(target_wxid, roomid) if not robber_points: - wcf.send_text("❌你没有积分记录,无法进行打劫!请先参与积分活动。", roomid, sender) + self.message_util.send_text_msg("❌你没有积分记录,无法进行打劫!请先参与积分活动。", roomid, sender) return True, "打劫者无积分" if not target_points: - wcf.send_text("❌目标没有积分记录,无法进行打劫!", roomid, sender) + self.message_util.send_text_msg("❌目标没有积分记录,无法进行打劫!", roomid, sender) return True, "目标无积分" robber_total = robber_points.get('total_points', 0) @@ -520,11 +521,11 @@ class PointTradePlugin(MessagePluginInterface): # 检查最低积分要求 if robber_total < self.rob_min_points: - wcf.send_text(f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", roomid, sender) + self.message_util.send_text_msg(f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", roomid, sender) return True, "打劫者积分不足" if target_total < self.rob_min_points: - wcf.send_text(f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", roomid, sender) + self.message_util.send_text_msg(f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", roomid, sender) return True, "目标积分不足" # 获取用户昵称 @@ -547,7 +548,7 @@ class PointTradePlugin(MessagePluginInterface): # 确保成功率在合理范围内 final_success_rate = max(0.05, min(final_success_rate, self.rob_success_rate)) - + is_success = random.random() < final_success_rate # 更新冷却时间 @@ -580,10 +581,10 @@ class PointTradePlugin(MessagePluginInterface): f"👤{target_name} 当前积分: {from_user.get('total_points', 0)}" ) - wcf.send_text(output, roomid, sender) + self.message_util.send_text_msg(output, roomid, sender) return True, "打劫成功" else: - wcf.send_text(f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", roomid, sender) + self.message_util.send_text_msg(f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", roomid, sender) return True, "打劫失败" else: @@ -603,11 +604,11 @@ class PointTradePlugin(MessagePluginInterface): robber_wxid, roomid, 24, f"打劫{target_name}失败被捕" ) - + # 获取转账后的积分信息 from_user = result.get("from_user", {}) to_user = result.get("to_user", {}) - + # 构建打劫失败消息 output = ( f"🚨 打劫失败!\n" @@ -617,15 +618,15 @@ class PointTradePlugin(MessagePluginInterface): f"👤{robber_name} 当前积分: {from_user.get('total_points', 0)}" ) - wcf.send_text(output, roomid, sender) + self.message_util.send_text_msg(output, roomid, sender) return True, "打劫失败" else: - wcf.send_text(f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", roomid, sender) + self.message_util.send_text_msg(f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", roomid, sender) return True, "处理惩罚失败" except Exception as e: self.LOG.error(f"处理打劫请求出错: {e}") - wcf.send_text(f"❌打劫过程中出现意外:{str(e)}", roomid, sender) + self.message_util.send_text_msg(f"❌打劫过程中出现意外:{str(e)}", roomid, sender) return True, f"处理出错: {str(e)}" def _handle_bailout(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: @@ -637,13 +638,13 @@ class PointTradePlugin(MessagePluginInterface): # 检查是否在群聊中 if not roomid: - wcf.send_text("❌保释功能仅在群聊中可用!", sender, "") + self.message_util.send_text_msg("❌保释功能仅在群聊中可用!", sender, "") return True, "非群聊环境" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - wcf.send_text(f"保释失败❌\n请指定一个保释目标!\n保释 @用户", + self.message_util.send_text_msg(f"保释失败❌\n请指定一个保释目标!\n保释 @用户", roomid, sender) return True, "目标无效" @@ -652,7 +653,7 @@ class PointTradePlugin(MessagePluginInterface): # 不能保释自己 if prisoner_wxid == bailout_wxid: - wcf.send_text("❌你不能保释自己!", roomid, sender) + self.message_util.send_text_msg("❌你不能保释自己!", roomid, sender) return True, "不能保释自己" try: @@ -665,19 +666,19 @@ class PointTradePlugin(MessagePluginInterface): # 执行保释 success, message = self.points_db.bailout_user(prisoner_wxid, bailout_wxid, roomid) - + if success: output = ( f"✅ 保释成功!\n" f"👤{bailout_name} 花费30积分保释了 👤{prisoner_name}" ) - wcf.send_text(output, roomid, sender) + self.message_util.send_text_msg(output, roomid, sender) return True, "保释成功" else: - wcf.send_text(f"❌保释失败: {message}", roomid, sender) + self.message_util.send_text_msg(f"❌保释失败: {message}", roomid, sender) return True, "保释失败" except Exception as e: self.LOG.error(f"处理保释请求出错: {e}") - wcf.send_text(f"❌保释过程中出现意外:{str(e)}", roomid, sender) + self.message_util.send_text_msg(f"❌保释过程中出现意外:{str(e)}", roomid, sender) return True, f"处理出错: {str(e)}"