Exemplo n.º 1
0
 async def giveup(self, ctx):
     """Give up on today's PADle"""
     if await self.do_quit_early(ctx):
         return
     confirmation = await get_user_confirmation(
         ctx, "Are you sure you would like to give up?", timeout=20)
     dbcog = await self.get_dbcog()
     if not confirmation:
         if confirmation is None:
             await send_cancellation_message(ctx, "Confirmation timeout.")
         return
     monster = dbcog.get_monster(int(await self.config.padle_today()))
     await self.config.user(ctx.author).done.set(True)
     m_embed = EmbedView(
         EmbedMain(title=MonsterHeader.menu_title(monster).to_markdown(),
                   description="PADle #{}".format(await
                                                  self.config.num_days()),
                   url=MonsterLink.ilmina(monster),
                   color=discord.Color.red()),
         embed_thumbnail=EmbedThumbnail(
             MonsterImage.icon(monster.monster_id))).to_embed()
     await ctx.send(embed=m_embed)
     await ctx.send(f"Use `{ctx.prefix}padle score` to share your score!")
     async with self.config.user(ctx.author).score() as scores:
         scores.append("\N{CROSS MARK}")
     async with self.config.all_scores() as all_scores:
         all_scores.append("X")
     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
Exemplo n.º 2
0
    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(
                color=state.query_settings.embedcolor,
                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.monster_id)),
            embed_fields=fields,
            embed_footer=embed_footer_with_state(state)
        )
Exemplo n.º 3
0
 def embed(cls, state: MaterialsViewState):
     # m: "MonsterModel", mats, usedin, gemid, gemusedin, skillups, skillup_evo_count, link
     return EmbedView(
         EmbedMain(color=state.query_settings.embedcolor,
                   title=MonsterHeader.menu_title(
                       state.monster,
                       is_tsubaki=state.alt_monsters[0].monster.monster_id
                       == cls.TSUBAKI,
                       is_jp_buffed=state.is_jp_buffed).to_markdown(),
                   url=MonsterLink.header_link(state.monster,
                                               state.query_settings)),
         embed_thumbnail=EmbedThumbnail(
             MonsterImage.icon(state.monster.monster_id)),
         embed_footer=embed_footer_with_state(state),
         embed_fields=[
             f for f in [
                 mat_use_field(state.mats,
                               "Evo materials",
                               query_settings=state.query_settings)
                 if state.mats or not (state.monster.is_stackable
                                       or state.gem_override) else None,
                 mat_use_field(state.usedin, "Material for", 10, state.
                               query_settings) 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,
                     state.query_settings) if state.gemusedin else None,
                 skillup_field(state.skillups, state.skillup_evo_count,
                               state.link, state.query_settings)
                 if not (state.monster.is_stackable or state.gem_override
                         ) else None
             ] if f is not None
         ] + [cls.evos_embed_field(state)])
Exemplo n.º 4
0
    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,
                                         state.query_settings)))
        ]

        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.query_settings.embedcolor,
            title=MonsterHeader.menu_title(
                state.monster,
                is_tsubaki=state.alt_monsters[0].monster.monster_id ==
                cls.TSUBAKI,
                is_jp_buffed=state.is_jp_buffed).to_markdown(),
            url=MonsterLink.header_link(state.monster, state.query_settings)),
                         embed_thumbnail=EmbedThumbnail(
                             MonsterImage.icon(state.monster.monster_id)),
                         embed_footer=embed_footer_with_state(state),
                         embed_fields=fields)
Exemplo n.º 5
0
 def embed(m: "MonsterModel", query_settings: QuerySettings):
     return EmbedView(
         EmbedMain(color=query_settings.embedcolor,
                   title=MonsterHeader.menu_title(m).to_markdown(),
                   description=LinksView.linksbox(m),
                   url=MonsterLink.header_link(m, query_settings)),
         embed_thumbnail=EmbedThumbnail(MonsterImage.icon(m.monster_id)))
