Exemple #1
0
 async def _channel_log(self, ctx, channel: discord.TextChannel = None):
     if channel is not None:
         conexao = Conexao()
         servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
         if servidor.channel_id_log is None:
             servidor.channel_id_log = channel.id
             ServidorRepository().update(conexao, servidor)
             conexao.fechar()
             return await ctx.send(
                 f'{ctx.author.mention} Log ativado com sucesso em <#{channel.id}>!'
             )
         else:
             log_antigo = servidor.channel_id_log
             servidor.channel_id_log = channel.id
             ServidorRepository().update(conexao, servidor)
             conexao.fechar()
             return await ctx.send(
                 f'{ctx.author.mention} Chat de logs alterado com sucesso!\n'
                 f'Antigo: <#{log_antigo}>\nNovo: <#{channel.id}>')
     else:
         conexao = Conexao()
         servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
         if servidor.channel_id_log is not None:
             servidor.channel_id_log = None
             ServidorRepository().update(conexao, servidor)
             conexao.fechar()
             return await ctx.send(f'{ctx.author.mention} Log desativado!')
         else:
             await self.bot.send_help(ctx)
Exemple #2
0
 async def _reativar_sugestao(self, ctx):
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     if not servidor.sugestao_de_comando:
         servidor.sugestao_de_comando = True
         ServidorRepository().update(conexao, servidor)
         conexao.fechar()
         return await ctx.send('Sugestões reativadas!')
     else:
         conexao.fechar()
         return await ctx.send('As sugestões já estavam ativadas!')
    async def _reativar_comando(self, ctx, comando=None):
        if comando is None:
            return await self.bot.send_help(ctx)

        conexao = Conexao()
        servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
        comando_desativado = ComandoDesativado(servidor, comando)
        # verificação para saber se o comando existe no banco
        comandos_desativados = ComandoDesativadoRepository().get_commands(
            conexao, servidor)
        # se não tiver o comando no banco:
        if not comando_desativado in [cmd for cmd in comandos_desativados]:
            conexao.fechar()
            return await ctx.send(
                '<a:atencao:755844029333110815> Este comando já está ativo!')
        try:
            ComandoDesativadoRepository().delete(conexao, comando_desativado)
            embed = discord.Embed(title=f'Comando reativado com sucesso!',
                                  colour=discord.Colour(random_color()),
                                  description=f'Comando reativado: {comando}',
                                  timestamp=datetime.utcnow())
            embed.set_footer(text=f'{ctx.author}',
                             icon_url=f'{ctx.author.avatar_url}')
            return await ctx.send(content='<a:on:755774680580882562>',
                                  embed=embed)
        except Exception as e:
            raise e
        finally:
            conexao.fechar()
 async def _remover_comando(self, ctx, *, comando: str = None):
     if comando is None:
         return await self.bot.send_help(ctx)
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     # vai verificar se o comando está no banco
     # aliás, pra remover o comando, ele precisa existir no banco
     comando_personalizado = ComandoPersonalizado(servidor, comando.lower(),
                                                  '', False)
     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().delete(conexao,
                                                 comando_personalizado)
         embed = discord.Embed(title=f'Comando removido com sucesso!',
                               colour=discord.Colour(random_color()),
                               description=f'Comando: {comando}',
                               timestamp=datetime.utcnow())
         embed.set_footer(text=f'{ctx.author}',
                          icon_url=ctx.author.avatar_url)
         return await ctx.send(content=get_emoji_dance(), embed=embed)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
Exemple #5
0
 async def on_message_delete(self, message):
     if message.author.bot: return
     if not self.bot.is_ready(): return
     if self.bot.maintenance_mode: return
     if message.is_system(): return
     if message.guild is None: return
     conexao = Conexao()
     server = ServidorRepository().get_servidor(conexao, message.guild.id)
     conexao.fechar()
     if server.channel_id_log is not None:
         channel = self.bot.get_channel(server.channel_id_log)
         if channel is not None:
             if server.mensagem_deletada:
                 msg_escaped = discord.utils.escape_markdown(
                     message.content)
                 embed = discord.Embed(
                     title=f'Mensagem deletada',
                     colour=discord.Colour(random_color()),
                     description=f'Autor: {message.author.name}\n'
                     f'Menção: {message.author.mention}\n'
                     f'Id: {message.author.id}\n'
                     f'Chat: <#{message.channel.id}>\n'
                     f'Mensagem deletada:```{msg_escaped}```',
                     timestamp=datetime.utcnow())
                 embed.set_thumbnail(url=message.author.avatar_url)
                 await channel.send(embed=embed)
Exemple #6
0
 async def on_message_edit(self, before, after):
     if after.author.bot: return
     if not self.bot.is_ready(): return
     if self.bot.maintenance_mode: return
     if before.content == after.content: return
     if after.is_system(): return
     if (after.guild is None) or (before.guild is None): return
     conexao = Conexao()
     server = ServidorRepository().get_servidor(conexao, after.guild.id)
     conexao.fechar()
     if server.channel_id_log is not None:
         channel = self.bot.get_channel(server.channel_id_log)
         if channel is not None:
             if server.mensagem_editada:
                 msg_antiga = discord.utils.escape_markdown(before.content)
                 msg_nova = discord.utils.escape_markdown(after.content)
                 embed = discord.Embed(
                     title='Mensagem editada',
                     colour=discord.Colour(random_color()),
                     description=f'Autor: {after.author.name}\n'
                     f'Menção: {after.author.mention}\n'
                     f'Id: {after.author.id}\n'
                     f'Chat: <#{after.channel.id}>\n'
                     f'Mensagem antiga:```{msg_antiga}```'
                     f'[Mensagem nova]({after.jump_url}):'
                     f'```{msg_nova}```',
                     timestamp=datetime.utcnow())
                 embed.set_thumbnail(url=after.author.avatar_url)
                 await channel.send(embed=embed)
