Перед процессом on_voice_state_update убедитесь, что бот находится в канале - PullRequest
0 голосов
/ 30 мая 2020

Я ранее задавал вопрос о фактическом процессе этого, и у меня он работал отлично, но есть только одна ошибка.

async def on_voice_state_update(self, member, before, after):
    def is_connected(member):
        voice_client = get(self.bot.voice_clients, guild=member.guild)
        return voice_client and voice_client.is_connected()

    if is_connected(member):
        await asyncio.sleep(9)
        if member.id == 'id of member' and after.afk and not before.afk:
            prevchannel = int(before.channel.id)
            channel = self.bot.get_channel(prevchannel)
            voice = await channel.connect()
            voice.play(discord.FFmpegPCMAudio('dir of mp3 file'))
            await asyncio.sleep(5)
            await voice.disconnect()
        else:
            pass
    else:
        if member.id == 'id of member' and after.afk and not before.afk:
            prevchannel = int(before.channel.id)
            channel = self.bot.get_channel(prevchannel)
            voice = await channel.connect()
            voice.play(discord.FFmpegPCMAudio('dir of mp3 file'))
            await asyncio.sleep(5)
            await voice.disconnect()
        else:
            pass

Я пытаюсь проверить, подключен ли бот к голосовой канал, так что если более одного человека присоединяются к AFK в одно и то же время (например, через 2 секунды), он ждет, пока не будет выполнена следующая итерация программы: await asyncio.sleep(10)

Проблема

Кажется, мне не удается заставить работать функцию is_connected, хотя я считаю, что иду в правильном направлении. Я подумал о том, чтобы попытаться получить идентификатор пользователя бота и проверить, подключен ли он к голосовому каналу. Это будет примерно так:

def is_botconnected(member):
    botid = self.bot.get_user('id of bot')
    channel = (all the channels)
if botid in channel.members:
    await asyncio.sleep(9)
    #execute program
else:
    #execute program

1 Ответ

0 голосов
/ 31 мая 2020

Решение

Мне удалось заставить его работать, используя bot.voice_clients.

async def on_voice_state_update(self, member, before, after):
    def is_connected(self):
        bot_client = get(self.bot.voice_clients)
        return bot_client and bot_client.is_connected()

    if is_connected(self):
        await asyncio.sleep(9)
        #execute program
    else:
        #execute program

self используется, поскольку это винтик.

...