async def _reload_all(self, ctx: Context): """Reloads all modules, while pulling from git.""" try: async with ctx.typing(): stdout, stderr = await self.run_process('git pull') # progress and stuff is redirected to stderr in git pull # however, things like "fast forward" and files # along with the text "already up-to-date" are in stdout self.bot.logger.info(f'[Reload all] Stdout: {stdout}') if stdout.startswith('Already up to date.'): return await ctx.send( 'Não há mudanças para serem atualizadas da origin.') modules = self.find_modules_from_git(stdout) self.bot.logger.info(f'[Reload all] Modules: {modules}') if not modules: return await ctx.send('Não há nenhuma cog a ser atualizada.') mods_text = '\n'.join( f'{index}. `{module}`' for index, (_, module) in enumerate(modules, start=1)) prompt_text = f'Isso vai atualizar as seguinte cogs, tem certeza?\n{mods_text}' confirm = await ctx.prompt(prompt_text) if not confirm: return await ctx.send('Abortando.') statuses = [] for is_submodule, module in modules: if is_submodule: try: try: self.bot.reload_extension(module) except commands.ExtensionNotLoaded: self.bot.load_extension(module) except Exception: statuses.append((ctx.tick(False), module)) else: statuses.append((ctx.tick(True), module)) else: try: self.reload_or_load_extension(module) except commands.ExtensionError: statuses.append((ctx.tick(False), module)) else: statuses.append((ctx.tick(True), module)) await ctx.send('\n'.join(f'{status} `{module}`' for status, module in statuses)) except Exception as e: capture_exception(e)
async def token(self, ctx: Context): user = ctx.get_user() if not user: return data = { 'name': self.bot.setting.authorization['name'], 'type': self.bot.setting.authorization['type'], 'data': self.bot.setting.authorization['data'], 'id': user.id, 'discord_id': user.discord_id, 'discord_name': user.discord_name, 'ingame_name': user.ingame_name } token = base64.b64encode(str(data).encode('utf-8')).decode('utf-8') description = ( 'Atenção: Nunca compartilhe o seu Token de Autorização com outras pessoas, ele pode ser utilizado para se passar ' 'por você, em pesquisas, eventos do Clã etc.') embed = discord.Embed(title='Token de Autorização', description=description, color=discord.Color.dark_red()) embed.add_field(name="Clique abaixo para ver o seu Token", value=f"||{token}||") await ctx.message.add_reaction('✅') return await ctx.author.send(embed=embed)
async def aplicar_raids(self, ctx: Context): denied_message = "Fool! Você já tem permissão para ir Raids!" if has_any_role(ctx.author, self.bot.setting.role.get('raids')): return await ctx.send(denied_message) user = ctx.get_user() ingame_name = user.ingame_name raids_channel = f"<#{self.bot.setting.chat.get('raids')}>" try: player = rs3clans.Player(ingame_name) except ConnectionError: return await ctx.send( 'Não foi possível acessar a API do Runemetrics no momento, tente novamente mais tarde.' ) if not player.exists: return await ctx.send( f"{ctx.author.mention}, o jogador '{player.name}' não existe.") elif player.clan not in self.bot.setting.clan_names: return await ctx.send( f"{ctx.author.mention}, o jogador '{player.name}' não é um membro do Clã Atlantis." ) elif player.private_profile: return await ctx.send( f"{ctx.author.mention}, seu perfil no Runemetrics está privado, por favor o deixe público " f"e tente aplicar novamente.") emojis = { 'prayer': '<:prayer:499707566012497921>', 'herblore': '<:herblore:499707566272544778>', 'attack': '<:attack:499707565949583391>', 'invention': '<:invention:499707566419607552>', 'inventory': '<:inventory:615747024775675925>', 'full_manual': '<:full_manual:615751745049722880>' } herb_level = player.skill('herblore').level if herb_level < 90: await ctx.send( f"Ei {ctx.author.mention}, vejo aqui que seu nível de {emojis['herblore']} " f"Herbologia é apenas " f"**{herb_level}**. Isso é um pouco baixo!\n" f"**Irei continuar com o processo de aplicação, mas não será possível te dar permissão para " f"participar no momento, aplique novamente quando obter um nível de {emojis['herblore']} " f"Herbologia superior a " f"90**, falta apenas **{5_346_332 - player.skill('herblore').exp:,.0f}** de Exp!" ) elif 96 > herb_level >= 90: await ctx.send( f"Ei {ctx.author.mention}, vejo aqui que seu nível de {emojis['herblore']} " f"Herbologia é **{herb_level}**. " f"Isso é suficiente para fazer Poções de sobrecarregamento (Overloads), mas " f"apenas usando Boosts, caso já não tenha, faça alguns usando o seguinte " f"boost (ou outro como Pulse Cores) <https://rs.wiki/Spicy_stew>" ) prayer_level = player.skill('prayer').level left_to_95 = 8_771_558 - player.skill('prayer').exp if prayer_level < 95: d_bones_price = await self.get_price(536) d_bones_exp = 252 d_bones_till_99 = int(left_to_95 / d_bones_exp) f_bones_price = await self.get_price(18832) frost_bones_exp = 630 f_bones_till_99 = int(left_to_95 / frost_bones_exp) gp_emoji = "<:coins:573305319661240340>" await ctx.send( f"Ei {ctx.author.mention}, vejo aqui que seu nível de {emojis['prayer']} Oração é " f"apenas **{prayer_level}**. Isso é um pouco baixo!\n" f"Mas tudo bem, falta apenas **{int(left_to_95):,.0f}** de Exp para o nível 95. Com esse nível você " f"irá poder usar as segundas melhores Maldições de aumento de dano. Há diversas formas de você " f"alcançar o nível 95. Veja algumas abaixo:\n" f"• {int(left_to_95 / d_bones_exp):,.0f} Ossos de Dragão no Altar de Casa sem nenhum Boost " f"({gp_emoji} {int(d_bones_till_99 * d_bones_price):,.0f})\n" f"• {int(left_to_95 / frost_bones_exp):,.0f} Ossos de Dragão Gelado no Altar de Casa sem nenhum Boost " f"({gp_emoji} {int(f_bones_till_99 * f_bones_price):,.0f})\n") embed = discord.Embed( title="Aplicação para Raids", description= f"Olá! Você aplicou para receber o cargo <@&{self.bot.setting.role.get('raids')}> para " f"participar dos Raids do Clã.", color=discord.Color.blue()) nb_space = '\u200B' embed.set_thumbnail(url="https://i.imgur.com/2HPEdiz.png") embed.add_field( name= f"{nb_space}\nPor favor postar uma ou mais screenshots com os itens abaixo. " f"(pode enviar uma de cada vez)", value= f"• {emojis['attack']} Equipamento (Arma/Armadura/Acessórios/Switches etc.)\n" f"• {emojis['inventory']} Inventário\n" f"• {emojis['invention']} Perks de Arma, Armadura, Escudo e Switches que irá usar\n\n", inline=False) perks_pocketbook = 'https://rspocketbook.com/rs_pocketbook.pdf#page=6' embed.add_field( name=f"{nb_space}\nLinks Úteis", value= f"• {emojis['full_manual']} [Exemplos de Barras de Habilidade](https://imgur.com/a/XKzqyFs)\n" f"• {emojis['invention']} [Melhores Perks e como os obter]({perks_pocketbook})\n" f"• [Exemplo de Aplicação](https://i.imgur.com/CMNzquL.png)\n" f"• Guia de Yakamaru: <#{self.bot.setting.chat.get('guia_yaka')}>\n\n", inline=False) seconds_till_raids = time_till_raids( self.bot.setting.raids_start_date()) raids_diff = datetime.timedelta(seconds=seconds_till_raids) days = raids_diff.days hours = raids_diff.seconds // 3600 minutes = (raids_diff.seconds // 60) % 60 embed.add_field( name=f"{nb_space}\nInformações sobre os Times", value=f"Os times de Raids acontecem a cada 2 Dias.\n**A próxima " f"notificação de Raids será em {days} Dia(s), {hours} Hora(s) e " f"{minutes} Minuto(s)**.\n\nPara participar basta digitar **`in raids`** no canal " f"<#{self.bot.setting.chat.get('raids_chat')}> após a notificação do Bot, e ele irá o colocar " f"no time automaticamente, caso o time já esteja cheio, ele te colocará como substituto até que " f"abra alguma vaga. Caso aconteça, ele irá te notificar.\n\n1 hora após o Bot ter iniciado o time " f"irá começar o Raids no jogo, não chegue atrasado. Mais informações no canal {raids_channel}.", inline=False) await ctx.send( embed=embed, content=f"<@&{self.bot.setting.role.get('pvm_teacher')}>")
async def amigo_secreto(self, ctx: Context): dev = self.bot.get_user(self.bot.setting.developer_id) await dev.send(f'{ctx.author} está se inscrevendo no amigo secreto.') with self.bot.db_session() as session: state = session.query(AmigoSecretoState).first() if not state: state = AmigoSecretoState(activated=False) session.add(state) session.commit() if not state.activated: return await ctx.send( f"{ctx.author.mention}, o Amigo Secreto do Atlantis ainda não está ativo." ) session.expunge(state) user = ctx.get_user() if not user: raise Exception('Varíavel \'user\' é None') atlantis = self.bot.get_guild(self.bot.setting.server_id) member = atlantis.get_member(ctx.author.id) if not member: return await ctx.send( f"{ctx.author.mention}, é necessário estar no Servidor do Atlantis " f"para participar do Amigo Secreto\nhttps://discord.me/atlantis" ) allowed_role_list = ['membro', 'mod_trial', 'mod', 'mod+', 'admin'] allowed_roles = [ self.bot.setting.role.get(role) for role in allowed_role_list ] if not has_any_role(member, *allowed_roles): return await ctx.send( f"{ctx.author.mention}, você precisa ser um Membro do Clã para participar do Amigo Secreto." ) with self.bot.db_session() as session: exists = session.query(AmigoSecretoPerson).filter_by( user_id=user.id).first() if exists: session.close() await ctx.send( f"{ctx.author.mention}, você já está cadastrado no Amigo Secreto!" ) return await dev.send( f'{ctx.author}: Inscrição cancelada. Já está no Amigo Secreto.' ) session.add(AmigoSecretoPerson(user_id=user.id)) session.commit() await dev.send( f'{ctx.author} foi cadastrado no Amigo Secreto com sucesso ({user})' ) if state.end_date: minus_two_days = state.end_date - timedelta(days=2) end_date = f"no dia {minus_two_days.strftime('%d/%m')}" else: end_date = "quando os Amigos Secretos forem sorteados!" return await ctx.send( f"{ctx.author.mention}, você foi cadastrado no Amigo Secreto do Atlantis com sucesso! :)\n" f"Uma mensagem será enviada pra você no privado do Discord com o nome do seu Amigo Secreto {end_date}" )