#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")
Как я могу добавить роль при нажатии кнопки?
Комментарии:
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")