Skip to content

/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:

  1. Gear select — multi-select for anything the member needs to borrow (firearm, holster, eye protection, ear protection, other). Leave empty if they have everything.
  2. 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_identity and validated_event to the RSVP row; advances.
  • Skip — leaves unlinked; advances.
  • Done — exits early.

On completion: refreshes the organizer post, shows a summary of changes.