コード例 #1
0
ファイル: transforminfo.py プロジェクト: loopdeer/pad-cogs
    def embed(state: TransformInfoViewState):
        base_mon = state.base_mon
        transformed_mon = state.transformed_mon

        fields = [
            EmbedField(
                '/'.join(['{}'.format(t.name) for t in transformed_mon.types]),
                Box(
                    IdView.normal_awakenings_row(transformed_mon)
                    if len(transformed_mon.awakenings) != 0 else Box(
                        Text('No Awakenings')), base_info(base_mon)),
            ),
            EmbedField('Card info',
                       IdView.misc_info(transformed_mon,
                                        state.true_evo_type_raw,
                                        state.acquire_raw, state.base_rarity),
                       inline=True),
            EmbedField(IdView.stats_header(transformed_mon).to_markdown(),
                       IdView.stats(transformed_mon),
                       inline=True),
            EmbedField(
                IdView.active_skill_header(transformed_mon).to_markdown() +
                base_skill(base_mon),
                Text(transformed_mon.active_skill.desc if transformed_mon.
                     active_skill else 'None')),
            EmbedField(
                IdView.leader_skill_header(transformed_mon).to_markdown(),
                Text(transformed_mon.leader_skill.desc if transformed_mon.
                     leader_skill else 'None'))
        ]

        return EmbedView(EmbedMain(
            color=state.color,
            title=MonsterHeader.long_v2(transformed_mon).to_markdown(),
            url=puzzledragonx(transformed_mon)),
                         embed_thumbnail=EmbedThumbnail(
                             MonsterImage.icon(transformed_mon)),
                         embed_footer=pad_info_footer_with_state(state),
                         embed_fields=fields)
コード例 #2
0
    def embed(cls, state: IdViewState):
        m = state.monster
        fields = [
            EmbedField(
                '/'.join(['{}'.format(t.name) for t in m.types]),
                Box(IdView.all_awakenings_row(m, state.transform_base),
                    cls.killers_row(m, state.transform_base))),
            EmbedField(
                'Inheritable' if m.is_inheritable else 'Not inheritable',
                IdView.misc_info(m, state.true_evo_type_raw, state.acquire_raw,
                                 state.base_rarity),
                inline=True),
            EmbedField(IdView.stats_header(m, state.previous_evolutions,
                                           state.query_settings).to_markdown(),
                       IdView.stats(m, state.previous_evolutions,
                                    state.query_settings),
                       inline=True),
            EmbedField(
                cls.active_skill_header(
                    m, state.previous_transforms).to_markdown(),
                Text(
                    cls.active_skill_text(m.active_skill,
                                          state.awoken_skill_map))),
            EmbedField(
                cls.leader_skill_header(m, state.query_settings.lsmultiplier,
                                        state.transform_base).to_markdown(),
                Text(m.leader_skill.desc if m.leader_skill else 'None')),
            cls.evos_embed_field(state)
        ]

        return EmbedView(EmbedMain(
            color=state.color,
            title=MonsterHeader.fmt_id_header(
                m, state.alt_monsters[0].monster.monster_id == cls.TSUBAKI,
                state.is_jp_buffed).to_markdown(),
            url=puzzledragonx(m)),
                         embed_thumbnail=EmbedThumbnail(MonsterImage.icon(m)),
                         embed_footer=embed_footer_with_state(state),
                         embed_fields=fields)
コード例 #3
0
ファイル: show_stats.py プロジェクト: RheingoldRiver/pad-cogs
    def embed(cls, state: ClosableEmbedViewState, props: ShowStatsViewProps):
        fields = []
        for mon, c in Counter(props.valid).most_common(
                cls.MAX_EXPANDED_RESULTS if len(props.valid) ==
                cls.MAX_EXPANDED_RESULTS else cls.MAX_EXPANDED_RESULTS - 1):
            fields.append(
                EmbedField(
                    mon.name_en,
                    Box(
                        LabeledText("Net",
                                    ShowStatsView.get_count(props.total, mon)),
                        LabeledText("Adj",
                                    ShowStatsView.get_count(props.adj, mon)),
                        LabeledText("You",
                                    ShowStatsView.get_count(props.you, mon))),
                    inline=True))
        if len(props.valid) > cls.MAX_EXPANDED_RESULTS:
            fields.append(
                EmbedField(
                    "... & More",
                    Box(f"+ {len(props.valid)-cls.MAX_EXPANDED_RESULTS-1} more monsters"
                        ),
                    inline=True))

        return EmbedView(EmbedMain(
            title=f"AdPEM Data for query: {state.raw_query}",
            description=Box(
                LabeledText("Net",
                            ShowStatsView.get_count(props.total,
                                                    *props.valid)),
                LabeledText("Adj",
                            ShowStatsView.get_count(props.adj, *props.valid)),
                LabeledText("You",
                            ShowStatsView.get_count(props.you,
                                                    *props.valid)))),
                         embed_thumbnail=EmbedThumbnail(
                             MonsterImage.icon(props.most_commmon)),
                         embed_fields=fields,
                         embed_footer=embed_footer_with_state(state))
