fix(tempvoice): enhance temporary channel deletion with retry mechanism
This commit is contained in:
35
tempvoice.py
35
tempvoice.py
@@ -524,7 +524,12 @@ class TempVoice(commands.Cog):
|
||||
|
||||
await self._send_creation_message(member, new_channel)
|
||||
|
||||
async def _delete_temp_channel_if_empty(self, channel: discord.abc.GuildChannel) -> None:
|
||||
async def _delete_temp_channel_if_empty(
|
||||
self,
|
||||
channel: discord.abc.GuildChannel,
|
||||
retries: int = 1,
|
||||
retry_delay: float = 0.75,
|
||||
) -> None:
|
||||
if not isinstance(channel, discord.VoiceChannel):
|
||||
return
|
||||
|
||||
@@ -532,27 +537,37 @@ class TempVoice(commands.Cog):
|
||||
if owner_id is None:
|
||||
return
|
||||
|
||||
if channel.members:
|
||||
for attempt in range(retries + 1):
|
||||
refreshed_channel = channel.guild.get_channel(channel.id)
|
||||
if not isinstance(refreshed_channel, discord.VoiceChannel):
|
||||
await self._remove_channel_mappings_bulk(channel.guild, {channel.id})
|
||||
return
|
||||
|
||||
if refreshed_channel.members:
|
||||
if attempt < retries:
|
||||
await asyncio.sleep(retry_delay)
|
||||
continue
|
||||
return
|
||||
|
||||
try:
|
||||
await channel.delete(reason="TempVoice: deleting empty temporary channel")
|
||||
await refreshed_channel.delete(reason="TempVoice: deleting empty temporary channel")
|
||||
except discord.NotFound:
|
||||
await self._remove_channel_mappings_bulk(channel.guild, {channel.id})
|
||||
await self._remove_channel_mappings_bulk(channel.guild, {refreshed_channel.id})
|
||||
except discord.Forbidden:
|
||||
log.warning(
|
||||
"Missing permissions to delete temporary channel %s (%s).",
|
||||
channel,
|
||||
channel.id,
|
||||
refreshed_channel,
|
||||
refreshed_channel.id,
|
||||
)
|
||||
except discord.HTTPException:
|
||||
log.exception(
|
||||
"HTTP error while deleting temporary channel %s (%s).",
|
||||
channel,
|
||||
channel.id,
|
||||
refreshed_channel,
|
||||
refreshed_channel.id,
|
||||
)
|
||||
else:
|
||||
await self._remove_channel_mappings_bulk(channel.guild, {channel.id})
|
||||
await self._remove_channel_mappings_bulk(channel.guild, {refreshed_channel.id})
|
||||
return
|
||||
|
||||
async def _setlimit_impl(self, ctx: commands.Context, limit: int) -> None:
|
||||
await self._set_locale_context(ctx.guild)
|
||||
@@ -641,7 +656,7 @@ class TempVoice(commands.Cog):
|
||||
await self._handle_join_to_create(member, target_category_id)
|
||||
|
||||
if before.channel is not None:
|
||||
await self._delete_temp_channel_if_empty(before.channel)
|
||||
await self._delete_temp_channel_if_empty(before.channel, retries=2, retry_delay=0.75)
|
||||
except Exception:
|
||||
log.exception(
|
||||
"Unexpected exception in on_voice_state_update for member %s (%s).",
|
||||
|
||||
Reference in New Issue
Block a user