Exemple #7
0
 async def on_guild_join(self, ctx):
     # toda vez que adicionarem o bot num servidor, vai adicionar o servidor ao banco
     servidor = Servidor(ctx.id)
     conexao = Conexao()
     try:
         ServidorRepository().create(conexao, servidor)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
     try:
         # source: https://github.com/AlexFlipnote/discord_bot.py/blob/master/cogs/events.py#L52
         to_send = sorted([chan for chan in ctx.channels if
                           chan.permissions_for(ctx.me).send_messages and isinstance(chan, discord.TextChannel)],
                          key=lambda x: x.position)[0]
     except IndexError:
         pass
     else:
         try:
             adm = ''
             if ctx.me.guild_permissions.view_audit_log:
                 async for entry in ctx.audit_logs(limit=2):
                     if str(entry.action).startswith('AuditLogAction.bot_add') and (
                             str(entry.target) == str(self.bot.user)):
                         adm = f' {entry.user.mention}'
             await to_send.send(f'{get_emoji_dance()}\nOlá{adm}! Obrigado por me adicionar em seu servidor!\n' +
                                'Para saber todos os meus comandos, digite ``--cmds``!')
         except:
             pass
Exemple #8
0
 async def _change_prefix(self,
                          ctx,
                          prefixo_novo=get_configs()['default_prefix']):
     conexao = Conexao()
     if ctx.prefix.replace("!", "").replace(" ",
                                            "") == self.bot.user.mention:
         # vai pegar o prefixo que está no banco
         prefixo_antigo = pegar_o_prefixo(self.bot, ctx, False, conexao)
     else:
         # se a pessoa não marcou o bot:
         prefixo_antigo = ctx.prefix
     servidor = Servidor(ctx.guild.id, prefixo_novo)
     ServidorRepository().update(conexao, servidor)
     if prefixo_novo != get_configs()['default_prefix']:
         embed = discord.Embed(
             title=f'Prefixo alterado com sucesso!',
             colour=discord.Colour(random_color()),
             description=f'Prefixo antigo: {prefixo_antigo}\n' +
             f'Prefixo novo: {prefixo_novo}',
             timestamp=datetime.utcnow())
         embed.set_footer(text=f'{ctx.author}',
                          icon_url=f'{ctx.author.avatar_url}')
         embed.add_field(
             name=
             f'Caso queria voltar para o prefixo padrão, basta digitar ``{prefixo_novo}prefixo``!'
             f'\n{get_emoji_dance()}',
             value='** **',
             inline=False)
         await ctx.send(embed=embed)
     else:
         await ctx.send(
             f'Agora estou com o prefixo padrão! {get_emoji_dance()}')
     conexao.fechar()
 async def _desativar_comando(self, ctx, *, comando: str = None):
     if comando is None:
         await self.bot.send_help(ctx)
         return
     comandos_que_nao_podem_ser_desativados = [
         'desativar_comando', 'disable_command', 'dc', 'reativar_comando',
         'reactivate_command', 'change_prefix', 'prefixo', 'prefix'
         'help', 'ajuda'
     ]
     if comando.lower() in comandos_que_nao_podem_ser_desativados:
         return await ctx.send(
             'Você não pode desativar este comando! <a:no_no:755774680325029889>'
         )
     conexao = Conexao()
     servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
     comando_desativado = ComandoDesativado(servidor, comando)
     try:
         ComandoDesativadoRepository().create(conexao, comando_desativado)
         embed = discord.Embed(title=f'Comando desativado com sucesso!',
                               colour=discord.Colour(random_color()),
                               description=f'Comando desativado: {comando}',
                               timestamp=datetime.utcnow())
         embed.set_footer(text=f'{ctx.author}',
                          icon_url=f'{ctx.author.avatar_url}')
         return await ctx.send(content='<a:off:755774680660574268>',
                               embed=embed)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
Exemple #10
0
 async def on_guild_remove(self, ctx):
     # toda vez que removerem o bot de um servidor, vai remover o servidor do banco
     servidor = Servidor(ctx.id)
     conexao = Conexao()
     try:
         ServidorRepository().delete(conexao, servidor)
     except Exception as e:
         raise e
     finally:
         conexao.fechar()
Exemple #11
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)
Exemple #12
0
 async def _cmds(self, ctx):
     conexao = Conexao()
     e = discord.Embed(
         title='Todos os meus comandos',
         colour=discord.Colour(random_color()),
         description=
         f'Caso você queira saber mais informações sobre um comando, '
         'digite \'help comando\'',
         timestamp=datetime.utcnow())
     e.set_author(name='Androxus', icon_url=self.bot.user.avatar_url)
     e.set_footer(text=f'{ctx.author}', icon_url=ctx.author.avatar_url)
     categories = self.bot.get_all_categories()
     servidor = None
     if ctx.guild:
         servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
         comandos_desativados = [
             c.comando for c in ComandoDesativadoRepository().get_commands(
                 conexao, servidor)
         ]
     for category in categories:
         commands = self.bot.get_commands_from_category(category)
         if len(commands) != 0:
             for i in range(len(commands)):
                 commands[i] = f'``{commands[i]}``'
             if servidor:
                 # vai remover todos os comandos desativados, da lista que vai aparecer na mensagem
                 for cmds_off in comandos_desativados:
                     if cmds_off in commands:
                         try:
                             commands = commands.remove(cmds_off)
                         except:
                             pass
             e.add_field(
                 name=
                 f'{self.bot.get_emoji_from_category(category)} {capitalize(category)} ({len(commands)})',
                 value=f'{", ".join(commands)}.',
                 inline=False)
     if servidor:
         cmds_personalizados = ComandoPersonalizadoRepository(
         ).get_commands(conexao, servidor)
         commands = []
         if len(cmds_personalizados) >= 1:
             for comando_personalizado in cmds_personalizados:
                 commands.append(f'``{comando_personalizado.comando}``')
             commands.sort()
             e.add_field(
                 name=
                 f'{self.bot.get_emoji_from_category("personalizado")} Comandos personalizados (são '
                 'comandos exclusivos deste servidor, e não precisam do prefixo)'
                 f'({len(commands)})',
                 value=f'{", ".join(commands)}.',
                 inline=False)
     conexao.fechar()
     await ctx.send(embed=e)
 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()
