# Models Every data shape the website's API sends or accepts, generated from the OpenAPI schema's `components/schemas`. Operation pages link to these entries instead of repeating field tables. (model-activityack)= ## `ActivityAck` | Field | Type | Required | Description | |---|---|---|---| | `ids` | array of string (uuid) | yes | | (model-addoncreate)= ## `AddonCreate` | Field | Type | Required | Description | |---|---|---|---| | `slug` | string | yes | | | `name` | string | yes | | | `summary` | string | yes | | | `version` | string | yes | | | `download_url` | string | yes | | | `homepage_url` | string \| null | no | | | `origin` | {ref}`AddonOrigin ` | no | | (model-addonorigin)= ## `AddonOrigin` Who made the addon: the guild itself, or a community addon it recommends. Type: string (model-addonschema)= ## `AddonSchema` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `slug` | string | yes | | | `name` | string | yes | | | `summary` | string | yes | | | `version` | string | yes | | | `download_url` | string | yes | | | `homepage_url` | string \| null | yes | | | `origin` | {ref}`AddonOrigin ` | no | | | `updated_at` | string (date-time) | yes | | (model-addonupdate)= ## `AddonUpdate` | Field | Type | Required | Description | |---|---|---|---| | `name` | string \| null | no | | | `summary` | string \| null | no | | | `version` | string \| null | no | | | `download_url` | string \| null | no | | | `homepage_url` | string \| null | no | | | `origin` | {ref}`AddonOrigin ` \| null | no | | (model-announcementimportcounts)= ## `AnnouncementImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | (model-announcementposted)= ## `AnnouncementPosted` | Field | Type | Required | Description | |---|---|---|---| | `message_id` | integer | yes | | (model-announcementpostedresult)= ## `AnnouncementPostedResult` | Field | Type | Required | Description | |---|---|---|---| | `message_id` | integer | yes | | (model-announcementsource)= ## `AnnouncementSource` Where an announcement was made. Type: string (model-attendancedetail)= ## `AttendanceDetail` | Field | Type | Required | Description | |---|---|---|---| | `event` | {ref}`AttendanceEventSummary ` | yes | | | `signups` | array of {ref}`AttendanceSignup ` | yes | | | `walk_in_candidates` | array of {ref}`WalkInCandidate ` | yes | | (model-attendanceeventsummary)= ## `AttendanceEventSummary` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `title` | string | yes | | | `kind` | {ref}`EventKind ` | yes | | | `starts_at` | string (date-time) | yes | | | `status` | {ref}`EventStatus ` | yes | | | `attendance_taken_at` | string (date-time) \| null | yes | | | `needs_attendance` | boolean | yes | | (model-attendancemark)= ## `AttendanceMark` | Field | Type | Required | Description | |---|---|---|---| | `entries` | array of {ref}`AttendanceMarkEntry ` | no | | | `walk_ins` | array of {ref}`WalkInCreate ` | no | | (model-attendancemarkentry)= ## `AttendanceMarkEntry` | Field | Type | Required | Description | |---|---|---|---| | `signup_id` | string (uuid) | yes | | | `attended` | boolean | yes | | (model-attendancerange)= ## `AttendanceRange` A reporting window for ``GET /api/attendance/report`` and ``/trends``. Type: string (model-attendancereport)= ## `AttendanceReport` | Field | Type | Required | Description | |---|---|---|---| | `range` | {ref}`AttendanceRange ` | yes | | | `raids_only` | boolean | yes | | | `rows` | array of {ref}`MemberAttendanceRow ` | yes | | (model-attendancesignup)= ## `AttendanceSignup` | Field | Type | Required | Description | |---|---|---|---| | `signup_id` | string (uuid) | yes | | | `member_id` | integer | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `character` | string \| null | yes | | | `class` | {ref}`WowClass ` \| null | yes | | | `role` | {ref}`SignupRole ` \| null | yes | | | `status` | {ref}`SignupStatus ` | yes | | | `attended` | boolean \| null | yes | | | `is_walk_in` | boolean | yes | | | `voice_minutes` | integer | yes | | | `suggested_attended` | boolean | yes | | (model-attendancetrendpoint)= ## `AttendanceTrendPoint` | Field | Type | Required | Description | |---|---|---|---| | `week_start` | string (date) | yes | | | `attendees` | integer | yes | | | `signed_up` | integer | yes | | | `show_rate` | number | yes | | (model-attendancetrends)= ## `AttendanceTrends` | Field | Type | Required | Description | |---|---|---|---| | `range` | {ref}`AttendanceRange ` | yes | | | `raids_only` | boolean | yes | | | `points` | array of {ref}`AttendanceTrendPoint ` | yes | | (model-awardimportcounts)= ## `AwardImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | | `updated` | integer | no | | | `voided` | integer | no | | (model-awaynowreport)= ## `AwayNowReport` | Field | Type | Required | Description | |---|---|---|---| | `discord_ids` | array of integer | yes | | (model-awayrangein)= ## `AwayRangeIn` | Field | Type | Required | Description | |---|---|---|---| | `start_date` | string (date) | yes | | | `end_date` | string (date) | yes | | | `note` | string \| null | no | | (model-awayrangeschema)= ## `AwayRangeSchema` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `start_date` | string (date) | yes | | | `end_date` | string (date) | yes | | | `note` | string \| null | yes | | (model-badgeack)= ## `BadgeAck` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | integer | yes | | | `badge_id` | string | yes | | (model-badgerolestate)= ## `BadgeRoleState` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | integer | yes | | | `badge_ids` | array of string | yes | | (model-badgesyncreport)= ## `BadgeSyncReport` | Field | Type | Required | Description | |---|---|---|---| | `role_state` | array of {ref}`BadgeRoleState ` | yes | | | `pending` | array of {ref}`PendingBadgeAnnouncement ` | yes | | (model-bankimportcounts)= ## `BankImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | (model-bankkind)= ## `BankKind` What kind of guild bank activity log row this is. Type: string (model-calendarlink)= ## `CalendarLink` | Field | Type | Required | Description | |---|---|---|---| | `token` | string | yes | | | `url` | string | yes | | (model-caseaction)= ## `CaseAction` Kinds of moderation action recorded as cases. Type: string (model-charactersource)= ## `CharacterSource` How a ``WowCharacter`` got linked to a member. Type: string (model-chartupdate)= ## `ChartUpdate` | Field | Type | Required | Description | |---|---|---|---| | `group` | integer \| null | no | | | `bench` | boolean \| null | no | | (model-confirmbydiscordrequest)= ## `ConfirmByDiscordRequest` | Field | Type | Required | Description | |---|---|---|---| | `actor_discord_id` | string | yes | | | `actor_name` | string | yes | | (model-discordeventpush)= ## `DiscordEventPush` | Field | Type | Required | Description | |---|---|---|---| | `event_id` | string (uuid) | yes | | | `discord_event_id` | integer \| null | yes | | | `thread_id` | integer \| null | no | The event's forum thread, if one has been created. | | `kind` | {ref}`EventKind ` | yes | | | `counts` | {ref}`EventCounts ` | no | Current headcounts, for the forum starter post's live counts line. | | `action` | string | yes | | | `name` | string | yes | | | `title` | string | yes | Full, untruncated title (``name`` is Discord's 100-char-limited version). | | `description` | string | yes | | | `location` | string | yes | Used for external events; voice/stage events keep theirs. | | `starts_at` | string (date-time) | yes | | | `ends_at` | string (date-time) | yes | Discord requires an end for external events. | | `signup_url` | string | yes | | | `push_hash` | string | yes | | (model-discordeventreconcile)= ## `DiscordEventReconcile` | Field | Type | Required | Description | |---|---|---|---| | `events` | array of {ref}`DiscordEventState ` | yes | | (model-discordeventstate)= ## `DiscordEventState` | Field | Type | Required | Description | |---|---|---|---| | `id` | integer | yes | | | `name` | string | yes | | | `description` | string \| null | no | | | `starts_at` | string (date-time) | yes | | | `ends_at` | string (date-time) \| null | no | | | `status` | {ref}`DiscordEventStatus ` | yes | | | `location` | string \| null | no | External events only. | | `channel_id` | integer \| null | no | Voice/stage events only. | (model-discordeventstatus)= ## `DiscordEventStatus` A Discord scheduled event's status, named the way Discord's ``EventStatus`` is. Type: string (model-discordinterest)= ## `DiscordInterest` | Field | Type | Required | Description | |---|---|---|---| | `count` | integer | yes | | | `members` | array of {ref}`SignupMember ` | yes | | (model-discordinterestreport)= ## `DiscordInterestReport` | Field | Type | Required | Description | |---|---|---|---| | `user_ids` | array of integer | yes | | (model-discordlive)= ## `DiscordLive` | Field | Type | Required | Description | |---|---|---|---| | `online` | integer \| null | yes | | | `members` | integer \| null | yes | | | `voice` | array of {ref}`VoiceChannelCount ` | yes | | | `reported_at` | string (date-time) \| null | yes | | (model-discordlivereport)= ## `DiscordLiveReport` | Field | Type | Required | Description | |---|---|---|---| | `online` | integer \| null | no | | | `members` | integer \| null | no | | | `voice` | array of {ref}`VoiceChannelCount ` | yes | | (model-discordonline)= ## `DiscordOnline` | Field | Type | Required | Description | |---|---|---|---| | `presence_count` | integer \| null | yes | | | `members` | array of {ref}`DiscordOnlineMember ` | yes | | | `ok` | boolean | yes | | (model-discordonlinemember)= ## `DiscordOnlineMember` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | | `status` | string | yes | | | `avatar_url` | string \| null | yes | | | `activity` | string \| null | yes | | (model-discordpushack)= ## `DiscordPushAck` | Field | Type | Required | Description | |---|---|---|---| | `push_hash` | string | yes | | | `event` | {ref}`DiscordEventState ` \| null | yes | | | `thread_id` | integer \| null | no | | (model-discordsyncpending)= ## `DiscordSyncPending` | Field | Type | Required | Description | |---|---|---|---| | `pushes` | array of {ref}`DiscordEventPush ` | yes | | | `deletions` | array of integer | yes | Discord event ids whose guild event was deleted on the site. | | `activity` | array of {ref}`SignupActivity ` | no | Unposted sign-up activity for events with a Discord thread, oldest first. | (model-earnedbadge)= ## `EarnedBadge` | Field | Type | Required | Description | |---|---|---|---| | `id` | string | yes | | | `name` | string | yes | | | `description` | string | yes | | | `icon` | string | yes | | | `earned_at` | string (date-time) | yes | | (model-epgpadjustmentcreate)= ## `EpgpAdjustmentCreate` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `kind` | {ref}`LedgerKind ` | yes | | | `amount` | integer | yes | | | `reason` | string | yes | | (model-epgpcharacter)= ## `EpgpCharacter` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `name` | string | yes | | | `realm` | string | yes | | | `class` | {ref}`WowClass ` \| null | yes | | | `member_id` | integer \| null | yes | | | `member_name` | string \| null | yes | | | `is_main` | boolean | yes | | | `source` | {ref}`CharacterSource ` | yes | | | `last_seen_at` | string (date-time) \| null | yes | | (model-epgpcharacterlist)= ## `EpgpCharacterList` | Field | Type | Required | Description | |---|---|---|---| | `characters` | array of {ref}`EpgpCharacter ` | yes | | (model-epgpcharacterupdate)= ## `EpgpCharacterUpdate` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer \| null | yes | | | `is_main` | boolean | yes | | (model-epgpgameimport)= ## `EpgpGameImport` | Field | Type | Required | Description | |---|---|---|---| | `payload` | string | yes | | | `generated_at` | string (date-time) | yes | | (model-epgpimportbody)= ## `EpgpImportBody` | Field | Type | Required | Description | |---|---|---|---| | `payload` | string | yes | | (model-epgpimportresult)= ## `EpgpImportResult` | Field | Type | Required | Description | |---|---|---|---| | `recorder` | string | yes | | | `sessions` | {ref}`ImportCounts ` | yes | | | `encounters` | {ref}`ImportCounts ` | yes | | | `loot` | {ref}`LootImportCounts ` | yes | | | `awards` | {ref}`AwardImportCounts ` | yes | | | `unlinked_characters` | array of string | no | | | `attendance` | {ref}`ImportAttendanceResult ` | yes | | | `conflicts` | array of string | no | | | `roster` | {ref}`RosterImportCounts ` | no | | | `professions` | {ref}`ProfessionImportCounts ` | no | | | `signups` | {ref}`SignupImportCounts ` | no | | | `bank` | {ref}`BankImportCounts ` | no | | | `announcements` | {ref}`AnnouncementImportCounts ` | no | | | `recruits` | {ref}`RecruitImportCounts ` | no | | | `member_notes` | {ref}`MemberNoteImportCounts ` | no | | (model-epgpledgerpage)= ## `EpgpLedgerPage` | Field | Type | Required | Description | |---|---|---|---| | `entries` | array of {ref}`EpgpLedgerRow ` | yes | | (model-epgpledgerrow)= ## `EpgpLedgerRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `at` | string (date-time) | yes | | | `kind` | {ref}`LedgerKind ` | yes | | | `amount` | integer | yes | | | `decayed` | number | yes | | | `reason` | string | yes | | | `note` | string \| null | yes | | | `character` | string \| null | yes | | | `member_id` | integer \| null | yes | | | `member_name` | string \| null | yes | | | `officer` | string | yes | | | `item_name` | string \| null | yes | | | `voided` | boolean | yes | | (model-epgplootpage)= ## `EpgpLootPage` | Field | Type | Required | Description | |---|---|---|---| | `items` | array of {ref}`EpgpLootRow ` | yes | | (model-epgplootrow)= ## `EpgpLootRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `at` | string (date-time) | yes | | | `item_id` | integer | yes | | | `item_name` | string | yes | | | `quality` | integer | yes | | | `character` | string \| null | yes | | | `member_id` | integer \| null | yes | | | `member_name` | string \| null | yes | | | `response` | {ref}`LootResponse ` | yes | | | `gp` | integer | yes | | | `instance_name` | string \| null | yes | | | `encounter_name` | string \| null | yes | | | `voided` | boolean | yes | | (model-epgpmembernotelist)= ## `EpgpMemberNoteList` | Field | Type | Required | Description | |---|---|---|---| | `notes` | array of {ref}`EpgpMemberNoteRow ` | yes | | (model-epgpmembernoterow)= ## `EpgpMemberNoteRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `character` | string | yes | | | `member_id` | integer \| null | yes | | | `note` | string | yes | | | `officer` | string | yes | | | `at` | string (date-time) | yes | | | `voided` | boolean | yes | | (model-epgpprogression)= ## `EpgpProgression` | Field | Type | Required | Description | |---|---|---|---| | `instances` | array of {ref}`EpgpProgressionInstance ` | yes | | (model-epgpprogressionencounter)= ## `EpgpProgressionEncounter` | Field | Type | Required | Description | |---|---|---|---| | `encounter_id` | integer | yes | | | `name` | string | yes | | | `first_kill_at` | string (date-time) \| null | yes | | | `kills` | integer | yes | | | `wipes` | integer | yes | | | `last_attempt_at` | string (date-time) | yes | | (model-epgpprogressioninstance)= ## `EpgpProgressionInstance` | Field | Type | Required | Description | |---|---|---|---| | `instance_id` | integer | yes | | | `name` | string | yes | | | `size` | integer | yes | | | `encounters` | array of {ref}`EpgpProgressionEncounter ` | yes | | (model-epgprecruitlist)= ## `EpgpRecruitList` | Field | Type | Required | Description | |---|---|---|---| | `recruits` | array of {ref}`EpgpRecruitRow ` | yes | | (model-epgprecruitrow)= ## `EpgpRecruitRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `character` | string | yes | | | `class` | {ref}`WowClass ` \| null | no | | | `status` | {ref}`RecruitStatus ` | yes | | | `note` | string \| null | yes | | | `checklist` | {ref}`RecruitChecklist ` | yes | | | `votes` | array of {ref}`ExportRecruitVote ` | yes | | | `member_id` | integer \| null | yes | | | `at` | string (date-time) | yes | | (model-epgprecruitupdate)= ## `EpgpRecruitUpdate` | Field | Type | Required | Description | |---|---|---|---| | `status` | {ref}`RecruitStatus ` \| null | no | | | `note` | string \| null | no | | | `checklist` | {ref}`RecruitChecklist ` \| null | no | | (model-epgprecruitvotecreate)= ## `EpgpRecruitVoteCreate` | Field | Type | Required | Description | |---|---|---|---| | `vote` | {ref}`RecruitVoteChoice ` | yes | | (model-epgproster)= ## `EpgpRoster` | Field | Type | Required | Description | |---|---|---|---| | `members` | array of {ref}`EpgpRosterRow ` | yes | | (model-epgprosterrow)= ## `EpgpRosterRow` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `name` | string | yes | | | `raid_status` | {ref}`RaidStatus ` \| null | yes | | | `trial_started_at` | string (date-time) \| null | yes | | (model-epgprosterupdate)= ## `EpgpRosterUpdate` | Field | Type | Required | Description | |---|---|---|---| | `raid_status` | {ref}`RaidStatus ` \| null | yes | | (model-epgprules)= ## `EpgpRules` | Field | Type | Required | Description | |---|---|---|---| | `ep` | object | yes | | | `gp` | object | yes | | | `chase_multiplier` | number | yes | | | `legendary_gp` | integer | yes | | | `os_percent` | integer | yes | | | `base_gp` | integer | yes | | | `min_gp` | integer | yes | | | `decay_percent` | integer | yes | | | `trial_days` | integer | yes | | (model-epgpstandings)= ## `EpgpStandings` | Field | Type | Required | Description | |---|---|---|---| | `generated_at` | string (date-time) | yes | | | `rules` | {ref}`EpgpRules ` | yes | | | `rows` | array of {ref}`EpgpStandingsRow ` | yes | | (model-epgpstandingsrow)= ## `EpgpStandingsRow` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer \| null | yes | | | `name` | string | yes | | | `main` | string \| null | yes | | | `class` | {ref}`WowClass ` \| null | yes | | | `characters` | array of string | yes | | | `ep` | number | yes | | | `gp` | number | yes | | | `pr` | number | yes | | | `trial` | boolean | yes | | (model-epgpsynctokencreate)= ## `EpgpSyncTokenCreate` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | (model-epgpsynctokencreated)= ## `EpgpSyncTokenCreated` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `name` | string | yes | | | `token` | string | yes | | (model-epgpsynctokenlist)= ## `EpgpSyncTokenList` | Field | Type | Required | Description | |---|---|---|---| | `tokens` | array of {ref}`EpgpSyncTokenSummary ` | yes | | (model-epgpsynctokensummary)= ## `EpgpSyncTokenSummary` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `name` | string | yes | | | `created_at` | string (date-time) | yes | | | `last_used_at` | string (date-time) \| null | yes | | (model-eventcounts)= ## `EventCounts` Current headcounts, for the forum starter post's live counts line. | Field | Type | Required | Description | |---|---|---|---| | `tank` | integer | yes | | | `healer` | integer | yes | | | `dps` | integer | yes | | | `signed` | integer | yes | | | `tentative` | integer | yes | | | `absent` | integer | yes | | | `interested` | integer | yes | | (model-eventcreate)= ## `EventCreate` | Field | Type | Required | Description | |---|---|---|---| | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `location` | string | no | | | `starts_at` | string (date-time) | yes | | | `ends_at` | string (date-time) \| null | no | | | `size` | integer \| null | no | | | `ep_override` | integer \| null | no | | | `notes` | string \| null | no | | (model-eventdetail)= ## `EventDetail` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `location` | string | yes | | | `starts_at` | string (date-time) | yes | | | `ends_at` | string (date-time) \| null | yes | | | `size` | integer \| null | yes | | | `ep` | integer | yes | | | `ep_override` | integer \| null | yes | | | `status` | {ref}`EventStatus ` | yes | | | `notes` | string \| null | yes | | | `counts` | {ref}`EventCounts ` \| null | yes | | | `series` | {ref}`SeriesRef ` \| null | yes | | | `signups` | array of {ref}`Signup ` | yes | | | `my_signup` | {ref}`Signup ` \| null | yes | | | `discord_interest` | {ref}`DiscordInterest ` \| null | yes | | | `away` | array of {ref}`SignupMember ` \| null | yes | | (model-eventkind)= ## `EventKind` What kind of guild event this is. ``raid``/``dungeon`` are "role kinds": sign-ups need character/class/role. Type: string (model-eventseriescreate)= ## `EventSeriesCreate` | Field | Type | Required | Description | |---|---|---|---| | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `location` | string | no | | | `size` | integer \| null | no | | | `ep_override` | integer \| null | no | | | `notes` | string \| null | no | | | `weekdays` | array of integer | yes | | | `interval_weeks` | integer | no | | | `start_time` | string | yes | | | `timezone` | string | yes | | | `duration_minutes` | integer \| null | no | | | `starts_on` | string (date) | yes | | | `until` | string (date) \| null | no | | (model-eventseriessummary)= ## `EventSeriesSummary` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `location` | string | yes | | | `size` | integer \| null | yes | | | `ep` | integer | yes | | | `ep_override` | integer \| null | yes | | | `notes` | string \| null | yes | | | `rule` | {ref}`SeriesRule ` | yes | | | `active` | boolean | yes | | | `next_starts_at` | string (date-time) \| null | yes | | (model-eventseriesupdate)= ## `EventSeriesUpdate` | Field | Type | Required | Description | |---|---|---|---| | `kind` | {ref}`EventKind ` \| null | no | | | `title` | string \| null | no | | | `location` | string \| null | no | | | `size` | integer \| null | no | | | `ep_override` | integer \| null | no | | | `notes` | string \| null | no | | | `weekdays` | array of integer \| null | no | | | `interval_weeks` | integer \| null | no | | | `start_time` | string \| null | no | | | `timezone` | string \| null | no | | | `duration_minutes` | integer \| null | no | | | `starts_on` | string (date) \| null | no | | | `until` | string (date) \| null | no | | (model-eventstatus)= ## `EventStatus` Lifecycle of a scheduled guild event. Type: string (model-eventsummary)= ## `EventSummary` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `location` | string | yes | | | `starts_at` | string (date-time) | yes | | | `ends_at` | string (date-time) \| null | yes | | | `size` | integer \| null | yes | | | `ep` | integer | yes | | | `ep_override` | integer \| null | yes | | | `status` | {ref}`EventStatus ` | yes | | | `notes` | string \| null | yes | | | `counts` | {ref}`EventCounts ` \| null | yes | | | `series` | {ref}`SeriesRef ` \| null | yes | | (model-eventupdate)= ## `EventUpdate` | Field | Type | Required | Description | |---|---|---|---| | `kind` | {ref}`EventKind ` \| null | no | | | `title` | string \| null | no | | | `location` | string \| null | no | | | `starts_at` | string (date-time) \| null | no | | | `ends_at` | string (date-time) \| null | no | | | `size` | integer \| null | no | | | `ep_override` | integer \| null | no | | | `notes` | string \| null | no | | | `status` | {ref}`EventStatus ` \| null | no | | (model-exportrecruitvote)= ## `ExportRecruitVote` | Field | Type | Required | Description | |---|---|---|---| | `officer` | string | yes | | | `vote` | {ref}`RecruitVoteChoice ` | yes | | | `at` | integer | yes | | (model-gmcase)= ## `GmCase` | Field | Type | Required | Description | |---|---|---|---| | `case_number` | integer | yes | | | `action` | string | yes | | | `user_id` | string | yes | | | `user_name` | string \| null | yes | | | `moderator_id` | string | yes | | | `moderator_name` | string \| null | yes | | | `reason` | string \| null | yes | | | `duration_seconds` | integer \| null | yes | | | `created_at` | string (date-time) | yes | | (model-gmcasereasonupdate)= ## `GmCaseReasonUpdate` | Field | Type | Required | Description | |---|---|---|---| | `reason` | string | yes | | (model-gmmember)= ## `GmMember` | Field | Type | Required | Description | |---|---|---|---| | `id` | integer | yes | | | `discord_id` | string | yes | | | `username` | string | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `roles` | array of {ref}`RoleTag ` | yes | | | `is_guild_member` | boolean | yes | | | `is_officer` | boolean | yes | | | `is_gm` | boolean | yes | | | `roster_confirmed_at` | string (date-time) \| null | yes | | | `battletag` | string \| null | yes | | | `battlenet_linked_at` | string (date-time) \| null | yes | | | `first_seen_at` | string (date-time) | yes | | | `last_login_at` | string (date-time) \| null | yes | | | `signup_count` | integer | yes | | | `case_count` | integer | yes | | | `level` | integer \| null | yes | | (model-gmmemberdetail)= ## `GmMemberDetail` | Field | Type | Required | Description | |---|---|---|---| | `member` | {ref}`GmMember ` | yes | | | `signups` | array of {ref}`GmSignup ` | yes | | | `cases` | array of {ref}`GmCase ` | yes | | | `xp` | integer \| null | yes | | | `message_count` | integer \| null | yes | | (model-gmsignup)= ## `GmSignup` | Field | Type | Required | Description | |---|---|---|---| | `event_id` | string (uuid) | yes | | | `title` | string | yes | | | `kind` | string | yes | | | `starts_at` | string (date-time) | yes | | | `event_status` | string | yes | | | `status` | string | yes | | | `character` | string \| null | yes | | | `class` | string \| null | yes | | | `role` | string \| null | yes | | | `comment` | string \| null | yes | | (model-guildannouncementcreate)= ## `GuildAnnouncementCreate` | Field | Type | Required | Description | |---|---|---|---| | `text` | string | yes | | | `discord` | boolean | no | | (model-guildannouncementrow)= ## `GuildAnnouncementRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `text` | string | yes | | | `author` | string | yes | | | `at` | string (date-time) | yes | | | `source` | {ref}`AnnouncementSource ` | yes | | | `posted_at` | string (date-time) \| null | yes | | (model-guildannouncementspage)= ## `GuildAnnouncementsPage` | Field | Type | Required | Description | |---|---|---|---| | `items` | array of {ref}`GuildAnnouncementRow ` | yes | | (model-guildbankpage)= ## `GuildBankPage` | Field | Type | Required | Description | |---|---|---|---| | `rows` | array of {ref}`GuildBankRow ` | yes | | | `totals` | {ref}`GuildBankTotals ` | yes | | (model-guildbankrow)= ## `GuildBankRow` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `at` | string (date-time) | yes | | | `character` | string \| null | yes | | | `member_name` | string \| null | yes | | | `kind` | {ref}`BankKind ` | yes | | | `item_id` | integer \| null | yes | | | `item_name` | string \| null | yes | | | `count` | integer | yes | | | `money` | integer | yes | | | `tab` | integer \| null | yes | | (model-guildbanktotals)= ## `GuildBankTotals` | Field | Type | Required | Description | |---|---|---|---| | `deposits_30d` | integer | yes | | | `withdrawals_30d` | integer | yes | | (model-guildconfigschema)= ## `GuildConfigSchema` | Field | Type | Required | Description | |---|---|---|---| | `guild_id` | integer | yes | | | `log_channel_id` | integer \| null | yes | | | `welcome_channel_id` | integer \| null | yes | | | `welcome_message` | string | yes | | | `auto_role_id` | integer \| null | yes | | | `linked_role_id` | integer \| null | no | | | `battlenet_role_id` | integer \| null | no | | | `gate_role_id` | integer \| null | no | | | `roster_role_id` | integer \| null | no | | | `events_forum_channel_id` | integer \| null | no | | | `leveling_enabled` | boolean | yes | | | `level_up_channel_id` | integer \| null | yes | | | `level_up_message` | string | yes | | | `xp_min` | integer | yes | | | `xp_max` | integer | yes | | | `xp_cooldown_seconds` | integer | yes | | | `level_roles_stack` | boolean | yes | | | `no_xp_channel_ids` | array of integer | yes | | | `no_xp_role_ids` | array of integer | yes | | | `automod_enabled` | boolean | yes | | | `automod_block_invites` | boolean | yes | | | `automod_block_links` | boolean | yes | | | `automod_max_mentions` | integer | yes | | | `automod_spam_messages` | integer | yes | | | `automod_spam_seconds` | integer | yes | | | `automod_timeout_seconds` | integer | yes | | | `automod_exempt_role_ids` | array of integer | yes | | | `automod_exempt_channel_ids` | array of integer | yes | | | `signup_notice_channel_id` | integer \| null | no | | | `weekly_board_channel_id` | integer \| null | no | | | `weekly_board_last_week` | string \| null | no | | | `away_role_id` | integer \| null | no | | | `badge_channel_id` | integer \| null | no | | | `badge_role_ids` | object | no | | | `announcement_channel_id` | integer \| null | no | | | `forever_feed_channel_id` | integer \| null | no | | (model-guildconfigupdate)= ## `GuildConfigUpdate` | Field | Type | Required | Description | |---|---|---|---| | `log_channel_id` | integer \| null | no | | | `welcome_channel_id` | integer \| null | no | | | `welcome_message` | string \| null | no | | | `auto_role_id` | integer \| null | no | | | `linked_role_id` | integer \| null | no | | | `battlenet_role_id` | integer \| null | no | | | `gate_role_id` | integer \| null | no | | | `roster_role_id` | integer \| null | no | | | `events_forum_channel_id` | integer \| null | no | | | `leveling_enabled` | boolean \| null | no | | | `level_up_channel_id` | integer \| null | no | | | `level_up_message` | string \| null | no | | | `xp_min` | integer \| null | no | | | `xp_max` | integer \| null | no | | | `xp_cooldown_seconds` | integer \| null | no | | | `level_roles_stack` | boolean \| null | no | | | `no_xp_channel_ids` | array of integer \| null | no | | | `no_xp_role_ids` | array of integer \| null | no | | | `automod_enabled` | boolean \| null | no | | | `automod_block_invites` | boolean \| null | no | | | `automod_block_links` | boolean \| null | no | | | `automod_max_mentions` | integer \| null | no | | | `automod_spam_messages` | integer \| null | no | | | `automod_spam_seconds` | integer \| null | no | | | `automod_timeout_seconds` | integer \| null | no | | | `automod_exempt_role_ids` | array of integer \| null | no | | | `automod_exempt_channel_ids` | array of integer \| null | no | | | `signup_notice_channel_id` | integer \| null | no | | | `weekly_board_channel_id` | integer \| null | no | | | `weekly_board_last_week` | string \| null | no | | | `away_role_id` | integer \| null | no | | | `badge_channel_id` | integer \| null | no | | | `badge_role_ids` | object \| null | no | | | `announcement_channel_id` | integer \| null | no | | | `forever_feed_channel_id` | integer \| null | no | | (model-guildcrafterprofessioncount)= ## `GuildCrafterProfessionCount` | Field | Type | Required | Description | |---|---|---|---| | `profession` | string | yes | | | `crafters` | integer | yes | | (model-guildcrafterresult)= ## `GuildCrafterResult` | Field | Type | Required | Description | |---|---|---|---| | `recipe_id` | integer | yes | | | `recipe_name` | string | yes | | | `item_id` | integer \| null | yes | | | `crafters` | array of {ref}`GuildCrafterRow ` | yes | | (model-guildcrafterrow)= ## `GuildCrafterRow` | Field | Type | Required | Description | |---|---|---|---| | `character` | string | yes | | | `member_id` | integer \| null | yes | | | `member_name` | string \| null | yes | | | `profession` | string | yes | | | `skill` | integer | yes | | (model-guildcrafters)= ## `GuildCrafters` | Field | Type | Required | Description | |---|---|---|---| | `results` | array of {ref}`GuildCrafterResult ` | yes | | | `professions` | array of {ref}`GuildCrafterProfessionCount ` | yes | | (model-guildnewsitem)= ## `GuildNewsItem` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `at` | string (date-time) | yes | | | `kind` | {ref}`NewsKind ` | yes | | | `text` | string | yes | | | `character` | string \| null | yes | | | `item_id` | integer \| null | yes | | | `quality` | integer \| null | yes | | (model-guildnewspage)= ## `GuildNewsPage` | Field | Type | Required | Description | |---|---|---|---| | `items` | array of {ref}`GuildNewsItem ` | yes | | (model-guildrolein)= ## `GuildRoleIn` | Field | Type | Required | Description | |---|---|---|---| | `id` | integer | yes | | | `name` | string | yes | | | `color` | integer | yes | | | `position` | integer | yes | | | `managed` | boolean | yes | | (model-guildrolesreplace)= ## `GuildRolesReplace` | Field | Type | Required | Description | |---|---|---|---| | `roles` | array of {ref}`GuildRoleIn ` | yes | | (model-guildroster)= ## `GuildRoster` | Field | Type | Required | Description | |---|---|---|---| | `taken_at` | string (date-time) \| null | yes | | | `members` | array of {ref}`GuildRosterMember ` | yes | | | `unlinked` | array of {ref}`GuildRosterUnlinked ` | yes | | (model-guildrostercharacter)= ## `GuildRosterCharacter` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | | `class` | {ref}`WowClass ` \| null | no | | | `level` | integer | yes | | | `zone` | string | yes | | | `last_seen_at` | string (date-time) | yes | | | `is_main` | boolean | yes | | (model-guildrostermember)= ## `GuildRosterMember` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `name` | string | yes | | | `rank` | string \| null | yes | | | `raid_status` | string \| null | yes | | | `main` | string \| null | yes | | | `characters` | array of {ref}`GuildRosterCharacter ` | yes | | (model-guildrosterunlinked)= ## `GuildRosterUnlinked` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | | `class` | {ref}`WowClass ` \| null | no | | | `level` | integer | yes | | | `rank` | string | yes | | | `last_seen_at` | string (date-time) | yes | | (model-heroleaderboard)= ## `HeroLeaderboard` | Field | Type | Required | Description | |---|---|---|---| | `season_id` | string | yes | | | `season_name` | string | yes | | | `rows` | array of {ref}`HeroRow ` | yes | | (model-heroprofile)= ## `HeroProfile` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `discord_id` | string | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `wow_class` | {ref}`WowClass ` \| null | yes | | | `rank` | integer \| null | yes | | | `chat_level` | integer | yes | | | `chat_xp` | integer | yes | | | `chat_xp_into_level` | integer | yes | | | `chat_xp_for_next_level` | integer | yes | | | `seasons` | object | yes | | | `all_time` | {ref}`HeroSeasonStats ` | yes | | | `first_event_date` | string (date) \| null | yes | | | `recent_events` | array of {ref}`HeroRecentEvent ` | yes | | | `badges` | array of {ref}`EarnedBadge ` | yes | | (model-herorecentevent)= ## `HeroRecentEvent` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `starts_at` | string (date-time) | yes | | | `ep` | integer | yes | | (model-herorow)= ## `HeroRow` | Field | Type | Required | Description | |---|---|---|---| | `rank` | integer \| null | yes | | | `member_id` | integer | yes | | | `discord_id` | string | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `wow_class` | {ref}`WowClass ` \| null | yes | | | `chat_level` | integer | yes | | | `ep` | integer | yes | | | `raids_attended` | integer | yes | | | `events_attended` | integer | yes | | | `badge_ids` | array of string | yes | | (model-heroseasonstats)= ## `HeroSeasonStats` | Field | Type | Required | Description | |---|---|---|---| | `ep` | integer | yes | | | `raids_attended` | integer | yes | | | `events_attended` | integer | yes | | | `attendance_rate` | number | yes | | (model-importattendanceresult)= ## `ImportAttendanceResult` | Field | Type | Required | Description | |---|---|---|---| | `event_id` | string (uuid) \| null | yes | | | `marked` | integer | no | | (model-importcounts)= ## `ImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | | `updated` | integer | no | | (model-leaderboardentry)= ## `LeaderboardEntry` | Field | Type | Required | Description | |---|---|---|---| | `rank` | integer | yes | | | `user_id` | integer | yes | | | `xp` | integer | yes | | | `level` | integer | yes | | | `message_count` | integer | yes | | (model-leaderboardpage)= ## `LeaderboardPage` | Field | Type | Required | Description | |---|---|---|---| | `entries` | array of {ref}`LeaderboardEntry ` | yes | | | `total` | integer | yes | | | `limit` | integer | yes | | | `offset` | integer | yes | | (model-ledgerkind)= ## `LedgerKind` Whether a ledger entry is an EP or GP change. Type: string (model-levelroleschema)= ## `LevelRoleSchema` | Field | Type | Required | Description | |---|---|---|---| | `level` | integer | yes | | | `role_id` | integer | yes | | (model-levelroleupsert)= ## `LevelRoleUpsert` | Field | Type | Required | Description | |---|---|---|---| | `role_id` | integer | yes | | (model-logactor)= ## `LogActor` | Field | Type | Required | Description | |---|---|---|---| | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | (model-logentry)= ## `LogEntry` | Field | Type | Required | Description | |---|---|---|---| | `id` | string | yes | | | `at` | string (date-time) | yes | | | `kind` | string | yes | | | `actor` | {ref}`LogActor ` \| null | yes | | | `summary` | string | yes | | | `detail` | string \| null | yes | | | `member_id` | integer \| null | yes | | | `event_id` | string (uuid) \| null | yes | | | `case_number` | integer \| null | yes | | (model-logpage)= ## `LogPage` | Field | Type | Required | Description | |---|---|---|---| | `entries` | array of {ref}`LogEntry ` | yes | | | `next_before` | string (date-time) \| null | yes | | (model-lootimportcounts)= ## `LootImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | | `updated` | integer | no | | | `voided` | integer | no | | (model-lootresponse)= ## `LootResponse` How a character rolled on an item. Type: string (model-mcptokencreate)= ## `McpTokenCreate` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | (model-mcptokencreated)= ## `McpTokenCreated` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `name` | string | yes | | | `token` | string | yes | | (model-mcptokenlist)= ## `McpTokenList` | Field | Type | Required | Description | |---|---|---|---| | `tokens` | array of {ref}`McpTokenSummary ` | yes | | (model-mcptokensummary)= ## `McpTokenSummary` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `name` | string | yes | | | `created_at` | string (date-time) | yes | | | `last_used_at` | string (date-time) \| null | yes | | (model-me)= ## `Me` | Field | Type | Required | Description | |---|---|---|---| | `id` | integer | yes | | | `discord_id` | string | yes | | | `username` | string | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `is_guild_member` | boolean | yes | | | `is_officer` | boolean | yes | | | `is_gm` | boolean | yes | | | `battletag` | string \| null | yes | | | `roster_confirmed` | boolean | yes | | (model-memberattendancerow)= ## `MemberAttendanceRow` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `signed_up` | integer | yes | | | `came` | integer | yes | | | `no_shows` | integer | yes | | | `walk_ins` | integer | yes | | | `attendance_rate` | number | yes | | | `last_attended` | string (date-time) \| null | yes | | (model-memberlevelschema)= ## `MemberLevelSchema` | Field | Type | Required | Description | |---|---|---|---| | `guild_id` | integer | yes | | | `user_id` | integer | yes | | | `xp` | integer | yes | | | `level` | integer | yes | | | `message_count` | integer | yes | | (model-memberlink)= ## `MemberLink` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | integer | yes | | | `battlenet_linked` | boolean | yes | | | `roster_confirmed` | boolean | no | | (model-memberlisting)= ## `MemberListing` | Field | Type | Required | Description | |---|---|---|---| | `id` | integer | yes | | | `username` | string | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | | `is_guild_member` | boolean | yes | | | `is_officer` | boolean | yes | | | `battletag` | string \| null | yes | | | `roster_confirmed` | boolean | yes | | | `last_login_at` | string (date-time) \| null | yes | | (model-membernoteimportcounts)= ## `MemberNoteImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | | `updated` | integer | no | | | `voided` | integer | no | | (model-memberprofilein)= ## `MemberProfileIn` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | integer | yes | | | `username` | string | yes | | | `global_name` | string \| null | yes | | | `guild_nick` | string \| null | yes | | | `avatar_hash` | string \| null | yes | | | `roles` | array of integer | yes | | (model-memberprofilesreplace)= ## `MemberProfilesReplace` | Field | Type | Required | Description | |---|---|---|---| | `profiles` | array of {ref}`MemberProfileIn ` | yes | | | `departed_ids` | array of integer | yes | | (model-modcasecreate)= ## `ModCaseCreate` | Field | Type | Required | Description | |---|---|---|---| | `action` | {ref}`CaseAction ` | yes | | | `user_id` | integer | yes | | | `moderator_id` | integer | yes | | | `reason` | string \| null | no | | | `duration_seconds` | integer \| null | no | | (model-modcaseschema)= ## `ModCaseSchema` | Field | Type | Required | Description | |---|---|---|---| | `guild_id` | integer | yes | | | `case_number` | integer | yes | | | `action` | {ref}`CaseAction ` | yes | | | `user_id` | integer | yes | | | `moderator_id` | integer | yes | | | `reason` | string \| null | yes | | | `duration_seconds` | integer \| null | yes | | | `created_at` | string (date-time) | yes | | (model-modcaseupdate)= ## `ModCaseUpdate` | Field | Type | Required | Description | |---|---|---|---| | `reason` | string \| null | no | | (model-mycharactercreate)= ## `MyCharacterCreate` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | | `realm` | string \| null | no | | | `class` | {ref}`WowClass ` \| null | no | | (model-newskind)= ## `NewsKind` What kind of guild news feed item this is. Type: string (model-pendingannouncement)= ## `PendingAnnouncement` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `text` | string | yes | | | `author` | string | yes | | | `at` | string (date-time) | yes | | (model-pendingannouncementspage)= ## `PendingAnnouncementsPage` | Field | Type | Required | Description | |---|---|---|---| | `items` | array of {ref}`PendingAnnouncement ` | yes | | (model-pendingbadgeannouncement)= ## `PendingBadgeAnnouncement` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | integer | yes | | | `badge_id` | string | yes | | | `name` | string | yes | | | `description` | string | yes | | (model-professionimportcounts)= ## `ProfessionImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `updated` | integer | no | | (model-raidstatus)= ## `RaidStatus` EPGP roster status, settable by an officer (``PUT /api/epgp/roster/{member_id}``). Type: string (model-rankschema)= ## `RankSchema` | Field | Type | Required | Description | |---|---|---|---| | `user_id` | integer | yes | | | `rank` | integer \| null | yes | | | `xp` | integer | yes | | | `level` | integer | yes | | | `message_count` | integer | yes | | | `xp_into_level` | integer | yes | | | `xp_for_next_level` | integer | yes | | (model-recruitchecklist)= ## `RecruitChecklist` | Field | Type | Required | Description | |---|---|---|---| | `talked` | boolean | no | | | `gear_check` | boolean | no | | | `first_raid` | boolean | no | | | `vouched` | boolean | no | | (model-recruitimportcounts)= ## `RecruitImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `new` | integer | no | | | `updated` | integer | no | | (model-recruitstatus)= ## `RecruitStatus` A recruiting candidate's status in the vetting pipeline. Type: string (model-recruitvotechoice)= ## `RecruitVoteChoice` An officer's vote on a recruit. Type: string (model-recruiting)= ## `Recruiting` | Field | Type | Required | Description | |---|---|---|---| | `roles` | array of {ref}`RecruitingRoleWant ` | yes | | | `classes` | array of {ref}`RecruitingClassWant ` | yes | | | `updated_at` | string (date-time) \| null | yes | | (model-recruitingclasswant)= ## `RecruitingClassWant` | Field | Type | Required | Description | |---|---|---|---| | `class` | {ref}`WowClass ` | yes | | | `priority` | {ref}`RecruitingPriority ` | no | | | `note` | string \| null | no | | (model-recruitingpriority)= ## `RecruitingPriority` How urgently the guild wants this role or class filled. Type: string (model-recruitingrolewant)= ## `RecruitingRoleWant` | Field | Type | Required | Description | |---|---|---|---| | `role` | {ref}`SignupRole ` | yes | | | `priority` | {ref}`RecruitingPriority ` | no | | | `note` | string \| null | no | | (model-recruitingupdate)= ## `RecruitingUpdate` | Field | Type | Required | Description | |---|---|---|---| | `roles` | array of {ref}`RecruitingRoleWant ` | no | | | `classes` | array of {ref}`RecruitingClassWant ` | no | | (model-rolemenucreate)= ## `RoleMenuCreate` | Field | Type | Required | Description | |---|---|---|---| | `channel_id` | integer | yes | | | `title` | string | yes | | | `description` | string \| null | no | | | `max_roles` | integer | no | | (model-rolemenuoptionschema)= ## `RoleMenuOptionSchema` | Field | Type | Required | Description | |---|---|---|---| | `role_id` | integer | yes | | | `label` | string | yes | | | `emoji` | string \| null | yes | | | `description` | string \| null | yes | | | `position` | integer | yes | | (model-rolemenuoptionupsert)= ## `RoleMenuOptionUpsert` | Field | Type | Required | Description | |---|---|---|---| | `label` | string | yes | | | `emoji` | string \| null | no | | | `description` | string \| null | no | | | `position` | integer \| null | no | | (model-rolemenuschema)= ## `RoleMenuSchema` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `guild_id` | integer | yes | | | `channel_id` | integer | yes | | | `message_id` | integer \| null | yes | | | `title` | string | yes | | | `description` | string \| null | yes | | | `max_roles` | integer | yes | | | `options` | array of {ref}`RoleMenuOptionSchema ` | yes | | (model-rolemenuupdate)= ## `RoleMenuUpdate` | Field | Type | Required | Description | |---|---|---|---| | `channel_id` | integer \| null | no | | | `message_id` | integer \| null | no | | | `title` | string \| null | no | | | `description` | string \| null | no | | | `max_roles` | integer \| null | no | | (model-roleresetcandidate)= ## `RoleResetCandidate` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `discord_id` | integer | yes | | | `requested_at` | string (date-time) | yes | | (model-roletag)= ## `RoleTag` | Field | Type | Required | Description | |---|---|---|---| | `id` | string | yes | | | `name` | string | yes | | | `color` | string \| null | yes | | (model-rosterimportcounts)= ## `RosterImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `updated` | integer | no | | (model-seriesref)= ## `SeriesRef` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `weekdays` | array of integer | yes | | | `interval_weeks` | integer | yes | | | `start_time` | string | yes | | | `timezone` | string | yes | | (model-seriesrule)= ## `SeriesRule` | Field | Type | Required | Description | |---|---|---|---| | `weekdays` | array of integer | yes | | | `interval_weeks` | integer | yes | | | `start_time` | string | yes | | | `timezone` | string | yes | | | `duration_minutes` | integer \| null | yes | | | `starts_on` | string (date) | yes | | | `until` | string (date) \| null | yes | | (model-setxprequest)= ## `SetXPRequest` | Field | Type | Required | Description | |---|---|---|---| | `xp` | integer | yes | | (model-signup)= ## `Signup` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `member` | {ref}`SignupMember ` | yes | | | `character` | string \| null | yes | | | `class` | {ref}`WowClass ` \| null | yes | | | `role` | {ref}`SignupRole ` \| null | yes | | | `status` | {ref}`SignupStatus ` | yes | | | `comment` | string \| null | yes | | | `group` | integer \| null | yes | | | `bench` | boolean | yes | | | `updated_at` | string (date-time) | yes | | (model-signupactivity)= ## `SignupActivity` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `thread_id` | integer | yes | | | `display_name` | string | yes | | | `action` | string | yes | | | `detail` | string \| null | no | | | `discord_id` | integer \| null | no | Member to @-mention; None for rows from before. | | `comment` | string \| null | no | | (model-signupbydiscord)= ## `SignupByDiscord` | Field | Type | Required | Description | |---|---|---|---| | `signup` | {ref}`Signup ` \| null | yes | | | `defaults` | {ref}`SignupDefaults ` \| null | yes | | | `kind` | {ref}`EventKind ` | yes | | (model-signupdefaults)= ## `SignupDefaults` | Field | Type | Required | Description | |---|---|---|---| | `character` | string \| null | yes | | | `class` | {ref}`WowClass ` \| null | yes | | | `role` | {ref}`SignupRole ` \| null | yes | | (model-signupimportcounts)= ## `SignupImportCounts` | Field | Type | Required | Description | |---|---|---|---| | `applied` | integer | no | | | `skipped_older` | integer | no | | | `unlinked` | integer | no | | (model-signupmember)= ## `SignupMember` | Field | Type | Required | Description | |---|---|---|---| | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | (model-signupnoticeack)= ## `SignupNoticeAck` | Field | Type | Required | Description | |---|---|---|---| | `channel_id` | integer | yes | | | `message_id` | integer | yes | | (model-signupnoticecandidate)= ## `SignupNoticeCandidate` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `discord_id` | string | yes | | | `display_name` | string | yes | | | `username` | string | yes | | | `avatar_hash` | string \| null | yes | | | `battletag` | string \| null | yes | | | `roster_confirmed` | boolean | yes | | | `created_at` | string (date-time) | yes | | (model-signupnoticeresolution)= ## `SignupNoticeResolution` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `discord_id` | string | yes | | | `display_name` | string | yes | | | `channel_id` | string | yes | | | `message_id` | string | yes | | | `confirmed_by` | string \| null | yes | | (model-signupnoticespage)= ## `SignupNoticesPage` | Field | Type | Required | Description | |---|---|---|---| | `pending` | array of {ref}`SignupNoticeCandidate ` | yes | | | `resolved` | array of {ref}`SignupNoticeResolution ` | yes | | (model-signuprole)= ## `SignupRole` What role a signed-up character plays. Type: string (model-signupstatus)= ## `SignupStatus` Whether a member is coming. Type: string (model-signupupsert)= ## `SignupUpsert` | Field | Type | Required | Description | |---|---|---|---| | `character` | string \| null | no | | | `class` | {ref}`WowClass ` \| null | no | | | `role` | {ref}`SignupRole ` \| null | no | | | `status` | {ref}`SignupStatus ` | yes | | | `comment` | string \| null | no | | (model-voicechannelcount)= ## `VoiceChannelCount` | Field | Type | Required | Description | |---|---|---|---| | `name` | string | yes | | | `count` | integer | yes | | (model-voicepresenceentry)= ## `VoicePresenceEntry` | Field | Type | Required | Description | |---|---|---|---| | `discord_id` | string | yes | | | `minutes` | integer | yes | | (model-voicepresencereport)= ## `VoicePresenceReport` | Field | Type | Required | Description | |---|---|---|---| | `event_id` | string (uuid) | yes | | | `entries` | array of {ref}`VoicePresenceEntry ` | no | | (model-walkincandidate)= ## `WalkInCandidate` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `display_name` | string | yes | | | `avatar_url` | string \| null | yes | | (model-walkincreate)= ## `WalkInCreate` | Field | Type | Required | Description | |---|---|---|---| | `member_id` | integer | yes | | | `character` | string \| null | no | | | `class` | {ref}`WowClass ` \| null | no | | | `role` | {ref}`SignupRole ` \| null | no | | (model-weeklyboardevent)= ## `WeeklyBoardEvent` | Field | Type | Required | Description | |---|---|---|---| | `id` | string (uuid) | yes | | | `kind` | {ref}`EventKind ` | yes | | | `title` | string | yes | | | `starts_at` | string (date-time) | yes | | | `discord_thread_id` | integer \| null | yes | | (model-wowclass)= ## `WowClass` Playable WoW classes. Type: string (model-xpawardresult)= ## `XPAwardResult` | Field | Type | Required | Description | |---|---|---|---| | `awarded` | boolean | yes | | | `amount` | integer | yes | | | `xp` | integer | yes | | | `level` | integer | yes | | | `previous_level` | integer | yes | | | `leveled_up` | boolean | yes | | | `earned_role_ids` | array of integer | no | | | `remove_role_ids` | array of integer | no | |