示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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')}>")
示例#4
0
    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}"
            )