Add better error handling

This commit is contained in:
2025-01-14 00:22:52 +01:00
parent f1695848ef
commit e379afe108
4 changed files with 189 additions and 56 deletions

View File

@ -12,7 +12,7 @@ from apscheduler.triggers.interval import IntervalTrigger
from discord.ui import Button, Select
from discord_reminder_bot import settings
from discord_reminder_bot.misc import calc_time, calculate
from discord_reminder_bot.misc import DateTrigger, calc_time, calculate
from discord_reminder_bot.parser import parse_time
if TYPE_CHECKING:
@ -208,9 +208,14 @@ def create_job_embed(job: Job) -> discord.Embed:
author_id: int = job_kwargs.get("author_id", 0)
embed_title: str = textwrap.shorten(f"{message}", width=256, placeholder="...")
# If trigger is IntervalTrigger, show the interval
interval: str = ""
if isinstance(job.trigger, IntervalTrigger):
interval = f"Interval: {job.trigger.interval} seconds"
return discord.Embed(
title=embed_title,
description=f"ID: {job.id}\nNext run: {next_run_time}\nTime left: {calculate(job)}\nChannel: <#{channel_id}>\nAuthor: <@{author_id}>", # noqa: E501
description=f"ID: {job.id}\nNext run: {next_run_time}\nTime left: {calculate(job)}\n{interval}\nChannel: <#{channel_id}>\nAuthor: <@{author_id}>", # noqa: E501
color=discord.Color.blue(),
)
@ -240,9 +245,11 @@ class JobSelector(Select):
label_prefix: str = ""
if job.next_run_time is None:
label_prefix = "Paused: "
# Cron job
elif isinstance(job.trigger, CronTrigger):
label_prefix = "Cron: "
# Interval job
elif isinstance(job.trigger, IntervalTrigger):
label_prefix = "Interval: "
@ -281,6 +288,7 @@ class JobManagementView(discord.ui.View):
self.scheduler: settings.AsyncIOScheduler = scheduler
self.add_item(JobSelector(scheduler))
self.update_buttons()
logger.debug("JobManagementView created for job: %s", job.id)
@discord.ui.button(label="Delete", style=discord.ButtonStyle.danger)
async def delete_button(self, interaction: discord.Interaction, button: Button) -> None: # noqa: ARG002
@ -292,7 +300,7 @@ class JobManagementView(discord.ui.View):
"""
job_kwargs: dict = self.job.kwargs or {}
logger.info("Deleting job: %s", self.job.id)
logger.info("Deleting job: %s because %s clicked the button.", self.job.id, interaction.user.name)
if hasattr(self.job, "__getstate__"):
logger.debug("State: %s", self.job.__getstate__() if hasattr(self.job, "__getstate__") else "No state")
@ -379,6 +387,7 @@ class JobManagementView(discord.ui.View):
if self.job.max_instances:
msg += f"**Max instances**: {self.job.max_instances}\n"
logger.debug("Deletion message: %s", msg)
return msg
@discord.ui.button(label="Modify", style=discord.ButtonStyle.primary)
@ -389,7 +398,7 @@ class JobManagementView(discord.ui.View):
interaction: The interaction object for the command.
button: The button that was clicked.
"""
logger.info("Modifying job: %s", self.job.id)
logger.info("Modifying job: %s. Clicked by %s", self.job.id, interaction.user.name)
if hasattr(self.job, "__getstate__"):
logger.debug("State: %s", self.job.__getstate__() if hasattr(self.job, "__getstate__") else "No state")
@ -422,17 +431,27 @@ class JobManagementView(discord.ui.View):
self.update_buttons()
await interaction.response.edit_message(view=self)
msg: str = f"Job '{self.job.name}' has been {status}."
job_kwargs: dict = self.job.kwargs or {}
job_msg: str = job_kwargs.get("message", "No message found")
job_author: int = job_kwargs.get("author_id", 0)
msg: str = f"Job '{job_msg}' has been {status} by <@{interaction.user.id}>. Job was created by <@{job_author}>."
if hasattr(self.job, "next_run_time"):
msg += f"\nNext run time: {self.job.next_run_time} {calculate(self.job)}"
trigger_time: datetime.datetime | None = (
self.job.trigger.run_date if isinstance(self.job.trigger, DateTrigger) else self.job.next_run_time
)
msg += f"\nNext run time: {trigger_time} {calculate(self.job)}"
await interaction.followup.send(msg)
def update_buttons(self) -> None:
"""Update the visibility of buttons based on job status."""
self.pause_button.disabled = not self.job.next_run_time
logger.debug("Updating buttons for job: %s", self.job.id)
self.pause_button.label = "Resume" if self.job.next_run_time is None else "Pause"
logger.debug("Pause button disabled: %s", self.pause_button.disabled)
logger.debug("Pause button label: %s", self.pause_button.label)
async def interaction_check(self, interaction: discord.Interaction) -> bool: # noqa: ARG002
"""Check the interaction and update buttons before responding.