我正在尝试通过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
答案 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")