Beispiel #1
0
    async def format_help_for(self, context, command_or_bot):

        if permissions.can_react(context):

            await context.message.add_reaction(chr(0x2709))

        return await super().format_help_for(context, command_or_bot)
Beispiel #2
0
    async def get_destination(self, no_pm: bool = False):
        try:
            if permissions.can_react(self.context):
                await self.context.message.add_reaction(chr(0x2709))
        except discord.Forbidden:
            pass

        if no_pm:
            return self.context.channel
        else:
            return self.context.author
Beispiel #3
0
    async def send_pages(self, no_pm: bool = False):
        try:
            if permissions.can_react(self.context):
                await self.context.message.add_reaction(chr(0x2709))
        except discord.Forbidden:
            pass

        try:
            destination = self.get_destination(no_pm=no_pm)
            for page in self.paginator.pages:
                await destination.send(page)
        except discord.Forbidden:
            destination = self.get_destination(no_pm=True)
            await destination.send("Couldn't send help to you due to blocked DMs...")
Beispiel #4
0
    async def on_command_error(self, ctx, error):
        # source: https://gist.github.com/EvieePy/7822af90858ef65012ea500bcecf1612

        if hasattr(ctx.command, 'on_error'):
            return

        cog = ctx.cog
        if cog:
            if cog._get_overridden_method(cog.cog_command_error) is not None:
                return

        ignored = ()

        error = getattr(error, 'original', error)
        if isinstance(error, ignored):
            return
        elif isinstance(error, errors.NotOwner):
            return await ctx.send(
                f'{ctx.author.mention} você não é meu criador {self.bot.emoji("no_no")}'
            )
        elif isinstance(error, errors.MissingRequiredArgument):
            return await self.bot.send_help(ctx)
        elif isinstance(error, MultipleResults):
            embed = discord.Embed(title='Encontrei mais de um resultado!',
                                  colour=discord.Colour.random(),
                                  timestamp=datetime.utcnow())
            results = error.results
            if len(results) >= 5:
                msg = '\n'.join(f'{u} (ID: {u.id})' for u in results[:5])
                msg += f'\nE outro(s) {len(results) - 5} resultado(s)...'
            else:
                msg = '\n'.join(f'{u} (ID: {u.id})' for u in results)
            embed.add_field(name=msg, value='** **')
            return await ctx.send(embed=embed)
        elif isinstance(error, errors.MaxConcurrencyReached):
            try:
                # vai ver se é o dono
                permissions.is_owner(ctx)
                # se for, usa o comando
                await ctx.command.reinvoke(ctx)
            except errors.NotOwner:  # se não for, dispara o erro
                return await ctx.send(
                    f'Calma lá {ctx.author.mention}! Você só pode usar 1 comando por vez! Se o '
                    'comando possuir páginas, pare o sistema de paginação, antes de usar o '
                    'comando de novo!')
        elif isinstance(error, errors.NoPrivateMessage):
            return await ctx.send(
                f'{ctx.author.mention} Este comando só pode ser usado num servidor! {self.bot.emoji("atencao")}'
            )
        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! {self.bot.emoji("sad")}')
        elif isinstance(error, errors.CheckFailure):
            return await ctx.send(
                f'{ctx.author.mention} Você precisa ter permissão de `{ctx.command.perm_user}`'
                ' para usar este comando! ')
        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 com todas as permissões.')
        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 usuário `{error.member}` na lista'
                    f' de banidos. Teste usar o comando com aspas entre o nome do usuário caso ele'
                    f' tenha um nome com espaços, assim:\n'
                    f'`unban "{error.member} nome legal que o cara tem"`')
            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):
            try:
                # vai ver se é o dono
                permissions.is_owner(ctx)
                # se for, usa o comando
                await ctx.command.reinvoke(ctx)
            except errors.NotOwner:  # se não for, dispara o erro
                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.')
        elif isinstance(error, DuplicateBlacklist):
            await ctx.send(
                f'{self.bot.emoji("atencao")} {ctx.author.mention} Essa pessoa já está na blacklist!'
            )
        elif isinstance(error, DuplicateComandoDesativado):
            await ctx.send(
                f'{self.bot.emoji("atencao")} {ctx.author.mention} Esse comando já está desativado!'
            )
        elif isinstance(error, ComandoDesativadoNotFound):
            await ctx.send(
                f'{self.bot.emoji("atencao")} {ctx.author.mention} Esse comando já está ativado!'
            )
        elif isinstance(error, DuplicateComandoPersonalizado):
            await ctx.send(
                f'{self.bot.emoji("atencao")} {ctx.author.mention} Esse comando já está cadastrado!'
            )
        elif isinstance(error, DuplicateServidor):
            pass
        else:
            try:
                return await ctx.send(
                    f'Ocorreu o erro:```py\n{error}```Na execução do comando ```{ctx.message.content}```'
                    f'{self.bot.emoji("sad")}')
            except:
                print(
                    f'Ocorreu o erro: {error}\nNa execução do comando {ctx.message.content}'
                )
Beispiel #5
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}'
                    )