diff --git a/bot/modules/reminders/cog.py b/bot/modules/reminders/cog.py index d3e9506a..d968bc57 100644 --- a/bot/modules/reminders/cog.py +++ b/bot/modules/reminders/cog.py @@ -416,7 +416,7 @@ class Reminders(LionCog): ) @AButton(label=t(_p('cmd:reminders_clear|confirm|button:yes', "Yes, clear my reminders"))) - async def confirm(view, interaction, press): + async def confirm(interaction, press): await interaction.response.defer() reminders = await self.data.Reminder.table.delete_where(userid=ctx.author.id) await self.talk_cancel(*(r['reminderid'] for r in reminders)).send(self.executor_name, wait_for_reply=False) @@ -430,14 +430,14 @@ class Reminders(LionCog): ), view=None ) - await view.close() + await press.view.close() await self.dispatch_update_for(ctx.author.id) @AButton(label=t(_p('cmd:reminders_clear|confirm|button:cancel', "Cancel"))) - async def deny(view, interaction, press): + async def deny(interaction, press): await interaction.response.defer() await ctx.interaction.delete_original_response() - await view.close() + await press.view.close() components = AsComponents(confirm, deny) await ctx.interaction.response.send_message(embed=embed, view=components, ephemeral=True) @@ -620,7 +620,7 @@ class Reminders(LionCog): self, ctx: LionContext, time: Transform[int, DurationTransformer(60)], - reminder: str, # TODO: Maximum length 1000? + reminder: appcmds.Range[str, 1, 1000], # TODO: Maximum length 1000? every: Optional[Transform[int, DurationTransformer(60)]] = None ): t = self.bot.translator.t diff --git a/bot/utils/ui/hooked.py b/bot/utils/ui/hooked.py index 2784e2d4..075476dc 100644 --- a/bot/utils/ui/hooked.py +++ b/bot/utils/ui/hooked.py @@ -1,3 +1,7 @@ +import time + +import discord +from discord.ui.item import Item from discord.ui.button import Button from .leo import LeoUI @@ -18,8 +22,8 @@ class HookedItem: self.pass_kwargs = pass_kwargs def __call__(self, coro): - async def wrapped(view, interaction, **kwargs): - return await coro(view, interaction, self, **kwargs, **self.pass_kwargs) + async def wrapped(interaction, **kwargs): + return await coro(interaction, self, **(self.pass_kwargs | kwargs)) self.callback = wrapped return self @@ -37,10 +41,19 @@ class AsComponents(LeoUI): self.pass_kwargs = pass_kwargs for item in items: - item.callback = self.wrap_callback(item.callback) self.add_item(item) - def wrap_callback(self, coro): - async def wrapped(*args, **kwargs): - return await coro(self, *args, **kwargs, **self.pass_kwargs) - return wrapped + async def _scheduled_task(self, item: Item, interaction: discord.Interaction): + try: + item._refresh_state(interaction, interaction.data) # type: ignore + + allow = await self.interaction_check(interaction) + if not allow: + return + + if self.timeout: + self.__timeout_expiry = time.monotonic() + self.timeout + + await item.callback(interaction, **self.pass_kwargs) + except Exception as e: + return await self.on_error(interaction, e, item)