feat: add /leaderboard/getplayerstats/pid?mode (#65)
Adds the ability to grab a players stats by pid without them being on the leaderboard. Untested changes. Reviewed-on: #65
This commit is contained in:
parent
c4fe4f1bf1
commit
35a6c0db78
2 changed files with 74 additions and 0 deletions
2
main.py
2
main.py
|
|
@ -14,6 +14,7 @@ from routes.equipment import equipment_history
|
|||
from routes.equipment import equipment
|
||||
from services.boss_retrieval import process_boss_file
|
||||
from routes import Ranking
|
||||
from routes import ranking_grabstats
|
||||
from routes import twitter_link
|
||||
from contextlib import asynccontextmanager
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
|
@ -187,6 +188,7 @@ app.include_router(equipment_history.router, prefix="/api/v1")
|
|||
app.include_router(equipment.router, prefix="/api/v1")
|
||||
app.include_router(Ranking.router, prefix="/api/v1")
|
||||
app.include_router(twitter_link.router, prefix="/api/v1")
|
||||
app.include_router(ranking_grabstats.router, prefix="/api/v1")
|
||||
|
||||
def start():
|
||||
uvicorn.run("main:app", host="0.0.0.0", port=settings.port, reload=False)
|
||||
|
|
|
|||
72
routes/ranking_grabstats.py
Normal file
72
routes/ranking_grabstats.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session as DBSession
|
||||
from sqlalchemy import desc
|
||||
from database import SessionLocal, PlayerRank, EquipmentLast
|
||||
from fastapi_cache.decorator import cache
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
def get_db():
|
||||
db = SessionLocal()
|
||||
try:
|
||||
yield db
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
@router.get("/leaderboard/getplayerstats/{pid}")
|
||||
@cache(expire=60)
|
||||
async def get_player_stats(pid: int, mode: int | None = None, db: DBSession = Depends(get_db)):
|
||||
try:
|
||||
query = (
|
||||
db.query(PlayerRank, EquipmentLast)
|
||||
.outerjoin(EquipmentLast, PlayerRank.PId == EquipmentLast.PId)
|
||||
.filter(PlayerRank.PId == pid)
|
||||
)
|
||||
|
||||
if mode is not None:
|
||||
query = query.filter(PlayerRank.GameMode == mode)
|
||||
|
||||
result = query.first()
|
||||
|
||||
if not result:
|
||||
raise HTTPException(status_code=404, detail="Player not found")
|
||||
|
||||
player, gear = result
|
||||
|
||||
player_data = {
|
||||
"PId": player.PId,
|
||||
"MiiName": player.MiiName,
|
||||
"Rank": player.Rank,
|
||||
"GameMode": player.GameMode,
|
||||
"WinSum": player.WinSum,
|
||||
"LoseSum": player.LoseSum,
|
||||
"RankingScore": round(player.RankingScore, 2),
|
||||
"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,
|
||||
}
|
||||
|
||||
if player.GameMode == 2:
|
||||
top_100_query = (
|
||||
db.query(PlayerRank.PId)
|
||||
.order_by(desc(PlayerRank.FesPower))
|
||||
.limit(100)
|
||||
.all()
|
||||
)
|
||||
top_100_tuples = set(top_100_query)
|
||||
|
||||
is_top_100 = (player.PId,) in top_100_tuples
|
||||
player_data["FesPower"] = player.FesPower
|
||||
player_data["is_top_100_fes"] = is_top_100
|
||||
else:
|
||||
player_data["FesPower"] = None
|
||||
player_data["is_top_100_fes"] = False
|
||||
|
||||
return player_data
|
||||
|
||||
except HTTPException as http_ex:
|
||||
raise http_ex
|
||||
except Exception as e:
|
||||
print(f"Error fetching stats for player {pid}: {e}")
|
||||
return {"error": str(e)}
|
||||
Loading…
Reference in a new issue