如何使用discord.py事件处理程序on_voice_state_update仅在用户加入语音通道时运行

时间:2018-05-22 22:02:37

标签: python-3.x discord.py

我正在尝试通过discord.py学习如何制作不和谐机器人,并希望添加一个功能,当其他用户加入机器人当前所在的语音通道时,将从机器人发送消息.I不知道如何使用事件处理程序本身,并且不了解他们的文档足以利用它。

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

2 个答案:

答案 0 :(得分:1)

2020年开始运作的版本。 请不要让我的代码在发送消息方面表现出不同。

from discord.ext.commands import Bot 
bot = commands.Bot(command_prefix='!')

@bot.event
async def on_voice_state_update(member, before, after):
    if before.channel is None and after.channel is not None:
        if after.channel.id == [YOUR_CHANNEL_ID]:
            await member.guild.system_channel.send("Alarm!")

答案 1 :(得分:0)

client.say只能在命令内使用,而不能在事件中使用。请参阅文档here

  

除了命令之外,我可以在其他地方使用bot.say吗?

     

没有。由于魔法的运作方式,它们只能在命令内部工作。

这是有道理的,因为命令总是从文本通道调用,这意味着机器人的响应可以发送到同一个通道。

在您的情况下,当用户加入语音频道时,机器人不知道发送“Howdy”的文本频道。

要解决此问题,请使用client.send_message代替client.say。在下面的示例代码中,每次触发on_voice_state_update事件时,“Howdy”都会发送到“常规”文本频道。

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")