Ошибка при запуске бота 'This client already has an associated command tree'
Пытаюсь освоить слэш-команды на discord.py. Прошерстила форумы, но решения своей проблемы не нашла. При запуске бота выдает ошибку:
Traceback (most recent call last):
File "d:\vip_files\code\bot\testbot.py", line 9, in <module>
tree = app_commands.CommandTree(bot)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\mimi\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\app_commands\tree.py", line 132, in __init__
raise ClientException('This client already has an associated command tree.')
discord.errors.ClientException: This client already has an associated command tree.
PS D:\vip_files\code\bot>
Вот весь код:
import discord
from discord import app_commands
from discord.ext import commands
TOKEN ='токен'
intents = discord.Intents.all()
bot = commands.Bot(command_prefix='?', intents=intents)
tree = app_commands.CommandTree(bot)
@bot.event
async def on_ready():
await tree.sync(guild=discord.Object(id=id сервера))
print('Im ready!')
# Клин
@tree.command(name = 'Клин', description = 'Очистка сообщений', guild=discord.Object(id=id сервера))
@commands.has_any_role(ids ролей)
async def клин(interaction: discord.Interaction, количество = 100):
await interaction.channel.purge(limit = int(количество))
await interaction.send('Готово!', ephemeral=True)
bot.run(TOKEN)
Ответы (2 шт):
Автор решения: Алексей Сенокосов
→ Ссылка
Ошибка "discord.errors.ClientException: This client already has an associated command tree" возникает, когда вы пытаетесь создать новое дерево команд для клиента Discord, который уже имеет связанное дерево команд.
При использовании discord.app_commands.CommandTree вы должны вызывать метод sync() только один раз для каждого клиента. Вы пытаетесь вызвать sync() внутри функции on_ready(), которая может вызываться каждый раз при подключении бота к Discord.
---------------------
import discord
from discord import app_commands
from discord.ext import commands
TOKEN ='токен'
intents = discord.Intents.all()
bot = commands.Bot(command_prefix='?', intents=intents)
tree = app_commands.CommandTree(bot)
tree.sync(guild=discord.Object(id=id_сервера)) # вынесли sync() за пределы on_ready()
@bot.event
async def on_ready():
print('Im ready!')
# Клин
@tree.command(name='Клин', description='Очистка сообщений', guild=discord.Object(id=id_сервера))
@commands.has_any_role(ids_ролей)
async def клин(interaction: discord.Interaction, количество=100):
await interaction.channel.purge(limit=int(количество))
await interaction.send('Готово!', ephemeral=True)
bot.run(TOKEN)
Автор решения: s1nhronn
→ Ссылка
К сожалению, нельзя использовать одновременно слеш-команды и команды без него. Либо то, либо то. Поэтому, напиши так:
import discord
from discord import app_commands
from discord.ext import commands
TOKEN ='токен'
intents = discord.Intents.all()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
@client.event
async def on_ready():
await tree.sync(guild=discord.Object(id=id сервера))
print('Im ready!')
# Клин
@tree.command(name = 'Клин', description = 'Очистка сообщений', guild=discord.Object(id=id сервера))
@commands.has_any_role(ids ролей)
async def клин(interaction: discord.Interaction, количество = 100):
await interaction.channel.purge(limit = int(количество))
await interaction.send('Готово!', ephemeral=True)
client.run(TOKEN)