Exemple #15
0
 async def on_member_update(self, before, after):
     if after.bot: return
     if not self.bot.is_ready(): return
     if self.bot.maintenance_mode: return
     conexao = Conexao()
     server = ServidorRepository().get_servidor(conexao, after.guild.id)
     conexao.fechar()
     if server is None:
         return
     if server.channel_id_log is not None:
         channel = self.bot.get_channel(server.channel_id_log)
         if channel is not None:
             if before.nick != after.nick:
                 if server.nick_alterado:
                     embed = discord.Embed(
                         title='Nick alterado',
                         colour=discord.Colour(random_color()),
                         description=f'O(A) {after.name} mudou de nick!\n'
                         f'User: {after.mention}\n'
                         f'Id: {after.id}\n'
                         f'Nick antigo: {before.nick}\n'
                         f'Nick novo: {after.nick}',
                         timestamp=datetime.utcnow())
                     embed.set_thumbnail(url=str(after.avatar_url))
                     await channel.send(embed=embed)
             if before.roles != after.roles:
                 if server.role_alterado:
                     cargos = [
                         f'<@&{c.id}>' for c in difference_between_lists(
                             before.roles, after.roles)
                     ]
                     # se a pessoa ficou com mais cargos, do que ela tinha antes
                     if len(before.roles) < len(after.roles):
                         desc = None
                         if len(cargos) == 1:
                             desc = f'Novo cargo: {cargos[0]}'
                         elif len(cargos) > 1:
                             desc = 'Novos cargo: ' + ', '.join(cargos)
                     else:  # se foi o contrário
                         desc = None
                         if len(cargos) == 1:
                             desc = f'Cargo removido: {cargos[0]}'
                         elif len(cargos) > 1:
                             desc = 'Cargos removidos: ' + ', '.join(cargos)
                     embed = discord.Embed(
                         title='Cargos alterados',
                         colour=discord.Colour(random_color()),
                         description=
                         f'O(A) {after.name} sofreu alteração nos cargos!\n'
                         f'User: {after.mention}\n'
                         f'Id: {after.id}\n'
                         f'{desc}',
                         timestamp=datetime.utcnow())
                     embed.set_thumbnail(url=str(after.avatar_url))
                     await channel.send(embed=embed)
             if (before.premium_since is None) and (after.premium_since
                                                    is not None):
                 if server.role_alterado:
                     # pessoa começou a dar boost
                     embed = discord.Embed(
                         title='Novo booster',
                         colour=discord.Colour(0xffdcf4),
                         description=
                         f'O(A) {after.name} começou a dar boost!\n'
                         f'User: {after.mention}\n'
                         f'Id: {after.id}\n',
                         timestamp=datetime.utcnow())
                     embed.set_thumbnail(url=str(after.avatar_url))
                     await channel.send(embed=embed)
