Discord.py (переписать) Как проверить, находится ли бот в канале, вы просите его присоединиться? - PullRequest
0 голосов
/ 06 января 2020

У меня небольшая проблема с проверкой моего бота, если он уже находится на канале, к которому его просят присоединиться.

В качестве примера приведен фрагмент кода:

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()

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

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()

1 Ответ

2 голосов
/ 06 января 2020

Вы можете получить VoiceClient бота в этой гильдии (если есть) через ctx.voice_client. Затем вы можете переместить этого клиента между каналами (который ничего не сделает, если он уже там) или создать нового клиента через 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()
...