Встроенные кнопки Discord

#python-3.x #discord.py

Вопрос:

Итак, я пытаюсь заключить необычную сделку с ролью реакции и хочу использовать для этого новую функцию кнопки. У меня работает базовая кнопка. Мой код:

 import discord
from discord.ext import commands
from discord_components import DiscordComponents, Button, ButtonStyle, InteractionType
Client = commands.Bot(command_prefix="?", help_command=None)

@Client.event
async def on_ready():
    DiscordComponents(Client, change_discord_methods=True)
    print(f"{Client.user} ready!")

@Client.command()
async def button(context, *, message):
    await context.send(type=InteractionType.ChannelMessageWithSource, content=message, components=[Button(style=ButtonStyle.blue, label="Default Button", custom_id="button")])

Client.run("token")
 

Как я могу добавить роль при нажатии кнопки?

https://i.stack.imgur.com/NZAEm.png

Комментарии:

1. Помогает ли вообще этот пример из документов? gitlab.com/discord.py-components/discord.py-components/-/blob/…

2. Это помогло мне понять, как реагировать на пользователя, но все же, как заставить бота добавить роль пользователю, который нажимает на кнопку?

3. В Интернете есть сотни примеров того, как добавить кому-то роль. Вы смотрели и пробовали что-нибудь из этого? Или проверил документы: discordpy.readthedocs.io/en/latest/…

Ответ №1:

Возможно, вам придется немного изменить роль, чтобы автоматизировать ее, но здесь.

 @client.command()
async def button(ctx):
    await ctx.send("Click this for role!", components=[Button(label="button")])

    interaction = await client.wait_for("button_click")
    role = discord.utils.get(ctx.guild.roles, name="Role name")
    user = ctx.message.author
    await user.add_roles(role)
    await interaction.respond(content='Done!')
 

Комментарии:

1. Однако вариант «Выбрать» может быть лучше

Ответ №2:

Это заняло некоторое время, но я, наконец, создал код, для всех, кто хочет сыграть роль реакции на это, вот, пожалуйста.

 import json
import discord
from discord.ext import commands
from discord_components import DiscordComponents, Button
import random

Client = commands.Bot(command_prefix="?", help_command=None)

@Client.command()
async def Reaction_Role(ctx, role: discord.Role, emoji, *, message):
    ID = random.randint(111,999)
    await ctx.send(f"{message}", components=[Button(label=f"{emoji} {role}", custom_id=f"{ID}")])
    with open("reaction.json", "r") as f:
        react = json.load(f)
    rr = {
        "roleid": role.id
    }
    react[ID] = {}
    react[ID] = rr
    with open("reaction.json", "w") as f:
        json.dump(react,f,indent=4)

@Client.event
async def on_button_click(interaction):
    ID = interaction.component.custom_id
    with open("reaction.json", "r") as f:
        react = json.load(f)
    rol = react[str(ID)]["roleid"]
    role = discord.utils.get(Client.get_guild(interaction.guild.id).roles, id=rol)
    member = await interaction.guild.fetch_member(interaction.user.id)
    if role in member.roles:
        await member.remove_roles(role)
        await interaction.respond(content=f"Removed role {role}")
    if not role in member.roles:
        await member.add_roles(role)
        await interaction.respond(content=f"Added role {role}")

@Client.event
async def on_ready():
    DiscordComponents(Client, change_discord_methods=True)
    print(f"{Client.user} ready!")

Client.run("token")