Discord.py(重写)如何检查机器人是否已经在您要求它加入的频道中?

Discord.py (rewrite) How to check if the bot is already in the channel you're asking it to join?

我在让我的机器人检查它是否已经在它被要求加入的频道中时遇到了一些麻烦。

举个例子,这是一段代码:

async def _sound(self, ctx:commands.Context):
   voice_channel = None
   if ctx.author.voice != None:
        voice_channel = ctx.author.voice.channel

   if voice_channel != None:
        vc = await voice_channel.connect()
        vc.play(discord.FFmpegPCMAudio('sound.mp3'))
        await asyncio.sleep(5)
        await vc.disconnect()

我面临的问题是,如果我在机器人仍在语音频道中时使用命令 >sound,我会收到一条错误消息,提示机器人已经在频道中。我尝试比较客户端通道和用户通道,如果它们相同则断开连接然后重新连接以避免错误,但我无法正确处理。这是我试过但没有用的方法:

voice_client = ctx.voice_client
if voice_client.channel.id == voice_channel.id:
        await voice_channel.disconnect
        vc = await voice_channel.connect()
        vc.play(discord.FFmpegPCMAudio('sound.mp3'))
        asyncio.sleep(4)
        await vc.disconnect()

您可以通过ctx.voice_client获得该公会(如果有的话)的机器人的VoiceClient。然后您可以在频道之间移动该客户端(如果它已经存在则什么也不做),或者如果它不存在则通过 voice_channel.connect 创建一个新客户端:

@commands.command()
async def _sound(self, ctx):
    if ctx.author.voice is None or ctx.author.voice.channel is None:
        return

    voice_channel = ctx.author.voice.channel
    if ctx.voice_client is None:
        vc = await voice_channel.connect()
    else:
        await ctx.voice_client.move_to(voice_channel)
        vc = ctx.voice_client

    vc.play(discord.FFmpegPCMAudio('sound.mp3'))
    await asyncio.sleep(5)
    await vc.disconnect()