Задать вопрос
@andreiw20

Ошибка в коде как исправить?

я написал код:
# Обработчик нажатия на кнопку присоединения к игре
@bot.on_component()
async def join_game_button(interaction):
global players
if interaction.author not in players:
players[interaction.author] = None
await interaction.response.send_message(content=f"{interaction.author.mention} присоединился к игре!", ephemeral=True)
else:
await interaction.response.send_message(content="Вы уже присоединились к игре!", ephemeral=True)

но почемуто когда я хочу запустить бота выбивает такую ошибку:

line 107, in
@bot.on_component()
^^^^^^^^^^^^^^^^
AttributeError: 'Bot' object has no attribute 'on_component'

Вот полный код без токена:
import disnake
from disnake.ext import commands
from disnake import Button, ButtonStyle
import random

# Токен вашего Discord бота
TOKEN = 'тут токен бота'

# Список игроков и их ролей
players = {}
roles = {}

# Функция для создания ролей
def assign_roles(num_players):
num_mafia = num_players // 3
num_doctors = 1
num_sheriffs = 1
num_citizens = num_players - num_mafia - num_doctors - num_sheriffs

roles['Мафия'] = num_mafia
roles['Доктор'] = num_doctors
roles['Шериф'] = num_sheriffs
roles['Горожане'] = num_citizens

# Функция для отправки личных сообщений
async def send_private_message(member, message):
try:
await member.send(message)
except:
pass

# Функция для начала игры
async def start_game(ctx, num_players):
global players, roles

if num_players < 1:
await ctx.send("Минимальное количество игроков для игры - 1")
return

assign_roles(num_players)
roles_list = []
for role, count in roles.items():
roles_list.extend([role] * count)

random.shuffle(roles_list)

players = {member: role for member, role in zip(ctx.guild.members, roles_list)}

for member, role in players.items():
await send_private_message(member, f"Ваша роль: {role}")

# Создание кнопки
button = Button(
style=ButtonStyle.gray,
label="Присоединиться",
custom_id="join_game"
)

# Добавление кнопки к сообщению
channel = ctx.bot.get_channel(1175286062839509073) # Айди канала для объявлений
message = await channel.send("Игра началась! Нажмите на кнопку, чтобы присоединиться.", components=[[button]])
print("Кнопка добавлена к сообщению:", message.id)

# Функция для присоединения к игре
async def join_game(ctx):
global players
if ctx.author not in players:
players[ctx.author] = None
await ctx.send(f"{ctx.author.mention} присоединился к игре!")

# Инициализация бота
intents = disnake.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents)

# Обработчик события "готовность" бота
@bot.event
async def on_ready():
print('Бот успешно подключен к Discord!')
print(f'Зашел как: {bot.user.name}')
print(f'ID бота: {bot.user.id}')
print('------')

# Команда для начала игры
@bot.command()
async def начать_мафию(ctx, num_players: int):
allowed_role_ids = [1193356600677773333] # Айди роли, которая может запускать игру
if any(role.id in allowed_role_ids for role in ctx.author.roles):
await start_game(ctx, num_players)
else:
await ctx.send("У вас нет прав для запуска игры или вы ввели некорректную команду.")

# Команда для запуска игры (только для администраторов)
@bot.command()
async def запустить_мафию(ctx):
allowed_role_ids = [1193356600677773333] # Айди роли, которая может запускать игру
if any(role.id in allowed_role_ids for role in ctx.author.roles):
await ctx.send("Введите количество игроков после команды, например: `!начать_мафию 8`")
else:
await ctx.send("У вас нет прав для запуска игры.")

# Команда для присоединения к игре
@bot.command()
async def присоединиться(ctx):
await join_game(ctx)

# Обработчик нажатия на кнопку присоединения к игре
@bot.on_component()
async def join_game_button(interaction):
global players
if interaction.author not in players:
players[interaction.author] = None
await interaction.response.send_message(content=f"{interaction.author.mention} присоединился к игре!", ephemeral=True)
else:
await interaction.response.send_message(content="Вы уже присоединились к игре!", ephemeral=True)

# Запуск бота
bot.run(TOKEN)

ПОЖАЛУЙСТА ПОМОГИТЕ РЕШИТЬ ЭТУ ОШИБКУ

А также есть и вот такая ошибка

MessageContentPrefixWarning: Message Content intent is not enabled and a prefix is configured. This may cause limited functionality for prefix commands. If you want prefix commands, pass an intents object with message_content set to True. If you don't need any prefix functionality, consider using InteractionBot. Alternatively, set prefix to disnake.ext.commands.when_mentioned to silence this warning.
bot = commands.Bot(command_prefix='!', intents=intents)
Traceback (most recent call last):
  • Вопрос задан
  • 173 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
По первой: on_component - это не атрибут бота, а внутреннее событие.
Писать надо как-то так:
# Обработчик нажатия на кнопку присоединения к игре
@bot.event
async def on_component(interaction):
    global players
    if interaction.author not in players:
        players[interaction.author] = None
        await interaction.response.send_message(content=f"{interaction.author.mention} присоединился к игре!",
                                                ephemeral=True)
    else:
        await interaction.response.send_message(content="Вы уже присоединились к игре!", ephemeral=True)

По второй: intents = disnake.Intents.all()

65ea40dbe196f490077828.png

З.Ы. И, может быть, лучше делать на слэш командах? - чтобы пользователям не нужно было прописывать их текстом и помнить их формат, а просто тыкать мышой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы