Search code examples
pythondiscorddiscord.py

Discord.py Button responses interaction failed after 3 min


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!


Solution

  • 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