Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с Python ошибка

Dan Play Ученик (88), открыт 2 недели назад
Всем привет делаю бота для Discord на Python используя библиотеку disnake.py и у меня есть код на верификацию игрока вот код


 bot.event 
async def on_button_click(button):
if button.custom_id == 'verify_button':
member = button.guild.get_member(button.user.id)
role = disnake.utils.get(button.guild.roles, name='Верифицирован')

if role:
await member.add_roles(role)

welcome_channel = disnake.utils.get(member.guild.channels, name='┇?│новые-игроки') # Имя канала для отправки приветственного сообщения
if welcome_channel:
await welcome_channel.send(f"Добро пожаловать, {member.mention}!")

Я зашел с твинка прошёл навигацию и при нажатии на кнопку Верификация мне в консоль выдает ошибку

 Traceback (most recent call last): 
File "C:\Users\Admin\AppData\Local\Programs\Python\Python313\Lib\site-packages\disnake\client.py", line 703, in _run_event
await coro(*args, **kwargs)
File "C:\Users\Admin\bot\bot.py", line 41, in on_button_click
if button.custom_id == 'verify_button':
^^^^^^^^^^^^^^^^
AttributeError: 'MessageInteraction' object has no attribute 'custom_id'

Суть этого кода что когда игрок заходит у него роль "Не Верифицирован" у него доступен один канал "Верификация" и там бот отправляет сообщение "@зашедший, Нажмите на кнопку, чтобы верифицироваться." И ниже кнопка Верифицироваться и когда игрок нажимает на неё то ему дается роль Участник а роль Не верифицирован убирается и канал Верификация пропадает. Вот суть прошу помочь мне решить эту проблему.
2 ответа
Сергей Просветленный (42710) 2 недели назад
Ну так тебе пишет красным по чёрному, что в объекте button нет никакого custom_id. Выведи на экран, что у тебя в объекте button содержится (print(button)) и разбирайся. В чём проблема? Возможно, судя по трёхсекундному поиску в гугле, надо button.component.custom_id.

Или при создании кнопки ты не присваиваешь custom_id.
Sergio 2.1 Оракул (67652) 2 недели назад
В новых версиях disnake.py следует использовать on_button_click иначе.
 @bot.listen("on_button_click") 
async def button_listener(inter: disnake.MessageInteraction):
if inter.component.custom_id == 'verify_button':
member = inter.guild.get_member(inter.author.id)
verify_role = disnake.utils.get(inter.guild.roles, name='Верифицирован')
unverified_role = disnake.utils.get(inter.guild.roles, name='Не Верифицирован')

if verify_role and unverified_role:
await member.add_roles(verify_role)
await member.remove_roles(unverified_role)

welcome_channel = disnake.utils.get(member.guild.channels, name='┇?│новые-игроки')
if welcome_channel:
await welcome_channel.send(f"Добро пожаловать, {member.mention}!")

await inter.response.send_message("Вы успешно верифицировались!", ephemeral=True)
А вот как создать сообщение с кнопкой:
 @bot.event 
async def on_member_join(member):
verify_channel = disnake.utils.get(member.guild.channels, name='верификация')
if verify_channel:
button = disnake.ui.Button(
style=disnake.ButtonStyle.green,
label="Верифицироваться",
custom_id="verify_button"
)

action_row = disnake.ui.ActionRow(button)

await verify_channel.send(
f"{member.mention}, Нажмите на кнопку, чтобы верифицироваться.",
components=[action_row]
)
Похожие вопросы