修复多人游戏排行榜问题

This commit is contained in:
咕谷酱
2025-08-22 13:52:28 +08:00
parent 6136b9fed3
commit b300ce9b09
13 changed files with 1008 additions and 324 deletions

View File

@@ -23,7 +23,7 @@ class EmailVerification(SQLModel, table=True):
is_used: bool = Field(default=False) # 是否已使用
used_at: datetime | None = Field(default=None)
ip_address: str | None = Field(default=None) # 请求IP
user_agent: str | None = Field(default=None) # 用户代理
user_agent: str | None = Field(default=None, max_length=255) # 用户代理
class LoginSession(SQLModel, table=True):
@@ -35,7 +35,7 @@ class LoginSession(SQLModel, table=True):
user_id: int = Field(sa_column=Column(BigInteger, ForeignKey("lazer_users.id"), nullable=False, index=True))
session_token: str = Field(unique=True, index=True) # 会话令牌
ip_address: str = Field() # 登录IP
user_agent: str | None = Field(default=None)
user_agent: str | None = Field(default=None, max_length=255) # 用户代理限制长度为255字符
country_code: str | None = Field(default=None)
is_verified: bool = Field(default=False) # 是否已验证
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))

View File

@@ -312,23 +312,7 @@ class UserResp(UserBase):
)
).one()
redis = get_redis()
# 实时验证用户在线状态
if obj.id is not None:
metadata_key = f"metadata:online:{obj.id}"
is_online_check = await redis.exists(metadata_key)
# 如果metadata键不存在立即从在线集合中清理该用户
if not is_online_check:
try:
from app.service.realtime_online_cleanup import realtime_cleanup
await realtime_cleanup.verify_user_online_status(obj.id)
except Exception as e:
from app.log import logger
logger.warning(f"Failed to verify user {obj.id} online status: {e}")
u.is_online = bool(is_online_check)
else:
u.is_online = False
u.is_online = await redis.exists(f"metadata:online:{obj.id}")
u.cover_url = (
obj.cover.get(
"url", "https://assets.ppy.sh/user-profile-covers/default.jpeg"
@@ -418,27 +402,26 @@ class UserResp(UserBase):
for ua in await obj.awaitable_attrs.achievement
]
if "rank_history" in include:
if obj.id is not None:
rank_history = await RankHistoryResp.from_db(session, obj.id, ruleset)
if len(rank_history.data) != 0:
u.rank_history = rank_history
rank_history = await RankHistoryResp.from_db(session, obj.id, ruleset)
if len(rank_history.data) != 0:
u.rank_history = rank_history
rank_top = (
await session.exec(
select(RankTop).where(
RankTop.user_id == obj.id, RankTop.mode == ruleset
)
rank_top = (
await session.exec(
select(RankTop).where(
RankTop.user_id == obj.id, RankTop.mode == ruleset
)
).first()
if rank_top:
u.rank_highest = (
RankHighest(
rank=rank_top.rank,
updated_at=datetime.combine(rank_top.date, datetime.min.time()),
)
if rank_top
else None
)
).first()
if rank_top:
u.rank_highest = (
RankHighest(
rank=rank_top.rank,
updated_at=datetime.combine(rank_top.date, datetime.min.time()),
)
if rank_top
else None
)
u.favourite_beatmapset_count = (
await session.exec(