コード例 #4
0
ファイル: evos.py プロジェクト: ethannp/pad-cogs
    def embed(cls, state: EvosViewState):
        fields = [
            EmbedField(
                ("{} evolution" if len(state.alt_versions) == 1 else "{} evolutions").format(len(state.alt_versions)),
                Box(*EvosView._evo_lines(state.alt_versions, state.monster)))]

        if state.gem_versions:
            fields.append(
                EmbedField(
                    ("{} evolve gem" if len(state.gem_versions) == 1 else "{} evolve gems").format(
                        len(state.gem_versions)),
                    Box(*EvosView._evo_lines(state.gem_versions, state.monster))))

        return EmbedView(
            EmbedMain(
                color=state.color,
                title=MonsterHeader.fmt_id_header(state.monster,
                                                  state.alt_monsters[0].monster.monster_id == cls.TSUBAKI,
                                                  state.is_jp_buffed).to_markdown(),
                url=puzzledragonx(state.monster)),
            embed_thumbnail=EmbedThumbnail(MonsterImage.icon(state.monster)),
            embed_footer=embed_footer_with_state(state),
            embed_fields=fields)
コード例 #5
0
 def embed(cls, state: MaterialsViewState):
     # m: "MonsterModel", color, mats, usedin, gemid, gemusedin, skillups, skillup_evo_count, link
     return EmbedView(
         EmbedMain(
             color=state.color,
             title=MonsterHeader.fmt_id_header(state.monster,
                                               state.alt_monsters[0].monster.monster_id == cls.TSUBAKI,
                                               state.is_jp_buffed).to_markdown(),
             url=puzzledragonx(state.monster)
         ),
         embed_thumbnail=EmbedThumbnail(MonsterImage.icon(state.monster)),
         embed_footer=embed_footer_with_state(state),
         embed_fields=[f for f in [
             mat_use_field(state.mats, "Evo materials")
             if state.mats or not (state.monster.is_stackable or state.gem_override) else None,
             mat_use_field(state.usedin, "Material for", 10)
             if state.usedin else None,
             mat_use_field(state.gemusedin, "Evo gem ({}) is mat for".format(state.gemid),
                           10 if state.gem_override else 5)
             if state.gemusedin else None,
             skillup_field(state.skillups, state.skillup_evo_count, state.link)
             if not (state.monster.is_stackable or state.gem_override) else None
         ] if f is not None] + [cls.evos_embed_field(state)]
     )
コード例 #6
0
 def embed(state, props: ExperienceCurveViewProps):
     regular = get_normal_exp_difference(props.monster, props.low,
                                         props.high, props.offset)
     lb = get_lb_exp_difference(props.monster, props.low, props.high,
                                props.offset)
     slb = get_slb_exp_difference(props.monster, props.low, props.high,
                                  props.offset)
     is_light = props.monster.full_damage_attr.value == 3
     return EmbedView(
         EmbedMain(
             color=state.color,
             title=MonsterHeader.fmt_id_header(props.monster,
                                               use_emoji=True),
             url=puzzledragonx(props.monster),
             description=Text(f'lv{props.low} -> lv{props.high} (' +
                              (trunc_humanize(props.monster.exp_curve)
                               if props.monster.exp_curve else "no") +
                              f' curve)'),
         ),
         embed_thumbnail=EmbedThumbnail(MonsterImage.icon(props.monster)),
         embed_fields=[
             EmbedField(title='Exact',
                        body=Box(
                            LabeledText("Reg", humanize_number(regular)),
                            LabeledText("LB", humanize_number(lb)),
                            LabeledText("SLB", humanize_number(slb)),
                            LabeledText("Net",
                                        humanize_number(regular + lb +
                                                        slb))),
                        inline=True),
             EmbedField(title='Approx',
                        body=Box(
                            LabeledText("Reg", trunc_humanize(regular)),
                            LabeledText("LB", trunc_humanize(lb)),
                            LabeledText("SLB", trunc_humanize(slb)),
                            LabeledText("Net",
                                        trunc_humanize(regular + lb +
                                                       slb))),
                        inline=True),
             EmbedField(
                 title='Resources',
                 body=Box(
                     LabeledText(
                         "Globes " + emoji_cache.get_emoji(
                             f'orb_{props.monster.full_damage_attr.name.lower()}'
                         ),
                         str(
                             get_total_needed(
                                 props.monster, props.low, props.high,
                                 props.offset,
                                 ceil(1.5 * GLOBE_EXP[
                                     props.monster.full_damage_attr.value]),
                                 is_light))),
                     LabeledText(
                         "TA2",
                         str(
                             get_total_needed(props.monster, props.low,
                                              props.high, props.offset,
                                              TA2_EXP, is_light))),
                     LabeledText(
                         "TA3",
                         str(
                             get_total_needed(props.monster, props.low,
                                              props.high, props.offset,
                                              TA3_EXP, is_light))),
                 ),
                 inline=True)
         ],
         embed_footer=embed_footer_with_state(state))
