示例#1
0
 async def _configs(self, ctx):
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     conexao.fechar()
     e = discord.Embed(title=f'Todas as configurações deste servidor!',
                       colour=discord.Colour(random_color()),
                       description='** **',
                       timestamp=datetime.utcnow())
     e.set_footer(text=f'{ctx.author}', icon_url=f'{ctx.author.avatar_url}')
     if ctx.guild.icon:
         e.set_thumbnail(url=ctx.guild.icon_url)
     if ctx.guild.banner:
         e.set_image(url=ctx.guild.banner_url)
     elif ctx.guild.splash_url:
         e.set_image(url=ctx.guild.splash_url)
     elif ctx.guild.discovery_splash_url:
         e.set_image(url=ctx.guild.discovery_splash_url)
     e.add_field(name=f'Prefixo', value=f'{servidor.prefixo}', inline=True)
     if servidor.sugestao_de_comando:
         sugestao_cmd = '<a:ativado:755774682334101615>'
     else:
         sugestao_cmd = '<a:desativado:755774682397147226>'
     e.add_field(name=f'Sugestao de comando',
                 value=sugestao_cmd,
                 inline=True)
     if servidor.channel_id_log is not None:
         e.add_field(
             name=f'Log',
             value=
             f'<a:ativado:755774682334101615>\nEm: <#{servidor.channel_id_log}>',
             inline=True)
         logs = []
         if servidor.mensagem_deletada:
             logs.append('``mensagem deletada``')
         if servidor.mensagem_editada:
             logs.append('``mensagem editada``')
         if servidor.avatar_alterado:
             logs.append('``avatar alterado``')
         if servidor.nome_alterado:
             logs.append('``nome alterado``')
         if servidor.tag_alterado:
             logs.append('``tag alterada``')
         if servidor.nick_alterado:
             logs.append('``nick alterado``')
         if servidor.role_alterado:
             logs.append('``cargo adicionado/removido``')
         if len(logs) != 0:
             e.add_field(name=f'Logs ativos',
                         value=capitalize(', '.join(logs)),
                         inline=True)
     else:
         e.add_field(name=f'Log',
                     value=f'<a:desativado:755774682397147226>',
                     inline=True)
     await ctx.send(embed=e)
