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 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
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 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 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 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()
async def on_error(event, ctx, *args, **kwargs): logger.exception(f'Exception in on_error. Event: {event}') await ctx.send(embed=MsgEmbed.error('!!! ОШИБКА !!!'))