Как сделать 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 шт):
Попробуй сделать кнопку как отдельный объект и внутри него создать поле с любым названием, например: active
. Пусть по умолчанию он будет равен True
, а когда какой либо из участников будет нажимать на нее, значение будет меняться на False
. Дальше просто через блок if
'а смотреть чему оно равно и в зависимости от значения либо отказывать в выполнении команды, либо наоборот, выполнять её.
Смотрите, нельзя сделать чтоб кнопка была выключена для каждого участника отдельно обычным сообщением, которое видят все.
Вы можете использовать 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)