示例#1
0
async def join(ctx, channel_name='', *, reconnect=True) -> bool:
    async def get_voice_channel() -> Optional[discord.VoiceChannel]:
        if channel_name == '':
            if not member_is_connected(ctx.author):
                await ctx.send(
                    embed=MsgEmbed.error('Присоединись к каналу, мудак'))
                return None
            return ctx.author.voice.channel
        return get_voice_channel_by_name()

    async def get_voice_channel_by_name() -> Optional[discord.VoiceChannel]:
        channels = list(
            filter(lambda x: x.name == channel_name, ctx.guild.voice_channels))
        if len(channels) == 0:
            await ctx.send(embed=MsgEmbed.error(
                'Ты инвалид? Название канала неправильное'))
            return None
        elif len(channels) == 1:
            return channels[0]
        else:
            choice = [f' {x} ({x.position + 1}-й)\n' for x in channels]
            choice.insert(0, 'Отмена')
            answer = await ask_user(ctx,
                                    'выбери канал',
                                    choice,
                                    icon_url=icons['list'])
            if answer is None: return None
            if answer == 0:
                await ctx.send(embed=MsgEmbed.warning('Подключение отменено'))
                return None
            if 1 <= answer <= len(channels):
                return channels[answer - 1]
            await ctx.send(
                embed=MsgEmbed.warning('Ты кто такой, сука, чтоб это делать?'))
            return None

    if not reconnect:
        voice = get_server(ctx).voice
        if voice and voice.is_connected(): return True

    channel = await get_voice_channel()
    if channel is None: return False

    result = await join_to_channel(ctx, channel)
    if result == 0:
        await ctx.send(
            embed=MsgEmbed.ok(f'Бот подключился к каналу: {channel}'))
    elif result == 1:
        await ctx.send(
            embed=MsgEmbed.warning(f'Бот уже подключен к каналу: {channel}'))
    elif result == 2:
        await ctx.send(embed=MsgEmbed.error(f'Ты че наделал?'))
    else:
        await ctx.send(
            embed=MsgEmbed.error('Ничего не понял, но очень интересно'))

    # Я не хачу пихать return в if'ы, что бы не нарушать гармонию форматирования
    return 0 <= result <= 1
示例#2
0
async def on_command_error(ctx, error):
    if isinstance(error, commands.CheckFailure):
        await ctx.send(embed=MsgEmbed.error('Не дорос ещё!'))
    elif isinstance(error, commands.CommandNotFound):
        await ctx.send(embed=MsgEmbed.error(
            f'Такой команды нет! `{ctx.prefix}help` - для справки'))
    elif isinstance(error, commands.MissingRequiredArgument) or isinstance(
            error, commands.BadArgument):
        await ctx.send(embed=MsgEmbed.error(
            f'Глаза разуй! Такого аргумента нет! `{ctx.prefix}help {ctx.command}` - для справки'
        ))
    else:
        raise error
示例#3
0
async def remove(ctx, arg):
    server = get_server(ctx)

    if arg == 'all':
        server.playlist.deleteAll()
        if server.voice: server.voice.stop()
        await ctx.send(embed=MsgEmbed.info('Удалил весь плейлист :fire:'))
        return

    if not arg.isdigit(): raise commands.MissingRequiredArgument()
    else: pos = int(arg)

    if not 0 <= pos < server.playlist.getLength():
        await ctx.send(embed=MsgEmbed.warning(
            'Как может в казино быть колода разложена в другом порядке?! Ты чё, бредишь, что ли?! Ёбаный твой рот, а!..'
        ))
        return

    mi = server.playlist.getByPosition(pos)
    playlist, voice = server.playlist, server.voice
    if pos == playlist.getPosition() and voice: voice.stop()
    if playlist.deleteByPosition(pos):
        await ctx.send(
            embed=MsgEmbed.info(f'Удалил: {mi.artist} - {mi.title} :fire:'))
    else:
        await ctx.send(embed=MsgEmbed.error('Ошибка удаления'))
示例#4
0
 async def get_voice_channel_by_name() -> Optional[discord.VoiceChannel]:
     channels = list(
         filter(lambda x: x.name == channel_name, ctx.guild.voice_channels))
     if len(channels) == 0:
         await ctx.send(embed=MsgEmbed.error(
             'Ты инвалид? Название канала неправильное'))
         return None
     elif len(channels) == 1:
         return channels[0]
     else:
         choice = [f' {x} ({x.position + 1}-й)\n' for x in channels]
         choice.insert(0, 'Отмена')
         answer = await ask_user(ctx,
                                 'выбери канал',
                                 choice,
                                 icon_url=icons['list'])
         if answer is None: return None
         if answer == 0:
             await ctx.send(embed=MsgEmbed.warning('Подключение отменено'))
             return None
         if 1 <= answer <= len(channels):
             return channels[answer - 1]
         await ctx.send(
             embed=MsgEmbed.warning('Ты кто такой, сука, чтоб это делать?'))
         return None