示例#2
0
 async def _configs(self, ctx):
     servidor = await ServidorRepository().get_servidor(self.bot.db_connection, ctx.guild.id)
     e = discord.Embed(title=f'Todas as configurações deste servidor!',
                       colour=discord.Colour.random(),
                       timestamp=datetime.utcnow())
     e.set_footer(text=f'{ctx.author}', icon_url=f'{ctx.author.avatar_url}')
     if ctx.guild.icon:
         e.set_thumbnail(url=ctx.guild.icon_url)
     if ctx.guild.banner:
         e.set_image(url=ctx.guild.banner_url)
     elif ctx.guild.splash_url:
         e.set_image(url=ctx.guild.splash_url)
     elif ctx.guild.discovery_splash_url:
         e.set_image(url=ctx.guild.discovery_splash_url)
     e.add_field(name=f'Prefixo',
                 value=f'{servidor.prefixo}',
                 inline=True)
     if servidor.sugestao_de_comando:
         sugestao_cmd = self.bot.emoji('ativado')
     else:
         sugestao_cmd = self.bot.emoji('desativado')
     e.add_field(name=f'Sugestao de comando',
                 value=sugestao_cmd,
                 inline=True)
     if servidor.channel_id_log is not None:
         e.add_field(name=f'Log',
                     value=f'{self.bot.emoji("ativado")}\nEm: <#{servidor.channel_id_log}>',
                     inline=True)
         logs = []
         if servidor.mensagem_deletada:
             logs.append('`mensagem deletada`')
         if servidor.mensagem_editada:
             logs.append('`mensagem editada`')
         if servidor.avatar_alterado:
             logs.append('`avatar alterado`')
         if servidor.nome_alterado:
             logs.append('`nome alterado`')
         if servidor.tag_alterado:
             logs.append('`tag alterada`')
         if servidor.nick_alterado:
             logs.append('`nick alterado`')
         if servidor.role_alterado:
             logs.append('`cargo adicionado/removido`')
         if len(logs) != 0:
             e.add_field(name=f'Logs ativos',
                         value=capitalize(', '.join(logs)),
                         inline=True)
     else:
         e.add_field(name=f'Log',
                     value=f'{self.bot.emoji("desativado")}',
                     inline=True)
     await ctx.reply(embed=e, mention_author=False)
 async def _modificar_comando(self,
                              ctx,
                              comando='',
                              resposta='',
                              in_text='t'):
     in_text = convert_to_bool(in_text)
     if in_text is None:
         await ctx.send(
             f'Valor ``{in_text}`` inválido! Os valores que eu aceito são: sim, não, yes, no, 0, 1'
         )
         return
     if ctx.message.content.count('"') != 4:
         return await ctx.send(
             'Parece que você digitou o comando errado!\nVocê deve usar o comando assim:\n'
             +
             f'{ctx.prefix}modificar_comando **"**comando**"** **"**resposta**"**'
         )
     if (comando.replace(' ', '') == '') or (resposta.replace(' ', '')
                                             == ''):
         return await self.bot.send_help(ctx)
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     comando_personalizado = ComandoPersonalizado(servidor, comando.lower(),
                                                  resposta, in_text)
     # vai verificar se o comando está no banco
     # aliás, pra modificar o comando, ele precisa existir no banco
     if comando_personalizado not in [
             cmd for cmd in ComandoPersonalizadoRepository().get_commands(
                 conexao, servidor)
     ]:
         conexao.fechar()
         return await ctx.send(
             '<a:atencao:755844029333110815> Este comando não existe!')
     try:
         ComandoPersonalizadoRepository().update(conexao,
                                                 comando_personalizado)
         in_text_str = capitalize(convert_to_string(in_text))
         embed = discord.Embed(
             title=f'Comando modificado com sucesso!',
             colour=discord.Colour(random_color()),
             description=f'Comando: {comando}\nResposta: {resposta}\n'
             f'Ignorar a posição do comando: {in_text_str}',
             timestamp=datetime.utcnow())
         embed.set_footer(text=f'{ctx.author}',
                          icon_url=ctx.author.avatar_url)
         await ctx.send(content=get_emoji_dance(), embed=embed)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
 async def _adicionar_comando(self,
                              ctx,
                              comando='',
                              resposta='',
                              in_text='t'):
     in_text = convert_to_bool(in_text)
     if in_text is None:
         return await ctx.send(
             f'Valor ``{in_text}`` inválido! Os valores que eu aceito são: sim, não, yes, no, 0, 1'
         )
     if ctx.message.content.count('"') < 4:
         return await ctx.send(
             'Parece que você digitou o comando errado!\nVocê deve usar o comando assim:\n'
             +
             f'{ctx.prefix}adicionar_comando **"**comando**"** **"**resposta**"**'
         )
     if (comando.replace(' ', '') == '') or (resposta.replace(' ', '')
                                             == ''):
         return await self.bot.send_help(ctx)
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     comando_personalizado = ComandoPersonalizado(servidor, comando.lower(),
                                                  resposta, in_text)
     try:
         ComandoPersonalizadoRepository().create(conexao,
                                                 comando_personalizado)
         in_text_str = capitalize(convert_to_string(in_text))
         embed = discord.Embed(title=f'Comando adicionado com sucesso!',
                               colour=discord.Colour(random_color()),
                               description='** **',
                               timestamp=datetime.utcnow())
         embed.set_footer(text=f'{ctx.author}',
                          icon_url=ctx.author.avatar_url)
         embed.add_field(
             name=
             f'Comando: {comando.lower()}\nResposta: {resposta}\nIgnorar a posição do comando: {in_text_str}',
             value=f'** **',
             inline=False)
         await ctx.send(content=get_emoji_dance(), embed=embed)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
