Как проверить, подключен ли бот к каналу? | дискорд.py

Я решил попробовать заставить своего дискорд-бота играть музыку, но я уже застрял. В основном из-за того, что я не могу найти никаких источников, которые могли бы помочь с текущей версией, я брал все из документации. Однако я не могу понять, как проверить, подключен ли бот к голосовому каналу.

Я пробовал if not Client.is_connected():, однако это не сработало. Если есть какие-либо обновленные источники, которые помогут мне получить основы голосовых функций discord.py, дайте мне ссылку :) Вот мой код:

# ----- 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, но я многого не понимаю

На самом деле все, что имеет значение здесь, это команда воспроизведения, но я включил остальные только потому, что (как вы можете видеть из моих комментариев) я не понимаю МНОГИЕ из того, что происходит. Как мне это сделать? Есть ли хорошие исходники для текущей версии? Заранее спасибо.


person xupaii    schedule 22.06.2019    source источник


Ответы (2)


Бот может быть подключен к голосу в нескольких гильдиях одновременно, поэтому вам необходимо получить VoiceClient для соответствующей гильдии из Client.voice_clients, а затем проверьте 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()
person Patrick Haugh    schedule 22.06.2019
comment
имя VoiceClient не определено - person xupaii; 23.06.2019
comment
Мой код не ссылается на класс VoiceClient напрямую, а ваш? - person Patrick Haugh; 23.06.2019
comment
Я сделал if VoiceClient.is_connected():, после включения этой функции я что-то упустил? - person xupaii; 23.06.2019
comment
Просто сделайте if is_connected(ctx):. Класс VoiceClient — это то, экземпляром которого является каждый отдельный голосовой клиент. Вы должны вызывать только методы экземпляра, как я делаю с voice_client выше. - person Patrick Haugh; 23.06.2019
comment
Кроме того, что касается моего другого вопроса, есть ли где-нибудь, где я могу научиться голосовому чату discord.py? Как гид? я ничего не могу найти - person xupaii; 23.06.2019
comment
Вы можете посмотреть пример голосового бота: github.com/Rapptz /discord.py/blob/master/examples/ При этом вы также можете получить доступ к голосовому клиенту через ctx.voice_client - person Patrick Haugh; 23.06.2019
comment
Откуда взялась функция get? - person Vencovsky; 27.09.2020
comment

вы также можете сделать

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!")
person Lag Jordan    schedule 18.02.2021