示例#5
0
 async def get_voice_channel() -> Optional[discord.VoiceChannel]:
     if channel_name == '':
         if not member_is_connected(ctx.author):
             await ctx.send(
                 embed=MsgEmbed.error('Присоединись к каналу, мудак'))
             return None
         return ctx.author.voice.channel
     return get_voice_channel_by_name()
示例#6
0
async def add(ctx, *args) -> Optional[bool]:
    """
		Добавляет в плейлист сервера новые треки
		
		args == ['--id', '...'] - поиск плейлиста по id
		args == ['url'] - поиск плейлиста по ссылке
		args == [...] - поиск трека по ключевым словам

		return True  - в плейлист был добавлен хотя бы 1 трек
		return False - в плейлист не было ничего добавлено
		return None  - таймаут, некорректные данные пользователя, ошибка апи
	"""
    async def cancel():
        await ctx.send(embed=MsgEmbed.warning('Отменено'))
        return False

    async def bad_answer():
        await ctx.send(
            embed=MsgEmbed.warning('Ты кто такой, сука, чтоб это делать?'))
        return None

    async def add_all():
        added_songs, songs_count = 0, len(mi_list)
        message = await ctx.send(embed=MsgEmbed.info('Загрузка плейлиста...'))
        for mi in mi_list:
            if server.playlist.add(mi): added_songs += 1
        if added_songs == songs_count:
            await message.edit(
                embed=MsgEmbed.ok('Все песни успешно добавлены!'))
            return True
        elif added_songs == 0:
            await message.edit(
                embed=MsgEmbed.warning('Ни одна песня не была добавлена!'))
            return False
        else:
            await message.edit(embed=MsgEmbed.warning(
                f'Добавлено: {added_songs}/{songs_count}'))
            return True

    async def add_one():
        songs_list = [f' {mi.artist} - {mi.title}' for mi in mi_list]
        songs_list.insert(0, 'Отмена')
        answer = await ask_user(ctx,
                                'выбери песню',
                                songs_list,
                                icon_url=icons['search'])
        if answer is None: return None
        if answer == 0: return await cancel()
        if 1 <= answer <= len(mi_list): mi = mi_list[answer - 1]
        else: return bad_answer()
        if server.playlist.add(mi):
            await ctx.send(
                embed=MsgEmbed.ok(f'Добавил: {mi.artist} - {mi.title}'))
            return True
        else:
            await ctx.send(embed=MsgEmbed.warning('Ошибка добавления!'))
            return False

    async def load_playlist():
        method = {
            0: cancel,
            1: add_one,
            2: add_all,
            None: lambda: None
        }.get(
            await ask_user(ctx, 'че ты хочешь?',
                           ['Отмена', 'Одна песня', 'Весь плейлист']),
            bad_answer)
        return await method()

    server = get_server(ctx)  # используется в подпрограммах (server.playlist)

    if len(args) == 0:
        await ctx.send(embed=MsgEmbed.error('Нифига ты быдло'))
        return

    # я не смог избавиться от флага
    if args[0] == '--id':
        if len(args) < 2:
            await ctx.send(
                embed=MsgEmbed.error('Недосдача по аргументам, жмот'))
            return
        if len(args) > 2:
            await ctx.send(embed=MsgEmbed.warning('Слишком много аргументов'))
        mi_list = VkSearch.byPlaylistId(args[1])
        is_playlist = True
    elif VkSearch.isCorrectPlaylistUrl(args[0]):
        if len(args) > 1:
            await ctx.send(embed=MsgEmbed.warning('Слишком много аргументов'))
        mi_list = VkSearch.byPlaylistUrl(args[0])
        is_playlist = True
    else:
        mi_list = VkSearch.byString(' '.join(args), 5)
        is_playlist = False
        return await add_one()

    if mi_list is None:
        await ctx.send(embed=MsgEmbed.error('Ошибка поиска!'))
        return
    if mi_list == []:
        await ctx.send(embed=MsgEmbed.warning('Ничего не найдено!'))
        return False

    if is_playlist: return await load_playlist()
    else: return await add_one()
示例#7
0
async def on_error(event, ctx, *args, **kwargs):
    logger.exception(f'Exception in on_error. Event: {event}')
    await ctx.send(embed=MsgEmbed.error('!!! ОШИБКА !!!'))