Как исправить «discord.errors.ClientException: команда kick уже зарегистрирована». ошибка? - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю диссон-бота в discord.py, который пинает любого участника, отправляющего определенную строку, но я получаю сообщение об ошибке «discord.errors.ClientException: команда kicked уже зарегистрирована».

bot = commands.Bot(command_prefix=',')
@client.event
async def on_message(message):
    if message.author == client.user:
    return    

    if "kick me"in message.content:
        @bot.command(name="kick", pass_context=True)
        @has_permissions(kick_members=True)
        async def _kick(ctx, member: Member):
            await bot.kick(member)

Вместо того, чтобы пнуть члена, я получаю прекрасный ответ:

Ignoring exception in on_message
Traceback (most recent call last):
  File "C:\Users\Jason\AppData\Local\Programs\Python\Python35\lib\site-packages\discord\client.py", line 307, in _run_event
    yield from getattr(self, event)(*args, **kwargs)
  File "C:\Users\Jason\AppData\Local\Programs\Python\Python35\PrawnBot.py", line 66, in on_message
    async def _kick(ctx, member: Member):
  File "C:\Users\Jason\AppData\Local\Programs\Python\Python35\lib\site-packages\discord\ext\commands\core.py", line 574, in decorator
    self.add_command(result)
  File "C:\Users\Jason\AppData\Local\Programs\Python\Python35\lib\site-packages\discord\ext\commands\core.py", line 487, in add_command
    raise discord.ClientException('Command {0.name} is already registered.'.format(command))
discord.errors.ClientException: Command kick is already registered.

1 Ответ

0 голосов
/ 12 апреля 2019

Всякий раз, когда отправляется сообщение !kick me, вы перерегистрируете команду.Команда должна находиться на верхнем уровне вашего скрипта или cog, а не создаваться заново каждый раз, когда вызывается событие.

bot = commands.Bot(command_prefix=',')

@bot.event
async def on_message(message)
    ...
    await bot.process_commands(mesage)

@bot.command(name="kick", pass_context=True)
@has_permissions(kick_members=True)
async def _kick(ctx, member: Member):
    await bot.kick(member)
...