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
async def leave(ctx): voice = get_server(ctx).voice if voice and voice.is_connected(): await voice.disconnect() await ctx.send(embed=MsgEmbed.warning('Бот отключился')) else: await ctx.send( embed=MsgEmbed.warning('Этим можно просто брать и обмазываться'))
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('Ошибка удаления'))
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 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
async def mix(ctx): server = get_server(ctx) playlist = server.playlist if playlist.getLength() == 0: await ctx.send(embed=MsgEmbed.warning('Плейлист пуст, животное')) return playlist.mix() playlist.position = playlist.getLength() - 1 await skip(ctx)
async def skip(ctx, count: int = 1): server = get_server(ctx) voice = server.voice playlist = server.playlist if playlist.getLength() == 0: await ctx.send(embed=MsgEmbed.warning('Скипалка не отросла')) return for i in range(count - 1): playlist.next() if voice: voice.stop()
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 ask_user(ctx, title: str, choice: List[str], *, icon_url: str = icons['list'], timeout=10, start_index=0, step_index=1) -> Optional[int]: choice = [f'{i + start_index}. {x}' for i, x in enumerate(choice)] emb = MsgEmbed.info('') emb.set_author(name=title, icon_url=icon_url) await send_long_list(ctx, choice, emb, MsgEmbed.info('')) try: msg = await client.wait_for('message', check=get_message_check(ctx.author), timeout=timeout) except asyncio.exceptions.TimeoutError: await ctx.send(embed=MsgEmbed.warning('Кто не успел - тот опоздал')) return None else: return int(msg.content)
async def playing(ctx): playlist = get_server(ctx).playlist if playlist.getLength() == 0: await ctx.send(embed=MsgEmbed.warning('Плейлист пуст')) return await ctx.send(embed=get_mi_embed(playlist.getCurrent()))
async def bad_answer(): await ctx.send( embed=MsgEmbed.warning('Ты кто такой, сука, чтоб это делать?')) return None
async def cancel(): await ctx.send(embed=MsgEmbed.warning('Отменено')) return False
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()