积分玩法加上撤回功能

This commit is contained in:
liuwei
2025-05-08 10:08:40 +08:00
parent bfe4652867
commit 42ca182764
2 changed files with 138 additions and 60 deletions

View File

@@ -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)}"

View File

@@ -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}")