Only list jobs that are in the current guild

This commit is contained in:
2025-01-25 19:24:26 +01:00
parent 90a3b9e72e
commit b87f62ba74
2 changed files with 52 additions and 9 deletions

View File

@ -268,8 +268,29 @@ class RemindGroup(discord.app_commands.Group):
await interaction.followup.send(content="No scheduled jobs found in the database.", ephemeral=True) await interaction.followup.send(content="No scheduled jobs found in the database.", ephemeral=True)
return return
embed: discord.Embed = create_job_embed(job=jobs[0]) guild: discord.Guild | None = interaction.guild
view = JobManagementView(job=jobs[0], scheduler=scheduler) if not guild:
await interaction.followup.send(content="Failed to get guild.", ephemeral=True)
return
# Only get jobs that are in the current guild
jobs_in_guild: list[Job] = []
list_of_channels_in_current_guild: list[int] = [c.id for c in guild.channels]
for job in jobs:
# If the job has guild_id and it's not the current guild, skip it
if job.kwargs.get("guild_id") and job.kwargs.get("guild_id") != guild.id:
logger.debug("Skipping job: %s because it's not in the current guild.", job.id)
continue
# If the job has channel_id and it's not in the current guild, skip it
if job.kwargs.get("channel_id") and job.kwargs.get("channel_id") not in list_of_channels_in_current_guild:
logger.debug("Skipping job: %s because it's not in the current guild's channels.", job.id)
continue
jobs_in_guild.append(job)
embed: discord.Embed = create_job_embed(job=jobs_in_guild[0])
view = JobManagementView(job=jobs_in_guild[0], scheduler=scheduler, guild=guild)
await interaction.followup.send(embed=embed, view=view) await interaction.followup.send(embed=embed, view=view)

View File

@ -158,23 +158,41 @@ def create_job_embed(job: Job) -> discord.Embed:
class JobSelector(Select): class JobSelector(Select):
"""Select menu for selecting a job to manage.""" """Select menu for selecting a job to manage."""
def __init__(self, scheduler: AsyncIOScheduler) -> None: def __init__(self, scheduler: AsyncIOScheduler, guild: discord.Guild) -> None:
"""Initialize the job selector. """Initialize the job selector.
Args: Args:
scheduler: The scheduler to get the jobs from. scheduler: The scheduler to get the jobs from.
guild: The guild this view is for.
""" """
self.scheduler: AsyncIOScheduler = scheduler self.scheduler: AsyncIOScheduler = scheduler
self.guild: discord.Guild = guild
options: list[discord.SelectOption] = [] options: list[discord.SelectOption] = []
jobs: list[Job] = scheduler.get_jobs() jobs: list[Job] = scheduler.get_jobs()
jobs_in_guild: list[Job] = []
list_of_channels_in_current_guild: list[int] = [c.id for c in guild.channels]
for job in jobs:
# If the job has guild_id and it's not the current guild, skip it
if job.kwargs.get("guild_id") and job.kwargs.get("guild_id") != guild.id:
logger.debug("Skipping job: %s because it's not in the current guild.", job.id)
continue
# If the job has channel_id and it's not in the current guild, skip it
if job.kwargs.get("channel_id") and job.kwargs.get("channel_id") not in list_of_channels_in_current_guild:
logger.debug("Skipping job: %s because it's not in the current guild's channels.", job.id)
continue
jobs_in_guild.append(job)
# Only 25 options are allowed in a select menu. # Only 25 options are allowed in a select menu.
# TODO(TheLovinator): Add pagination for more than 25 jobs. # noqa: TD003 # TODO(TheLovinator): Add pagination for more than 25 jobs. # noqa: TD003
max_jobs: int = 25 max_jobs: int = 25
if len(jobs) > max_jobs: if len(jobs_in_guild) > max_jobs:
jobs = jobs[:max_jobs] jobs_in_guild = jobs_in_guild[:max_jobs]
for job in jobs: for job in jobs_in_guild:
label_prefix: str = "" label_prefix: str = ""
label_prefix = "Paused: " if job.next_run_time is None else label_prefix label_prefix = "Paused: " if job.next_run_time is None else label_prefix
label_prefix = "Interval: " if isinstance(job.trigger, IntervalTrigger) else label_prefix label_prefix = "Interval: " if isinstance(job.trigger, IntervalTrigger) else label_prefix
@ -198,24 +216,27 @@ class JobSelector(Select):
job: Job | None = self.scheduler.get_job(self.values[0]) job: Job | None = self.scheduler.get_job(self.values[0])
if job: if job:
embed: discord.Embed = create_job_embed(job) embed: discord.Embed = create_job_embed(job)
view = JobManagementView(job, self.scheduler) view = JobManagementView(job, self.scheduler, guild=self.guild)
await interaction.response.edit_message(embed=embed, view=view) await interaction.response.edit_message(embed=embed, view=view)
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) -> None: def __init__(self, job: Job, scheduler: AsyncIOScheduler, guild: discord.Guild) -> 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.
""" """
super().__init__(timeout=None) super().__init__(timeout=None)
self.job: Job = job self.job: Job = job
self.scheduler: AsyncIOScheduler = scheduler self.scheduler: AsyncIOScheduler = scheduler
self.add_item(JobSelector(scheduler)) self.guild: discord.Guild = 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)
@ -305,6 +326,7 @@ class JobManagementView(discord.ui.View):
status = "paused" status = "paused"
button.label = "Resume" button.label = "Resume"
else: else:
logger.error("Got a job without a next_run_time: %s", self.job.id)
status: str = f"What is this? {self.job.__getstate__()}" status: str = f"What is this? {self.job.__getstate__()}"
button.label = "What?" button.label = "What?"