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)
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