コード例 #7
0
    async def guess(self, ctx, *, guess):
        """Guess a card for the daily PADle"""
        if await self.do_quit_early(ctx):
            return
        dbcog = await self.get_dbcog()

        guess_monster = await dbcog.find_monster(guess, ctx.author.id)
        if guess_monster is None:
            close_menu = ClosableEmbedMenu.menu()
            props = PADleMonsterConfirmationViewProps(
                "Monster not found, please try again.")
            query_settings = await QuerySettings.extract_raw(
                ctx.author, self.bot, guess)
            state = ClosableEmbedViewState(
                ctx.author.id, ClosableEmbedMenu.MENU_TYPE, guess,
                query_settings, PADleMonsterConfirmationView.VIEW_TYPE, props)
            await close_menu.create(ctx, state)
            return

        m_embed = EmbedView(EmbedMain(
            title=MonsterHeader.menu_title(guess_monster).to_markdown(),
            description="Did you mean this monster?"),
                            embed_thumbnail=EmbedThumbnail(
                                MonsterImage.icon(
                                    guess_monster.monster_id))).to_embed()
        confirmation = await get_user_reaction(ctx,
                                               m_embed,
                                               YES_EMOJI,
                                               NO_EMOJI,
                                               timeout=20)
        if confirmation is None:
            return await send_cancellation_message(ctx,
                                                   "Confirmation timeout.")
        if confirmation == NO_EMOJI:
            return await send_cancellation_message(ctx, "Please guess again.")
        if not await self.config.user(ctx.author).start():
            return await send_cancellation_message(
                ctx,
                "You have not started a game yet! The PADle may have just expired."
            )
        if await self.config.user(ctx.author).done():
            return await send_cancellation_message(
                ctx, "You have already finished today's PADle!")
        async with self.config.user(
                ctx.author).todays_guesses() as todays_guesses:
            todays_guesses.append(guess_monster.monster_id)
        monster = dbcog.get_monster(int(await self.config.padle_today()))
        cur_day = await self.config.num_days()
        todays_guesses = await self.config.user(ctx.author).todays_guesses()
        async with self.config.user(ctx.author).all_guesses() as all_guesses:
            all_guesses[str(cur_day)] = todays_guesses

        channel = self.bot.get_channel(await self.config.user(ctx.author
                                                              ).channel_id())
        if channel is not None:
            with suppress(discord.HTTPException):
                del_msg = await channel.fetch_message(await self.config.user(
                    ctx.author).edit_id())
                await del_msg.delete()

        guess_monster_diff = MonsterDiff(monster, guess_monster)
        points = guess_monster_diff.get_diff_score()

        padle_menu = PADleScrollMenu.menu()
        # query_settings = await QuerySettings.extract_raw(ctx.author, self.bot, guess)
        cur_page = ceil(len(todays_guesses) / 5) - 1
        page_guesses = await PADleScrollViewState.do_queries(
            dbcog, todays_guesses[((cur_page) * 5):((cur_page + 1) * 5)])
        state = PADleScrollViewState(ctx.author.id,
                                     PADleScrollMenu.MENU_TYPE,
                                     guess,
                                     monster=monster,
                                     cur_day_page_guesses=page_guesses,
                                     current_day=cur_day,
                                     current_page=cur_page,
                                     num_pages=cur_page + 1)
        message = await padle_menu.create(ctx, state)
        await self.config.user(ctx.author).edit_id.set(message.id)
        await self.config.user(ctx.author).channel_id.set(ctx.channel.id)

        score = "\N{LARGE YELLOW SQUARE}"
        if guess_monster.monster_id == monster.monster_id:
            await ctx.send(
                "You got the PADle in {} guesses! Use `{}padle score` to share your score."
                .format(
                    len(await self.config.user(ctx.author).todays_guesses()),
                    ctx.prefix))
            await self.config.user(ctx.author).done.set(True)
            async with self.config.all_scores() as all_scores:
                all_scores.append(
                    str(
                        len(await
                            self.config.user(ctx.author).todays_guesses())))
            score = "\N{LARGE GREEN SQUARE}"
        else:
            if points < 9:
                score = "\N{LARGE ORANGE SQUARE}"
            if points < 5:
                score = "\N{LARGE RED SQUARE}"
        async with self.config.user(ctx.author).score() as scores:
            scores.append(score)
コード例 #8
0
ファイル: image.py プロジェクト: loopdeer/pad-cogs
def monster_thumbnail(m: "MonsterModel"):
    return EmbedThumbnail(MonsterImage.icon(m))