Как использовать обработчик события discord.py on_voice_state_update для запуска только при подключении пользователя к голосовому каналу - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь научиться создавать диск-бот через discord.py и хотел добавить функцию, в которой сообщение будет отправляться ботом всякий раз, когда другой пользователь присоединяется к голосовому каналу, в котором в данный момент находится бот. Я незнал, как использовать сам обработчик событий, и недостаточно разбирался в их документации, чтобы его использовать.

from discord.ext.commands import Bot 
client = Bot(command_prefix="!")

@client.event
async def on_voice_state_update(before, after):
    await client.say("Howdy")

Из моего ограниченного понимания документации, обработчик событий должен использоваться всякий раз, когда пользователь отключен, оглушен, покидает или присоединяется к каналу.

Однако даже когда я пыталсячтобы он распознал эти действия, он выдал мне сообщение об ошибке:

Ignoring exception in on_voice_state_update
Traceback (most recent call last):
  File "C:\Users\Sam\PycharmProjects\FunBotProject\venv\lib\site-packages\discord\client.py", line 307, in _run_event
    yield from getattr(self, event)(*args, **kwargs)
  File "C:/Users/Sam/PycharmProjects/FunBotProject/my_bot2.py", line 63, in on_voice_state_update
    await client.say("Xd ")
  File "C:\Users\Sam\PycharmProjects\FunBotProject\venv\lib\site-packages\discord\ext\commands\bot.py", line 309, in _augmented_msg
    msg = yield from coro
  File "C:\Users\Sam\PycharmProjects\FunBotProject\venv\lib\site-packages\discord\client.py", line 1145, in send_message
    channel_id, guild_id = yield from self._resolve_destination(destination)
  File "C:\Users\Sam\PycharmProjects\FunBotProject\venv\lib\site-packages\discord\client.py", line 289, in _resolve_destination
    raise InvalidArgument(fmt.format(destination))
discord.errors.InvalidArgument: Destination must be Channel, PrivateChannel, User, or Object. Received NoneType

1 Ответ

0 голосов
/ 23 мая 2018

client.say можно использовать только внутри команд, а не событий.См. Документацию здесь .

Могу ли я использовать bot.say в других местах, кроме команд?

Нет.Они работают только внутри команд из-за того, как работает задействованная магия.

Это имеет смысл, поскольку команда всегда будет вызываться из текстового канала, что означает, что ответ от бота может быть отправлен натот же канал.

В вашем случае, когда пользователь присоединяется к голосовому каналу, бот не знает, на какой текстовый канал отправить «Howdy».

Чтобы это исправить, используйте client.send_messageвместо client.say.В приведенном ниже примере кода «Howdy» будет отправляться на «общий» текстовый канал каждый раз, когда вызывается событие on_voice_state_update.

from discord.ext.commands import Bot 
client = Bot(command_prefix="!")

@client.event
async def on_voice_state_update(before, after):
    if before.voice.voice_channel is None and after.voice.voice_channel is not None:
        for channel in before.server.channels:
            if channel.name == 'general':
                await client.send_message(channel, "Howdy")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...