Частично готовый продукт Итак, по сути, я пытаюсь создать бота Discord, который позволит сотруднику запросить роль. Затем этот запрос будет отправлен на текстовый канал только для администратора с кнопкой одобрения и кнопкой отклонения. Часть, на которой я застрял, - это заставить бота автоматически добавлять роль при нажатии кнопки «Утвердить».
Мой код на данный момент:
class Request(discord.ui.View):
def __init__(self):
super().__init__()
self.value = None
@discord.ui.button(label = 'Approve', style = discord.ButtonStyle.green, disabled=False, custom_id='Approve')
async def approve(self, interaction: discord.Interaction, button: discord.ui.Button):
member = interaction.user
approve_embed = discord.Embed(title='Request Approved!', description=f'Approved by {member.mention}')
button.style=discord.ButtonStyle.gray
await interaction.response.edit_message(embed = approve_embed, view=self)
self.value = True
self.stop()
@discord.ui.button(label = 'Decline', style = discord.ButtonStyle.red, disabled=False, custom_id='Decline')
async def decline(self, interaction: discord.Interaction, button: discord.ui.Button):
member = interaction.user
button.style=discord.ButtonStyle.gray
decline_embed = discord.Embed(title='Request Declined!', description=f'Declined by {member.mention}')
await interaction.response.edit_message(embed=decline_embed, view=self)
self.value = True
self.stop()
@client.command()
@commands.has_any_role('Mod', '1253697387051094136')
async def roleadd(ctx, role: discord.Role, user: discord.Member):
channel = client.get_channel(1253704722544853185)
view = Request()
await channel.send(f'**New Role Request!** \n {ctx.author.mention} requested to give {role.mention} to {user.mention}', view=view)
await ctx.reply('*Your request has been submitted*')
Вы можете передать контекст из команды в обратный вызов, передав информацию через аргументы представления. В представлении «Запрос» определите один аргумент для пользователя, которому вы хотите назначить роль, и еще один для самой роли, и установите оба аргумента в качестве атрибутов представления. Затем вы можете использовать это в функции обратного вызова для выполнения желаемых действий.
Вот ваш реформированный код:
class Request(discord.ui.View):
def __init__(self, user_to_give_role: discord.Member, role_to_give: discord.Role):
super().__init__()
self.value = None
self.user_to_give_role = user_to_give_role
self.role_to_give = role_to_give
@discord.ui.button(label='Approve', style=discord.ButtonStyle.green, disabled=False, custom_id='Approve')
async def approve(self, button: discord.Button, interaction: discord.Interaction):
member = interaction.user
approve_embed = discord.Embed(
title='Request Approved!', description=f'Approved by {member.mention}')
button.style = discord.ButtonStyle.gray
await interaction.response.edit_message(embed=approve_embed, view=self)
await self.user_to_give_role.add_roles(self.role_to_give)
self.value = True
self.stop()
@discord.ui.button(label='Decline', style=discord.ButtonStyle.red, disabled=False, custom_id='Decline')
async def decline(self, button: discord.Button, interaction: discord.Interaction):
member = interaction.user
button.style = discord.ButtonStyle.gray
decline_embed = discord.Embed(
title='Request Declined!', description=f'Declined by {member.mention}')
await interaction.response.edit_message(embed=decline_embed, view=self)
self.value = True
self.stop()
@client.command()
@commands.has_any_role('Mod', '1253697387051094136')
async def roleadd(ctx, role: discord.Role, user: discord.Member):
channel = client.get_channel(1253704722544853185)
view = Request(user_to_give_role=user, role_to_give=role)
await channel.send(f'**New Role Request!** \n {ctx.author.mention} requested to give {role.mention} to {user.mention}', view=view)
await ctx.reply('*Your request has been submitted*')
Привет хакерман
@JohnDykstraJohnTyler, нет проблем, я рад помочь.
Большое спасибо. Я занимаюсь этим уже несколько недель, и когда я задал тот же вопрос на сервере Discord.py, мне отказали, потому что у меня не было достаточно четкого понимания основ Python (и это правда). . Однако они не увидели еще более 400 строк кода, которые я уже успешно написал для других целей, но этот небольшой толчок был всем, что мне нужно, чтобы пересечь (временную) финишную черту. Еще раз спасибо за вашу помощь!