出门历练限流

This commit is contained in:
liuwei
2025-11-24 09:13:54 +08:00
parent daa81ed7e8
commit 6017cd2b42
2 changed files with 15 additions and 33 deletions

View File

@@ -52,7 +52,7 @@ gift_seconds = 10
points_to_stone_seconds = 10
# 副本与炼丹冷却
expedition_seconds = 1800
expedition_seconds = 86400
alchemy_seconds = 600
# 修为结算参数:基础速率(每小时),灵根乘数(名称:倍率)

View File

@@ -138,27 +138,9 @@ class XiuxianRedisDB:
date_str = now.strftime("%Y-%m-%d")
date_key = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}:date:{date_str}"
# 如果基于日期的键存在,说明今天已限流
if r.exists(date_key) == 1:
key_no_date = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}"
if r.exists(date_key) == 1 or r.exists(key_no_date) == 1:
return True
# 兼容旧格式检查是否有旧的限流键不带group_id和日期
old_key_no_group = f"xiuxian:rate_limit:user:{user_id}:cmd:{cmd}"
old_key_with_date = f"xiuxian:rate_limit:user:{user_id}:cmd:{cmd}:date:{date_str}"
# 检查旧格式不带group_id带日期
if r.exists(old_key_with_date) == 1:
return True
# 检查旧格式不带group_id不带日期
if r.exists(old_key_no_group) == 1:
# 如果旧键存在检查是否过期TTL > 0表示未过期
ttl = r.ttl(old_key_no_group)
if ttl > 0:
return True
# 如果已过期,删除旧键
r.delete(old_key_no_group)
return False
except Exception as e:
logger.error(f"检查限流失败: {e}")
@@ -502,18 +484,12 @@ class XiuxianPlugin(MessagePluginInterface):
return False, "Redis未初始化"
# 限流:默认按用户+群维度;历练按用户全局维度
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 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)
@@ -1121,6 +1097,12 @@ class XiuxianPlugin(MessagePluginInterface):
player = self._get_player(sender, roomid or "")
if not player:
return False, "未注册"
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, "限流"
player = self._check_status_update(player)
st = player.get("status", "Idle")
if st in ("Cultivating", "Injured", "Expedition"):