From d40280c97549c6fa7a3fcf303a624c313ce3871a Mon Sep 17 00:00:00 2001 From: rm-rf-omega Date: Fri, 27 Sep 2024 18:31:03 +0200 Subject: [PATCH] Fixed a critical bug in the GIF ratelimiter cog caused by the double deletion of dictionary keys due to Python's default behavior of deleting keys if an empty value is assigned to them --- tux/cogs/services/gif_limiter.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tux/cogs/services/gif_limiter.py b/tux/cogs/services/gif_limiter.py index 922685f..0f7b061 100644 --- a/tux/cogs/services/gif_limiter.py +++ b/tux/cogs/services/gif_limiter.py @@ -55,15 +55,13 @@ class GifLimiter(commands.Cog): if ( channel in self.channelwide_gif_limits - and channel in self.recent_gifs_by_channel and len(self.recent_gifs_by_channel[channel]) >= self.channelwide_gif_limits[channel] ): await self._delete_message(message, "for channel") return if ( - user in self.recent_gifs_by_user - and channel in self.user_gif_limits + channel in self.user_gif_limits and len(self.recent_gifs_by_user[user]) >= self.user_gif_limits[channel] ): await self._delete_message(message, "for user") @@ -94,14 +92,15 @@ class GifLimiter(commands.Cog): current_time: int = int(time()) async with self.gif_lock: - for channel_id, timestamps in self.recent_gifs_by_channel.items(): + + for channel_id, timestamps in list(self.recent_gifs_by_channel.items()): self.recent_gifs_by_channel[channel_id] = [t for t in timestamps if current_time - t < self.recent_gif_age] - for user_id, timestamps in self.recent_gifs_by_user.items(): - self.recent_gifs_by_user[user_id] = [t for t in timestamps if current_time - t < self.recent_gif_age] - - # Delete user key if no GIF has recently been sent by them - if len(self.recent_gifs_by_user[user_id]) == 0: + for user_id, timestamps in list(self.recent_gifs_by_user.items()): + filtered_timestamps = [t for t in timestamps if current_time - t < self.recent_gif_age] + if filtered_timestamps: + self.recent_gifs_by_user[user_id] = filtered_timestamps + else: del self.recent_gifs_by_user[user_id] async def setup(bot: Tux) -> None: