feat(database): 添加全球排名事件触发逻辑

- 在 ScoreResp 类中添加逻辑,判断玩家是否进入全球前 50 或前 1% 排名
This commit is contained in:
chenjintang-shrimp
2025-08-13 17:17:39 +00:00
parent 3f5b242c6f
commit 3f31785428

View File

@@ -13,7 +13,8 @@ from app.calculator import (
calculate_weighted_pp,
clamp,
)
from app.config import settings
from app.config import Settings, settings
from app.database.events import Event, EventType
from app.database.team import TeamMember
from app.models.model import (
CurrentUserAttributes,
@@ -225,6 +226,31 @@ class ScoreResp(ScoreBase):
)
or None
)
total_users = (
await session.exec(select(func.count()).select_from(User))
).first()
assert total_users is not None
if s.rank_global is not None and s.rank_global <= min(
math.ceil(float(total_users) * 0.01), 50
):
rank_event = Event(
created_at=datetime.now(UTC),
type=EventType.RANK,
user_id=score.user_id,
user=score.user,
)
rank_event.event_payload = {
"scorerank": str(score.rank),
"rank": s.rank_global,
"mode": str(s.beatmap.mode),
"beatmap": {"title": s.beatmap.version, "url": s.beatmap.url},
"user": {
"username": score.user.username,
"url": str(Settings.frontend_url) + "/users/" + str(score.user.id),
},
}
session.add(rank_event)
await session.commit()
s.rank_country = (
await get_score_position_by_id(
session,