feat(rust): Teams from first-party clans (phase 9, protocol 6) #12
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/phase-9-clans"
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?
Phase 9 (R5): a first-party Rust clan is a Team, and this module becomes the site's Team provider. Design of record:
docs/modules/rust/PLAN.md§24, D47–D58 (docs PR alongside). It pairs with Rust-Plugins and Rust-Linkfeat/phase-9-clans(protocol 6).What it does
getTeams,getTeamMembers,getTeamLeaders,projectRoster, andpageUrlTemplate: '/rust/clans/{externalId}'.externalIdis<serverId>:<clanId>:<createdMs>(D52), because the game restarts clan ids whenever its clan database version changes.complete: trueonly when every server's board is fresh, supported and untruncated (D53). It answers partial when some are, and refuses when none are.tlast advanced.rust_clans,rust_clan_membersandrust_clan_boards.team.*kinds. Leadership is diffed board to board (D54). Membership lines go to the Team feed, all members-only (D49).projectRosterand the module's own clan page use one function, and it re-reads the users row. The setting is a new section on Admin → Rust visibility, which also flags servers running uMod Clans (D47) and servers at the ceiling.GET …/servers/:id/clans(the list is public, D58) andGET /public/rust/clans/:externalId./rust/clans/:externalIdwith three module slots for core's notify, activity and forum contributions (D56).PROTOCOL_VERSIONis 6.Two traps in core's contract, both handled here
dedupeKeyto 40 characters, silently. The key is therefore a sha1 (exactly 40 characters), so a re-offer is a no-op instead of a collision.Verified
clans.test.js, mutation-checked by planting two defects) and 41 client tests.check:imports,check:bundle,check:externals, the regenerated OpenAPI fragment, and the frozen route manifest generated against core at the pinned sha./public/teams/:slug/membersfor anonymous, stranger, linked member and moderator.Not walked: a real player's name on a feed line (the synthetic Steam ids have none, so lines read "A player …"), and the admin page in a browser. Its API was walked: a moderator's PUT gets 403, an unknown rung 400, and
publicopens the roster.Depends on website#204 (one module per site). Core allows one Team provider per site, and a second registration fails the whole load, which would take module-uo down on a site running both.
AI disclosure
Written with Claude Code (Opus 5.5).
🤖 Generated with Claude Code
https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY