AuSIDE
@AuSIDE

Как отключить кнопку в on_timeout disnake?

Есть класс с двумя кнопками
class Buttons(disnake.ui.View):
    def __init__(self, author: disnake.User, timeout: float = 180):
        super().__init__(timeout=timeout)
        self.author = author

    @disnake.ui.button(label='Первая кнопка',
                       custom_id='1')
    async def first(self, button, interaction):
        pass #Не важно что в кнопках будет происходить

    @disnake.ui.button(label='Вторая кнопка',
                       custom_id='2')
    async def second(self, button, interaction):
        pass #Не важно что в кнопках будет происходить

    async def on_timeout(self):
        pass #Я не знаю что здесь необходимо написать


И сама команда, где используется этот класс с двумя кнопками (не буду прикреплять, всё равно ничего не даст). Необходимо отключить кнопку после завершения тайм-аута, но я не понимаю что необходимо написать, чтобы кнопки отключились
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
yunikeil
@yunikeil
Один из вариантов, это при отправке сообщения сохранять его объект. А в timeout использоваться message.edit. Для нахождения нужного сообщения, можно перед Context.send использовать генерацию случайного набора символов и сохранять рядом с объектом сообщения + передавать в конструктор View. Как вариант тут хорошо подойдёт словарь, в котором ключ = случайный набор символов, а значения ключа - объект сообщения.
messages: dict = {
     "18hsdijq": message,
     ...
}


Вот пример реализации на nexctcord, без использования словаря. Такой вариант не будет работать при нескольких отправленных сообщения одновременно.
class Confirm(nextcord.ui.View):
    def __init__(self):
        super().__init__()
        self.timeout = 10
        self.value = None
        self.message = None
        
    @nextcord.ui.button(label="Confirm", style=nextcord.ButtonStyle.green)
    async def confirm(self, button: nextcord.ui.Button, interaction: nextcord.Interaction):
        await interaction.response.send_message("Confirming", ephemeral=True)
        self.value = True

    @nextcord.ui.button(label="Cancel", style=nextcord.ButtonStyle.grey)
    async def cancel(self, button: nextcord.ui.Button, interaction: nextcord.Interaction):
        await interaction.response.send_message("Cancelling", ephemeral=True)
        self.value = False
    
    async def on_timeout(self):
        for item in [self.confirm, self.cancel]:
            item.disabled = True
        await message.edit(view=self)
    
    # Код из другого класса, для создания сообщения
    @commands.command()
    async def msg(self, ctx: Context):
        if ctx.author.id not in self.bot.OWNERS:
            return
        global message
        message = await ctx.send(content="Confirm", view=Confirm())
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы