From 69bcf09c9459f4504327c78dfbe7f40a99927a2c Mon Sep 17 00:00:00 2001 From: Raven Scott Date: Fri, 22 May 2026 21:38:00 -0400 Subject: [PATCH] feat(roles): add reorderRoles for drag-reorder position updates Batch-update custom role positions for server settings drag reorder with P2P ROLE_UPSERT sync. Co-authored-by: Cursor --- README.md | 5 +++-- index.js | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7fede3b..e1916ff 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Let servers define up to 24 named colored roles with Discord-style permission fl | Method | Role | |--------|------| -| `listRoles` / `getRole` / `createRole` / `updateRole` / `deleteRole` | Role CRUD | +| `listRoles` / `getRole` / `createRole` / `updateRole` / `deleteRole` / `reorderRoles` | Role CRUD + position reorder | | `getMemberRoleIds` / `setMemberRoleIds` | Member links | | `attachCustomRolesToMembers` | Enrich member list | | `resolvePermissions(member, customRoles)` | View object for UI | @@ -82,7 +82,7 @@ Voice/stage join: `listRoles` + `memberPermissionMask` with channel overwrites. ## UI / IPC -Server settings → Roles: create role, color, permission matrix, assign to members. IPC mirrors platform role APIs. +Server settings → Roles: create role, color, permission matrix, **drag reorder** (updates `position` + `ROLE_UPSERT` gossip), assign to members. IPC mirrors platform role APIs including `reorder-guild-custom-roles`. ## Related docs @@ -96,6 +96,7 @@ Server settings → Roles: create role, color, permission matrix, assign to memb - `npm run test:role-permissions` - `npm run test:voice-permissions` +- `npm run test:role-reorder` (Phase 202 GUI drag reorder) ## Code example diff --git a/index.js b/index.js index f4029e3..3c88974 100644 --- a/index.js +++ b/index.js @@ -120,6 +120,30 @@ class PearcordGuildRoles { return row } + async reorderRoles (guildId, orderedRoleIds = []) { + const gid = this._guildKey(guildId) + const roles = await this.listRoles(gid) + const want = (orderedRoleIds || []).map(String) + if (want.length !== roles.length) { + throw new Error('role order must include all custom roles') + } + const roleSet = new Set(roles.map((r) => r.id)) + for (const id of want) { + if (!roleSet.has(id)) throw new Error('unknown role in order') + } + const updated = [] + for (let i = 0; i < want.length; i++) { + const prev = roles.find((r) => r.id === want[i]) + if (!prev) continue + if ((prev.position || 0) === i) { + updated.push(prev) + continue + } + updated.push(await this.updateRole(gid, want[i], { position: i })) + } + return updated + } + async deleteRole (guildId, roleId) { const gid = this._guildKey(guildId) const prev = await this.getRole(gid, roleId)