当前位置: 首页 > 知识库问答 >
问题:

如何使用discord。仅当用户加入语音频道时,才会更新\u voice\u state\u上的py事件处理程序

刘建中
2023-03-14

我正在努力学习如何通过discord创建discord机器人。py,并希望添加一项功能,每当其他用户加入bot当前所在的语音频道时,bot就会发送一条消息。我不知道如何使用事件处理程序本身,也不太了解他们的文档来使用它。

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个答案

姬魁
2023-03-14

客户端。say只能在命令内部使用,不能在事件内部使用。请参阅此处的文档。

我能用机器人吗。除了命令之外,在其他地方说什么?

不,它们只在命令内部工作,这是因为魔法的工作方式。

这是有意义的,因为命令将始终从文本通道调用,这意味着来自bot的响应可以发送到同一通道。

在您的情况下,当用户加入语音频道时,bot不知道向哪个文本频道发送“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")
穆商震
2023-03-14

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!")
 类似资料:
  • 我只是想做一个简单的方法,让我的不和谐机器人加入一个频道。我已经看了多个线程,其中一些已经过时,因为它们是在discord.py迁移到v1.0之前。我已经使用type()和dir()来检查通道是什么类型,并查看它有什么方法。我将其与discord.py的API进行了比较,我发现一个问题是dir()创建了一个名为的字段,但是API显示对象有一个名为方法。感谢所有的帮助!:)

  • 所以我尝试制作一个机器人,当有人加入我的discord服务器的语音通道时,它可以通知我的线路组。问题是,我的朋友经常通过反复离开和加入语音频道来玩我的机器人,如果有人加入语音频道,我的机器人会在我的通话组中发送垃圾邮件。所以,如果用户已经离开语音频道5分钟并再次加入语音频道,我需要帮助使我的机器人只通知我的线路组

  • 我正在做一个简单的不和谐机器人,node.js.我让它运行并响应,但我不能召唤它到语音频道这是我使用的代码 它总是转到“加入语音频道”消息,即使我在语音频道。

  • 我正在尝试将我的discord机器人连接到语音通道,但它不工作。 没有任何错误或任何事情,当我这样做时什么都不会发生!加入我的不和频道。 这是我的代码。我试图寻找一些教程,但大多数似乎已经过时了。 有人能帮我吗? 编辑:

  • 问题内容: 我有一个字段,我想在其中应用的变体。 该字段与ajax调用绑定在一起,当用户更改输入时,服务器端将处理数据,但是,我不想太频繁地进行调用。 假设用户要输入一个真正的字符串,我希望仅在用户完成将要键入的单词后才能进行呼叫。不过,我不想使用诸如模糊之类的事件。有什么比实现更好的方法呢? 问题答案: 使用在角> 1.3 没有-在标记中: 在您的后备控制器/范围内 然后,您将仅在1000ms不

  • 这是很新的。我一直在阅读readthedocs API参考资料以了解不和谐。这对我来说没什么意义。到目前为止我有 我们的目标是让机器人加入带有的用户加入的语音频道,但我在让机器人加入频道时遇到了麻烦。