From ee093f15e3fa903922da83bf98d313f8f443acc5 Mon Sep 17 00:00:00 2001 From: liuwei Date: Fri, 21 Nov 2025 17:53:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E9=97=A8=E5=8E=86=E7=BB=83=E9=99=90?= =?UTF-8?q?=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/xiuxian/main.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/plugins/xiuxian/main.py b/plugins/xiuxian/main.py index 6619acd..6010e47 100644 --- a/plugins/xiuxian/main.py +++ b/plugins/xiuxian/main.py @@ -501,11 +501,19 @@ class XiuxianPlugin(MessagePluginInterface): self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) return False, "Redis未初始化" - if self.redis_db.check_rate_limited(sender, roomid or "", cmd): - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 操作过于频繁,请稍候再试", sender) - if self.revoke: - self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) - return False, "限流" + # 限流:默认按用户+群维度;历练按用户全局维度 + if cmd == "出门历练": + if self.redis_db.check_rate_limited(sender, "__global__", cmd): + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 历练冷却中,请稍候再试", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + return False, "限流" + else: + if self.redis_db.check_rate_limited(sender, roomid or "", cmd): + client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 操作过于频繁,请稍候再试", sender) + if self.revoke: + self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) + return False, "限流" if cmd == "注册修仙": return await self._cmd_register(bot, sender, roomid, content) @@ -563,6 +571,10 @@ class XiuxianPlugin(MessagePluginInterface): seconds = self.seconds_rl.get(cmd, 3) self.redis_db.set_rate_limit(user_id, group_id, cmd, seconds) + def _rate_set_global(self, user_id: str, cmd: str): + seconds = self.seconds_rl.get(cmd, 3) + self.redis_db.set_rate_limit(user_id, "__global__", cmd, seconds) + def _check_status_update(self, player: Dict[str, Any]) -> Dict[str, Any]: """状态机自动流转:过期的 Unstable_Qi/Injured 恢复为 Idle。""" now = datetime.now(timezone.utc) @@ -1150,13 +1162,13 @@ class XiuxianPlugin(MessagePluginInterface): player["status"] = "Injured" player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=30)).isoformat() self._save_player(player) - self._rate_set(sender, roomid or "", "出门历练") + self._rate_set_global(sender, "出门历练") client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 历练失败,灵气反噬,受伤30分钟", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) return False, "历练失败" else: - self._rate_set(sender, roomid or "", "出门历练") + self._rate_set_global(sender, "出门历练") client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "⚠️ 历练无所得", sender) if self.revoke: self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) @@ -1174,7 +1186,7 @@ class XiuxianPlugin(MessagePluginInterface): except Exception: pass self._save_player(player) - self._rate_set(sender, roomid or "", "出门历练") + self._rate_set_global(sender, "出门历练") mats_text = ", ".join([f"{k}×{v}" for k, v in mats_gain.items()]) if mats_gain else "无" client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 历练成功,获得灵石{stones_gain},材料:{mats_text}", sender) if self.revoke: