如何检查机器人是否连接到频道? | discord.py

How to check if bot is connected to a channel? | discord.py

我决定尝试让我的 discord 机器人播放音乐,但我已经卡住了。主要是因为我找不到任何资源来帮助当前版本,我一直在从文档中获取所有内容。但是,我不知道如何检查机器人是否已连接到语音通道。

我试过 if not Client.is_connected():,但是没有用。如果有任何更新的资源可以帮助我了解 discord.py 语音功能的基础知识,请给我一个 link :) 这是我目前的代码:

# ----- ATTEMPT AT VOICE COMMANDS ------
#discord.opus.load_opus() - what goes in bracket???

@client.command(name="join", pass_ctx=True)
async def join(ctx):
    #if not is_connected(): - Client.is_connected() not working

    user = ctx.message.author
    vc = user.voice.channel
    await vc.connect()
    await ctx.send(f"Joined **{vc}**")

    #else:
    #    await ctx.send("I'm already connected!")

@client.command(name="disconnect", pass_ctx=True)
async def disconnect(ctx):
    # if not is_connected(): - once again can't work it out
    vc = ctx.message.guild.voice_client # i don't even know how this worked :D
    await vc.disconnect()

    #else:
    #    await ctx.send("I'm not connected to any channels")

@client.command(name="play", pass_ctx=True)
async def play(ctx, songurl=None):
    if not songurl: # this works at least
        await ctx.send("Please specify a song")
        return
    if not is_connected(): # once again, how to check if bot is connected?
        vc = ctx.message.author.voice.channel
        if not vc: # i think this should work
            await ctx.send("You're not in a voice channel!")

        await vc.connect()
    # haven't even worked out anything past this point and it's broken

ps:抱歉把我的整个 vc 部分都扔掉了,但我不太了解

这里真正重要的是播放命令,但我将其他命令包括在内只是因为(正如您从我的评论中看到的那样)我不明白发生了什么。我该怎么办?当前版本有什么好的资源吗?提前致谢。

一个bot可以同时连接多个公会的语音,所以需要获取VoiceClient for the appropriate guild from Client.voice_clients and then check VoiceClient.is_connected:

def is_connected(ctx):
    voice_client = get(ctx.bot.voice_clients, guild=ctx.guild)
    return voice_client and voice_client.is_connected()

你也可以

client.command()
async def join(ctx):
    user = ctx.message.author
    vc = user.voice.channel

    voice = discord.utils.get(client.voice_clients, guild=ctx.guild) # This allows for more functionality with voice channels

    if voice == None: # None being the default value if the bot isnt in a channel (which is why the is_connected() is returning errors)
        await vc.connect()
        await ctx.send(f"Joined **{vc}**")
    else:
        await ctx.send("I'm already connected!")

在对我的机器人进行一些试验后,我发现与此类似的东西可能对你有用。它也非常快速和简单。

if ctx.guild.voice_client in  bot.voice_clients:
    # Do something here

我在 on_message 事件中使用了它,但它也可能适用于您的用例:

if not ctx.guild.voice_client in bot.voice_clients:
    # Do something else here