出门历练限流
This commit is contained in:
@@ -52,7 +52,7 @@ gift_seconds = 10
|
|||||||
points_to_stone_seconds = 10
|
points_to_stone_seconds = 10
|
||||||
|
|
||||||
# 副本与炼丹冷却
|
# 副本与炼丹冷却
|
||||||
expedition_seconds = 1800
|
expedition_seconds = 86400
|
||||||
alchemy_seconds = 600
|
alchemy_seconds = 600
|
||||||
|
|
||||||
# 修为结算参数:基础速率(每小时),灵根乘数(名称:倍率)
|
# 修为结算参数:基础速率(每小时),灵根乘数(名称:倍率)
|
||||||
|
|||||||
@@ -138,27 +138,9 @@ class XiuxianRedisDB:
|
|||||||
date_str = now.strftime("%Y-%m-%d")
|
date_str = now.strftime("%Y-%m-%d")
|
||||||
date_key = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}:date:{date_str}"
|
date_key = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}:date:{date_str}"
|
||||||
|
|
||||||
# 如果基于日期的键存在,说明今天已限流
|
key_no_date = f"xiuxian:rate_limit:group:{group_id}:user:{user_id}:cmd:{cmd}"
|
||||||
if r.exists(date_key) == 1:
|
if r.exists(date_key) == 1 or r.exists(key_no_date) == 1:
|
||||||
return True
|
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
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"检查限流失败: {e}")
|
logger.error(f"检查限流失败: {e}")
|
||||||
@@ -502,18 +484,12 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
return False, "Redis未初始化"
|
return False, "Redis未初始化"
|
||||||
|
|
||||||
# 限流:默认按用户+群维度;历练按用户全局维度
|
# 限流:默认按用户+群维度;历练按用户全局维度
|
||||||
if cmd == "出门历练":
|
|
||||||
if self.redis_db.check_rate_limited(sender, "__global__", cmd):
|
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)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 操作过于频繁,请稍候再试", sender)
|
||||||
if self.revoke:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "限流"
|
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 == "注册修仙":
|
if cmd == "注册修仙":
|
||||||
return await self._cmd_register(bot, sender, roomid, content)
|
return await self._cmd_register(bot, sender, roomid, content)
|
||||||
@@ -1121,6 +1097,12 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player = self._get_player(sender, roomid or "")
|
player = self._get_player(sender, roomid or "")
|
||||||
if not player:
|
if not player:
|
||||||
return False, "未注册"
|
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)
|
player = self._check_status_update(player)
|
||||||
st = player.get("status", "Idle")
|
st = player.get("status", "Idle")
|
||||||
if st in ("Cultivating", "Injured", "Expedition"):
|
if st in ("Cultivating", "Injured", "Expedition"):
|
||||||
|
|||||||
Reference in New Issue
Block a user