/rsvp — Command Reference¶
Overview¶
RSVPs are submitted via Grist form or via /rsvp me. The bot handles organizer review, member linking, and status management.
RSVP matching uses two reference fields:
- validated_event — links the RSVP to a specific Events row
- validated_identity — links the RSVP to a People row
Unmatched RSVPs (form submissions not yet linked) appear in the UNMATCHED section of /rsvp list and the organizer post. Use /rsvp identify to link them.
Status Values¶
Event_RSVPs.status_from_organizer — Choice field:
| Status | Meaning | Set by |
|---|---|---|
| (blank) | Received, not reviewed | Default for new submissions |
interest noted |
Noted, decision deferred | Default on bot-submitted RSVPs |
accepted |
Confirmed | /rsvp accept |
waitlisted |
On waitlist | /rsvp waitlist |
ignored |
Not actioning | /rsvp ignore |
dropped |
Withdrawn | /rsvp withdraw |
Event Context¶
All commands accept an optional event_id. When omitted, the event is inferred from the current channel by matching against Events.organizer_thread and Events.Discord_event URLs. If no match is found, an error is returned.
Self-Service Commands¶
Available to vetted members (most_recent_status in {"vetted", "vetted (left discord)"}).
/rsvp me [event_id] [member]¶
Submits an RSVP. Two-step ephemeral flow:
- Gear select — multi-select for anything the member needs to borrow (firearm, holster, eye protection, ear protection, other). Leave empty if they have everything.
- Notes modal — optional free-text notes for the organizer.
On submit: creates (or updates a withdrawn) Event_RSVPs row with validated_identity and validated_event already set. Status defaults to interest noted. Refreshes the pinned organizer post and posts a log line to the organizer thread.
Organizer path — if member is provided and the caller is an organizer, the RSVP is submitted on behalf of that member. Running /rsvp me in the organizer thread without a member param opens a member picker instead of defaulting to the caller.
Guards:
- Vetted check runs against the target member (not the caller) — organizers cannot bypass it.
- Errors if an active RSVP already exists for the member + event. Use /rsvp withdraw to cancel first.
/rsvp withdraw [event_id]¶
Sets status_from_organizer to dropped. Does not delete the row — re-running /rsvp me will reactivate it with a fresh timestamp.
Guards: - Vetted gate. - Errors if no RSVP found. - Warns if already withdrawn.
Posts a log line to the organizer thread.
Organizer Commands¶
All require Chapter Organizer or higher.
/rsvp list [event_id]¶
Returns an ephemeral embed with RSVPs grouped by status. Also refreshes the pinned organizer post.
Sections (each numbered separately):
ACCEPTED (2)
1. @alice º 🔫 [8 mo] (a)
2. @bob ^ [14 mo]
WAITLISTED (1)
1. @carol
INTEREST NOTED (1)
1. @dave ~ [1 mo]
PENDING (1)
1. @eve
UNMATCHED (1)
1. @frank
Flags:
^ toucher of grass (person in Events.accepted_ToGs)
º has taken [type] before (person in Events.has_taken_before)
~ joined <2mo ago (months_since_vetted < 2)
🔫 needs firearm
🪣 needs holster
🥽 needs eye protection
👂 needs ear protection
❓ needs other
[n mo] = months since vetted
RSVPs with a non-empty Notes field get a footnote marker (a), (b), etc.; note text appears below the legend.
/rsvp accept @member [event_id] [note]¶
/rsvp waitlist @member [event_id] [note]¶
/rsvp ignore @member [event_id] [note]¶
Set status_from_organizer to accepted, waitlisted, or ignored respectively.
Guards:
- Errors if the member has no RSVP for this event. (Use /rsvp me @member to add one.)
- Warns if already at the target status.
On success: refreshes the organizer post, posts a log line to the organizer thread, and replies with a link to the pinned organizer post.
note is optional. If provided, it is written to organizer_notes. Warns before overwriting an existing note.
/rsvp note @member [note] [event_id]¶
Set or clear an organizer-only note on a member's RSVP. note is required; pass -- to clear.
Warns before overwriting an existing note.
/rsvp info @member [event_id]¶
Returns an ephemeral embed with a member's full RSVP detail:
@alice — RSVP
Status: accepted
Signed up: #2 (May 30, 9:14am)
Vetted: 8 months ago
Last taken: P1: 2024-01-21
Prereqs: N/A
Gear needed: 🔫
Notes: "first time"
Organizer notes: ""
Reads pre-computed Grist formula fields directly (last_taken, prereqs_taken, signup_order, months_since_vetted). Timestamp shown in America/Los_Angeles.
/rsvp identify [event_id]¶
Interactive bulk-linking flow for connecting unmatched form RSVPs to Discord members.
Cycles through RSVPs with no validated_identity one at a time:
Who is @castor? (3 remaining)
[ Select Discord member… ▾ ] [Skip] [Done]
- Select member — writes
validated_identityandvalidated_eventto the RSVP row; advances. - Skip — leaves unlinked; advances.
- Done — exits early.
On completion: refreshes the organizer post, shows a summary of changes.