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()
 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()
Exemple #3
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 _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 #5
0
 def __init__(self):
     self.repository = ComandoPersonalizadoRepository()
     self.servidor = Servidor(123, 'prefixo teste')
     self.con = globals()['con']
Exemple #6
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 #7
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)