示例#5
0
    async def _userinfo(self, ctx, *args):
        try:
            user = None
            if ctx.message.mentions:  # se tiver alguma menção na mensagem
                user = ctx.message.mentions[0]  # vai pegar a primeira menção
            else:  # se a pessoa não mencionou ninguém, entra aqui
                if args:  # se a pessoa passou pelo menos alguma coisa
                    try:  # vai tentar converter o primeiro argumento para int
                        id_user = int(args[0])  # conversão
                        if ctx.guild:
                            user = ctx.guild.get_member(
                                id_user
                            )  # vai tentar pegar o membro do server com esse id
                        if user is None:  # se não achou na guild, vai ver se o bot acha
                            user = self.bot.get_user(id_user)
                        # se o bot não achou um user, ele vai pega pela API do discord
                        if user is None:
                            try:
                                user = await self.bot.fetch_user(id_user)
                            except discord.errors.NotFound:
                                user = None
                            except discord.HTTPException:
                                user = None
                        # se mesmo assim, não achar o user
                        if user is None:
                            return await ctx.send(
                                f'{ctx.author.mention} não consegui um usuário com este id!'
                            )
                    except ValueError:  # se der erro, é porque a pessoa não passou número no primeiro argumento
                        user = None
                    # se o user for None
                    if user is None:
                        # se entrou aqui, é o user ainda não foi achado
                        args = ' '.join(args)
                        # listas que vão ser usadas caso a pessoa digite um nome inválido
                        name = []
                        name_tag = []
                        nickname = []
                        # se o comando foi usado de um servidor:
                        if ctx.guild:
                            # vai procurar o membro passado pela pessoa
                            for member in ctx.guild.members:
                                # se a pessoa tiver um nick
                                if member.nick is not None:
                                    # vai ver se a pessoa digitou esse nick
                                    if member.nick.lower() == args.lower():
                                        user = member
                                        break
                                    # lista que vai ser usada caso não ache o membro
                                    nickname.append(member.nick.lower())
                                # se a pessoa passou o nome ou nome#tag de algum membro:
                                if (args.lower() == member.name.lower()) or (
                                        args.lower() == str(member).lower()):
                                    user = member
                                    break
                                # listas que vão ser usadas caso não ache o membro
                                name.append(member.name.lower())
                                name_tag.append(str(member).lower())
                        # se não achou a pessoa na guild
                        if user is None:
                            # vai ver se o bot acha a pessoa
                            for _user in self.bot.users:
                                # se a pessoa passou o nome ou nome#tag de algum user que o bot tem acesso:
                                if (args.lower()
                                        == _user.name) or (args.lower()
                                                           == str(_user)):
                                    user = _user
                                    break
                                name.append(_user.name.lower())
                                name_tag.append(str(_user).lower())
                        # se o bot não achou nem o membro nem a pessoa
                        if user is None:
                            # é passado para um set, apenas para eliminar os itens repetidos
                            name = list(set(name))
                            name_tag = list(set(name_tag))
                            nickname = list(set(nickname))
                            # mensagem padrão
                            msg = f'{ctx.author.mention} Eu não achei nenhum usuário com este nome/nick.'
                            user_by_nick = get_most_similar_items_with_similarity(
                                args, nickname)
                            # se veio pelo menos 1 user pelo nick
                            if user_by_nick:
                                # vai pegar o nick mais parecido que veio, e se a similaridade for maior que 60%:
                                if user_by_nick[0][-1] > 0.6:
                                    msg += f'\nVocê quis dizer `{capitalize(user_by_nick[0][0])}` ?'
                                    raise InvalidArgument(msg=msg)
                            # se não passou pelo return de cima, vai ver se acha algum nome parecido
                            # com o que a pessoa digitou
                            user_by_name_tag = get_most_similar_items_with_similarity(
                                args, name_tag)
                            # se veio pelo menos 1 user pelo nametag
                            if user_by_name_tag:
                                # se for pelo menos 60% similar:
                                if user_by_name_tag[0][-1] > 0.6:
                                    msg += f'\nVocê quis dizer `{capitalize(user_by_name_tag[0][0])}` ?'
                                    raise InvalidArgument(msg=msg)
                            # se não passou pelo return de cima, vai ver se acha algum user#tag parecido com o
                            # que a pessoa digitou
                            user_by_name = get_most_similar_items_with_similarity(
                                args, name)
                            # se veio pelo menos 1 user pelo nametag
                            if user_by_name:
                                # vai pegar o nome mais parecido que veio e se a similaridade for maior que 60%:
                                if user_by_name[0][-1] > 0.6:
                                    msg += f'\nVocê quis dizer `{capitalize(user_by_name[0][0])}` ?'
                                    raise InvalidArgument(msg=msg)
                            # se não passou por nenhum if de cima, vai mandar a mensagem dizendo que não achou
                            raise InvalidArgument(msg=msg)
                else:  # se a pessoa não passou nenhum argumento:
                    user = ctx.author
            roles = None
            if hasattr(user, 'roles'):
                roles = ', '.join([
                    f"<@&{x.id}>" for x in sorted(
                        user.roles, key=lambda x: x.position, reverse=True)
                    if x.id != ctx.guild.default_role.id
                ]) if len(user.roles) > 1 else None
            if hasattr(user, 'top_role'):
                cor = user.top_role.colour.value
            else:
                cor = discord.Colour(random_color())
            info2 = None
            badges = ''
            pf = user.public_flags
            if ctx.guild:
                if ctx.guild.owner_id == user.id:
                    badges += '👑'
            if pf.staff:
                badges += '<:staff:767508404687863844>'
            if pf.partner:
                badges += '<:parceiro:767508978162073670>'
            if pf.hypesquad:
                badges += '<:hypesquad:767509441926004746>'
            if pf.bug_hunter or pf.bug_hunter_level_2:
                badges += '<:bug_hunter:767510394021216277>'
            if pf.hypesquad_bravery:
                badges += '<:hypesquad_bravery:767510882238333009>'
            if pf.hypesquad_brilliance:
                badges += '<:hypesquad_brilliance:767511165173235763>'
            if pf.hypesquad_balance:
                badges += '<:hypesquad_balance:767511585080999966>'
            if pf.early_supporter:
                badges += '<:early_supporter:767511883368366100>'
            if user.bot:
                badges += '<:bot:763808270426177538>'
            if pf.verified_bot_developer or pf.early_verified_bot_developer:
                badges += '<:dev_tag:763812174514487346>'
            # como o discord não deixar bots verem o profile do user
            # e no profile que diz se a pessoa tem nitro, vamos ver se
            # ela tem um gif no avatar, se tiver, ela tem nitro
            # ou vamos ver se ela está dando boost no servidor
            if user.is_avatar_animated():
                badges += '<a:nitro:767516060785311744>'
            elif hasattr(user, 'premium_since'):
                if user.premium_since is not None:
                    badges += '<a:nitro:767516060785311744>'
            if hasattr(user, 'premium_since'):
                if user.premium_since is not None:
                    badges += '<a:boost:767518522619985930>'
            status = ''
            if hasattr(user, 'raw_status'):
                if user.raw_status == 'online':
                    status = '<:online:768461948743843861>'
                elif user.raw_status == 'dnd':
                    status = '<:dnd:768461948928655381>'
                elif user.raw_status == 'idle':
                    status = '<:idle:768461949041246229>'
                elif (user.raw_status == 'offline') or (user.raw_status
                                                        == 'invisible'):
                    status = '<:offline:768461948790243349>'
            info1 = discord.Embed(
                title=f'{badges} {user.display_name} {status}',
                colour=cor,
                description='** **',
                timestamp=datetime.utcnow())
            info1.set_footer(text=f'{ctx.author}',
                             icon_url=ctx.author.avatar_url)
            info1.set_thumbnail(url=user.avatar_url)
            info1.add_field(name="📑 Nome e tag:",
                            value=f'`{user}`',
                            inline=True)
            info1.add_field(name="🆔 Id: ", value=f'``{user.id}``', inline=True)
            if hasattr(user, 'raw_status'):
                # se a pessoa não estiver offline ou invisivel
                if (user.raw_status != 'offline') and (user.raw_status !=
                                                       'invisible'):
                    if user.is_on_mobile():
                        plataforma = '📱 Celular'
                    else:
                        plataforma = '💻 Pc'
                    info1.add_field(name="🗯 Está no:",
                                    value=f'``{plataforma}``',
                                    inline=True)
            if hasattr(user, 'activities'):
                activities = user.activities
                streaming = False
                custom = False
                playing = False
                if len(activities) != 0:
                    for activity in activities:
                        if (activity.type.name
                                == 'streaming') and (not streaming):
                            info1.add_field(
                                name=
                                '<:stream:768461948538454017> Fazendo live',
                                value=
                                f'**🎙 Plataforma**: `{activity.platform}`\n'
                                f'**🏷 Nome da live**: `{activity.name}`\n'
                                f'**🕛 Começou**: `{datetime_format(activity.created_at)}`',
                                inline=True)
                            streaming = True
                        elif (activity.type.name == 'custom') and (not custom):
                            if (activity.emoji is not None) or (activity.name
                                                                is not None):
                                if activity.emoji is not None:
                                    if activity.emoji.id in [
                                            c.id for c in self.bot.emojis
                                    ]:
                                        emoji = f'{activity.emoji}'
                                    else:
                                        emoji = f'❓'
                                else:
                                    emoji = '`🚫 Nulo`'
                                if activity.name is not None:
                                    texto = f'`{activity.name}`'
                                else:
                                    texto = '`🚫 Nulo`'
                                info1.add_field(
                                    name=
                                    '<a:disco:763811701589803098> Status personalizado',
                                    value=f'🔰 Emoji: {emoji}\n'
                                    f'🖋 Frase: {texto}',
                                    inline=True)
                                custom = True
                        elif (activity.type.name
                              == 'playing') and (not playing):
                            if activity.start is not None:
                                value = f'`{activity.name}`\n**🕛 Começou a jogar:**\n' + \
                                        f'`{datetime_format(activity.start)}`'
                            else:
                                value = f'`{activity.name}`'
                            info1.add_field(name='🕹 Jogando',
                                            value=value,
                                            inline=True)
                            playing = True
            if hasattr(user, 'nick'):
                if user.nick is not None:
                    info1.add_field(name="🔄 Nickname",
                                    value=f'``{user.nick}``',
                                    inline=True)
            info1.add_field(
                name="🗓 Conta criada em:",
                value=
                f'``{user.created_at.strftime("%d/%m/%Y")}``({datetime_format(user.created_at)})',
                inline=True)
            if hasattr(user, 'joined_at'):
                rank_members = [
                    str(c) for c in sorted(user.guild.members,
                                           key=lambda x: x.joined_at)
                ]
                info1.add_field(
                    name="📥 Entrou no servidor em:",
                    value=
                    f'`{user.joined_at.strftime("%d/%m/%Y")}`({datetime_format(user.joined_at)})'
                    f'\n**🏆 Está na `{rank_members.index(str(user)) + 1}°` posição, '
                    'no rank dos membros mais antigos!**',
                    inline=True)
                if user.premium_since is not None:
                    info1.add_field(
                        name=
                        "<a:boost:767518522619985930> Começou a dar boost neste servidor em:",
                        value=f'`{user.premium_since.strftime("%d/%m/%Y")}`('
                        f'{datetime_format(user.premium_since)})',
                        inline=True)
                # só vai mostrar as permissões da pessoa, se ela estiver no server
                info2 = discord.Embed(title=f'{badges} {user.display_name}',
                                      colour=cor,
                                      description='** **',
                                      timestamp=datetime.utcnow())
                info2.set_footer(text=f'{ctx.author}',
                                 icon_url=ctx.author.avatar_url)
                info2.set_thumbnail(url=user.avatar_url)
                if roles is not None:
                    info2.add_field(
                        name=f'🏅 Cargos({len(roles.split(", "))}):',
                        value=roles,
                        inline=False)
                all_perms = user.permissions_in(ctx.message.channel)
                perms = []
                for atributo in dir(all_perms):
                    if isinstance(getattr(all_perms, atributo), bool):
                        if getattr(all_perms, atributo):
                            perms.append(atributo)
                perms_traduzidas = {
                    'add_reactions': 'adicionar reações',
                    'administrator': 'administrador',
                    'attach_files': 'anexar arquivos',
                    'ban_members': 'banir membros',
                    'change_nickname': 'mudar apelido',
                    'create_instant_invite': 'criar convite',
                    'embed_links': 'enviar links',
                    'kick_members': 'expulsar membros',
                    'manage_channels': 'gerenciar canais',
                    'manage_emojis': 'gerenciar emojis',
                    'manage_guild': 'gerenciar servidor',
                    'manage_messages': 'gerenciar mensagens',
                    'manage_nicknames': 'gerenciar apelidos',
                    'manage_permissions': 'gerenciar permissões',
                    'manage_roles': 'gerenciar cargos',
                    'manage_webhooks': 'gerenciar webhooks',
                    'mention_everyone': 'mencionar everyone',
                    'read_message_history': 'ler histórico de mensagens',
                    'read_messages': 'ver mensagens',
                    'send_messages': 'enviar mensagens',
                    'send_tts_messages': 'enviar mensagem com tts',
                    'view_audit_log': 'ver registro de auditoria',
                    'view_channel': 'ver canal',
                    'view_guild_insights': 'ver desempenho do servidor',
                    'use_external_emojis': 'usar emojis externos'
                }
                for c in range(0, len(perms)):
                    # vai substituir os "_" por espaços e tirar o external_emojis
                    for perm_traducao in perms_traduzidas.items():
                        if perm_traducao[0] == perms[c]:
                            perms[c] = f"``{perm_traducao[-1]}``"
                            break
                if 'external_emojis' in perms:
                    perms.pop(perms.index('external_emojis'))
                if len(perms) >= 1:
                    info2.add_field(
                        name=f'📌 Permissões neste chat({len(perms)}):',
                        value=capitalize(', '.join(perms)),
                        inline=False)
                else:
                    info2.add_field(
                        name=f'📌 Permissão neste chat(0):',
                        value=
                        'Este usuário não tem nenhuma permissão, neste chat!',
                        inline=False)
        except InvalidArgument as erro:
            return await ctx.send(erro.msg)

        async def menus_user_info(ctx, msg):
            def check_page1(
                reaction, user, msg
            ):  # fica verificando a pagina 1, para ver se é para ir para a pagina 2
                user_check = user.id == ctx.author.id
                reaction_check = str(reaction.emoji) == '➡'
                msg_check = msg.id == reaction.message.id
                return user_check and reaction_check and msg_check

            def check_page2(
                reaction, user, msg
            ):  # fica verificando a pagina 2, para ver se é para ir para a pagina 1
                user_check = user.id == ctx.author.id
                reaction_check = str(reaction.emoji) == '⬅'
                msg_check = msg.id == reaction.message.id
                return user_check and reaction_check and msg_check

            async def check_reactions_without_perm(ctx, bot, msg):
                while True:
                    while True:
                        reaction, user = await bot.wait_for('reaction_add',
                                                            timeout=900.0)
                        if check_page1(reaction, user, msg):
                            break
                    await msg.delete()
                    msg = await ctx.send(embed=info2)
                    await msg.add_reaction('⬅')
                    while True:
                        reaction, user = await bot.wait_for('reaction_add',
                                                            timeout=900.0)
                        if check_page2(reaction, user, msg):
                            break
                    await msg.delete()
                    msg = await ctx.send(embed=info1)
                    await msg.add_reaction('➡')

            async def check_reactions_with_perm(bot, msg):
                while True:
                    while True:
                        reaction, user = await bot.wait_for('reaction_add',
                                                            timeout=900.0)
                        if check_page1(reaction, user, msg):
                            break
                    await msg.clear_reactions()
                    await msg.add_reaction('⬅')
                    await msg.edit(embed=info2)
                    while True:
                        reaction, user = await bot.wait_for('reaction_add',
                                                            timeout=900.0)
                        if check_page2(reaction, user, msg):
                            break
                    await msg.clear_reactions()
                    await msg.add_reaction('➡')
                    await msg.edit(embed=info1)

            # se o bot tiver perm pra usar o "clear_reactions"
            if ctx.guild.me.guild_permissions.manage_messages:
                await check_reactions_with_perm(self.bot, msg)
            else:  # se o bot não tiver permissão:
                await check_reactions_without_perm(ctx, self.bot, msg)

        msg_bot = await ctx.send(embed=info1)
        if info2:
            # se tiver o info2, significa que foi usado num servidor
            await msg_bot.add_reaction('➡')
            try:
                # vai fica 1 minuto e meio esperando o usuário apertas nas reações
                await asyncio.wait_for(menus_user_info(ctx, msg_bot),
                                       timeout=90.0)
            except asyncio.TimeoutError:  # se acabar o tempo
                pass
