2026-03-22 00:40:21 +01:00
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
|
from sqlalchemy.orm import Session as DBSession
|
|
|
|
|
from sqlalchemy import desc
|
2026-03-22 07:19:38 +01:00
|
|
|
from database import SessionLocal, PlayerRank, EquipmentLast
|
2026-03-25 00:31:32 +01:00
|
|
|
from fastapi_cache import FastAPICache
|
|
|
|
|
from fastapi_cache.backends.inmemory import InMemoryBackend
|
|
|
|
|
from fastapi_cache.decorator import cache
|
2026-03-22 00:40:21 +01:00
|
|
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
|
|
|
|
def get_db():
|
|
|
|
|
db = SessionLocal()
|
|
|
|
|
try:
|
|
|
|
|
yield db
|
|
|
|
|
finally:
|
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
|
|
@router.get("/leaderboard")
|
2026-03-25 00:31:32 +01:00
|
|
|
@cache(expire=60)
|
2026-03-22 00:40:21 +01:00
|
|
|
async def get_leaderboard(db: DBSession = Depends(get_db)):
|
|
|
|
|
try:
|
|
|
|
|
top_100_query = (
|
|
|
|
|
db.query(PlayerRank.PId)
|
|
|
|
|
.order_by(desc(PlayerRank.FesPower))
|
|
|
|
|
.limit(100)
|
|
|
|
|
.all()
|
|
|
|
|
)
|
2026-03-22 06:39:07 +01:00
|
|
|
top_100_tuples = set(top_100_query)
|
2026-03-22 07:19:38 +01:00
|
|
|
|
2026-03-22 06:39:07 +01:00
|
|
|
modes = {0, 1, 2}
|
2026-03-22 00:40:21 +01:00
|
|
|
leaderboard = {}
|
|
|
|
|
|
|
|
|
|
for mode in modes:
|
|
|
|
|
top_players = (
|
2026-03-22 07:19:38 +01:00
|
|
|
db.query(PlayerRank, EquipmentLast)
|
|
|
|
|
.outerjoin(EquipmentLast, PlayerRank.PId == EquipmentLast.PId)
|
2026-03-22 00:40:21 +01:00
|
|
|
.filter(PlayerRank.GameMode == mode)
|
|
|
|
|
.order_by(desc(PlayerRank.RankingScore))
|
|
|
|
|
.limit(9)
|
|
|
|
|
.all()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
mode_results = []
|
2026-03-22 07:19:38 +01:00
|
|
|
for player, gear in top_players:
|
2026-03-22 06:43:47 +01:00
|
|
|
player_data = {
|
2026-03-22 00:40:21 +01:00
|
|
|
"PId": player.PId,
|
|
|
|
|
"MiiName": player.MiiName,
|
|
|
|
|
"Rank": player.Rank,
|
|
|
|
|
"WinSum": player.WinSum,
|
|
|
|
|
"LoseSum": player.LoseSum,
|
|
|
|
|
"RankingScore": round(player.RankingScore, 2),
|
2026-03-22 07:19:38 +01:00
|
|
|
"weapon": gear.weapon if gear else None,
|
|
|
|
|
"headgear": gear.Gear_Head if gear else None,
|
|
|
|
|
"clothes": gear.Gear_Clothes if gear else None,
|
|
|
|
|
"shoes": gear.Gear_Shoes if gear else None,
|
2026-03-22 06:43:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if mode == 2:
|
|
|
|
|
is_top_100 = (player.PId,) in top_100_tuples
|
|
|
|
|
player_data["FesPower"] = player.FesPower
|
|
|
|
|
player_data["is_top_100_fes"] = is_top_100
|
|
|
|
|
|
|
|
|
|
mode_results.append(player_data)
|
2026-03-22 00:40:21 +01:00
|
|
|
|
|
|
|
|
leaderboard[f"mode_{mode}"] = mode_results
|
|
|
|
|
|
|
|
|
|
return leaderboard
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
2026-03-22 06:39:07 +01:00
|
|
|
print(f"Error: {e}")
|
2026-03-22 00:40:21 +01:00
|
|
|
return {"error": str(e)}
|