feat(permissions): extend role and overwrite span metadata for Phase 510
role.update emits previousPermissionMask and permissionMaskDelta; permission.overwrite tracks replacedExisting and bit changes; post-upsert permission.eval logs effective sendMessages; delete span adds hadAllow/hadDeny.
This commit is contained in:
@@ -75,6 +75,8 @@ Expose a single `EventEmitter` API the UI drives over IPC (`apps/pearcord/index.
|
||||
|
||||
**v0.8.471 (Phase 508):** `presence.set`/`presence.custom`/`presence.activity` spans extended (`previousStatus`, `statusChanged`, `customTextLength`, `spanKind`, `activityName`, `hasAssets`). Split presence guild-loading compositor + clipboard presence meta. Bundle: `npm run test:phase508-presence`.
|
||||
|
||||
**v0.8.473 (Phase 510):** `role.update` adds `previousPermissionMask`/`permissionMaskDelta`; `permission.overwrite` adds `replacedExisting`/`allowChanged`/`denyChanged`; `permission.eval` after overwrite upsert; `permission.overwrite.delete` adds `hadAllow`/`hadDeny`. UI `syncPermissionsPanelsDuringGuildLoading`. Bundle: `npm run test:phase510-permissions`.
|
||||
|
||||
**v0.8.472 (Phase 509):** `discovery.list` adds `queryLen`/`sort`/`minMembers`; `discovery.publish` adds `beforeListed`/`changed`; `discovery.mesh` adds `hadCachedStats`. UI split discovery guild-loading compositor + clipboard discovery meta. Bundle: `npm run test:phase509-discovery`.
|
||||
|
||||
**v0.8.460 (Phase 497):** `presence.set`/`presence.custom`/`presence.activity` spans (`peerCount`, `activityType`, `guildGossip`). UI presence compositor + tightened **presence-errors** filter. Bundle: `npm run test:phase497-presence`. See [PRESENCE.md](../../docs/PRESENCE.md).
|
||||
|
||||
@@ -5195,15 +5195,23 @@ class PearcordPlatform extends EventEmitter {
|
||||
throw new Error('no permission to manage roles')
|
||||
}
|
||||
await this._initGuildRoles(this.guild.guild.id)
|
||||
const prevRow = (await this.guildRoles.listRoles(this.guild.guild.id)).find(
|
||||
(r) => r.id === roleId
|
||||
)
|
||||
const previousPermissionMask = Number(prevRow?.permissions) || 0
|
||||
const row = await this.guildRoles.updateRole(this.guild.guild.id, roleId, patch)
|
||||
this.guild.gossipRoleUpsert(row)
|
||||
this.emit('guild-role', row)
|
||||
const permissionMask = Number(row?.permissions ?? patch.permissions) || 0
|
||||
span.end({
|
||||
roleId: row?.id || roleId,
|
||||
guildId,
|
||||
name: String(row?.name || patch.name || '').slice(0, 32),
|
||||
hasColor: patch.color !== undefined,
|
||||
permissionMask: Number(row?.permissions ?? patch.permissions) || 0,
|
||||
permissionMask,
|
||||
previousPermissionMask,
|
||||
permissionMaskChanged: patch.permissions !== undefined,
|
||||
permissionMaskDelta: permissionMask ^ previousPermissionMask,
|
||||
renamed: patch.name !== undefined,
|
||||
permissionsChanged: patch.permissions !== undefined,
|
||||
hoistChanged: patch.hoist !== undefined
|
||||
@@ -5484,6 +5492,12 @@ class PearcordPlatform extends EventEmitter {
|
||||
})
|
||||
if (!ch) throw new Error('channel not found')
|
||||
await this._initChannelPermissions(this.guild.guild.id)
|
||||
const prevOw = await this.channelPermissions.getOverwrite(
|
||||
this.guild.guild.id,
|
||||
chId,
|
||||
payload.targetType,
|
||||
payload.targetId
|
||||
)
|
||||
const allow =
|
||||
payload.allow !== undefined
|
||||
? Number(payload.allow) || 0
|
||||
@@ -5506,6 +5520,8 @@ class PearcordPlatform extends EventEmitter {
|
||||
await this._audit('channel.overwrite', { guildId: this.guild.guild.id, targetId: chId })
|
||||
this.emit('channel-overwrite', row)
|
||||
await this._fanoutAppEvent(APP_EVENTS.CHANNEL_PERMISSION_UPDATE, { overwrite: row })
|
||||
const previousAllowBits = Number(prevOw?.allow) || 0
|
||||
const previousDenyBits = Number(prevOw?.deny) || 0
|
||||
span.end({
|
||||
channelId: chId,
|
||||
guildId,
|
||||
@@ -5514,8 +5530,34 @@ class PearcordPlatform extends EventEmitter {
|
||||
allowBits: allow,
|
||||
denyBits: deny,
|
||||
allowNonZero: allow > 0,
|
||||
denyNonZero: deny > 0
|
||||
denyNonZero: deny > 0,
|
||||
replacedExisting: !!prevOw,
|
||||
previousAllowBits,
|
||||
previousDenyBits,
|
||||
allowChanged: previousAllowBits !== allow,
|
||||
denyChanged: previousDenyBits !== deny
|
||||
})
|
||||
const evalSpan = this.log.time('permission.eval', {
|
||||
channelId: chId,
|
||||
guildId,
|
||||
context: 'overwrite.upsert'
|
||||
})
|
||||
try {
|
||||
const granted = await this._hasPerm(PERMISSION.SEND_MESSAGES, chId)
|
||||
evalSpan.end({
|
||||
channelId: chId,
|
||||
guildId,
|
||||
granted,
|
||||
perm: 'sendMessages'
|
||||
})
|
||||
} catch (evalErr) {
|
||||
this.log.error('permission.eval error', {
|
||||
channelId: chId,
|
||||
guildId,
|
||||
error: evalErr?.message || String(evalErr)
|
||||
})
|
||||
evalSpan.fail(evalErr)
|
||||
}
|
||||
return row
|
||||
} catch (err) {
|
||||
this.log.error('permission.overwrite error', {
|
||||
@@ -5568,7 +5610,9 @@ class PearcordPlatform extends EventEmitter {
|
||||
guildId,
|
||||
targetType,
|
||||
targetId,
|
||||
deleted: !!prev
|
||||
deleted: !!prev,
|
||||
hadAllow: !!(Number(prev?.allow) || 0),
|
||||
hadDeny: !!(Number(prev?.deny) || 0)
|
||||
})
|
||||
return prev
|
||||
} catch (err) {
|
||||
|
||||
Reference in New Issue
Block a user