Top.Mail.Ru
Ответы

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

Всем привет делаю бота для Discord на Python используя библиотеку disnake.py и у меня есть код на верификацию игрока вот код


123456789101112
 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}!") 


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

1234567
 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' 


Суть этого кода что когда игрок заходит у него роль "Не Верифицирован" у него доступен один канал "Верификация" и там бот отправляет сообщение "@зашедший, Нажмите на кнопку, чтобы верифицироваться." И ниже кнопка Верифицироваться и когда игрок нажимает на неё то ему дается роль Участник а роль Не верифицирован убирается и канал Верификация пропадает. Вот суть прошу помочь мне решить эту проблему.

По дате
По Рейтингу
Аватар пользователя
Оракул
7мес

В новых версиях disnake.py следует использовать on_button_click иначе.

12345678910111213141516
 @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) 

А вот как создать сообщение с кнопкой:

12345678910111213141516
 @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] 
        ) 
Аватар пользователя
Просветленный
7мес

Ну так тебе пишет красным по чёрному, что в объекте button нет никакого custom_id. Выведи на экран, что у тебя в объекте button содержится (print(button)) и разбирайся. В чём проблема? Возможно, судя по трёхсекундному поиску в гугле, надо button.component.custom_id.

Или при создании кнопки ты не присваиваешь custom_id.