Exemple #16
0
    async def on_command_error(self, ctx, error):
        # source: https://gist.github.com/EvieePy/7822af90858ef65012ea500bcecf1612

        # This prevents any commands with local handlers being handled here in on_command_error.
        if hasattr(ctx.command, 'on_error'):
            return

        # This prevents any cogs with an overwritten cog_command_error being handled here.
        cog = ctx.cog
        if cog:
            if cog._get_overridden_method(cog.cog_command_error) is not None:
                return

        ignored = ()

        # Allows us to check for original exceptions raised and sent to CommandInvokeError.
        # If nothing is found. We keep the exception passed to on_command_error.
        error = getattr(error, 'original', error)
        if isinstance(error, ignored):
            # Anything in ignored will return and prevent anything happening.
            return
        elif isinstance(error, errors.CommandNotFound):
            # vai pegar toda a mensagem, depois do prefixo
            comando = ctx.message.content.lower()[len(ctx.prefix):]
            # se o primeiro caracter da mensagem, não for uma letra
            if comando[0] not in ascii_letters:
                # não vai fazer nada
                return
            comando = comando.split(' ')[0]
            mostrar_erro = False
            if ctx.guild:
                conexao = Conexao()
                servidor = ServidorRepository().get_servidor(
                    conexao, ctx.guild.id)
                conexao.fechar()
                if servidor.sugestao_de_comando:
                    mostrar_erro = True
                else:
                    mostrar_erro = False
            commands = []
            for command in self.bot.get_all_commands():
                if comando.lower() == command.category:
                    e = embedHelpCategory(self.bot, ctx, comando)
                    return await ctx.send(embed=e)
                commands.append(command.name)
                commands.append(command.category)
                for alias in command.aliases:
                    commands.append(alias)
            if mostrar_erro:
                msg = f'{ctx.author.mention} <:sad:763839041095204895> eu não achei consegui ' \
                      f'achar o comando "{comando}".'
                sugestao = get_most_similar_item(comando, commands)
                if sugestao:
                    # se a sugestão for pelo menos 50% semelhante ao comando
                    if string_similarity(comando, sugestao) >= 0.6:
                        msg += f'\nVocê quis dizer ``{sugestao}``?'
                msg += f'\nPara desativar esta mensagem, use o comando ``desativar_sugestão``'
                return await ctx.send(msg, delete_after=10)
        elif isinstance(error, errors.NotOwner):
            return await ctx.send(
                f'{ctx.author.mention} você não é meu criador <a:no_no:755774680325029889>'
            )
        elif isinstance(error, errors.MissingRequiredArgument):
            return await self.bot.send_help(ctx)
        elif isinstance(error, errors.MaxConcurrencyReached):
            return await ctx.send(
                f'Calma lá {ctx.author.mention}! Você só pode usar 1 comando por vez!'
            )
        elif isinstance(error, errors.NoPrivateMessage):
            return await ctx.send(
                f'{ctx.author.mention} Este comando só pode ser usado num servidor! <a:atencao:755844029333110815>'
            )
        elif isinstance(error, errors.MissingPermissions):
            if len(error.missing_perms) == 1:
                permissoes = error.missing_perms[0]
            else:
                permissoes = ', '.join(error.missing_perms)
            return await ctx.send(
                f'{ctx.author.mention} Você precisa ter permissão de ``{permissoes}`` para usar este comando!'
            )
        elif isinstance(error, errors.BotMissingPermissions):
            if len(error.missing_perms) == 1:
                permissoes = error.missing_perms[0]
            else:
                permissoes = ', '.join(error.missing_perms)
            return await ctx.send(
                f'{ctx.author.mention} Eu não posso executar este comando, pois não tenho permissão de '
                +
                f'``{permissoes}`` neste servidor! <a:sad:755774681008832623>')
        elif isinstance(error, errors.CheckFailure):
            return await ctx.send(
                f'{ctx.author.mention} você não tem permissão para usar este comando!\nDigite '
                +
                f'`{ctx.prefix}help {ctx.command}` para ver quais permissões você precisa ter!'
            )
        elif isinstance(error, Forbidden):
            if not permissions.can_embed(ctx):
                if ctx.author.permissions_in(
                        ctx.message.channel).administrator:
                    msg = 'Por favor, me dê permissão de "inserir links", para que eu possa mostrar minhas mensagens ;-;'
                else:
                    msg = 'Por favor, peça para um administrador do servidor me dar permissão de "inserir links",' \
                          ' para que eu possa mostrar minhas mensagens ;-;'
                return await ctx.send(msg)
            if not permissions.can_upload(ctx):
                if ctx.author.permissions_in(
                        ctx.message.channel).administrator:
                    msg = 'Por favor, me dê permissão de "anexar arquivos", para que eu possa funcionar corretamente ;-;'
                else:
                    msg = 'Por favor, peça para um administrador do servidor me dar permissão de "anexar arquivos",' \
                          ' para que eu possa funcionar corretamente ;-;'
                return await ctx.send(msg)
            if not permissions.can_react(ctx):
                if ctx.author.permissions_in(
                        ctx.message.channel).administrator:
                    msg = 'Por favor, me dê permissão de "adicionar reações", para que eu possa funcionar corretamente ;-;'
                else:
                    msg = 'Por favor, peça para um administrador do servidor me dar permissão de "adicionar reações",' \
                          ' para que eu possa funcionar corretamente ;-;'
                return await ctx.send(msg)
            await ctx.send(
                f'{ctx.author.mention} eu não tenho permissão para executar esse comando, acho que algum'
                +
                ' administrador deve ter tirado minhas permissões! Com o comando ``invite``você consegue '
                + 'ter o link para me adicionar')
        elif isinstance(error, errors.BadArgument):
            if str(error).startswith('Member') and str(error).endswith(
                    'not found'):
                return await ctx.send(
                    f'{ctx.author.mention} não consegui encontrar esse membro.'
                )
            elif str(error) == 'Esse id não está banido!':
                return await ctx.send(
                    f'{ctx.author.mention} não consegui encontrar um membro banido, com este id: `{error.id}`.'
                )
            elif str(error) == 'Esse membro não está banido!':
                return await ctx.send(
                    f'{ctx.author.mention} não consegui encontrar o membro banido `{error.member}`.'
                )
            elif str(error) == 'Membro mencionado não está banido!':
                return await ctx.send(
                    f'{ctx.author.mention} não consegui encontrar o membro {error.user.mention} na lista de bans.'
                )
        elif isinstance(error, errors.CommandOnCooldown):
            await ctx.send(
                f'Calma lá {ctx.author.mention}, você está usando meus comandos muito rápido!\n'
                + f'Tente novamente em {error.retry_after:.2f} segundos.')
        else:
            if str(error).startswith('duplicate servidor'):
                pass
            elif str(error).startswith('duplicate comando desativado'):
                return await ctx.send(
                    f'<a:atencao:755844029333110815> {ctx.author.mention} Esse comando já está desativado!'
                )
            elif str(error).startswith('Este comando já está ativo!'):
                return await ctx.send(
                    f'<a:atencao:755844029333110815> {ctx.author.mention} Esse comando já está ativado!'
                )
            elif str(error).startswith('blacklisted'):
                return await ctx.send(
                    f'<a:atencao:755844029333110815> {ctx.author.mention} Essa pessoa já está na blacklist!'
                )
            elif str(error).startswith('comando personalizado duplicado'):
                return await ctx.send(
                    f'<a:atencao:755844029333110815> {ctx.author.mention} Esse comando já está cadastrado!'
                )
            else:
                try:
                    return await ctx.send(
                        f'Ocorreu o erro:```py\n{error}```Na execução do comando ```{ctx.message.content}```<a:sad'
                        ':755774681008832623>')
                except:
                    print(
                        f'Ocorreu o erro: {error}\nNa execução do comando {ctx.message.content}'
                    )
