Search code examples
pythondiscorddiscord.pynextcordpycord

How to have separate interactions for separate buttons | discord.py pycord


How can I have different interactions response on different buttons in pycord/discord.py.

Code:

@client.command()
async def test(ctx: commands.Context):
    button = Button(label="Click Below", custom_id="freefire",style=discord.ButtonStyle.green, emoji="<:freefire:944183849779335198>")
    button1 = Button(label="Click Below", custom_id="bgmi",style=discord.ButtonStyle.green, emoji="<:bgmi:944184219528208384>")

    async def free_fire(interaction: discord.Interaction):
        role = ctx.guild.get_role(944152201784336414)
        member = ctx.guild.get_member(interaction.user.id)
        if role in interaction.user.roles and interaction.custom_id== "freefire":
            await interaction.user.remove_roles(role)
            await interaction.response.send_message(f"{role} role has been taken from you", ephemeral=True)
        else:
            await member.add_roles(role)
            await interaction.response.send_message(f"{role} role has been given to you", ephemeral=True)
        

    button.callback = free_fire


    async def bgmi(interaction: discord.Interaction):
        role = ctx.guild.get_role(944152314200088667)
        member = ctx.guild.get_member(interaction.user.id)
        if role in interaction.user.roles and interaction.custom_id== "bgmi":
            await interaction.user.remove_roles(role)
            await interaction.response.send_message(f"{role} role has been taken from you", ephemeral=True)
        else:
            await member.add_roles(role)
            await interaction.response.send_message(f"{role} role has been given to you", ephemeral=True)
        

    button.callback = bgmi

It simply gives the role of last button when I click the first button and other buttons do not respond at all there is no error in console or anywhere.


Solution

  • The problem is that you first set button.callback to free_fire, but then you set button.callback to bgmi. This can be solved by changing the second button.callback = ... to button1.callback = ...