コード例 #1
0
    async def stats(self, ctx: commands.Context):
        """
        Returns your rank, MMR, and games played

        Example:
            !rank
        """
        with session_scope() as session:
            rating_objects = (
                session.query(
                    PlayerRating,
                    sqlalchemy.func.count().label("count"),
                    (
                        sqlalchemy.func.sum((Game.winner == GameParticipant.side).cast(sqlalchemy.Integer))
                    ).label("wins"),
                )
                .select_from(PlayerRating)
                .join(GameParticipant)
                .join(Game)
                .filter(PlayerRating.player_id == ctx.author.id)
                .group_by(PlayerRating)
            )

            if ctx.guild:
                rating_objects = rating_objects.filter(PlayerRating.player_server_id == ctx.guild.id)

            rows = []

            for row in sorted(rating_objects.all(), key=lambda r: -r.count):
                # TODO LOW PRIO Make that a subquery
                rank = (
                    session.query(sqlalchemy.func.count())
                    .select_from(PlayerRating)
                    .filter(PlayerRating.player_server_id == row.PlayerRating.player_server_id)
                    .filter(PlayerRating.role == row.PlayerRating.role)
                    .filter(PlayerRating.mmr > row.PlayerRating.mmr)
                ).first()[0]

                rank_str = get_rank_emoji(rank)

                row_string = (
                    f"{f'{self.bot.get_guild(row.PlayerRating.player_server_id).name} ' if not ctx.guild else ''}"
                    f"{get_role_emoji(row.PlayerRating.role)} "
                    f"{rank_str} "
                    f"`{int(row.PlayerRating.mmr)} MMR  "
                    f"{row.wins}W {row.count-row.wins}L`"
                )

                rows.append(row_string)

            embed = Embed(title=f"Ranks for {ctx.author.display_name}", description="\n".join(rows))

            await ctx.send(embed=embed)
コード例 #2
0
ファイル: ranking_pages.py プロジェクト: shane10231023/Bot
    async def format_page(self,
                          menu: Optional[menus.MenuPages],
                          entries,
                          offset=None) -> Embed:

        if menu:
            show_footer = True
            offset = menu.current_page * self.per_page
        else:
            # TODO LOW PRIO The display code should be separated and better written than this/using a menu
            show_footer = False
            offset = offset * self.per_page

        rows = []

        max_name_length = max(len(r.Player.short_name) for r in entries)

        for idx, row in enumerate(entries):
            rank = idx + offset

            rank_str = get_rank_emoji(rank)

            role = get_role_emoji(row.role)

            player_name = row.Player.short_name

            player_padding = max_name_length - len(player_name) + 2

            wins = row.wins
            losses = row.count - row.wins

            output_string = (
                f"{rank_str}{role}  "
                f"`{row.Player.short_name}{' '*player_padding}{int(row.mmr)} "
                f"{wins}W {losses}L`")

            rows.append(output_string)

        embed = Embed(
            title=f"Ranking & MMR {self.embed_name_suffix}" if menu or
            (not show_footer and offset == 0
             )  # Cleanup that horrendous code that’s used for ranking channels
            else None,
            description="\n".join(rows),
        )

        if show_footer:
            embed.set_footer(
                text=f"Page {menu.current_page + 1} of {self._max_pages}")

        return embed