Skip to content

Commit 4c0f8a9

Browse files
AmbratolmAmbratolm
authored andcommitted
Improved ALeaderboardcog: Adivided into rank/level subs & improv
1 parent d85f4b7 commit 4c0f8a9

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

bot/cogs/game_cogs/leaderboard_cog.py

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from typing import Any
2+
13
from discord import Color, Embed, Guild, Interaction, Member, User, app_commands
2-
from discord.ext.commands import Cog
4+
from discord.ext.commands import GroupCog
35
from humanize import intcomma, naturalsize, naturaltime
46
from odmantic import query
57

@@ -11,15 +13,49 @@
1113
# ----------------------------------------------------------------------------------------------------
1214
# * Leaderboard Cog
1315
# ----------------------------------------------------------------------------------------------------
14-
class LeaderboardCog(Cog, description="Allows players to view their data"):
16+
class LeaderboardCog(
17+
GroupCog, group_name="leaderboard", description="Allows players to view their data"
18+
):
1519
def __init__(self, bot: ActBot):
1620
self.bot = bot
1721

1822
# ----------------------------------------------------------------------------------------------------
1923

2024
@app_commands.guild_only()
21-
@app_commands.command(description="View top members")
22-
async def leaderboard(self, interaction: Interaction):
25+
@app_commands.command(description="View top members sorted by level")
26+
async def level(self, interaction: Interaction):
27+
embed = EmbedX.info(emoji="🏅", title="Level Leaderboard")
28+
await self.show_leaderboard(
29+
interaction=interaction,
30+
embed=embed,
31+
sort=(
32+
query.desc(Actor.level),
33+
query.desc(Actor.xp),
34+
query.desc(Actor.gold),
35+
),
36+
)
37+
38+
@app_commands.guild_only()
39+
@app_commands.command(description="View top members sorted by rank")
40+
async def rank(self, interaction: Interaction):
41+
embed = EmbedX.info(emoji="🏆", title="Rank Leaderboard")
42+
await self.show_leaderboard(
43+
interaction=interaction,
44+
embed=embed,
45+
sort=(
46+
query.desc(Actor.elo),
47+
query.desc(Actor.gold),
48+
),
49+
)
50+
51+
# ----------------------------------------------------------------------------------------------------
52+
53+
async def show_leaderboard(
54+
self,
55+
interaction: Interaction,
56+
embed: Embed,
57+
sort: Any,
58+
):
2359
# Check guild
2460
guild = interaction.guild
2561
if not guild:
@@ -31,15 +67,15 @@ async def leaderboard(self, interaction: Interaction):
3167

3268
# Get top actors
3369
await interaction.response.defer()
34-
actors_members = await self.bot.get_actors_members(guild)
70+
actors_members = await self.bot.get_actors_members(guild=guild, sort=sort)
3571
if not actors_members:
3672
await interaction.followup.send(
3773
embed=EmbedX.warning(description="No actors found.")
3874
)
3975
return
4076

4177
# Create board table
42-
top_actor: Actor
78+
# top_actor: Actor
4379
names_column_text = ""
4480
stats_column_text = ""
4581
for i, (actor, member) in enumerate(actors_members):
@@ -55,8 +91,7 @@ async def leaderboard(self, interaction: Interaction):
5591
names_column_text += f"**# {(i+1)}** ― {medal} {name} {skull}\n**`🏆{rank} 🏅{level}{xp} 💰{gold}`**\n\n"
5692
# stats_column_text += f"**`🏆{rank} 🏅{level} ⏫{xp} 💰{gold}`**\n"
5793

58-
# Create embed
59-
embed = EmbedX.info(emoji="🏆", title="Leaderboard")
94+
# Send embed
6095
# try:
6196
# top_member = guild.get_member(top_actor.id) or await guild.fetch_member(
6297
# top_actor.id

bot/main.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pathlib
2+
from typing import Any
23

34
from colorama import Fore
45
from discord import Guild, Interaction, Member, Message, Object, User, app_commands
@@ -211,23 +212,25 @@ def create_dm_actor(self, user: User) -> DmActor:
211212
# ----------------------------------------------------------------------------------------------------
212213

213214
async def get_actors_members(
214-
self, guild: Guild, limit: int = 10, sort_by_top=True
215+
self,
216+
guild: Guild,
217+
limit: int = 10,
218+
sort: Any | None = (
219+
query.desc(Actor.level),
220+
query.desc(Actor.xp),
221+
query.desc(Actor.gold),
222+
),
215223
) -> list[tuple[Actor, Member]]:
216224
"""Get actors with their associated members."""
217225
db = self.get_db(guild)
218226
actors = (
219227
db.find(
220228
Actor,
221229
Actor.is_member == True,
222-
sort=(
223-
query.desc(Actor.elo),
224-
query.desc(Actor.level),
225-
query.desc(Actor.xp),
226-
query.desc(Actor.gold),
227-
),
230+
sort=sort,
228231
limit=limit,
229232
)
230-
if sort_by_top
233+
if sort
231234
else db.find(Actor, limit=limit)
232235
)
233236
actors_members: list[tuple[Actor, Member]] = []

0 commit comments

Comments
 (0)