Skip to main content

Event Lifecycle & Attendance

Events progress through distinct phases, each with different rules for participation status and officer actions.

Event Status Flow

stateDiagram-v2
draft --> published
published --> active
active --> completed
published --> cancelled

Participation Statuses

Participation statuses are phase-aware: which statuses are valid depends on the event's current phase.

Pre-Event (published/draft)

StatusMeaning
invitedOfficer sent an invite
confirmedSigned up and has a slot
waitlistSigned up but slot is full
declinedDeclined the invite

Officers can toggle participants between confirmed and waitlist.

Active/Completed Events

StatusMeaning
attendedParticipated in the event
benchedWas available but sat out (roster/comp reasons)
absentDid not show up

Officers can set any participant to attended, benched, or absent. Pre-event statuses (confirmed, waitlist) are rejected on active/completed events.

Why Benched Matters

Benched is distinct from absent for attendance tracking and trial evaluations. A benched player showed up and was ready — they shouldn't be penalized the same way an absent player is.

Self-Service Rules

  • Published events: Users can sign up, change their character, and withdraw.
  • Active events: Users can change their character but cannot withdraw.
  • Completed events: Users cannot change anything. Only officers can modify participation after completion.

Officers can always change a participant's character via the roster dropdown on active/completed events.

Voice Attendance Tracking

When enabled (Settings > Integrations > Voice Attendance), the platform tracks Discord voice channel activity during events.

Modes

ModeBehavior
offNo tracking
trackRecords who joins the voice channel and for how long
autoTrack + automatically marks confirmed participants as attended

Confirmation Workflow

  1. During an active event, voice presence is tracked in temporary EventVoicePresence records
  2. After the event completes, officers see the Voice Attendance panel
  3. Each user can be marked as Attended, Benched, or Absent (defaults: signed-up members → Attended)
  4. On confirmation, permanent Participation records are created with voiceDurationMinutes, and temporary voice data is deleted

Data Lifecycle

  • Temporary: EventVoicePresence rows exist only while tracking is active
  • Permanent: Participation.voiceDurationMinutes persists after confirmation
  • Unconfirmed data is discarded: If an officer never confirms, temporary data is cleaned up when the event is deleted or cancelled

Discord Scheduled Events

Events can optionally create Discord Scheduled Events for visibility in Discord's event UI.

  • Auto-start: A cron job starts Discord Scheduled Events when the platform event's scheduledAt time arrives
  • Auto-complete: Events are completed when their duration elapses
  • Manual control: Officers can start, delay, or end events from the UI
  • Cover images: If an event has an image, it's sent as the scheduled event cover

API Endpoints

MethodPathPurpose
PATCH/events/:id/signupUser updates own character/role
PATCH/events/:eventId/participations/:userIdOfficer updates participant status/character
POST/events/:id/attendance/confirmOfficer confirms voice attendance
GET/events/:id/voice-presenceGet current voice presence data
PATCH/events/:id/delayDelay event start time