Discord.py Button responses interaction failed after 3 min

Question:

The button doesn’t respond if no one has clicked it in 3 minutes.
I saw that it was something with timeout but I don’t know where to place it.

My code:

#Tickets
class Menu(discord.ui.View):
    def __init__(self):
        super().__init__()
        self.value = None

    @discord.ui.button(label="  Ticket", style=discord.ButtonStyle.grey)
    async def menu1(self, interaction: discord.Interaction, button: discord.ui.Button):
        with open("open_channels_user_id.json", "r") as f:
            data = json.load(f)
            user_id = data["user_id"]

            if user_id != interaction.user.id:
                admin_role = discord.utils.get(interaction.guild.roles, name="hulpje")
                category = discord.utils.get(interaction.guild.categories, name='Ticket')
                overwrites = {interaction.guild.default_role: discord.PermissionOverwrite(read_messages=False),
                              interaction.guild.me: discord.PermissionOverwrite(read_messages=True),
                              interaction.user: discord.PermissionOverwrite(read_messages=True),
                              admin_role: discord.PermissionOverwrite(read_messages=True)}
                new_ticket = await interaction.guild.create_text_channel(f'Ticket- {interaction.user.name}', category=category, overwrites=overwrites)
                channel = client.get_channel(new_ticket.id)
                embed = discord.Embed(title=f'Ticket- {interaction.user.name}', description="Goed dat je een ticket opent. n Stuur alvast wat informatie zodat het makkelijker is voor het staff team.", color=0x004BFF)
                await channel.send(embed=embed)
                await interaction.response.send_message(f"Ticket is geopen met de naam: Ticket- {interaction.user.name}")

                data['user_id'] = interaction.user.id
                with open("open_channels_user_id.json", "w") as f:
                    json.dump(data, f)

                time.sleep(3)
                await interaction.channel.purge(limit=1)

            else:
                await interaction.channel.send("Je hebt al een ticket openstaan.")
                time.sleep(5)
                await interaction.channel.purge(limit=1)

async def menu(ctx):
    view = Menu()
    embed = discord.Embed(title="Ticket", description="Vragen, klachten of iets anders maak hier je Ticket aan en wordt zo snel mogelijk geholpen!", color=0x004BFF)
    await ctx.send(embed=embed, view=view)

I don’t know what to do. Pls help!

Asked By: Kevin

||

Answers:

You can set the timeout value like this:

class Menu(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=180) # Timeout value in seconds
        self.value = None

If you set it to None, it will never time out, until you restart your bot.
If you want the view to persist between bot restarts, see this example here: https://github.com/Rapptz/discord.py/blob/master/examples/views/persistent.py

Answered By: moinierer3000
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.