From 42ca18276421f778e9fc39ca64bcbe13f6d1c966 Mon Sep 17 00:00:00 2001 From: liuwei Date: Thu, 8 May 2025 10:08:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=AF=E5=88=86=E7=8E=A9=E6=B3=95=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E6=92=A4=E5=9B=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/point_trade/main.py | 190 +++++++++++++++++++--------- utils/decorator/points_decorator.py | 8 +- 2 files changed, 138 insertions(+), 60 deletions(-) diff --git a/plugins/point_trade/main.py b/plugins/point_trade/main.py index ffc8280..3befafd 100644 --- a/plugins/point_trade/main.py +++ b/plugins/point_trade/main.py @@ -10,6 +10,7 @@ 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 +from utils.revoke.message_auto_revoke import MessageAutoRevoke from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager import mysql.connector.pooling @@ -48,6 +49,7 @@ class PointTradePlugin(MessagePluginInterface): super().__init__() self.db_pool = None self.bot: WechatAPIClient = None + self.revoke: MessageAutoRevoke = None def initialize(self, context: Dict[str, Any]) -> bool: """初始化插件""" @@ -132,6 +134,7 @@ class PointTradePlugin(MessagePluginInterface): xml = message.get("xml", "") self.bot: WechatAPIClient = message.get("bot") + self.revoke: MessageAutoRevoke = message.get("revoke") # 检查权限 if roomid and gbm.get_group_permission(roomid, Feature.POINT_TRADE) == PermissionStatus.DISABLED: return False, "没有权限" @@ -162,23 +165,27 @@ class PointTradePlugin(MessagePluginInterface): # 检查命令格式 if len(command) < 3: - await self.bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!积分转账 积分数 @用户", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message((roomid if roomid else sender), + f"❌命令格式错误!积分转账 积分数 @用户", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "命令格式错误" # 检查积分数是否为正整数 if not command[1].isdigit(): - await self.bot.send_text_message((roomid if roomid else sender), - f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message((roomid if roomid else sender), + f"🈚️转账积分无效(必须为正整数!) \n积分转账 积分数 @用户", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "积分无效" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - await self.bot.send_text_message((roomid if roomid else sender), - f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message((roomid if roomid else sender), + f"转账失败❌\n🈚️转账人无效! \n积分转账 积分数 @用户", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "转账人无效" reward_points = int(command[1]) @@ -197,13 +204,17 @@ class PointTradePlugin(MessagePluginInterface): error_msg = result.get("error", "未知错误") if "积分不足" in error_msg: current_points = result.get("current_points", 0) - await self.bot.send_text_message((roomid if roomid else sender), - f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message( + (roomid if roomid else sender), + f"❌转账失败!\n你的积分不足以进行转账!当前积分:{current_points},你需要 {reward_points} 积分。", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) else: - await self.bot.send_text_message((roomid if roomid else sender), - f"❌转账失败!\n{error_msg}", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message( + (roomid if roomid else sender), + f"❌转账失败!\n{error_msg}", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, f"转账失败: {error_msg}" # 获取转账后的积分信息 @@ -223,14 +234,17 @@ class PointTradePlugin(MessagePluginInterface): f"👤{from_user_name} 当前积分: {from_user.get('total_points', 0)}\n" f"👤{to_user_name} 当前积分: {to_user.get('total_points', 0)}" ) - - await self.bot.send_text_message((roomid if roomid else sender), output, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message((roomid if roomid else sender), + output, [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 20) return True, "转账成功" except Exception as e: self.LOG.error(f"积分交易出错: {e}") - await self.bot.send_text_message((roomid if roomid else sender), f"❌积分交易失败!请稍后重试。错误: {str(e)}", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message((roomid if roomid else sender), + f"❌积分交易失败!请稍后重试。错误: {str(e)}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 2) return True, f"处理出错: {str(e)}" async def _handle_my_points(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: @@ -243,9 +257,11 @@ class PointTradePlugin(MessagePluginInterface): user_points = self.points_db.get_user_points(sender, roomid) if not user_points: - await self.bot.send_text_message((roomid if roomid else sender), - f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message( + (roomid if roomid else sender), + f"❌未找到你的积分记录!请先参与积分活动[签到,答题/t]。", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 4) return False, "未找到积分记录" # 获取用户昵称 @@ -300,13 +316,17 @@ class PointTradePlugin(MessagePluginInterface): f"{recent_txs}" ) - await self.bot.send_text_message((roomid if roomid else sender), output, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message((roomid if roomid else sender), + output, [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 10) return True, "查询积分成功" except Exception as e: self.LOG.error(f"查询积分出错: {e}") - await self.bot.send_text_message((roomid if roomid else sender), f"❌查询积分失败!请稍后重试。错误: {str(e)}", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message((roomid if roomid else sender), + f"❌查询积分失败!请稍后重试。错误: {str(e)}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, f"处理出错: {str(e)}" async def _handle_points_ranking(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: @@ -315,7 +335,9 @@ class PointTradePlugin(MessagePluginInterface): roomid = message.get("roomid", "") if not roomid: - await self.bot.send_text_message(sender, "❌积分排行榜仅在群聊中可用!", "") + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(sender, + "❌积分排行榜仅在群聊中可用!", "") + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "非群聊环境" try: @@ -323,7 +345,10 @@ class PointTradePlugin(MessagePluginInterface): ranking = self.points_db.get_points_ranking(roomid, 10) if not ranking: - await self.bot.send_text_message(roomid, "❌暂无积分排行数据!请先参与积分活动。", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + "❌暂无积分排行数据!请先参与积分活动。", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "无排行数据" # 构建排行榜消息 @@ -348,12 +373,16 @@ class PointTradePlugin(MessagePluginInterface): f"更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ) - await self.bot.send_text_message(roomid, output, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, output, [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 10) return True, "查询排行榜成功" except Exception as e: self.LOG.error(f"查询积分排行榜出错: {e}") - await self.bot.send_text_message(roomid, f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌查询积分排行榜失败!请稍后重试。错误: {str(e)}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, f"处理出错: {str(e)}" def at_list(self, xml): @@ -462,7 +491,10 @@ class PointTradePlugin(MessagePluginInterface): # 检查时间限制 - 只允许在18:00-21:00之间打劫 current_hour = datetime.now().hour if current_hour < 18 or current_hour >= 21: - await self.bot.send_text_message(roomid, "❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + "❌打劫功能仅在晚上18:00-21:00之间开放!请在开放时间再来。", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "时间限制" # 检查是否在押 @@ -471,10 +503,12 @@ class PointTradePlugin(MessagePluginInterface): remaining_time = prison_status['end_time'] - datetime.now() hours = int(remaining_time.total_seconds() / 3600) minutes = int((remaining_time.total_seconds() % 3600) / 60) - await self.bot.send_text_message( - f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", + + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message( roomid, - sender) + f"❌你正在服刑!\n剩余时间: {hours}小时{minutes}分钟\n可请求他人花费30积分保释。", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "在押状态" # 检查冷却时间 @@ -485,16 +519,20 @@ class PointTradePlugin(MessagePluginInterface): if time_passed < self.rob_cooldown: remaining_time = int(self.rob_cooldown - time_passed) minutes, seconds = divmod(remaining_time, 60) - await self.bot.send_text_message(roomid, - f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", - sender) + + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + f"❌你最近已经打劫过了,需要冷却 {minutes}分{seconds}秒 后才能再次打劫!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "冷却中" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - await self.bot.send_text_message(roomid, f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + f"打劫失败❌\n请指定一个打劫目标!\n打劫 @用户", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "目标无效" target_wxid = next(iter(at_users)) @@ -502,7 +540,9 @@ class PointTradePlugin(MessagePluginInterface): # 不能打劫自己 if target_wxid == robber_wxid: - await self.bot.send_text_message(roomid, "❌你不能打劫自己!", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, "❌你不能打劫自己!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "不能打劫自己" try: @@ -511,11 +551,17 @@ class PointTradePlugin(MessagePluginInterface): target_points = self.points_db.get_user_points(target_wxid, roomid) if not robber_points: - await self.bot.send_text_message(roomid, "❌你没有积分记录,无法进行打劫!请先参与积分活动。", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + "❌你没有积分记录,无法进行打劫!请先参与积分活动。", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "打劫者无积分" if not target_points: - await self.bot.send_text_message(roomid, "❌目标没有积分记录,无法进行打劫!", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + "❌目标没有积分记录,无法进行打劫!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "目标无积分" robber_total = robber_points.get('total_points', 0) @@ -523,12 +569,18 @@ class PointTradePlugin(MessagePluginInterface): # 检查最低积分要求 if robber_total < self.rob_min_points: - await self.bot.send_text_message(roomid, f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + f"❌你的积分不足 {self.rob_min_points} 点,无法进行打劫!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) + return True, "打劫者积分不足" if target_total < self.rob_min_points: - await self.bot.send_text_message(roomid, f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, + f"❌目标积分不足 {self.rob_min_points} 点,不值得打劫!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "目标积分不足" # 获取用户昵称 @@ -584,11 +636,14 @@ class PointTradePlugin(MessagePluginInterface): f"👤{target_name} 当前积分: {from_user.get('total_points', 0)}" ) - await self.bot.send_text_message(output, roomid, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, output, [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 90) return True, "打劫成功" else: - await self.bot.send_text_message(roomid, f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌打劫过程中出现问题:{result.get('error', '未知错误')}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "打劫失败" else: @@ -622,17 +677,23 @@ class PointTradePlugin(MessagePluginInterface): f"👤{robber_name} 当前积分: {from_user.get('total_points', 0)}" ) - await self.bot.send_text_message(roomid, output, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, output, [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 90) return True, "打劫失败" else: - await self.bot.send_text_message(roomid, - f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌处理打劫惩罚时出现问题:{result.get('error', '未知错误')}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "处理惩罚失败" except Exception as e: self.LOG.error(f"处理打劫请求出错: {e}") - await self.bot.send_text_message(roomid, f"❌打劫过程中出现意外:{str(e)}", sender) + + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌打劫过程中出现意外:{str(e)}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, f"处理出错: {str(e)}" async def _handle_bailout(self, message: Dict[str, Any]) -> Tuple[bool, Optional[str]]: @@ -643,14 +704,18 @@ class PointTradePlugin(MessagePluginInterface): # 检查是否在群聊中 if not roomid: - await self.bot.send_text_message(sender, "❌保释功能仅在群聊中可用!", "") + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(sender, + "❌保释功能仅在群聊中可用!", "") + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "非群聊环境" # 检查@用户是否有效 at_users = self.at_list(xml) if len(at_users) != 1: - await self.bot.send_text_message(roomid, f"保释失败❌\n请指定一个保释目标!\n保释 @用户", - sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"保释失败❌\n请指定一个保释目标!\n保释 @用户", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "目标无效" prisoner_wxid = next(iter(at_users)) @@ -658,7 +723,9 @@ class PointTradePlugin(MessagePluginInterface): # 不能保释自己 if prisoner_wxid == bailout_wxid: - await self.bot.send_text_message(roomid, "❌你不能保释自己!", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_at_message(roomid, "❌你不能保释自己!", + [sender]) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) return True, "不能保释自己" try: @@ -677,13 +744,20 @@ class PointTradePlugin(MessagePluginInterface): f"✅ 保释成功!\n" f"👤{bailout_name} 花费30积分保释了 👤{prisoner_name}" ) - await self.bot.send_text_message(roomid, output, sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, output, sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 10) return True, "保释成功" else: - await self.bot.send_text_message(roomid, f"❌保释失败: {message}", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌保释失败: {message}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, "保释失败" except Exception as e: self.LOG.error(f"处理保释请求出错: {e}") - await self.bot.send_text_message(roomid, f"❌保释过程中出现意外:{str(e)}", sender) + client_msg_id, create_time, new_msg_id = await self.bot.send_text_message(roomid, + f"❌保释过程中出现意外:{str(e)}", + sender) + self.revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 3) return True, f"处理出错: {str(e)}" diff --git a/utils/decorator/points_decorator.py b/utils/decorator/points_decorator.py index fec1a32..55422b3 100644 --- a/utils/decorator/points_decorator.py +++ b/utils/decorator/points_decorator.py @@ -7,6 +7,7 @@ from typing import Callable, Dict, Any, Tuple, Union from db.connection import DBConnectionManager from db.points_db import PointsDBOperator, PointSource +from utils.revoke.message_auto_revoke import MessageAutoRevoke from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager from wechat_ipad import WechatAPIClient @@ -203,7 +204,7 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = roomid = message.get("roomid", "") bot: WechatAPIClient = message.get("bot") - + revoke: MessageAutoRevoke = message.get("revoke") if not sender or not (roomid or sender): return await func(self, message) @@ -242,10 +243,13 @@ def plugin_points_cost(points: int, description: str = None, feature: Feature = # 添加对 response 的类型检查 if isinstance(response, str) and "积分" not in response: response += f"\n\n💰 已消费 {points} 积分" - await bot.send_at_message( + + client_msg_id, create_time, new_msg_id = await bot.send_at_message( (roomid if roomid else sender), f"💰消费 {points} 积分", [sender] ) + revoke.add_message_to_revoke(roomid, client_msg_id, create_time, new_msg_id, 5) + else: logger.warning(f"用户 {sender} 积分扣除失败: {deduct_result}")