出门历练限流

This commit is contained in:
liuwei
2025-11-21 17:53:35 +08:00
parent 3206c03aa4
commit ee093f15e3

View File

@@ -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: