我在一年多前写了一个简单的不和谐机器人,当用户加入语音频道时,它会播放一个声音字节。直到大约一周前,它一直工作得很好。什么都没变,但我想我已经知道发生了什么。
- 用户加入语音通道,调用on_voice_state_update()。
- 机器人加入语音通道。
- 机器人加入注册另一个调用on_voice_state_update()。
- 该调用不做任何事情就返回。
- 未处理其他事件。
当它工作时,在加入语音通道后,bot会播放用户选择的声音字节并立即离开。
看起来bot能够建立到语音通道的连接,但是在执行voice_client = await after.channel.connect()
之后什么都没有。
@bot.event
async def on_voice_state_update(member, before, after):
# Ignore voice state changes that don't involve changing channels.
if before.channel == after.channel:
return
# Only do stuff if the user has a hook set up.
member_id = str(member.id)
if member_id in target_members:
# Disconnect bot from any existing voice clients before joining the new one.
for vc in bot.voice_clients:
await vc.disconnect()
# If user is disconnecting, after channel is None. Therefore, do nothing.
if after.channel is None:
return
# Join the user's voice channel and play the sound.
target_audio = target_members[member_id]
voice_client = await after.channel.connect() # This line cases the new call to on_voice_state_update()
voice_client.play(discord.FFmpegPCMAudio(target_audio))
# After playing the sound, disconnect after a short delay.
while voice_client.is_playing():
await asyncio.sleep(1)
await voice_client.disconnect()
return
编辑:经过更多的调试修改了问题。bot成功加入通道,但没有播放声音字节或离开。
discord。成员具有bot属性,无论该成员是否是bot,该属性都会返回一个布尔值。您可以在代码中检查。
@bot.event
async def on_voice_state_update(member, before, after):
# Ignore if member is a bot
if member.bot:
return
# Rest of code
这样,如果加入的用户是机器人,它就不会继续执行代码。这也常用于on_message
事件。
如果你想让它不调用只有当它是你的机器人,你可以检查用户是否是你的机器人使用Client。引用bot的用户。
@bot.event
async def on_voice_state_update(member, before, after):
# Ignore if member is a your bot
if member.id == bot.user.id:
return
# Rest of code