Exemplo n.º 6
0
    def embed(cls, state: PicViewState):
        url = MonsterImage.picture(state.monster.monster_id)
        animated = state.monster.has_animation
        fields = [EmbedField(
            'Extra Links',
            Box(
                Box(
                    Text('Animation:'),
                    LinkedText('(MP4)', MonsterImage.video(state.monster.monster_no_jp)),
                    Text('|'),
                    LinkedText('(GIF)', MonsterImage.gif(state.monster.monster_no_jp)),
                    delimiter=' '
                ) if animated else None,
                Box(
                    Text('Orb Skin:'),
                    LinkedText('Regular', MonsterImage.orb_skin(state.monster.orb_skin_id)),
                    Text('|'),
                    LinkedText('Color Blind', MonsterImage.orb_skin_colorblind(state.monster.orb_skin_id)),
                    delimiter=' '
                ) if state.monster.orb_skin_id else None,
            )
        ),
            cls.evos_embed_field(state)
        ]

        return EmbedView(
            EmbedMain(
                color=state.query_settings.embedcolor,
                title=MonsterHeader.menu_title(state.monster,
                                               is_tsubaki=state.alt_monsters[0].monster.monster_id == cls.TSUBAKI,
                                               is_jp_buffed=state.is_jp_buffed).to_markdown(),
                url=MonsterLink.header_link(state.monster, state.query_settings)
            ),
            embed_footer=embed_footer_with_state(state),
            embed_fields=fields,
            embed_body_image=EmbedBodyImage(url),
        )
Exemplo n.º 7
0
 def embed(cls, state: ClosableEmbedViewState,
           props: PersonalStatsViewProps):
     return EmbedView(EmbedMain(
         title=f"{props.username}'s PADle Stats",
         description=
         (f"**Games Played**: {props.played}\n"
          f"**Win Rate**: {props.win_rate:.2%}\n"
          f"**Current Streak**: {props.cur_streak}\n"
          f"**Max Streak**: {props.max_streak}\n"
          f"**Favorite Guessed Monster**: {MonsterHeader.menu_title(props.monster).to_markdown()}"
          ),
         color=props.query_settings.embedcolor),
                      embed_thumbnail=EmbedThumbnail(
                          MonsterImage.icon(props.monster.monster_id)),
                      embed_footer=embed_footer_with_state(
                          state, text="Click the X to close."))
Exemplo n.º 8
0
    def embed(cls, state: PantheonViewState):
        fields = [EmbedField(
            'Pantheon: {}'.format(state.series_name),
            Box(*_pantheon_lines(state.pantheon_list, state.base_monster, state.query_settings))
        ),
            cls.evos_embed_field(state)]

        return EmbedView(
            EmbedMain(
                color=state.query_settings.embedcolor,
                title=MonsterHeader.menu_title(state.monster,
                                               is_tsubaki=state.alt_monsters[0].monster.monster_id == cls.TSUBAKI,
                                               is_jp_buffed=state.is_jp_buffed).to_markdown(),
                url=MonsterLink.header_link(state.monster, state.query_settings)),
            embed_footer=embed_footer_with_state(state),
            embed_fields=fields,
            embed_thumbnail=EmbedThumbnail(MonsterImage.icon(state.monster.monster_id)),
        )
Exemplo n.º 9
0
 def embed(state: GlobalStatsViewState):
     description = GlobalStatsView.get_description(state)
     if state.num_days == state.current_day:
         return EmbedView(
             EmbedMain(
                 title=BoldText(f"PADle #{state.current_day}"),
                 color=state.query_settings.embedcolor,
             ),
             embed_fields=[EmbedField("Stats", Box(description))],
             embed_footer=embed_footer_with_state(state, text=GlobalStatsView.get_pages_footer(state)))
     else:
         return EmbedView(
             EmbedMain(
                 title=BoldText(f"PADle #{state.current_day}"),
                 description=Box(BoldText(MonsterHeader.menu_title(state.monster).to_markdown())),
                 color=state.query_settings.embedcolor,
             ),
             embed_fields=[EmbedField("Stats", Box(description))],
             embed_footer=embed_footer_with_state(state, text=GlobalStatsView.get_pages_footer(state)),
             embed_thumbnail=EmbedThumbnail(MonsterImage.icon(state.monster.monster_id)))
Exemplo n.º 10
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.query_settings.embedcolor,
                      title=MonsterHeader.menu_title(
                          m,
                          is_tsubaki=state.alt_monsters[0].monster.monster_id
                          == cls.TSUBAKI,
                          is_jp_buffed=state.is_jp_buffed).to_markdown(),
                      url=MonsterLink.header_link(m, state.query_settings)),
            embed_thumbnail=EmbedThumbnail(MonsterImage.icon(m.monster_id)),
            embed_footer=embed_footer_with_state(state),
            embed_fields=fields)