示例#6
0
 async def _userinfo(self, ctx, *, user: DiscordUser = None):
     if user is None:
         user = ctx.author
     if hasattr(user, 'top_role'):
         cor = user.top_role.colour.value
     else:
         cor = discord.Colour.random()
     emojis_badges = {
         'staff': self.bot.get_emoji('staff_badge'),
         'partner': self.bot.get_emoji('parceiro_badge'),
         'hypesquad': self.bot.get_emoji('hs_badge'),
         'bug_hunter': self.bot.get_emoji('bug_hunter_badge'),
         'hypesquad_bravery': self.bot.get_emoji('hs_bravery_badge'),
         'hypesquad_brilliance': self.bot.get_emoji('hs_brilliance_badge'),
         'hypesquad_balance': self.bot.get_emoji('hs_balance_badge'),
         'early_supporter': self.bot.get_emoji('early_supporter_badge'),
         'team_user': '',
         'system': '',
         'bug_hunter_level_2': self.bot.get_emoji('bug_hunter_badge'),
         'verified_bot': '',
         'verified_bot_developer': self.bot.get_emoji('dev_badge')
     }
     badges = ''
     if ctx.guild:
         if ctx.guild.owner_id == user.id:
             badges += '👑'
     if user.bot:
         badges += str(self.bot.get_emoji('bot_badge'))
     if hasattr(user, 'public_flags'):
         for flag, have in iter(user.public_flags):
             if have:
                 badges += str(emojis_badges[flag])
     if user.is_avatar_animated() or (hasattr(user, 'premium_since') and user.premium_since is not None):
         badges += str(self.bot.get_emoji('nitro'))
     if hasattr(user, 'premium_since') and user.premium_since is not None:
         badges += str(self.bot.get_emoji('boost'))
     status_emoji = ''
     status_text = None
     if hasattr(user, 'raw_status'):
         if user.raw_status == 'online':
             status_emoji = str(self.bot.get_emoji('online'))
             status_text = 'online'
         elif user.raw_status == 'dnd':
             status_emoji = str(self.bot.get_emoji('dnd'))
             status_text = 'ocupado'
         elif user.raw_status == 'idle':
             status_emoji = str(self.bot.get_emoji('idle'))
             status_text = 'ausente'
         elif (user.raw_status == 'offline') or (user.raw_status == 'invisible'):
             status_emoji = str(self.bot.get_emoji('offline'))
             status_text = 'offline'
     embed_base = discord.Embed(title=f'{badges} {user.display_name} {status_emoji}',
                                colour=cor,
                                timestamp=datetime.utcnow())
     embeds = []
     embed1 = embed_base.copy()
     embed1.set_image(url=user.avatar_url)
     embed1.add_field(name="📑 Nome e tag:", value=f'`{user}`', inline=True)
     embed1.add_field(name="🆔 Id: ", value=f'`{user.id}`', inline=True)
     embed1.add_field(name='🙋‍♂️ Menção:', value=user.mention, inline=True)
     if hasattr(user, 'nick') and (user.nick is not None):
         embed1.add_field(name="🔄 Apelido", value=f'`{user.nick}`', inline=True)
     embeds.append(embed1)
     embed2 = embed_base.copy()
     embed2.set_thumbnail(url=user.avatar_url)
     embed2.add_field(name="🗓 Conta criada em:",
                      value=f'`{user.created_at.strftime("%d/%m/%Y")}`({datetime_format(user.created_at)})',
                      inline=True)
     if hasattr(user, 'joined_at'):
         rank_members = [str(c) for c in sorted(user.guild.members, key=lambda x: x.joined_at)]
         embed2.add_field(name="📥 Entrou no servidor em:",
                          value=f'`{user.joined_at.strftime("%d/%m/%Y")}`({datetime_format(user.joined_at)})',
                          inline=True)
         embed2.add_field(name='🏆 rank dos membros mais antigos:',
                          value=f'**{prettify_number(rank_members.index(str(user)) + 1)}°**/'
                                f'{prettify_number(len(rank_members))}',
                          inline=True)
         if user.premium_since is not None:
             embed2.add_field(
                 name=f'{self.bot.get_emoji("boost")} Começou a dar boost neste servidor em:',
                 value=f'`{user.premium_since.strftime("%d/%m/%Y")}`('
                       f'{datetime_format(user.premium_since)})',
                 inline=True)
     embeds.append(embed2)
     if hasattr(user, 'raw_status') and (user.raw_status != 'offline') and \
             (user.raw_status != 'invisible') and (not user.bot):
         embed3 = embed_base.copy()
         embed3.set_thumbnail(url=user.avatar_url)
         if user.is_on_mobile():
             plataforma = '📱 Celular'
         else:
             if user.web_status.value != 'offline':
                 plataforma = '💻 Pc ─ usando o site 🌐'
             else:
                 plataforma = '💻 Pc ─ usando o discord desktop 🖥'
         embed3.add_field(name=f'{self.bot.get_emoji("hacking")} Está acessando o discord pelo:',
                          value=f'`{plataforma}`',
                          inline=False)
         if status_text is not None:
             embed3.add_field(name=f'🕵️ Status: {status_text}',
                              value='** **',
                              inline=True)
         if hasattr(user, 'activities') and len(user.activities) > 0:
             streaming = False
             custom = False
             playing = False
             for activity in user.activities:
                 if (activity.type.name == 'streaming') and (not streaming):
                     embed3.add_field(name=f'{self.bot.emoji("streaming")} Fazendo live',
                                      value=f'**🎙 Plataforma**: `{activity.platform}`\n'
                                            f'**🏷 Nome da live**: `{activity.name}`\n'
                                            f'**🕛 Começou**: `{datetime_format(activity.created_at)}`',
                                      inline=False)
                     streaming = True
                 elif (activity.type.name == 'custom') and (not custom):
                     if (activity.emoji is not None) or (activity.name is not None):
                         if activity.emoji is not None:
                             if activity.emoji.id in [c.id for c in self.bot.emojis]:
                                 emoji = f'{activity.emoji}'
                             else:
                                 emoji = f'❓'
                         else:
                             emoji = '`🚫 Nulo`'
                         if activity.name is not None:
                             texto = f'`{activity.name}`'
                         else:
                             texto = '`🚫 Nulo`'
                         embed3.add_field(name=f'{self.bot.emoji("disco")} Status personalizado',
                                          value=f'🔰 Emoji: {emoji}\n'
                                                f'🖋 Frase: {texto}',
                                          inline=False)
                         custom = True
                 elif (activity.type.name == 'playing') and (not playing):
                     if activity.start is not None:
                         value = f'`{activity.name}`\n**🕛 Começou a jogar:**\n' + \
                                 f'`{datetime_format(activity.start)}`'
                     else:
                         value = f'`{activity.name}`'
                     embed3.add_field(name='🕹 Jogando',
                                      value=value,
                                      inline=False)
                     playing = True
         embeds.append(embed3)
     if hasattr(user, 'roles') and len(user.roles) > 1:
         roles = [role for role in sorted(user.roles, key=lambda r: r.position, reverse=True)
                  if role.id != ctx.guild.default_role.id]
         roles_count = len(roles)
         if roles_count > 0:
             roles_mention = ', '.join(f'<@&{r.id}>' for r in roles)
             roles_name = None
             if len(roles_mention) > 1000:
                 roles_name = ', '.join(f'`{r.name}`' for r in roles)
             if roles_name is not None and len(roles_name) > 1000:
                 roles_name = f'{roles_name[:1000]}...'
             roles = roles_name or roles_mention
             roles = f'**{roles}**'
             embed4 = embed_base.copy()
             embed4.set_thumbnail(url=user.avatar_url)
             embed4.add_field(name=f'🏅 Cargos({roles_count}):',
                              value=roles,
                              inline=False)
             # estamos pegando e filtrando as permissões que o user tem, neste chat
             all_perms = user.permissions_in(ctx.message.channel)
             perms = []
             for atributo in dir(all_perms):
                 if isinstance(getattr(all_perms, atributo), bool):
                     if getattr(all_perms, atributo):
                         perms.append(atributo)
             perms_traduzidas = {
                 'add_reactions': 'adicionar reações',
                 'administrator': 'administrador',
                 'attach_files': 'anexar arquivos',
                 'ban_members': 'banir membros',
                 'change_nickname': 'mudar apelido',
                 'create_instant_invite': 'criar convite',
                 'embed_links': 'enviar links',
                 'kick_members': 'expulsar membros',
                 'manage_channels': 'gerenciar canais',
                 'manage_emojis': 'gerenciar emojis',
                 'manage_guild': 'gerenciar servidor',
                 'manage_messages': 'gerenciar mensagens',
                 'manage_nicknames': 'gerenciar apelidos',
                 'manage_permissions': 'gerenciar permissões',
                 'manage_roles': 'gerenciar cargos',
                 'manage_webhooks': 'gerenciar webhooks',
                 'mention_everyone': 'mencionar everyone',
                 'read_message_history': 'ler histórico de mensagens',
                 'read_messages': 'ver mensagens',
                 'send_messages': 'enviar mensagens',
                 'send_tts_messages': 'enviar mensagem com tts',
                 'view_audit_log': 'ver registro de auditoria',
                 'view_channel': 'ver canal',
                 'view_guild_insights': 'ver desempenho do servidor',
                 'use_external_emojis': 'usar emojis externos'
             }
             for c in range(0, len(perms)):
                 # vai substituir os "_" por espaços e tirar o external_emojis
                 for perm_traducao in perms_traduzidas.items():
                     if perm_traducao[0] == perms[c]:
                         perms[c] = f"`{perm_traducao[-1]}`"
                         break
             if 'external_emojis' in perms:
                 perms.pop(perms.index('external_emojis'))
             if len(perms) >= 1:
                 embed4.add_field(name=f'📌 Permissões neste chat({len(perms)}):',
                                  value=capitalize(', '.join(perms)),
                                  inline=False)
             else:
                 embed4.add_field(name=f'📌 Permissão neste chat(0):',
                                  value='Este usuário não tem possui permissões, neste chat!',
                                  inline=False)
             embeds.append(embed4)
     for pos, embed in enumerate(embeds):
         embed.set_footer(text=f'{ctx.author} ─ {pos + 1}/{len(embeds)}',
                          icon_url=ctx.author.avatar_url)
     paginator = CustomEmbedPaginator(ctx=ctx,
                                      timeout=60,
                                      auto_footer=False,
                                      remove_reactions=ctx.channel.permissions_for(
                                          ctx.me).manage_messages)
     if len(embeds) > 2:
         paginator.add_reaction('⏮', 'first')
     paginator.add_reaction('◀️', 'back')
     paginator.add_reaction('⏹️', 'clear')
     paginator.add_reaction('▶', 'next')
     if len(embeds) > 2:
         paginator.add_reaction('⏭', 'last')
     msg = await paginator.run(embeds)
     for reaction in msg.reactions:
         if reaction.me:
             await reaction.remove(ctx.me)