sidequest_common.schemas.heroes#

Hall of Heroes: a members-only, raider.io-style leaderboard and per-member profile.

Attendance for raids/events/EP/attendance-rate is defined once, in sidequest_api.lib.attendance.attended_condition (a SQLAlchemy condition over EventSignup joined to GuildEvent); every stat here is derived from it rather than from a separate “attended” concept.

SEASONS is the only thing to touch to add a season: append one more entry with a starts_at after the previous season’s ends_at (None means “still running”).

Attributes#

SEASONS

Ordered oldest-first. The last entry's ends_at is always None (the current season).

Classes#

HeroLeaderboard

GET /api/heroes.

HeroProfile

GET /api/heroes/{member_id}.

HeroRecentEvent

One recent event a member attended, for the profile's recent-events list.

HeroRow

One leaderboard row.

HeroSeasonStats

One member's stats for one season (or all time).

Season

One competitive season. Open-ended (ends_at: None) until a later season starts.

Module Contents#

class sidequest_common.schemas.heroes.HeroLeaderboard#

Bases: pydantic.BaseModel

GET /api/heroes.

rows: list[HeroRow]#
season_id: str#
season_name: str#
class sidequest_common.schemas.heroes.HeroProfile#

Bases: pydantic.BaseModel

GET /api/heroes/{member_id}.

all_time: HeroSeasonStats#
avatar_url: str | None#
badges: list[sidequest_common.schemas.badges.EarnedBadge]#
chat_level: int#
chat_xp: int#
chat_xp_for_next_level: int#
chat_xp_into_level: int#
discord_id: str#
display_name: str#
first_event_date: datetime.date | None#
member_id: int#
rank: int | None#
recent_events: list[HeroRecentEvent]#
seasons: dict[str, HeroSeasonStats]#
wow_class: sidequest_common.schemas.events.WowClass | None#
class sidequest_common.schemas.heroes.HeroRecentEvent#

Bases: pydantic.BaseModel

One recent event a member attended, for the profile’s recent-events list.

ep: int#
id: uuid.UUID#
kind: sidequest_common.schemas.events.EventKind#
model_config#
starts_at: datetime.datetime#
title: str#
class sidequest_common.schemas.heroes.HeroRow#

Bases: pydantic.BaseModel

One leaderboard row.

avatar_url: str | None#
badge_ids: list[str]#
chat_level: int#
discord_id: str#
display_name: str#
ep: int#
events_attended: int#
member_id: int#
raids_attended: int#
rank: int | None#
wow_class: sidequest_common.schemas.events.WowClass | None#
class sidequest_common.schemas.heroes.HeroSeasonStats#

Bases: pydantic.BaseModel

One member’s stats for one season (or all time).

attendance_rate: float#
ep: int#
events_attended: int#
raids_attended: int#
class sidequest_common.schemas.heroes.Season#

Bases: pydantic.BaseModel

One competitive season. Open-ended (ends_at: None) until a later season starts.

ends_at: datetime.datetime | None#
id: str#
name: str#
starts_at: datetime.datetime#
sidequest_common.schemas.heroes.SEASONS: tuple[Season, Ellipsis]#

Ordered oldest-first. The last entry’s ends_at is always None (the current season).