Skip to content

Polyamory notices, bot quips, slash commands, and new fun commands - #6

Merged
CommunityPoke merged 2 commits into
mainfrom
devin/1792269150-polyamory-notices
Oct 18, 2026
Merged

CommunityPoke merged 2 commits into
mainfrom
devin/1792269150-polyamory-notices

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Multiple simultaneous partners were already supported (MATRIMONY_MAX_PARTNERS, default unlimited). This PR adds the missing piece for polyamorous marriages: when a user takes a new partner, every existing partner of both spouses is notified with an immediate accept-or-divorce choice — plus three community requests: bot-directed quips, slash command support, and a few new fun commands.

Polyamory notices

  1. !matr marry @user → proposal as before. If either side already has partners, the proposal message now says those partners will be notified.
  2. The target accepts → the marriage forms immediately, regardless of existing partners. No consent gate.
  3. Each existing partner (of the proposer and of the target) gets a notice in the channel with Accept and Divorce buttons, plus text equivalents.
    • Accept (!matr accept): acknowledgement only — the notice is cleared, nothing else changes.
    • Divorce (!matr divorce @partner or the button): ends that partner's own marriage to the spouse via the normal divorce path (remove_partners — so divorce, abandon, forcedivorce all behave consistently).
  4. An ignored notice never undoes or blocks anything.
  • store.py: new notices table (user_id = partner being told, spouse_id = their partner who remarried, other_id = the new spouse) + Notice dataclass and CRUD. remove_partners clears notices that presume the dissolved marriage, so divorce/abandon/forcedivorce can't leave stale ones. stats() gains partner_notices.
  • cogs/matr.py: _notify_new_partners runs after a marriage is enacted (proposals and forcemarry) and posts one notice per existing partner with a PartnerNoticeView (buttons restricted to that partner, 24h window). matr_accept picks from proposals and notices (_pick_answerable); matr_decline stays proposal-only but points notice-holders at divorce.

Bot-directed quips

  • Aiming an action at Matrimony itself appends a rotating quip as Discord subtext (-# line) under the normal reply — one quip set per command (_BOT_QUIPS, itertools.cycle rotation).
  • Proposals at the bot (marry/adopt/makeparent) are declined outright with a quip — e.g. "sorry, taken by discord.py" — and no proposal is created.

Slash commands

  • Every !matr command is now a discord.py hybrid command, so /matr mirrors the prefix surface exactly.
  • Discord caps a slash group at 25 children and the bot has ~50, so /matr holds the core family commands while the rest nest one level: /matr fun hug, /matr admin forcemarry, /matr meta stats. The group's app_command is detached during decoration and the tree is assembled in the Registration section.
  • commands.guild_only / commands.has_permissions were mirrored with app_commands.guild_only() / app_commands.default_permissions() so the slash side inherits the same restrictions.
  • setup_hook calls tree.sync() to publish the commands at startup.

New fun commands

  • flirt @user (alias rizz) — a terrible pickup line + GIF.
  • date @user (alias dateidea) — a terrible date idea + GIF.
  • anniversary [@partner] (alias anniv) — time married (via store.partnership_since); defaults to your only partner.

No economy, currency, or inventory — just relational jokes.

Tests

27 new tests (98 total): notice lifecycle/fan-out/divorce paths; quip append/no-quip/rotation and bot-declines; flirt/date/anniversary callbacks; slash tree layout, subgroup contents, lowercase-name rule, guild_only/default_permissions propagation, and prefix-side parity. pytest and ruff check are clean.

Link to Devin session: https://app.devin.ai/sessions/44ba7d7c447945aa98b7996e284e472e
Open in Devin Desktop: https://app.devin.ai/desktop/session/44ba7d7c447945aa98b7996e284e472e?variant=devin
Requested by: @CommunityPoke

When a proposal is accepted (or a forcemarry lands), the marriage forms
immediately as before, and every existing partner of either spouse gets
a partner notice with Accept (acknowledge only) and Divorce buttons.
!matr accept acknowledges a notice text-side; !matr divorce @partner or
the Divorce button ends that partner's own marriage via the normal
divorce path. Notices never block the new marriage and are cleared when
the underlying marriage ends.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

- Commands aimed at the bot append a rotating quip as Discord subtext
  (-# line); proposals at the bot are declined with a quip instead of
  creating a proposal.
- Every !matr command is now a discord.py hybrid, so /matr mirrors the
  prefix surface: core commands directly under /matr, fun/admin/meta in
  nested subgroups (Discord caps groups at 25 children), synced in
  setup_hook. guild_only and manage_guild propagate to the slash side.
- New fun commands: flirt (pickup lines), date (date ideas),
  anniversary (marriage duration via store.partnership_since).
- Tests for quips, slash tree layout/permissions, and the new commands;
  README updated.

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration devin-ai-integration Bot changed the title Polyamory: notify existing partners on new marriage with accept/divorce options Polyamory notices, bot quips, slash commands, and new fun commands Oct 17, 2026
@CommunityPoke
CommunityPoke merged commit 5a13c62 into main Oct 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant