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