コード例 #1
0
ファイル: Bot.py プロジェクト: profile-picture-team/vin13
 async def disconnect_with_msg(msg):  # это понятно
     await voice.disconnect()  # это тоже
     await server.ctx.send(embed=MsgEmbed.hearts(msg))  # и это
コード例 #2
0
ファイル: Bot.py プロジェクト: profile-picture-team/vin13
async def on_voice_state_update(member, before, after):
    before_channel = before.channel  # это понятно
    after_channel = after.channel  # это тоже
    if before_channel is None: return  # если нечего ещё смотреть, выходим
    # если просто кто-то подключился к каналу, выходим
    if after_channel and before_channel.id == after_channel.id: return
    sid = before_channel.guild.id  # это понятно (sid - server id)
    if not sid in servers: return  # если нам нечего взять, выходим
    server = servers[sid]  # это понятно
    voice = server.voice  # это тоже
    if voice is None: return  # если нам нечего взять, выходим
    bot_id = client.user.id  # это понятно

    def is_it_only_robots(
        members
    ):  # это тоже, но объясню, если весь канал состоит из ботов, то True, в противном случае False
        for member in members:
            if member.bot == False:
                return False
        return True

    async def disconnect_with_msg(msg):  # это понятно
        await voice.disconnect()  # это тоже
        await server.ctx.send(embed=MsgEmbed.hearts(msg))  # и это

    voice_members = voice.channel.members
    if len(voice_members) > 1:  # если мы не одни
        # если мы не одни и тут только боты, отключаемся
        if is_it_only_robots(voice_members):
            await disconnect_with_msg('Пока-пока, безчувственные машины')
        return  # это понятно
    before_members = before_channel.members
    if after_channel and after_channel.members[
            0].id == bot_id:  # если нас переместили, то преследуем
        await voice.disconnect()
        try:
            voice = await before_channel.connect(
            )  # само преследование (почему говнокодим, я объясняю в конце функции)
        except asyncio.exceptions.TimeoutError:
            await disconnect_with_msg(
                'Ай-яй-яй'
            )  # если мы не смогли преследовать (нет прав), то отключаемся
        else:
            await server.ctx.send(embed=MsgEmbed.hearts('Не надо стесняться'))
            server.voice = voice
        # тут преследование удастся в любом случае, но если поменять со скоростью света права before_channel, то преследование не удастся
        return  # это понятно
    if voice.channel.id != before_channel.id: return  # я уже забыл, зачем оно
    if voice.is_connected():
        # нас кикают или никого не осталось, отключаемя
        if after_channel is None: await disconnect_with_msg('Пока-пока')
        else:  # от нас уходят в другой канал, преследуем
            after_members = after_channel.members  # это понятно
            a_mention = after_members[len(after_members) -
                                      1].mention  # это тоже
            await voice.disconnect()  # читабельность, пока
            try:
                voice = await after_channel.connect(timeout=5
                                                    )  # само преследование
            except asyncio.exceptions.TimeoutError:
                await disconnect_with_msg(
                    f'Увидимся, {a_mention}'
                )  # если мы не смогли преследовать (нет прав), то отключаемся (я бы ещё юзера нахер послал, но ладно)
            else:
                await server.ctx.send(
                    embed=MsgEmbed.hearts(f'Ты куда, {a_mention}?'))
                server.voice = voice