sidequest_common.schemas.epgp ============================= .. py:module:: sidequest_common.schemas.epgp .. autoapi-nested-parse:: EPGP loot system schemas. Rules constants, the addon export/import wire shapes, and the HTTP API's request/response schemas (``local://addon-contract.md`` is the source of truth; field names and string prefixes here are binding). Attributes ---------- .. autoapisummary:: sidequest_common.schemas.epgp.AWARD_AMOUNT_MAX sidequest_common.schemas.epgp.AWARD_AMOUNT_MIN sidequest_common.schemas.epgp.BASE_GP sidequest_common.schemas.epgp.CHASE_MULTIPLIER sidequest_common.schemas.epgp.DECAY_PERCENT sidequest_common.schemas.epgp.DEFAULT_REALM sidequest_common.schemas.epgp.EPGP_RULES sidequest_common.schemas.epgp.EP_VALUES sidequest_common.schemas.epgp.GP_BY_INVTYPE sidequest_common.schemas.epgp.LEGENDARY_GP sidequest_common.schemas.epgp.MAX_AWARDS sidequest_common.schemas.epgp.MAX_DEVICE_NAME_LENGTH sidequest_common.schemas.epgp.MAX_ENCOUNTERS sidequest_common.schemas.epgp.MAX_IMPORT_BYTES sidequest_common.schemas.epgp.MAX_LOOT sidequest_common.schemas.epgp.MAX_NAME_LENGTH sidequest_common.schemas.epgp.MAX_NOTE_LENGTH sidequest_common.schemas.epgp.MAX_SESSIONS sidequest_common.schemas.epgp.MIN_GP sidequest_common.schemas.epgp.OS_PERCENT sidequest_common.schemas.epgp.TRIAL_DAYS sidequest_common.schemas.epgp.WEEKLY_RESET_HOUR_UTC sidequest_common.schemas.epgp.WEEKLY_RESET_WEEKDAY Classes ------- .. autoapisummary:: sidequest_common.schemas.epgp.AwardImportCounts sidequest_common.schemas.epgp.AwardReason sidequest_common.schemas.epgp.CharacterSource sidequest_common.schemas.epgp.DeviceAuthorizationPollStatus sidequest_common.schemas.epgp.DeviceAuthorizationStatus sidequest_common.schemas.epgp.EpgpAdjustmentCreate sidequest_common.schemas.epgp.EpgpCharacter sidequest_common.schemas.epgp.EpgpCharacterList sidequest_common.schemas.epgp.EpgpCharacterUpdate sidequest_common.schemas.epgp.EpgpDeviceAuthorizationCreate sidequest_common.schemas.epgp.EpgpDeviceAuthorizationCreated sidequest_common.schemas.epgp.EpgpDeviceAuthorizationPoll sidequest_common.schemas.epgp.EpgpDeviceAuthorizationPollResult sidequest_common.schemas.epgp.EpgpDeviceAuthorizationStatus sidequest_common.schemas.epgp.EpgpGameImport sidequest_common.schemas.epgp.EpgpImportBody sidequest_common.schemas.epgp.EpgpImportResult sidequest_common.schemas.epgp.EpgpLedgerPage sidequest_common.schemas.epgp.EpgpLedgerRow sidequest_common.schemas.epgp.EpgpLootPage sidequest_common.schemas.epgp.EpgpLootRow sidequest_common.schemas.epgp.EpgpProgression sidequest_common.schemas.epgp.EpgpProgressionEncounter sidequest_common.schemas.epgp.EpgpProgressionInstance sidequest_common.schemas.epgp.EpgpRoster sidequest_common.schemas.epgp.EpgpRosterRow sidequest_common.schemas.epgp.EpgpRosterUpdate sidequest_common.schemas.epgp.EpgpRules sidequest_common.schemas.epgp.EpgpStandings sidequest_common.schemas.epgp.EpgpStandingsRow sidequest_common.schemas.epgp.EpgpSyncTokenCreate sidequest_common.schemas.epgp.EpgpSyncTokenCreated sidequest_common.schemas.epgp.EpgpSyncTokenList sidequest_common.schemas.epgp.EpgpSyncTokenMe sidequest_common.schemas.epgp.EpgpSyncTokenSummary sidequest_common.schemas.epgp.ExportAward sidequest_common.schemas.epgp.ExportEncounter sidequest_common.schemas.epgp.ExportLoot sidequest_common.schemas.epgp.ExportPayload sidequest_common.schemas.epgp.ExportSession sidequest_common.schemas.epgp.ExportSessionMember sidequest_common.schemas.epgp.GameImportEvent sidequest_common.schemas.epgp.GameImportPayload sidequest_common.schemas.epgp.GameImportSignup sidequest_common.schemas.epgp.GameImportStandingsRow sidequest_common.schemas.epgp.ImportAttendanceResult sidequest_common.schemas.epgp.ImportCounts sidequest_common.schemas.epgp.LedgerKind sidequest_common.schemas.epgp.LedgerSource sidequest_common.schemas.epgp.LootImportCounts sidequest_common.schemas.epgp.LootResponse sidequest_common.schemas.epgp.MyCharacterCreate sidequest_common.schemas.epgp.RaidStatus Module Contents --------------- .. py:class:: AwardImportCounts Bases: :py:obj:`ImportCounts` ``ImportCounts`` plus rows newly voided by this import. .. py:attribute:: voided :type: int :value: 0 .. py:class:: AwardReason Bases: :py:obj:`enum.StrEnum` Why an EP/GP ledger entry was written. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: ADJUST :value: 'adjust' .. py:attribute:: BOSS_KILL :value: 'boss_kill' .. py:attribute:: FULL_NIGHT :value: 'full_night' .. py:attribute:: LOOT :value: 'loot' .. py:attribute:: ON_TIME :value: 'on_time' .. py:attribute:: PROGRESS :value: 'progress' .. py:attribute:: STANDBY :value: 'standby' .. py:class:: CharacterSource Bases: :py:obj:`enum.StrEnum` How a ``WowCharacter`` got linked to a member. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: CLAIM :value: 'claim' .. py:attribute:: IMPORT :value: 'import' .. py:attribute:: OFFICER :value: 'officer' .. py:attribute:: SIGNUP :value: 'signup' .. py:class:: DeviceAuthorizationPollStatus Bases: :py:obj:`enum.StrEnum` ``status`` on ``POST /api/epgp/device-authorizations/token``. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: APPROVED :value: 'approved' .. py:attribute:: DENIED :value: 'denied' .. py:attribute:: EXPIRED :value: 'expired' .. py:attribute:: PENDING :value: 'pending' .. py:attribute:: SLOW_DOWN :value: 'slow_down' .. py:class:: DeviceAuthorizationStatus Bases: :py:obj:`enum.StrEnum` ``status`` on ``GET /api/epgp/device-authorizations/{user_code}``. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: APPROVED :value: 'approved' .. py:attribute:: DENIED :value: 'denied' .. py:attribute:: EXPIRED :value: 'expired' .. py:attribute:: PENDING :value: 'pending' .. py:class:: EpgpAdjustmentCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/epgp/adjustments`` (officer). .. py:attribute:: amount :type: int .. py:attribute:: kind :type: LedgerKind .. py:attribute:: member_id :type: int .. py:attribute:: reason :type: str .. py:class:: EpgpCharacter Bases: :py:obj:`pydantic.BaseModel` A ``WowCharacter``, as returned by the characters admin screen and ``/api/me/characters``. .. py:attribute:: id :type: uuid.UUID .. py:attribute:: is_main :type: bool .. py:attribute:: last_seen_at :type: datetime.datetime | None .. py:attribute:: member_id :type: int | None .. py:attribute:: member_name :type: str | None .. py:attribute:: model_config .. py:attribute:: name :type: str .. py:attribute:: realm :type: str .. py:attribute:: source :type: CharacterSource .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass | None .. py:class:: EpgpCharacterList Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/characters`` (officer) and ``GET /api/me/characters`` (member). .. py:attribute:: characters :type: list[EpgpCharacter] .. py:class:: EpgpCharacterUpdate Bases: :py:obj:`pydantic.BaseModel` Body for ``PUT /api/epgp/characters/{id}`` (officer). .. py:attribute:: is_main :type: bool .. py:attribute:: member_id :type: int | None .. py:class:: EpgpDeviceAuthorizationCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/epgp/device-authorizations`` (public): the device starting a browser sign-in. .. py:attribute:: device_name :type: str .. py:class:: EpgpDeviceAuthorizationCreated Bases: :py:obj:`pydantic.BaseModel` Response for ``POST /api/epgp/device-authorizations`` (public): poll ``.../token`` with ``device_code``. .. py:attribute:: device_code :type: str .. py:attribute:: expires_in :type: int .. py:attribute:: interval :type: int .. py:attribute:: user_code :type: str .. py:attribute:: verification_uri :type: str .. py:attribute:: verification_uri_complete :type: str .. py:class:: EpgpDeviceAuthorizationPoll Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/epgp/device-authorizations/token`` (public). .. py:attribute:: device_code :type: str .. py:class:: EpgpDeviceAuthorizationPollResult Bases: :py:obj:`pydantic.BaseModel` Response for ``POST /api/epgp/device-authorizations/token`` (public): always 200, never an oracle. ``token``/``name`` are set only once, on the first ``"approved"`` poll; a later poll for the same device code gets ``"expired"``. .. py:attribute:: name :type: str | None :value: None .. py:attribute:: status :type: DeviceAuthorizationPollStatus .. py:attribute:: token :type: str | None :value: None .. py:class:: EpgpDeviceAuthorizationStatus Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/device-authorizations/{user_code}`` (any guild member). .. py:attribute:: created_at :type: datetime.datetime .. py:attribute:: device_name :type: str .. py:attribute:: expires_at :type: datetime.datetime .. py:attribute:: status :type: DeviceAuthorizationStatus .. py:attribute:: user_code :type: str .. py:class:: EpgpGameImport Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/game-import`` (officer). .. py:attribute:: generated_at :type: datetime.datetime .. py:attribute:: payload :type: str .. py:class:: EpgpImportBody Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/epgp/imports``: any text containing one ``SQX1:`` string. .. py:attribute:: payload :type: str .. py:class:: EpgpImportResult Bases: :py:obj:`pydantic.BaseModel` Response for ``POST /api/epgp/imports``. .. py:attribute:: announcements :type: sidequest_common.schemas.guild_hub.AnnouncementImportCounts .. py:attribute:: attendance :type: ImportAttendanceResult .. py:attribute:: awards :type: AwardImportCounts .. py:attribute:: bank :type: sidequest_common.schemas.guild_hub.BankImportCounts .. py:attribute:: conflicts :type: list[str] Session external ids skipped by the one-recorder-per-raid-night conflict rule. .. py:attribute:: encounters :type: ImportCounts .. py:attribute:: loot :type: LootImportCounts .. py:attribute:: member_notes :type: sidequest_common.schemas.guild_hub.MemberNoteImportCounts .. py:attribute:: professions :type: sidequest_common.schemas.guild_hub.ProfessionImportCounts .. py:attribute:: recorder :type: str .. py:attribute:: recruits :type: sidequest_common.schemas.guild_hub.RecruitImportCounts .. py:attribute:: roster :type: sidequest_common.schemas.guild_hub.RosterImportCounts .. py:attribute:: sessions :type: ImportCounts .. py:attribute:: signups :type: sidequest_common.schemas.guild_hub.SignupImportCounts .. py:attribute:: unlinked_characters :type: list[str] .. py:class:: EpgpLedgerPage Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/ledger`` (public), newest first. .. py:attribute:: entries :type: list[EpgpLedgerRow] .. py:class:: EpgpLedgerRow Bases: :py:obj:`pydantic.BaseModel` One row of ``GET /api/epgp/ledger``. .. py:attribute:: amount :type: int .. py:attribute:: at :type: datetime.datetime .. py:attribute:: character :type: str | None .. py:attribute:: decayed :type: float .. py:attribute:: id :type: uuid.UUID .. py:attribute:: item_name :type: str | None .. py:attribute:: kind :type: LedgerKind .. py:attribute:: member_id :type: int | None .. py:attribute:: member_name :type: str | None .. py:attribute:: note :type: str | None .. py:attribute:: officer :type: str .. py:attribute:: reason :type: str .. py:attribute:: voided :type: bool .. py:class:: EpgpLootPage Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/loot`` (public), newest first. .. py:attribute:: items :type: list[EpgpLootRow] .. py:class:: EpgpLootRow Bases: :py:obj:`pydantic.BaseModel` One row of ``GET /api/epgp/loot``. .. py:attribute:: at :type: datetime.datetime .. py:attribute:: character :type: str | None .. py:attribute:: encounter_name :type: str | None .. py:attribute:: gp :type: int .. py:attribute:: id :type: uuid.UUID .. py:attribute:: instance_name :type: str | None .. py:attribute:: item_id :type: int .. py:attribute:: item_name :type: str .. py:attribute:: member_id :type: int | None .. py:attribute:: member_name :type: str | None .. py:attribute:: quality :type: int .. py:attribute:: response :type: LootResponse .. py:attribute:: voided :type: bool .. py:class:: EpgpProgression Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/progression`` (public). .. py:attribute:: instances :type: list[EpgpProgressionInstance] .. py:class:: EpgpProgressionEncounter Bases: :py:obj:`pydantic.BaseModel` One boss's kill/wipe tally on the progression board. .. py:attribute:: encounter_id :type: int .. py:attribute:: first_kill_at :type: datetime.datetime | None .. py:attribute:: kills :type: int .. py:attribute:: last_attempt_at :type: datetime.datetime .. py:attribute:: name :type: str .. py:attribute:: wipes :type: int .. py:class:: EpgpProgressionInstance Bases: :py:obj:`pydantic.BaseModel` One instance's bosses on the progression board. .. py:attribute:: encounters :type: list[EpgpProgressionEncounter] .. py:attribute:: instance_id :type: int .. py:attribute:: name :type: str .. py:attribute:: size :type: int .. py:class:: EpgpRoster Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/roster`` (officer). .. py:attribute:: members :type: list[EpgpRosterRow] .. py:class:: EpgpRosterRow Bases: :py:obj:`pydantic.BaseModel` One row of ``GET /api/epgp/roster`` (officer). .. py:attribute:: member_id :type: int .. py:attribute:: name :type: str .. py:attribute:: raid_status :type: RaidStatus | None .. py:attribute:: trial_started_at :type: datetime.datetime | None .. py:class:: EpgpRosterUpdate Bases: :py:obj:`pydantic.BaseModel` Body for ``PUT /api/epgp/roster/{member_id}`` (officer). Setting ``"trial"`` stamps ``trial_started_at`` now. .. py:attribute:: raid_status :type: RaidStatus | None .. py:class:: EpgpRules Bases: :py:obj:`pydantic.BaseModel` The ``rules`` object as returned by ``GET /api/epgp/standings`` (same shape as the game-import payload). .. py:attribute:: base_gp :type: int .. py:attribute:: chase_multiplier :type: float .. py:attribute:: decay_percent :type: int .. py:attribute:: ep :type: dict[str, int] .. py:attribute:: gp :type: dict[str, int] .. py:attribute:: legendary_gp :type: int .. py:attribute:: min_gp :type: int .. py:attribute:: os_percent :type: int .. py:attribute:: trial_days :type: int .. py:class:: EpgpStandings Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/standings`` (public). .. py:attribute:: generated_at :type: datetime.datetime .. py:attribute:: rows :type: list[EpgpStandingsRow] .. py:attribute:: rules :type: EpgpRules .. py:class:: EpgpStandingsRow Bases: :py:obj:`pydantic.BaseModel` One row of ``GET /api/epgp/standings``. .. py:attribute:: characters :type: list[str] .. py:attribute:: ep :type: float .. py:attribute:: gp :type: float .. py:attribute:: main :type: str | None .. py:attribute:: member_id :type: int | None .. py:attribute:: model_config .. py:attribute:: name :type: str .. py:attribute:: pr :type: float .. py:attribute:: trial :type: bool .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass | None .. py:class:: EpgpSyncTokenCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/epgp/sync-tokens`` (officer). .. py:attribute:: name :type: str .. py:class:: EpgpSyncTokenCreated Bases: :py:obj:`pydantic.BaseModel` Response for ``POST /api/epgp/sync-tokens``: the token shown once, never stored in plaintext. .. py:attribute:: id :type: uuid.UUID .. py:attribute:: name :type: str .. py:attribute:: token :type: str .. py:class:: EpgpSyncTokenList Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/sync-tokens`` (officer). .. py:attribute:: tokens :type: list[EpgpSyncTokenSummary] .. py:class:: EpgpSyncTokenMe Bases: :py:obj:`pydantic.BaseModel` Response for ``GET /api/epgp/sync-tokens/me`` (Bearer only). What the presenting token's owner can see about themselves. ``is_guild_member`` is always ``true``: a token whose owner left the guild gets 403 instead. .. py:attribute:: avatar_url :type: str | None .. py:attribute:: calendar_url :type: str | None .. py:attribute:: display_name :type: str .. py:attribute:: is_guild_member :type: bool .. py:attribute:: is_officer :type: bool .. py:attribute:: token_name :type: str .. py:class:: EpgpSyncTokenSummary Bases: :py:obj:`pydantic.BaseModel` One non-revoked sync token, without the secret (``GET /api/epgp/sync-tokens``, officer, own tokens only). .. py:attribute:: created_at :type: datetime.datetime .. py:attribute:: id :type: uuid.UUID .. py:attribute:: last_used_at :type: datetime.datetime | None .. py:attribute:: name :type: str .. py:class:: ExportAward Bases: :py:obj:`pydantic.BaseModel` One EP/GP ledger entry in the export payload. .. py:attribute:: amount :type: int .. py:attribute:: at :type: int .. py:attribute:: character :type: str .. py:attribute:: id :type: str .. py:attribute:: kind :type: LedgerKind .. py:attribute:: loot_id :type: str | None :value: None .. py:attribute:: note :type: str | None .. py:attribute:: officer :type: str .. py:attribute:: reason :type: AwardReason .. py:attribute:: session_id :type: str | None :value: None .. py:attribute:: voided :type: bool :value: False .. py:class:: ExportEncounter Bases: :py:obj:`pydantic.BaseModel` One boss pull entry in the export payload. ``session_id``/``ended_at`` may be absent (see ``ExportSession``). .. py:attribute:: characters :type: list[str] .. py:attribute:: difficulty_id :type: int .. py:attribute:: encounter_id :type: int .. py:attribute:: ended_at :type: int | None :value: None .. py:attribute:: id :type: str .. py:attribute:: name :type: str .. py:attribute:: session_id :type: str | None :value: None .. py:attribute:: size :type: int .. py:attribute:: standby :type: list[str] .. py:attribute:: started_at :type: int .. py:attribute:: success :type: bool .. py:class:: ExportLoot Bases: :py:obj:`pydantic.BaseModel` One loot award entry in the export payload. .. py:attribute:: at :type: int .. py:attribute:: character :type: str .. py:attribute:: encounter_row_id :type: str | None :value: None .. py:attribute:: gp :type: int .. py:attribute:: id :type: str .. py:attribute:: inv_type :type: str .. py:attribute:: item_id :type: int .. py:attribute:: item_name :type: str .. py:attribute:: officer :type: str .. py:attribute:: quality :type: int .. py:attribute:: response :type: LootResponse .. py:attribute:: session_id :type: str | None :value: None .. py:attribute:: voided :type: bool :value: False .. py:class:: ExportPayload Bases: :py:obj:`pydantic.BaseModel` The full decoded ``SQX1:`` payload, bounded per the contract. ``v: 2`` adds the guild-hub sections below; every v2 section is optional so a ``v: 1`` addon keeps working unchanged. .. py:attribute:: addon_version :type: str .. py:attribute:: announcements :type: list[sidequest_common.schemas.guild_hub.ExportAnnouncement] .. py:attribute:: awards :type: list[ExportAward] .. py:attribute:: bank :type: list[sidequest_common.schemas.guild_hub.ExportBankEntry] .. py:attribute:: encounters :type: list[ExportEncounter] .. py:attribute:: exported_at :type: int .. py:attribute:: guild :type: str .. py:attribute:: loot :type: list[ExportLoot] .. py:attribute:: member_notes :type: list[sidequest_common.schemas.guild_hub.ExportMemberNote] .. py:attribute:: professions :type: list[sidequest_common.schemas.guild_hub.ExportProfession] .. py:attribute:: realm :type: str .. py:attribute:: recorder :type: str .. py:attribute:: recruits :type: list[sidequest_common.schemas.guild_hub.ExportRecruit] .. py:attribute:: roster :type: sidequest_common.schemas.guild_hub.ExportRoster | None :value: None .. py:attribute:: sessions :type: list[ExportSession] .. py:attribute:: signups :type: list[sidequest_common.schemas.guild_hub.ExportSignupV2] .. py:attribute:: v :type: int .. py:class:: ExportSession Bases: :py:obj:`pydantic.BaseModel` One raid session entry in the export payload. Lua json encoders drop nil keys rather than emitting null, so every nullable contract field here is a pydantic default, not a required key: the addon may omit ``event_id``/``ended_at`` entirely (e.g. a session exported before the raid ended) rather than sending them as JSON ``null``. .. py:attribute:: difficulty_id :type: int .. py:attribute:: ended_at :type: int | None :value: None .. py:attribute:: event_id :type: uuid.UUID | None :value: None .. py:attribute:: id :type: str .. py:attribute:: instance_id :type: int .. py:attribute:: instance_name :type: str .. py:attribute:: members :type: list[ExportSessionMember] .. py:attribute:: size :type: int .. py:attribute:: started_at :type: int .. py:class:: ExportSessionMember Bases: :py:obj:`pydantic.BaseModel` One session member entry in the export payload. ``class`` arrives as the addon's uppercase token (e.g. ``"MAGE"``, Blizzard's ``UnitClass`` return), normalized to lowercase before validation. .. py:attribute:: character :type: str .. py:attribute:: first_seen :type: int .. py:attribute:: last_seen :type: int .. py:attribute:: model_config .. py:attribute:: standby :type: bool :value: False .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass | None .. py:class:: GameImportEvent Bases: :py:obj:`pydantic.BaseModel` One upcoming scheduled event in the game-import payload. .. py:attribute:: id :type: uuid.UUID .. py:attribute:: kind :type: sidequest_common.schemas.events.EventKind .. py:attribute:: signups :type: list[GameImportSignup] .. py:attribute:: size :type: int | None .. py:attribute:: starts_at :type: int .. py:attribute:: title :type: str .. py:class:: GameImportPayload Bases: :py:obj:`pydantic.BaseModel` The full ``SQI1:`` payload built by ``GET /api/epgp/game-import``. ``members``/``news`` are the public part (the addon may broadcast them); ``sheets``/``crafters``/ ``recipe_names`` are on-demand (an officer's addon answers members' requests, never broadcasts the whole thing); ``officer`` stays on officers' addons only. All four v2 additions are always present since the endpoint already requires an officer. .. py:attribute:: crafters :type: list[sidequest_common.schemas.guild_hub.GameImportCrafter] .. py:attribute:: events :type: list[GameImportEvent] .. py:attribute:: generated_at :type: int .. py:attribute:: killed_encounters :type: list[int] .. py:attribute:: members :type: list[sidequest_common.schemas.guild_hub.GameImportMember] .. py:attribute:: news :type: list[sidequest_common.schemas.guild_hub.GameImportNews] .. py:attribute:: officer :type: sidequest_common.schemas.guild_hub.GameImportOfficerPart .. py:attribute:: recipe_names :type: dict[str, str] .. py:attribute:: rules :type: dict .. py:attribute:: sheets :type: dict[str, sidequest_common.schemas.guild_hub.GameImportSheet] .. py:attribute:: standings :type: list[GameImportStandingsRow] .. py:attribute:: v :type: int .. py:class:: GameImportSignup Bases: :py:obj:`pydantic.BaseModel` One event sign-up in the game-import payload. ``character`` is the free-text sign-up name, no realm. .. py:attribute:: bench :type: bool .. py:attribute:: character :type: str .. py:attribute:: group :type: int | None .. py:attribute:: model_config .. py:attribute:: role :type: sidequest_common.schemas.events.SignupRole .. py:attribute:: status :type: sidequest_common.schemas.events.SignupStatus .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass .. py:class:: GameImportStandingsRow Bases: :py:obj:`pydantic.BaseModel` One standings row in the game-import payload. .. py:attribute:: characters :type: list[str] .. py:attribute:: ep :type: float .. py:attribute:: gp :type: float .. py:attribute:: main :type: str | None .. py:attribute:: member_id :type: int | None .. py:attribute:: model_config .. py:attribute:: name :type: str .. py:attribute:: pr :type: float .. py:attribute:: trial :type: bool .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass | None .. py:class:: ImportAttendanceResult Bases: :py:obj:`pydantic.BaseModel` What the attendance hand-off did for one import call. .. py:attribute:: event_id :type: uuid.UUID | None .. py:attribute:: marked :type: int :value: 0 .. py:class:: ImportCounts Bases: :py:obj:`pydantic.BaseModel` New vs. updated (re-imported, unchanged ``external_id``) row counts. .. py:attribute:: new :type: int :value: 0 .. py:attribute:: updated :type: int :value: 0 .. py:class:: LedgerKind Bases: :py:obj:`enum.StrEnum` Whether a ledger entry is an EP or GP change. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: EP :value: 'ep' .. py:attribute:: GP :value: 'gp' .. py:class:: LedgerSource Bases: :py:obj:`enum.StrEnum` Where a ledger entry came from: the addon export, or a site-made officer adjustment. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: ADDON :value: 'addon' .. py:attribute:: SITE :value: 'site' .. py:class:: LootImportCounts Bases: :py:obj:`ImportCounts` ``ImportCounts`` plus rows newly voided by this import. .. py:attribute:: voided :type: int :value: 0 .. py:class:: LootResponse Bases: :py:obj:`enum.StrEnum` How a character rolled on an item. Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: ALT :value: 'alt' .. py:attribute:: BANK :value: 'bank' .. py:attribute:: COUNCIL :value: 'council' .. py:attribute:: DE :value: 'de' .. py:attribute:: MS :value: 'ms' .. py:attribute:: OS :value: 'os' .. py:class:: MyCharacterCreate Bases: :py:obj:`pydantic.BaseModel` Body for ``POST /api/me/characters`` (member). 409 if another member already claimed this name-realm. .. py:attribute:: model_config .. py:attribute:: name :type: str .. py:attribute:: realm :type: str | None :value: None .. py:attribute:: wow_class :type: sidequest_common.schemas.events.WowClass | None .. py:class:: RaidStatus Bases: :py:obj:`enum.StrEnum` EPGP roster status, settable by an officer (``PUT /api/epgp/roster/{member_id}``). Initialize self. See help(type(self)) for accurate signature. .. py:attribute:: RAIDER :value: 'raider' .. py:attribute:: TRIAL :value: 'trial' .. py:data:: AWARD_AMOUNT_MAX :value: 1000 .. py:data:: AWARD_AMOUNT_MIN :value: -1000 .. py:data:: BASE_GP :value: 100 .. py:data:: CHASE_MULTIPLIER :value: 1.5 .. py:data:: DECAY_PERCENT :value: 15 Weekly decay applied to EP and GP at every reset, read-time only (``amount * (1 - DECAY_PERCENT/100) ** resets``). .. py:data:: DEFAULT_REALM :value: 'Whitemane' The guild's single WoW: Forever realm, used when a member claims a character without specifying one. .. py:data:: EPGP_RULES :type: dict[str, object] Exact shape of the ``rules`` object in the ``SQI1:`` import string. .. py:data:: EP_VALUES :type: dict[str, int] EP awarded per ``AwardReason``. ``standby`` earns the same as the raid (``on_time``/``full_night``/boss kills). .. py:data:: GP_BY_INVTYPE :type: dict[str, int] GP by ``INVTYPE_*`` at main-spec cost. A 1H "main caster weapon" uses the 2H cost (200) by officer toggle; tier tokens use the cost of the slot the officer picks; chase items are ``slot cost * CHASE_MULTIPLIER``; legendary pieces are flat ``LEGENDARY_GP``. None of those three cases key off ``inv_type`` alone, so they aren't in this map. .. py:data:: LEGENDARY_GP :value: 300 .. py:data:: MAX_AWARDS :value: 20000 .. py:data:: MAX_DEVICE_NAME_LENGTH :value: 60 Cap on ``EpgpDeviceAuthorizationCreate.device_name``, trimmed; also the sync token name length it feeds into. .. py:data:: MAX_ENCOUNTERS :value: 500 .. py:data:: MAX_IMPORT_BYTES :value: 2097152 .. py:data:: MAX_LOOT :value: 1000 .. py:data:: MAX_NAME_LENGTH :value: 64 .. py:data:: MAX_NOTE_LENGTH :value: 200 .. py:data:: MAX_SESSIONS :value: 50 .. py:data:: MIN_GP :value: 100 .. py:data:: OS_PERCENT :value: 10 Off-spec pays this percent of main-spec GP, rounded half up. Alt fill and disenchant/bank pay 0. .. py:data:: TRIAL_DAYS :value: 14 .. py:data:: WEEKLY_RESET_HOUR_UTC :value: 15 .. py:data:: WEEKLY_RESET_WEEKDAY :value: 1 ``datetime.weekday()`` value for Tuesday.