Refator eco code. Split into modules
This commit is contained in:
82
core/economy/leaderboards.py
Normal file
82
core/economy/leaderboards.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""Leaderboard queries over the full collection."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from .. import pb_client
|
||||
from .levels import get_level
|
||||
|
||||
|
||||
async def get_leaderboard(top_n: int | None = 10) -> list[tuple[str, int]]:
|
||||
"""Return top_n (user_id_str, balance) pairs sorted descending."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
((r["user_id"], r.get("balance", 0)) for r in records if r.get("user_id")),
|
||||
key=lambda x: x[1],
|
||||
reverse=True,
|
||||
)
|
||||
return result if top_n is None else result[:top_n]
|
||||
|
||||
|
||||
async def get_leaderboard_exp(top_n: int | None = 10) -> list[tuple[str, int, int]]:
|
||||
"""Return top_n (user_id_str, exp, level) sorted by EXP descending."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
((r["user_id"], r.get("exp", 0)) for r in records if r.get("user_id")),
|
||||
key=lambda x: x[1],
|
||||
reverse=True,
|
||||
)
|
||||
entries = [(uid, exp, get_level(exp)) for uid, exp in result]
|
||||
return entries if top_n is None else entries[:top_n]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Extended leaderboards
|
||||
# ---------------------------------------------------------------------------
|
||||
async def get_leaderboard_season_exp(top_n: int | None = 10) -> list[tuple[str, int, int]]:
|
||||
"""Return (user_id, season_total_exp, prestige_level) sorted by season EXP."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
(
|
||||
(r["user_id"], r.get("season_total_exp", 0), r.get("prestige_level", 0))
|
||||
for r in records if r.get("user_id")
|
||||
),
|
||||
key=lambda x: x[1],
|
||||
reverse=True,
|
||||
)
|
||||
return result if top_n is None else result[:top_n]
|
||||
|
||||
|
||||
async def get_leaderboard_prestige(top_n: int | None = 10) -> list[tuple[str, int, int]]:
|
||||
"""Return (user_id, prestige_level, prestige_points) sorted by prestige_level then PP."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
(
|
||||
(r["user_id"], r.get("prestige_level", 0), r.get("prestige_points", 0))
|
||||
for r in records if r.get("user_id")
|
||||
),
|
||||
key=lambda x: (x[1], x[2]),
|
||||
reverse=True,
|
||||
)
|
||||
return result if top_n is None else result[:top_n]
|
||||
|
||||
|
||||
async def get_leaderboard_wagered(top_n: int | None = 10) -> list[tuple[str, int]]:
|
||||
"""Return (user_id, total_wagered) sorted descending."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
((r["user_id"], r.get("total_wagered", 0)) for r in records if r.get("user_id")),
|
||||
key=lambda x: x[1],
|
||||
reverse=True,
|
||||
)
|
||||
return result if top_n is None else result[:top_n]
|
||||
|
||||
|
||||
async def get_leaderboard_fish(top_n: int | None = 10) -> list[tuple[str, int]]:
|
||||
"""Return (user_id, total_fish_caught) sorted descending."""
|
||||
records = await pb_client.list_all_records()
|
||||
result = sorted(
|
||||
((r["user_id"], r.get("total_fish_caught", 0)) for r in records if r.get("user_id")),
|
||||
key=lambda x: x[1],
|
||||
reverse=True,
|
||||
)
|
||||
return result if top_n is None else result[:top_n]
|
||||
Reference in New Issue
Block a user