Exemple #17
0
    async def _setup_logs(self, ctx):
        # TODO
        sr = ServidorRepository()
        servidor = await sr.get_servidor(self.bot.db_connection, ctx.guild.id)
        if servidor.channel_id_log is None:
            return await ctx.reply(
                f'Você precisa configurar um chat para os logs primeiro!'
                ' Use o comando ``channel_log``')

        def check(message):
            return message.author == ctx.author

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie as mensagem deleta? (atual: '
            f'{convert_to_string(servidor.mensagem_deletada)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.mensagem_deletada = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie as mensagem editadas? (atual: '
            f'{convert_to_string(servidor.mensagem_editada)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.mensagem_editada = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie quando algum membro mudar o avatar? (atual: '
            f'{convert_to_string(servidor.avatar_alterado)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.avatar_alterado = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie quando algum membro mudar o nome? (atual: '
            f'{convert_to_string(servidor.nome_alterado)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.nome_alterado = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie quando algum membro mudar a tag? (atual: '
            f'{convert_to_string(servidor.tag_alterado)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.tag_alterado = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie quando algum membro de nick? (atual: '
            f'{convert_to_string(servidor.nick_alterado)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.nick_alterado = value

        await ctx.send(
            f'{ctx.author.mention} Você quer que eu envie quando algum cargo, de algum membro, for alterado? (atual: '
            f'{convert_to_string(servidor.role_alterado)})(sim/não)')
        try:
            msg = await self.bot.wait_for('message', check=check, timeout=30)
        except asyncio.TimeoutError:
            return await ctx.send('Tempo esgotado!')
        value = convert_to_bool(msg.content)
        if value is None:
            return await ctx.send(
                f'{ctx.author.mention} Eu não sei o que é {msg.content}. Eu só aceito ``sim`` ou ``não``'
            )
        servidor.role_alterado = value
        await sr.update(self.bot.db_connection, servidor)
        return await ctx.send(
            f'{ctx.author.mention} configurações feitas com sucesso! Para você ver todas as'
            ' configurações, digite "configs"')
Exemple #18
0
async def on_message_event(bot, message):
    if not bot.is_ready():
        return
    try:
        permissions.is_owner(message)
    except discord.ext.commands.errors.NotOwner:
        # se a pessoa não for dona do bot, e ele estiver em manutenção, simplesmente ignora a mensagem
        if bot.maintenance_mode:
            return
    if message.author.id == bot.user.id:
        return
    if message.is_system():
        return
    ctx = await bot.get_context(message)
    if not permissions.can_send(ctx):
        # se o bot não tiver permissão para enviar mensagens:
        return
    stopwatch = Stopwatch()
    # se a pessoa não usar um comando do bot, vai chegar None como prefixo
    conexao = Conexao()
    servidor = None
    if message.guild:
        servidor = ServidorRepository().get_servidor(conexao, message.guild.id)
    if servidor:
        prefixo = servidor.prefixo
    else:
        prefixo = ''
    banido = BlacklistRepository().get_pessoa(conexao, message.author.id)[0]
    if banido or message.author.bot:
        stopwatch.stop()
        return conexao.fechar()
    if isinstance(message.channel,
                  discord.DMChannel):  # se a mensagem foi enviada no dm
        embed = discord.Embed(
            title=f'O(A) {message.author} mandou mensagem no meu dm',
            colour=0xfdfd96,
            description=f'{message.content}',
            timestamp=datetime.utcnow())
        embed.set_footer(
            text=f'{message.author.id}',
            icon_url='https://media-exp1.licdn.com/dms/image/C510BAQHhOjPujl' +
            'cgfQ/company-logo_200_200/0?e=2159024400&v=beta&t=49' +
            'Ex7j5UkZroF7-uzYIxMXPCiV7dvtvMNDz3syxcLG8')
        if len(message.attachments) != 0:
            for attachment in message.attachments:
                embed.set_image(url=attachment.url)
        embed.set_thumbnail(url=message.author.avatar_url)
        await bot.dm_channel_log.send(embed=embed)
    if message.mention_everyone:  # verifica se marcou here ou everyone
        emoji = bot.get_emoji(755774680220172340)  # emoji de ping pistola
        await message.add_reaction(emoji)  # adiciona a reação com o emoji
    if servidor:  # Se foi usado num server, vai ver se o comando está desativado
        # aqui, vai verificar se o comando foi desativado
        for comando_desativado in ComandoDesativadoRepository().get_commands(
                conexao, servidor):
            # aqui, estamos retirando o prefixo da mensagem, e criando uma lista com todas as palavras
            palavras_formatadas = message.content.lower().replace(
                prefixo, '').split(' ')
            # se a primeira palavra, for diferente de '' e o comando desativado estiver nela:
            if (palavras_formatadas[0] !=
                    '') and (comando_desativado.comando.lower()
                             in palavras_formatadas[0].lower()):
                # se ela corresponder, a um comando que está desativado:
                await message.channel.send(
                    '<a:no_no:755774680325029889> Este comando ' +
                    'foi desativado por um administrador do servidor!')
                stopwatch.stop()
                return conexao.fechar()
    channel = message.channel
    usando_comando = False
    if servidor:  # se a mensagem foi enviar num servidor
        try:
            #  como tem 3 for, um dentro do outro, é mais facil força um erro, do que ir dando break em cada um
            for cog in bot.cogs:  # verifica se a mensagem, está chamando algum comando
                # laço que vai passar por todos os comandos que o bot tem
                for command in bot.get_cog(cog).get_commands():
                    if message.content.lower().startswith(
                            f'{prefixo}{command.name}'
                    ):  # Se a mensagem tiver o comando
                        usando_comando = True
                        raise Exception()  # para o laço
                    for aliases in command.aliases:  # também verifica os "sinônimos"
                        if message.content.lower().startswith(
                                f'{prefixo}{aliases}'):  # se achar o comando
                            usando_comando = True
                            raise Exception()  # para o laço
        except Exception:
            pass
        if not usando_comando:  # se não estiver usando um comando do bot
            # vai ver se a pessoa usou algum comando personalizado
            # só existem comandos personalizados em servidores, então aqui verifica se está num server
            if servidor:
                for comando_personalizado in ComandoPersonalizadoRepository(
                ).get_commands(conexao, servidor):
                    # se identificar o comando, na mensagem
                    if comando_personalizado.comando.lower(
                    ) in message.content.lower():
                        enviar_mensagem = True
                        # se não for para ignorar a posição, vai ver se a mensagem inicia com o comando
                        if not comando_personalizado.in_text:
                            if not message.content.lower().startswith(
                                    comando_personalizado.comando.lower()):
                                # se for obrigatorio que a mensagem comesse com o comando, e ela não estiver começando
                                enviar_mensagem = False  # não vai responder
                        if enviar_mensagem:
                            stopwatch.stop()
                            await channel.send(
                                comando_personalizado.resposta.format(
                                    tempo=str(stopwatch)))
                            return
    if (f'<@{str(bot.user.id)}>'
            == message.content) or (f'<@!{str(bot.user.id)}>'
                                    == message.content):
        await channel.send(
            f'Use o comando ``{prefixo}cmds`` para obter todos os meus comandos!'
        )
        if permissions.can_use_external_emojis(ctx):
            await channel.send('<a:hello:755774680949850173>')
        conexao.fechar()
        stopwatch.stop()
        return
    conexao.fechar()
    stopwatch.stop()
    await bot.process_commands(message)
Exemple #19
0
 async def on_user_update(self, before, after):
     if after.bot: return
     if not self.bot.is_ready(): return
     if self.bot.maintenance_mode: return
     conexao = Conexao()
     servers_with_user = []
     for guild in self.bot.guilds:
         if guild.get_member(after.id) is not None:
             servers_with_user.append(ServidorRepository().get_servidor(
                 conexao, guild.id))
     conexao.fechar()
     if len(servers_with_user) == 0:
         return
     if before.name != after.name:
         embed = discord.Embed(
             title='Nome alterado',
             colour=discord.Colour(random_color()),
             description=f'O(A) {after.name} mudou de nome!\n'
             f'User: {after.mention}\n'
             f'Id: {after.id}\n'
             f'Nome antigo: {before.name}\n'
             f'Nome novo: {after.name}',
             timestamp=datetime.utcnow())
         embed.set_thumbnail(url=after.avatar_url)
         for server in servers_with_user:
             if server.channel_id_log is not None:
                 channel = self.bot.get_channel(server.channel_id_log)
                 if (channel is not None) and server.nome_alterado:
                     await channel.send(embed=embed)
     if before.discriminator != after.discriminator:
         embed = discord.Embed(
             title='Tag alterada',
             colour=discord.Colour(random_color()),
             description=f'O(A) {after.name} mudou a tag!\n'
             f'User: {after.mention}\n'
             f'Id: {after.id}\n'
             f'Tag antiga: {before.discriminator}\n'
             f'Tag nova: {after.discriminator}',
             timestamp=datetime.utcnow())
         embed.set_thumbnail(url=after.avatar_url)
         for server in servers_with_user:
             if server.channel_id_log is not None:
                 channel = self.bot.get_channel(server.channel_id_log)
                 if (channel is not None) and server.tag_alterado:
                     await channel.send(embed=embed)
     if before.avatar_url != after.avatar_url:
         url_antigo = str(before.avatar_url_as(format='webp'))
         if url_antigo.find('?size=') != -1:
             url_antigo = url_antigo[:url_antigo.rfind('?size=')]
         url_novo = str(after.avatar_url_as(format='webp'))
         async with aiohttp.ClientSession() as session:
             async with session.get(url_antigo) as resp:
                 if resp.status == 200:
                     response_antigo = BytesIO(await resp.read())
                 else:
                     return
             async with session.get(url_novo) as resp:
                 if resp.status == 200:
                     response_novo = BytesIO(await resp.read())
                 else:
                     return
             avatar_antigo = Image.open(response_antigo).resize(
                 (512, 512), Image.ANTIALIAS)
             avatar_novo = Image.open(response_novo).resize((512, 512),
                                                            Image.ANTIALIAS)
             base = Image.new('RGBA', (1024, 512), (0, 0, 0, 0))
             base.paste(avatar_antigo, (0, 0))
             base.paste(avatar_novo, (512, 0))
             arr = BytesIO()
             base.save(arr, format='PNG')
             arr.seek(0)
             file = discord.File(arr, filename='avatar.png')
             embed = discord.Embed(
                 title='Avatar alterado',
                 colour=discord.Colour(random_color()),
                 description=f'O(A) {after.name} mudou o avatar!\n'
                 f'User: {after.mention}\n'
                 f'Id: {after.id}\n'
                 f'[Avatar antigo]({before.avatar_url})'
                 f' → [avatar novo]({after.avatar_url})',
                 timestamp=datetime.utcnow())
             embed.set_image(url='attachment://avatar.png')
             for server in servers_with_user:
                 if server.channel_id_log is not None:
                     channel = self.bot.get_channel(server.channel_id_log)
                     if (channel is not None) and server.avatar_alterado:
                         await channel.send(file=file, embed=embed)
Exemple #20
0
def embedHelpCommand(bot: Androxus = None,
                     ctx: commands.Context = None,
                     comando: str = None,
                     descricao: str = None,
                     parametros: list = [],
                     exemplos: list = [],
                     aliases: list = [],
                     perm_pessoa: str = None,
                     perm_bot: str = None,
                     cor: int = None):
    conexao = Conexao()
    # se a pessoa usou o comando, mencionando o bot:
    if ctx.prefix.replace("!", "").replace(" ", "") == bot.user.mention:
        # vai pegar o prefixo que está no banco
        prefixo = pegar_o_prefixo(bot, ctx, False, conexao)
    else:
        # se a pessoa não marcou o bot:
        prefixo = ctx.prefix
    # se a cor não for passada, vai ser usada uma cor aleatória
    cor_a_usar = cor or random_color()
    if comando is None:
        comando = ctx.command.name
    if descricao is None:
        descricao = ctx.command.description
    # precisa fazer uma copia da lista, senão
    # as alterações feitas aqui
    # vão refletir no comando fora da função
    if len(parametros) == 0:
        parametros = ctx.command.parameters.copy()
    if len(exemplos) == 0:
        exemplos = ctx.command.examples.copy()
    if len(aliases) == 0:
        aliases = ctx.command.aliases.copy()
    if perm_pessoa is None:
        perm_pessoa = ctx.command.perm_user
    if perm_bot is None:
        perm_bot = ctx.command.perm_bot
    exemplo = '\n'.join(exemplos).format(prefix=ctx.prefix,
                                         author_mention=ctx.author.mention,
                                         this_channel=f'<#{ctx.channel.id}>')
    como_usar = f'``{prefixo}{comando}`` '
    comando_esta_desativado = False
    if ctx.guild is not None:  # se a mensagem foi enviar de um server
        servidor = ServidorRepository().get_servidor(conexao, ctx.guild.id)
        cmds_desativados = ComandoDesativadoRepository().get_commands(
            conexao, servidor)
        # for em todos os comandos desativados
        try:
            for comando_desativado in cmds_desativados:
                if comando in comando_desativado.comando:  # vê se o comando principal, está desativado
                    comando_esta_desativado = True
                    break
                for comando_alias in aliases:  # vai verificar se algum "sinônimo" desse comando, está desativado
                    if comando_alias in comando_desativado.comando:  # verifica se o comando está desativado
                        comando_esta_desativado = True
                        raise Exception()
        except Exception:  # foi usado raise error, para conseguir parar os dois laços
            pass
    if parametros:  # se tiver pelo menos 1 item nos parâmetros
        for c in range(
                0, len(parametros)
        ):  # vai adicionar `` antes, e depois dos parâmetros, em todos os itens
            parametros[c] = f'``{parametros[c]}``'
        como_usar += ' '.join(
            parametros)  # adiciona os parâmetros no "como_usar"
    if aliases:
        for c in range(
                0, len(aliases)):  # vai adicionar `` antes, e depois de alias
            aliases[c] = f'``{prefixo}{aliases[c]}``'
        if len(aliases) == 1:
            alias = aliases[0]
        else:
            alias = ', '.join(aliases)
    embed = discord.Embed(title=f'``{prefixo}{comando}``',
                          colour=discord.Colour(cor_a_usar),
                          description=descricao,
                          timestamp=datetime.utcnow())
    embed.set_author(name='Androxus', icon_url=bot.user.avatar_url)
    embed.set_footer(text=f'{ctx.author}', icon_url=ctx.author.avatar_url)
    embed.add_field(name='**Como usar?**', value=como_usar, inline=False)
    if parametros:  # novamente, só vai entrar, se tiver pelo menos 1 item nos parâmetros
        embed.add_field(
            name=
            '<a:atencao:755844029333110815> Tudo que estiver entre **<>** é obrigatório, e tudo que estiver '
            'entre **[]** é opcional.',
            value='** **',
            inline=False)
    embed.add_field(name='📖 Exemplo', value=exemplo, inline=False)
    if aliases:
        embed.add_field(name=':twisted_rightwards_arrows: Sinônimos',
                        value=alias,
                        inline=False)
    if perm_pessoa or perm_bot:
        requisito_p = ''
        requisito_b = ''
        if perm_pessoa:
            requisito_p = f'Você precisa ter permissão de ``{perm_pessoa}`` para usar este comando!'
        if perm_bot:
            requisito_b = f'\nEu preciso ter permissão de ``{perm_bot}`` para realizar este comando!'
        embed.add_field(name=':name_badge: Requisitos:',
                        value=f'{requisito_p}{requisito_b}',
                        inline=False)
    if comando_esta_desativado:  # se o comando estiver desativado
        embed.add_field(
            name=
            "<a:atencao:755844029333110815> **O comando foi desativado por algum administrador do server!**",
            value="**Se você usar este comando, eu não irei responder!**",
            inline=False)
    conexao.fechar()
    return embed
Exemple #21
0
 def __init__(self):
     self.repository = ServidorRepository()
     self.con = globals()['con']
Exemple #22
0
    async def _help(self, ctx, *, comando=None):
        e = None
        # se o comando foi chamado pela pessoa assim: "help ..." e se a pessoa passou alguma coisa
        # se o comando for None, vai mostrar a ajuda do comando "help" ou qualquer outro que vier no ctx
        if (ctx.command.name == 'help') and (comando is not None):
            # vai verificar se o que a pessoa passou não foi uma categoria
            command = None
            if not self.bot.is_category(comando):
                command = self.bot.get_command(comando)
                comandos_personalizados = []
                # se não achar um comando, vai procurar nos comandos personalizados
                if (command is None) and (ctx.guild is not None):
                    conexao = Conexao()
                    servidor = ServidorRepository().get_servidor(
                        conexao, ctx.guild.id)
                    comandos_personalizados = ComandoPersonalizadoRepository(
                    ).get_commands(conexao, servidor)
                    conexao.fechar()
                    for cmd_pers in comandos_personalizados:
                        if cmd_pers.comando == comando:
                            e = discord.Embed(
                                title=
                                '<a:loop_fun:763809373046702110> Comando personalizado',
                                colour=discord.Colour(random_color()),
                                description=
                                f'**Este comando só existe neste servidor!**',
                                timestamp=datetime.utcnow())
                            e.set_author(
                                name='Androxus',
                                icon_url=f'{self.bot.user.avatar_url}')
                            e.set_footer(text=f'{ctx.author}',
                                         icon_url=ctx.author.avatar_url)
                            e.add_field(
                                name=f'Comando: ```{cmd_pers.comando}```\n'
                                f'Resposta: ```{cmd_pers.resposta}```\n'
                                f'Ignorar posição: ```{convert_to_string(cmd_pers.in_text)}```',
                                value='** **',
                                inline=False)
                            return await ctx.send(embed=e)
                # se achou um comando "escondido"
                if (command is not None) and command.hidden:
                    command = None
                # se o bot não achar o comando com esse nome
                if command is None:
                    embed = discord.Embed(
                        title=
                        'Comando não encontrado <a:sad:755774681008832623>',
                        colour=discord.Colour(0xFF0000),
                        description=
                        f'Desculpe, mas não achei a ajuda para o comando ``{comando}``',
                        timestamp=datetime.utcnow())
                    embed.set_author(name='Androxus',
                                     icon_url=f'{self.bot.user.avatar_url}')
                    embed.set_footer(text=f'{ctx.author}',
                                     icon_url=f'{ctx.author.avatar_url}')
                    msg = '```ini\n[•] Veja se você não digitou algo errado'
                    all_commands = []
                    for command in self.bot.get_all_commands():
                        all_commands.append(command.name)
                        all_commands.append(command.category)
                        for alias in command.aliases:
                            all_commands.append(alias)
                    comando = ctx.message.content.lower()[len(ctx.prefix
                                                              ):].split(' ')
                    if comando[0] == 'help':
                        comando.pop(0)
                    comando = comando[0]
                    if ctx.guild:
                        all_commands = all_commands + [
                            c.comando for c in comandos_personalizados
                        ]
                    sugestao = get_most_similar_item(comando, all_commands)
                    # se a sugestão for pelo menos 50% semelhante ao comando
                    if (sugestao is not None) and (string_similarity(
                            comando, sugestao) >= 0.5):
                        msg += f'\n[•] Você quis dizer "{sugestao}"?'
                    embed.add_field(name='**Possiveis soluções:**',
                                    value=f'{msg}```',
                                    inline=False)
                    return await ctx.send(embed=embed)
            else:
                # se a pessoa usou o comando "help diversão" vai mostrar todos os comandos
                # que estão nessa categoria
                e = embedHelpCategory(self.bot, ctx, comando)
            # se não passou pelo return , vai atribuir o comando ao ctx.command
            ctx.command = command
            # o help do comando money é diferente, por isso esta condição
            if (ctx.command is not None) and (ctx.command.name == 'money'):
                embed1 = embedHelpCommand(self.bot, ctx)
                embed1.add_field(
                    name=
                    f'Para saber todas as abreviações das moedas que eu aceito, clique em ➡',
                    value=f'** **',
                    inline=True)
                embed2 = discord.Embed(
                    title=f'Todas as moedas que eu aceito no comando "money"',
                    colour=discord.Colour(random_color()),
                    description='** **',
                    timestamp=datetime.utcnow())
                translator = Translator()
                moedas = ''
                for c in currency_exchange.currencies():
                    moedas += f'{c}\n'
                moedas = translator.translate(moedas, dest='pt').text
                for c in moedas.splitlines():
                    abreviacao, moeda = c.split(' - ')
                    embed2.add_field(name=f'**{abreviacao}**',
                                     value=f'{moeda}',
                                     inline=True)

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

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

                    async def check_reactions_without_perm(ctx, msg, bot):
                        # mudas as páginas, se o bot não tiver perm pra apagar reações
                        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=embed2)
                            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=embed1)
                            await msg.add_reaction('➡')

                    async def check_reactions_with_perm(msg, bot):
                        # mudas as páginas, se o bot tiver perm pra apagar reações
                        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=embed2)
                            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=embed1)

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

                msg_bot = await ctx.send(embed=embed1)
                await msg_bot.add_reaction('➡')
                try:
                    # vai fica 1 minuto e meio esperando o usuário apertas nas reações
                    await asyncio.wait_for(menu_help(ctx, msg_bot),
                                           timeout=90.0)
                except asyncio.TimeoutError:  # se acabar o tempo
                    pass
                return
        if e is None:
            e = embedHelpCommand(self.bot, ctx)
        return await ctx.send(embed=e)