Как передать контекст из команды в обратный вызов в discord.py

Частично готовый продукт Итак, по сути, я пытаюсь создать бота 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*')
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете передать контекст из команды в обратный вызов, передав информацию через аргументы представления. В представлении «Запрос» определите один аргумент для пользователя, которому вы хотите назначить роль, и еще один для самой роли, и установите оба аргумента в качестве атрибутов представления. Затем вы можете использовать это в функции обратного вызова для выполнения желаемых действий.

Вот ваш реформированный код:

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*')

Большое спасибо. Я занимаюсь этим уже несколько недель, и когда я задал тот же вопрос на сервере Discord.py, мне отказали, потому что у меня не было достаточно четкого понимания основ Python (и это правда). . Однако они не увидели еще более 400 строк кода, которые я уже успешно написал для других целей, но этот небольшой толчок был всем, что мне нужно, чтобы пересечь (временную) финишную черту. Еще раз спасибо за вашу помощь!

John T 11.07.2024 17:23

Привет хакерман

Sujal Motagi 12.07.2024 14:43

@JohnDykstraJohnTyler, нет проблем, я рад помочь.

hackerman 15.07.2024 15:53

Другие вопросы по теме