feat: remind the people who haven't answered "Are you in?" (#1158) #1168
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/1158-nudge-unanswered"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1158 (D302, D303). Backend, bot and frontend in one change.
<@…> Are you in for Session 14, Tuesday 13 October at 8:00 pm CDT (<t:…:t> your time)? React ✅ if you are in, ❌ if you are not, ❔ if you might. Answer here: <url>POST /sessions/{id}/remind-unanswered, audited, at most once in 12 hours), and an automatic nudgersvp_nudge_minutesbefore a confirmed session (campaign setting, default 2880, can be turned off; once per confirmed time).session_reminderwith the answer buttons; a webhook-only campaign gets a 409 from the button.UPDATEclaims the send and commits before anything goes out; a failed send restores the previous values.session_rsvp_nudge, offered only to a bot whose/identitylists the feature; an older bot ignores it. Additive: noBOT_CONTRACT_VERSIONbump.faces.pygains only the nudge;_handle_vote_reminder'sallowed_mentionsis tightened fromusers=Trueto the exact ids.e1158a1b2c3d(aftere1159a1b2c3d): two columns onsessions, one oncampaigns; real downgrade.Not in the nudge: people with no linked Discord (naming them is person-written text; see #1166).
Verified
On
docker-test: bot suite (709 passed);test_rsvp_nudge.pyand the title-reader guard (39); an earlier wider backend run of 19 modules (578 passed, before the last payload change, not re-run since); alembic upgrade, downgrade -1, upgrade (before the re-point ontoe1159a1b2c3d); ruff; version and changelog checks; frontend lint; the touched vitest files alone.Not run: the full frontend suite (timed out under host load), the full backend suite, journeys,
build; nothing after merging main (two doc conflicts resolved by hand). Not checkable on dev: the dev bot has no Discord token. No render check yet of the button and the setting.🤖 Generated with Claude Code