Ответы пользователя по тегу discord.py
  • Как отключить кнопку в on_timeout disnake?

    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())
    Ответ написан
    Комментировать