Skip to content

feat(party): let players ask to join and open parties to everyone - #29

Merged
TheMeinerLP merged 2 commits into
mainfrom
feat/open-party-joining
Oct 30, 2026
Merged

TheMeinerLP merged 2 commits into
mainfrom
feat/open-party-joining

Conversation

@TheMeinerLP

Copy link
Copy Markdown
Contributor

Proposed changes

Until now a player could only get into a party through an invite from its leader. A player who wanted to join a friend had to ask in chat and wait for the friend to find the right command. A streamer who wanted viewers in had to invite each one by hand, which stopped working past a handful of people.

Now a player can ask to join, and a leader can open the party so that anyone who knows the leader's name can walk in. The leader stays in control in both cases.

  • Asking. /party request <player> sends the leader a prompt with a clickable [Accept] and [Deny]. The request lasts 60 seconds. A player who is denied, or whose request runs out, waits 60 seconds before asking the same party again. The player is never left guessing: the answer says how long the request stays open.
  • Open parties. A leader with the permission quelea.party.public opens the party with /party public on. Any leader can close it with /party public off, so a leader who lost the permission can still close. While the party is open, /party join <player> puts the player straight in, up to 20 members. A request to an open party also joins at once, and the player sees "joined", not "request sent".
  • Kicks stick. A kicked player cannot join or ask until the leader invites them again. The ban ends with the party.
  • Leadership. A new leader never inherits an open party by accident. When the leader leaves or the leadership changes, the party closes, the members stay, and the new leader is told, with the hint to reopen it only if they hold the permission.

Nobody can list or search for open parties. Access is by name only.

Rollout. A request reaches the leader only through the proxy the leader is on. Every proxy needs the new plugin before players use /party request. A proxy still on the old plugin drops the prompt silently, and the request then expires.

Types of changes

  • Bugfix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation Update (if none of the other choices apply)

Checklist

  • I have added tests that prove my fix is effective or that my feature works
  • I have added necessary documentation (if appropriate)

Further comments

Two commits, both feat(party): the backend (the service rules, the Dragonfly state, the routes and the problem codes) and the proxy plugin (the commands, the prompts and the messages). The OpenSpec change add-open-party-joining holds the design. Decisions worth a look:

  • An invite lifts the kick ban when the invite is created, not when it is accepted. The leader's explicit act outranks the ban.
  • The permission is checked on the proxy only. The service has no notion of Minecraft permissions; closing needs none.
  • No player id is ever a metric tag. The new operations count under their existing meter, by name.
  • The public size limit is read as at least the private limit, so a public party never holds fewer members than a private one.

A player outside a party can ask the party of an online player to let them
in. A private party keeps the request for its leader, who accepts or rejects
it; a request expires after its TTL, and a denial or an expiry starts a
cooldown. A leader can open the party to everyone. While it is open a player
joins directly, up to the public size limit.

A kicked player cannot join or request the party until the leader invites
them again. Bans, open requests and cooldowns end with the party. A change
of leader closes an open party, and a closed party keeps its members.
party.leader-changed carries wasPublic when the change closed the party.
The proxy gains /party public on|off, request, join, approve and reject.
Opening a party is refused before any service call unless the player holds
quelea.party.public; closing needs no permission. A request to a public
party reads as a join, a request to a private one as sent, with its expiry.

The leader gets a clickable prompt for a join request. The requester is told
the answer once. A leadership change that closed a public party tells the new
leader, with the reopen hint only when they hold the permission.

Messages for the six new problem codes are in English and German. A cooldown
names its wait only when the service sent Retry-After. None of the six codes
is reported to Sentry.
@github-actions

Copy link
Copy Markdown
Contributor

Test results

  204 files    204 suites   1m 43s ⏱️
  549 tests   549 ✅  0 💤 0 ❌
1 647 runs  1 555 ✅ 92 💤 0 ❌

Results for commit 6586387.

@TheMeinerLP
TheMeinerLP merged commit 7bde4c3 into main Oct 30, 2026
12 checks passed
@TheMeinerLP
TheMeinerLP deleted the feat/open-party-joining branch October 30, 2026 20:15
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