diff --git a/agon/cogs/commands/create.py b/agon/cogs/commands/create.py index 7b9b0a1..1833d58 100644 --- a/agon/cogs/commands/create.py +++ b/agon/cogs/commands/create.py @@ -99,7 +99,7 @@ class CreateCog(commands.Cog, name="Create Cog"): min_value=1, max_value=30, ), - channel: nextcord.TextChannel | None = nextcord.SlashOption( + channel: nextcord.TextChannel | nextcord.Thread | None = nextcord.SlashOption( description="Channel to post Group in. If left empty, defaults to current channel.", required=False, default=None, diff --git a/agon/cogs/commands/delete.py b/agon/cogs/commands/delete.py index 8be1c56..c30aeb3 100644 --- a/agon/cogs/commands/delete.py +++ b/agon/cogs/commands/delete.py @@ -37,7 +37,7 @@ class DeleteCog(commands.Cog, name="Delete Cog"): async def channel_messages( self, interaction: nextcord.Interaction, - channel: nextcord.TextChannel | None = nextcord.SlashOption( + channel: nextcord.TextChannel | nextcord.Thread | None = nextcord.SlashOption( description="Channel to clear of messages.", required=False, default=None, @@ -54,7 +54,7 @@ class DeleteCog(commands.Cog, name="Delete Cog"): Is a SlashOption. Limited to text channels. Defaults to None. """ if not channel: - if isinstance(interaction.channel, nextcord.TextChannel): + if isinstance(interaction.channel, nextcord.TextChannel | nextcord.Thread): channel = interaction.channel else: # This should never happen. diff --git a/agon/cogs/commands/set.py b/agon/cogs/commands/set.py index dc015c0..b43c589 100644 --- a/agon/cogs/commands/set.py +++ b/agon/cogs/commands/set.py @@ -251,6 +251,10 @@ class SetCog(commands.Cog, name="Set command."): channel (nextcord.abc.GuildChannel, optional): Channel to register. Is a SlashOption. Limited to text channels, Defaults to None. """ + if interaction.guild is None or interaction.channel is None: + agon_logger.warning("Set command was called with an interaction that had no guild or channel.") + return + channel_id = interaction.channel.id if not channel else channel.id with Session(engine) as session: @@ -262,11 +266,14 @@ class SetCog(commands.Cog, name="Set command."): if (group := session.scalar(stmt)) is None: await interaction.response.send_message("Group or Category was not found.", ephemeral=True) return + old_channel_id = group.channel_id group.channel_id = channel_id session.commit() - # TODO(imcompiling): delete the message and call send_highscore_message to send a new one. Bug needs fixed - # first. - # 082 + + old_channel = interaction.guild.get_channel(old_channel_id) + if old_channel and isinstance(old_channel, nextcord.TextChannel | nextcord.Thread) and group.message_id: + await old_channel.get_partial_message(group.message_id).delete() + await interaction.send(f"Registered <#{channel_id}>.", ephemeral=True) @group.subcommand( diff --git a/agon/cogs/commands/submission.py b/agon/cogs/commands/submission.py index 0ac1b6d..24f3ad3 100644 --- a/agon/cogs/commands/submission.py +++ b/agon/cogs/commands/submission.py @@ -101,7 +101,7 @@ class SubmissionCog(commands.Cog): await interaction.response.send_message(error_response, ephemeral=True) return - if not isinstance(channel, nextcord.TextChannel): + if not isinstance(channel, nextcord.TextChannel | nextcord.Thread): await interaction.response.send_message("An error happened with submission.") agon_logger.error( "Channel id %s in guild %s is does not correspond to a TextChannel.", channel.id, channel.guild.id diff --git a/agon/cogs/commands/views/delete_confirm.py b/agon/cogs/commands/views/delete_confirm.py index 0655b3e..b909aea 100644 --- a/agon/cogs/commands/views/delete_confirm.py +++ b/agon/cogs/commands/views/delete_confirm.py @@ -43,7 +43,7 @@ class DeleteConfirmView(nextcord.ui.Modal): session.delete(group) # delete the message related to group channel = interaction.guild.get_channel(group.channel_id) - if not isinstance(channel, nextcord.TextChannel): + if not isinstance(channel, nextcord.TextChannel | nextcord.Thread): return message: nextcord.Message = await channel.fetch_message(group.message_id) await message.delete() diff --git a/agon/utils.py b/agon/utils.py index bb4a74c..d30868e 100644 --- a/agon/utils.py +++ b/agon/utils.py @@ -342,11 +342,13 @@ async def send_highscore_message(session: Session, guild: nextcord.Guild, group: group (CategoryGroup): group to post to the message. """ highscore_string = format_highscore_message(session, group) - channel = guild.get_channel(group.channel_id) + if (channel := guild.get_channel(group.channel_id)) is None: + agon_logger.error("Channel id %s in guild %s does not exist.", group.channel_id, guild.id) + return - if not isinstance(channel, nextcord.TextChannel): + if not isinstance(channel, nextcord.TextChannel | nextcord.Thread): agon_logger.error( - "Channel id %s in guild %s is does not correspond to a TextChannel.", channel.id, channel.guild.id + "Channel id %s in guild %s is does not correspond to a TextChannel or Thread.", channel.id, channel.guild.id ) return @@ -356,10 +358,14 @@ async def send_highscore_message(session: Session, guild: nextcord.Guild, group: group.message_id = message.id session.commit() else: - # TODO(imcompiling): check what happens when message is deleted. - # https://gitea.cheezers.org/imcompiling/agon/issues/83 - message: nextcord.Message = await channel.fetch_message(group.message_id) - await message.edit(content=highscore_string) + try: + message: nextcord.Message = await channel.fetch_message(group.message_id) + await message.edit(content=highscore_string) + except nextcord.NotFound: + # Message was deleted on discord's side. + message: nextcord.Message = await channel.send(highscore_string) + group.message_id = message.id + session.commit() return