from typing import TypedDict, List, Optional, Dict class Player(TypedDict): steamid: str communityvisibilitystate: int profilestate: int personaname: str profileurl: str avatar: str avatarmedium: str avatarfull: str avatarhash: str lastlogoff: int personastate: int realname: str primaryclanid: str timecreated: int personastateflags: int gameextrainfo: str gameid: str class PlayerSummariesResponse(TypedDict): players: List[Player] class PlayerSummaries(TypedDict): response: PlayerSummariesResponse class ProcessedPlayer(Player): game_start_time: int # Unix timestamp class PlayerSummariesProcessedResponse(TypedDict): players: List[ProcessedPlayer] class Achievements(TypedDict): name: str image: bytes class GameData(TypedDict): game_name: str play_time: str # e.g. 10.2 last_played: str # e.g. 10 月 2 日 game_image: bytes achievements: List[Achievements] completed_achievement_number: int total_achievement_number: int class PlayerData(TypedDict): steamid: str player_name: str background: bytes avatar: bytes avatar_frame: Optional[bytes] # 头像框(社区物品)PNG,无则 None description: str recent_2_week_play_time: str game_data: List[GameData] # 以下字段来自主页 HTML 解析 + 社区 ?xml=1(不占 API 配额),缺失时为默认值 level: Optional[int] counts: Dict[str, int] member_since: Optional[str] online_state: Optional[str] state_message: Optional[str] current_game: Optional[str] # 资料页「当前正在游戏」的游戏名(已本地化) privacy_state: Optional[str] vac_banned: bool trade_ban_state: Optional[str] limited_account: bool hours_2wk: Optional[float] class ProfileCardExtra(TypedDict, total=False): """信息卡头部增强字段(缺失的键不绘制对应元素) status_kind / ban_kind 决定配色,取值见 draw.py 的 status_row_colors / ban_tag_colors;status_kind 为 private 时表示资料私密降级提示。 """ level: Optional[int] counts: Dict[str, int] member_since: Optional[str] status_text: Optional[str] status_kind: Optional[str] ban_text: Optional[str] ban_kind: Optional[str] class DrawPlayerStatusData(TypedDict): game_name: str game_time: str # e.g. 10.2 小时(过去 2 周) last_play_time: str # e.g. 10 月 2 日 game_header: bytes achievements: List[Achievements] completed_achievement_number: int total_achievement_number: int two_week_time: Optional[str] # e.g. 近两周 3.2 小时,缺失为 None __all__ = [ "Player", "PlayerSummaries", "PlayerSummariesResponse", "ProcessedPlayer", "PlayerSummariesProcessedResponse", "ProfileCardExtra", "DrawPlayerStatusData", ]