212 lines
4.9 KiB
Python
212 lines
4.9 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
from app.database import (
|
|
LazerUserAchievement,
|
|
Team as Team,
|
|
)
|
|
|
|
from .score import GameMode
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class PlayStyle(str, Enum):
|
|
MOUSE = "mouse"
|
|
KEYBOARD = "keyboard"
|
|
TABLET = "tablet"
|
|
TOUCH = "touch"
|
|
|
|
|
|
class Country(BaseModel):
|
|
code: str
|
|
name: str
|
|
|
|
|
|
class Cover(BaseModel):
|
|
custom_url: str | None = None
|
|
url: str
|
|
id: int | None = None
|
|
|
|
|
|
class Level(BaseModel):
|
|
current: int
|
|
progress: int
|
|
|
|
|
|
class GradeCounts(BaseModel):
|
|
ss: int = 0
|
|
ssh: int = 0
|
|
s: int = 0
|
|
sh: int = 0
|
|
a: int = 0
|
|
|
|
|
|
class Statistics(BaseModel):
|
|
count_100: int = 0
|
|
count_300: int = 0
|
|
count_50: int = 0
|
|
count_miss: int = 0
|
|
level: Level
|
|
global_rank: int | None = None
|
|
global_rank_exp: int | None = None
|
|
pp: float = 0.0
|
|
pp_exp: float = 0.0
|
|
ranked_score: int = 0
|
|
hit_accuracy: float = 0.0
|
|
play_count: int = 0
|
|
play_time: int = 0
|
|
total_score: int = 0
|
|
total_hits: int = 0
|
|
maximum_combo: int = 0
|
|
replays_watched_by_others: int = 0
|
|
is_ranked: bool = False
|
|
grade_counts: GradeCounts
|
|
country_rank: int | None = None
|
|
rank: dict | None = None
|
|
|
|
|
|
class Kudosu(BaseModel):
|
|
available: int = 0
|
|
total: int = 0
|
|
|
|
|
|
class MonthlyPlaycount(BaseModel):
|
|
start_date: str
|
|
count: int
|
|
|
|
|
|
class UserAchievement(BaseModel):
|
|
achieved_at: datetime
|
|
achievement_id: int
|
|
|
|
# 添加数据库模型转换方法
|
|
def to_db_model(self, user_id: int) -> LazerUserAchievement:
|
|
return LazerUserAchievement(
|
|
user_id=user_id,
|
|
achievement_id=self.achievement_id,
|
|
achieved_at=self.achieved_at
|
|
)
|
|
|
|
|
|
class RankHighest(BaseModel):
|
|
rank: int
|
|
updated_at: datetime
|
|
|
|
|
|
class RankHistory(BaseModel):
|
|
mode: str
|
|
data: list[int]
|
|
|
|
|
|
class DailyChallengeStats(BaseModel):
|
|
daily_streak_best: int = 0
|
|
daily_streak_current: int = 0
|
|
last_update: datetime | None = None
|
|
last_weekly_streak: datetime | None = None
|
|
playcount: int = 0
|
|
top_10p_placements: int = 0
|
|
top_50p_placements: int = 0
|
|
user_id: int
|
|
weekly_streak_best: int = 0
|
|
weekly_streak_current: int = 0
|
|
|
|
|
|
class Page(BaseModel):
|
|
html: str = ""
|
|
raw: str = ""
|
|
|
|
|
|
class User(BaseModel):
|
|
# 基本信息
|
|
id: int
|
|
username: str
|
|
avatar_url: str
|
|
country_code: str
|
|
default_group: str = "default"
|
|
is_active: bool = True
|
|
is_bot: bool = False
|
|
is_deleted: bool = False
|
|
is_online: bool = True
|
|
is_supporter: bool = False
|
|
is_restricted: bool = False
|
|
last_visit: datetime | None = None
|
|
pm_friends_only: bool = False
|
|
profile_colour: str | None = None
|
|
|
|
# 个人资料
|
|
cover_url: str | None = None
|
|
discord: str | None = None
|
|
has_supported: bool = False
|
|
interests: str | None = None
|
|
join_date: datetime
|
|
location: str | None = None
|
|
max_blocks: int = 100
|
|
max_friends: int = 500
|
|
occupation: str | None = None
|
|
playmode: GameMode = GameMode.OSU
|
|
playstyle: list[PlayStyle] = []
|
|
post_count: int = 0
|
|
profile_hue: int | None = None
|
|
profile_order: list[str] = [
|
|
"me",
|
|
"recent_activity",
|
|
"top_ranks",
|
|
"medals",
|
|
"historical",
|
|
"beatmaps",
|
|
"kudosu",
|
|
]
|
|
title: str | None = None
|
|
title_url: str | None = None
|
|
twitter: str | None = None
|
|
website: str | None = None
|
|
session_verified: bool = False
|
|
support_level: int = 0
|
|
|
|
# 关联对象
|
|
country: Country
|
|
cover: Cover
|
|
kudosu: Kudosu
|
|
statistics: Statistics
|
|
statistics_rulesets: dict[str, Statistics]
|
|
|
|
# 计数信息
|
|
beatmap_playcounts_count: int = 0
|
|
comments_count: int = 0
|
|
favourite_beatmapset_count: int = 0
|
|
follower_count: int = 0
|
|
graveyard_beatmapset_count: int = 0
|
|
guest_beatmapset_count: int = 0
|
|
loved_beatmapset_count: int = 0
|
|
mapping_follower_count: int = 0
|
|
nominated_beatmapset_count: int = 0
|
|
pending_beatmapset_count: int = 0
|
|
ranked_beatmapset_count: int = 0
|
|
ranked_and_approved_beatmapset_count: int = 0
|
|
unranked_beatmapset_count: int = 0
|
|
scores_best_count: int = 0
|
|
scores_first_count: int = 0
|
|
scores_pinned_count: int = 0
|
|
scores_recent_count: int = 0
|
|
|
|
# 历史数据
|
|
account_history: list[dict] = []
|
|
active_tournament_banner: dict | None = None
|
|
active_tournament_banners: list[dict] = []
|
|
badges: list[dict] = []
|
|
current_season_stats: dict | None = None
|
|
daily_challenge_user_stats: DailyChallengeStats | None = None
|
|
groups: list[dict] = []
|
|
monthly_playcounts: list[MonthlyPlaycount] = []
|
|
page: Page = Page()
|
|
previous_usernames: list[str] = []
|
|
rank_highest: RankHighest | None = None
|
|
rank_history: RankHistory | None = None
|
|
rankHistory: RankHistory | None = None # 兼容性别名
|
|
replays_watched_counts: list[dict] = []
|
|
team: Team | None = None
|
|
user_achievements: list[UserAchievement] = []
|