Implement message cleanup on bot close and enhance job management view timeout handling
This commit is contained in:
@ -26,10 +26,12 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
logger: logging.Logger = logging.getLogger(__name__)
|
logger: logging.Logger = logging.getLogger(__name__)
|
||||||
logger.setLevel(logging.DEBUG)
|
logger.setLevel(logging.DEBUG)
|
||||||
|
logging.getLogger("discord.client").setLevel(logging.INFO)
|
||||||
|
|
||||||
GUILD_ID = discord.Object(id=341001473661992962)
|
GUILD_ID = discord.Object(id=341001473661992962)
|
||||||
|
|
||||||
scheduler: settings.AsyncIOScheduler = get_scheduler()
|
scheduler: settings.AsyncIOScheduler = get_scheduler()
|
||||||
|
msg_to_cleanup: list[discord.InteractionMessage] = []
|
||||||
|
|
||||||
|
|
||||||
class RemindBotClient(discord.Client):
|
class RemindBotClient(discord.Client):
|
||||||
@ -48,6 +50,23 @@ class RemindBotClient(discord.Client):
|
|||||||
"""Log when the bot is ready."""
|
"""Log when the bot is ready."""
|
||||||
logger.info("Logged in as %s (%s)", self.user, self.user.id if self.user else "N/A ID")
|
logger.info("Logged in as %s (%s)", self.user, self.user.id if self.user else "N/A ID")
|
||||||
|
|
||||||
|
async def close(self) -> None:
|
||||||
|
"""Close the bot and cleanup views."""
|
||||||
|
logger.info("Closing bot and cleaning up views.")
|
||||||
|
for msg in msg_to_cleanup:
|
||||||
|
logger.debug("Removing view: %s", msg.id)
|
||||||
|
try:
|
||||||
|
# If the message is "/remind list timed out.", skip it
|
||||||
|
if msg.content == "/remind list timed out.":
|
||||||
|
logger.debug("Message %s is a timeout message. Skipping.", msg.id)
|
||||||
|
continue
|
||||||
|
|
||||||
|
await msg.delete()
|
||||||
|
except discord.HTTPException as e:
|
||||||
|
logger.error("Failed to remove view: %s", e) # noqa: TRY400
|
||||||
|
|
||||||
|
return await super().close()
|
||||||
|
|
||||||
async def setup_hook(self) -> None:
|
async def setup_hook(self) -> None:
|
||||||
"""Setup the bot."""
|
"""Setup the bot."""
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
@ -289,8 +308,13 @@ class RemindGroup(discord.app_commands.Group):
|
|||||||
|
|
||||||
jobs_in_guild.append(job)
|
jobs_in_guild.append(job)
|
||||||
|
|
||||||
|
message: discord.InteractionMessage = await interaction.original_response()
|
||||||
|
|
||||||
embed: discord.Embed = create_job_embed(job=jobs_in_guild[0])
|
embed: discord.Embed = create_job_embed(job=jobs_in_guild[0])
|
||||||
view = JobManagementView(job=jobs_in_guild[0], scheduler=scheduler, guild=guild)
|
view = JobManagementView(job=jobs_in_guild[0], scheduler=scheduler, guild=guild, message=message)
|
||||||
|
|
||||||
|
msg_to_cleanup.append(message)
|
||||||
|
logger.debug("Views to cleanup: %s", msg_to_cleanup)
|
||||||
|
|
||||||
await interaction.followup.send(embed=embed, view=view)
|
await interaction.followup.send(embed=embed, view=view)
|
||||||
|
|
||||||
|
@ -233,24 +233,35 @@ class JobSelector(Select):
|
|||||||
class JobManagementView(discord.ui.View):
|
class JobManagementView(discord.ui.View):
|
||||||
"""View for managing jobs."""
|
"""View for managing jobs."""
|
||||||
|
|
||||||
def __init__(self, job: Job, scheduler: AsyncIOScheduler, guild: discord.Guild) -> None:
|
def __init__(self, job: Job, scheduler: AsyncIOScheduler, guild: discord.Guild, message: discord.Message | None = None) -> None:
|
||||||
"""Initialize the job management view.
|
"""Initialize the job management view.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
job: The job to manage.
|
job: The job to manage.
|
||||||
scheduler: The scheduler to manage the job with.
|
scheduler: The scheduler to manage the job with.
|
||||||
guild: The guild this view is for.
|
guild: The guild this view is for.
|
||||||
|
message: The message to manage.
|
||||||
"""
|
"""
|
||||||
super().__init__(timeout=None)
|
super().__init__(timeout=30)
|
||||||
self.job: Job = job
|
self.job: Job = job
|
||||||
self.scheduler: AsyncIOScheduler = scheduler
|
self.scheduler: AsyncIOScheduler = scheduler
|
||||||
self.guild: discord.Guild = guild
|
self.guild: discord.Guild = guild
|
||||||
|
self.message: discord.Message | None = message
|
||||||
|
|
||||||
self.add_item(JobSelector(scheduler, self.guild))
|
self.add_item(JobSelector(scheduler, self.guild))
|
||||||
self.update_buttons()
|
self.update_buttons()
|
||||||
|
|
||||||
logger.debug("JobManagementView created for job: %s", job.id)
|
logger.debug("JobManagementView created for job: %s", job.id)
|
||||||
|
|
||||||
|
async def on_timeout(self) -> None:
|
||||||
|
"""Handle the view timeout."""
|
||||||
|
logger.info("JobManagementView timed out for job: %s", self.job.id)
|
||||||
|
if self.message:
|
||||||
|
await self.message.edit(content="`/remind list` timed out.", embed=None, view=None)
|
||||||
|
else:
|
||||||
|
logger.debug("No message to edit for job: %s", self.job.id)
|
||||||
|
self.stop()
|
||||||
|
|
||||||
@discord.ui.button(label="Delete", style=discord.ButtonStyle.danger)
|
@discord.ui.button(label="Delete", style=discord.ButtonStyle.danger)
|
||||||
async def delete_button(self, interaction: discord.Interaction, button: Button) -> None: # noqa: ARG002
|
async def delete_button(self, interaction: discord.Interaction, button: Button) -> None: # noqa: ARG002
|
||||||
"""Delete the job.
|
"""Delete the job.
|
||||||
@ -373,5 +384,11 @@ class JobManagementView(discord.ui.View):
|
|||||||
Returns:
|
Returns:
|
||||||
bool: Whether the interaction is valid.
|
bool: Whether the interaction is valid.
|
||||||
"""
|
"""
|
||||||
|
logger.info("Interaction check for job: %s", self.job.id)
|
||||||
|
logger.debug("Timeout was %s before interaction check", self.timeout)
|
||||||
|
|
||||||
|
self.timeout = 30
|
||||||
|
logger.debug("Checking interaction for job: %s", self.job.id)
|
||||||
|
|
||||||
self.update_buttons()
|
self.update_buttons()
|
||||||
return True
|
return True
|
||||||
|
Reference in New Issue
Block a user