Exemplo n.º 11
0
    def embed(state: ClosableEmbedViewState, props: AwakeningHelpViewProps):
        monster = props.monster
        show_help = state.query_settings.showhelp.value
        token_map = props.token_map
        fields = [
            EmbedField('Normal Awakenings',
                       get_normal_awakenings(monster, show_help, token_map)),
            EmbedField('Super Awakenings',
                       get_super_awakenings(monster, show_help, token_map))
        ]

        return EmbedView(
            EmbedMain(color=state.query_settings.embedcolor,
                      description='This monster has no awakenings.'
                      if not monster.awakenings else ''),
            embed_author=EmbedAuthor(
                MonsterHeader.menu_title(monster).to_markdown(),
                MonsterLink.header_link(monster,
                                        query_settings=state.query_settings),
                MonsterImage.icon(monster.monster_id)),
            embed_footer=embed_footer_with_state(state),
            embed_fields=fields)
Exemplo n.º 12
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.query_settings.embedcolor,
             title=MonsterHeader.menu_title(props.monster, use_emoji=True),
             url=MonsterLink.header_link(
                 props.monster, query_settings=state.query_settings),
             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.monster_id)),
         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))
Exemplo n.º 13
0
 def embed(m: "MonsterModel", query_settings: QuerySettings):
     return EmbedView(EmbedMain(color=query_settings.embedcolor),
                      embed_author=EmbedAuthor(
                          MonsterHeader.menu_title(m).to_markdown(),
                          MonsterLink.header_link(m, query_settings),
                          MonsterImage.icon(m.monster_id)))
Exemplo n.º 14
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)
Exemplo n.º 15
0
    def embed(cls, state: ButtonInfoViewState):
        is_coop = state.display_options.players == ButtonInfoOptions.coop
        is_desktop = state.display_options.device == ButtonInfoOptions.desktop
        max_110 = state.display_options.max_level == ButtonInfoOptions.limit_break
        monster = state.monster
        info = state.info

        fields = [
            EmbedField(
                # this block does not change if the lv110/lv120 toggle is clicked
                ButtonInfoView.get_max_level_text(monster, True),
                Box(
                    Text('Without Latents'),
                    # avoid whitespace after code block
                    Box(get_stat_block(info.coop if is_coop else info.solo),
                        Text('With Latents (Atk+)'),
                        delimiter=''),
                    get_stat_block(
                        info.coop_latent if is_coop else info.solo_latent)),
                inline=True),
            EmbedField(
                'Lv. 120',
                Box(
                    Text('Without Latents'),
                    # avoid whitespace after code block
                    Box(get_stat_block(
                        info.coop_slb if is_coop else info.solo_slb),
                        Text('With Latents (Atk++)'),
                        delimiter=''),
                    get_stat_block(info.coop_slb_latent if is_coop else info.
                                   solo_slb_latent)),
                inline=True) if monster.limit_mult != 0 else None,
            EmbedField(
                ButtonInfoView.get_common_buttons_title_text(monster, max_110),
                Box(
                    Text(
                        '*Inherits are assumed to be the max possible level (up to 110) and +297.*'
                    ),
                    # janky, but python gives DeprecationWarnings when using \* in a regular string
                    Text(r'*\* = on-color stat bonus applied*'),
                    Text('Card Button Damage'),
                    # done this way to not have the whitespace after code block
                    Box(BlockText(info.get_card_btn_str(is_coop, max_110)),
                        Text('Team Button Contribution'),
                        delimiter=''),
                    BlockText(info.get_team_btn_str(is_coop, max_110))))
            if is_desktop else None,
            EmbedField(
                ButtonInfoView.get_common_buttons_title_text(monster, max_110),
                Box(
                    Text(
                        '*Inherits are assumed to be the max possible level (up to 110) and +297.*'
                    ),
                    # janky, but python gives DeprecationWarnings when using \* in a regular string
                    Text(r'*\* = on-color stat bonus applied*')))
            if not is_desktop else None,
            EmbedField('Card Button Damage',
                       BlockText(
                           get_mobile_btn_str(
                               info.get_card_btn_str(is_coop, max_110))),
                       inline=True) if not is_desktop else None,
            EmbedField('Team Button Contribution',
                       BlockText(
                           get_mobile_btn_str(
                               info.get_team_btn_str(is_coop, max_110))),
                       inline=True) if not is_desktop else None,
            cls.evos_embed_field(state)
        ]

        return EmbedView(EmbedMain(
            color=state.query_settings.embedcolor,
            description='(Co-op mode)' if is_coop else '(Singleplayer mode)'),
                         embed_author=EmbedAuthor(
                             MonsterHeader.menu_title(monster).to_markdown(),
                             MonsterLink.header_link(monster,
                                                     state.query_settings),
                             MonsterImage.icon(monster.monster_id)),
                         embed_footer=embed_footer_with_state(state),
                         embed_fields=fields)