Как сделать disnake кнопку одноразовой для каждого участника?

я создаю кнопку в ембед:

button = disnake.ui.Button(label='Принять правила', style=disnake.ButtonStyle.success, emoji='✅',
                           custom_id='rules_accept')
await channel('rul').send(content=content, embeds=embeds, components=button)

обрабатываю её нажатие тут:

@bot.listen("on_button_click")
async def help_listener(inter: disnake.MessageInteraction):
    if inter.component.custom_id == "rules_accept":
        await inter.user.add_roles(role('ver'))
        inter.component.disabled = True
        await inter.response.send_message(f'Успешно! Теперь вы можете верифицировать звание в '
                                          f'{channel("ver_chat").mention} или {channel("ver_voice").mention}',
                                          ephemeral=True)

но почему inter.component.disabled = True не выключает её нажатия после первого нажатия?


Ответы (2 шт):

Автор решения: SuperFeda

Попробуй сделать кнопку как отдельный объект и внутри него создать поле с любым названием, например: active. Пусть по умолчанию он будет равен True, а когда какой либо из участников будет нажимать на нее, значение будет меняться на False. Дальше просто через блок if'а смотреть чему оно равно и в зависимости от значения либо отказывать в выполнении команды, либо наоборот, выполнять её.

→ Ссылка
Автор решения: ArkaDarkTime

Смотрите, нельзя сделать чтоб кнопка была выключена для каждого участника отдельно обычным сообщением, которое видят все.

Вы можете использовать ephemeral сообщение, а так же чтоб кнопка выключалась вам нужно изменять компонет по умолчанию с помощью edit_original_message() (сокращение edit_original_response()):

@bot.listen("on_button_click")
async def help_listener(self, inter: disnake.MessageInteraction):
    if inter.component.custom_id == "rules_accept":
        button = disnake.ui.Button(
            label='Принять правила', style=disnake.ButtonStyle.success,
            emoji='✅', custom_id='rules_accept', disabled=True)
        await inter.edit_original_message(components=button)
        await inter.followup.send(
            f'Успешно! Теперь вы можете верифицировать звание!',
            ephemeral=True)
→ Ссылка