From 4d3b87fee36cdcc7c84ca4a98a8901fc3282be8f Mon Sep 17 00:00:00 2001 From: Travis Weir Date: Mon, 13 Jul 2026 10:22:13 -0500 Subject: [PATCH 1/2] Fix null-safety issues spotted by Sentry --- dozer/cogs/actionlogs.py | 2 ++ dozer/cogs/starboard.py | 6 ++++-- dozer/cogs/voice.py | 8 ++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dozer/cogs/actionlogs.py b/dozer/cogs/actionlogs.py index dc6a6bad..988b1720 100644 --- a/dozer/cogs/actionlogs.py +++ b/dozer/cogs/actionlogs.py @@ -280,6 +280,8 @@ async def on_raw_message_edit(self, payload: discord.RawMessageUpdateEvent): if payload.cached_message: return mchannel = self.bot.get_channel(int(payload.channel_id)) + if mchannel is None: + return guild = mchannel.guild try: content = payload.data['content'] diff --git a/dozer/cogs/starboard.py b/dozer/cogs/starboard.py index b261054a..8fa6ab9b 100644 --- a/dozer/cogs/starboard.py +++ b/dozer/cogs/starboard.py @@ -185,8 +185,10 @@ async def starboard_check(self, reaction: discord.Reaction, member: discord.Memb logger.warning(f"Cannot find Starboard Message {db_msgs[0].starboard_message_id} to remove") starboard_msg = discord.Object(db_msgs[0].starboard_message_id) await self.remove_from_starboard(config, starboard_msg, True) - - self.locked_messages.remove(msg) + try: + self.locked_messages.remove(msg) + except KeyError: + return @Cog.listener() async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent): diff --git a/dozer/cogs/voice.py b/dozer/cogs/voice.py index 202139a3..eb1e8678 100755 --- a/dozer/cogs/voice.py +++ b/dozer/cogs/voice.py @@ -38,12 +38,16 @@ async def on_voice_state_update(self, member: discord.Member, before: discord.Vo # leave event, take role config = await Voicebinds.get_by(channel_id=before.channel.id) if len(config) != 0: - await member.remove_roles(member.guild.get_role(config[0].role_id)) + role_to_remove = member.guild.get_role(config[0].role_id) + if role_to_remove is not None: + await member.remove_roles() if after.channel is not None: # join event, give role config = await Voicebinds.get_by(channel_id=after.channel.id) if len(config) != 0: - await member.add_roles(member.guild.get_role(config[0].role_id)) + role_to_add = member.guild.get_role(config[0].role_id) + if role_to_add is not None: + await member.add_roles() @Cog.listener('on_voice_state_update') # Used for auto PTT async def on_PTT_check(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): From 13eb89c494892da7761875c0d97336b5aae2d59d Mon Sep 17 00:00:00 2001 From: Travis Weir Date: Mon, 13 Jul 2026 14:00:21 -0500 Subject: [PATCH 2/2] Actually add/remove roles --- dozer/cogs/voice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dozer/cogs/voice.py b/dozer/cogs/voice.py index eb1e8678..2c012b46 100755 --- a/dozer/cogs/voice.py +++ b/dozer/cogs/voice.py @@ -40,14 +40,14 @@ async def on_voice_state_update(self, member: discord.Member, before: discord.Vo if len(config) != 0: role_to_remove = member.guild.get_role(config[0].role_id) if role_to_remove is not None: - await member.remove_roles() + await member.remove_roles(role_to_remove) if after.channel is not None: # join event, give role config = await Voicebinds.get_by(channel_id=after.channel.id) if len(config) != 0: role_to_add = member.guild.get_role(config[0].role_id) if role_to_add is not None: - await member.add_roles() + await member.add_roles(role_to_add) @Cog.listener('on_voice_state_update') # Used for auto PTT async def on_PTT_check(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState):