@openclaw/buzz 2026.8.1-beta.2 → 2026.9.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapter.runtime-D0uEmTwf.js → adapter.runtime-DA6guOQ_.js} +5 -5
- package/dist/api.js +2 -2
- package/dist/{channel-CCmyE6Yq.js → channel-BulZqShF.js} +234 -270
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{directory-config-BXa3Vqzu.js → directory-config-BesCse0q.js} +1 -1
- package/dist/directory-contract-api.js +1 -1
- package/dist/qa-runner-api.js +2 -2
- package/dist/{room-membership-CNBlHjTj.js → room-membership-DSAkyE0a.js} +55 -5
- package/dist/setup-plugin-api.js +2 -2
- package/dist/{setup-surface-DCxlD2oY.js → setup-surface-BvQgEJ7O.js} +20 -42
- package/dist/{types-CPFsIZ5Z.js → types-BN_HOsnq.js} +18 -5
- package/node_modules/nostr-tools/lib/cjs/abstract-pool.js +7 -5
- package/node_modules/nostr-tools/lib/cjs/abstract-pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/abstract-relay.js +6 -4
- package/node_modules/nostr-tools/lib/cjs/abstract-relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/core.js +10 -6
- package/node_modules/nostr-tools/lib/cjs/core.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/index.js +17 -11
- package/node_modules/nostr-tools/lib/cjs/index.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/kinds.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/kinds.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip04.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip10.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip10.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip13.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip17.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip17.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip18.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip18.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip19.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip21.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip22.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip22.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip25.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip25.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip27.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip28.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip28.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip29.js +288 -12
- package/node_modules/nostr-tools/lib/cjs/nip29.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip44.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/nip45.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip45.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip46.js +9 -5
- package/node_modules/nostr-tools/lib/cjs/nip46.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip47.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip47.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip57.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip57.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip59.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip59.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nip98.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nip98.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nipb0.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nipb0.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/nipb7.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/nipb7.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/pool.js +9 -5
- package/node_modules/nostr-tools/lib/cjs/pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/pure.js +10 -6
- package/node_modules/nostr-tools/lib/cjs/pure.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/references.js.map +1 -1
- package/node_modules/nostr-tools/lib/cjs/relay.js +8 -4
- package/node_modules/nostr-tools/lib/cjs/relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/signer.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/signer.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/utils.js +2 -0
- package/node_modules/nostr-tools/lib/cjs/utils.js.map +2 -2
- package/node_modules/nostr-tools/lib/cjs/wasm.js +10 -6
- package/node_modules/nostr-tools/lib/cjs/wasm.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/abstract-pool.js +7 -5
- package/node_modules/nostr-tools/lib/esm/abstract-pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/abstract-relay.js +6 -4
- package/node_modules/nostr-tools/lib/esm/abstract-relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/core.js +10 -6
- package/node_modules/nostr-tools/lib/esm/core.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/index.js +17 -11
- package/node_modules/nostr-tools/lib/esm/index.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/kinds.js +2 -0
- package/node_modules/nostr-tools/lib/esm/kinds.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip04.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip10.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip10.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip13.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip17.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip17.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip18.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip18.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip19.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip21.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip22.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip22.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip25.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip25.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip27.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip28.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip28.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip29.js +288 -12
- package/node_modules/nostr-tools/lib/esm/nip29.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip44.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/nip45.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip45.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip46.js +9 -5
- package/node_modules/nostr-tools/lib/esm/nip46.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip47.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip47.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip57.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip57.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip59.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip59.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nip98.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nip98.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nipb0.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nipb0.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/nipb7.js +2 -0
- package/node_modules/nostr-tools/lib/esm/nipb7.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/pool.js +9 -5
- package/node_modules/nostr-tools/lib/esm/pool.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/pure.js +10 -6
- package/node_modules/nostr-tools/lib/esm/pure.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/references.js.map +1 -1
- package/node_modules/nostr-tools/lib/esm/relay.js +8 -4
- package/node_modules/nostr-tools/lib/esm/relay.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/signer.js +2 -0
- package/node_modules/nostr-tools/lib/esm/signer.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/utils.js +2 -0
- package/node_modules/nostr-tools/lib/esm/utils.js.map +2 -2
- package/node_modules/nostr-tools/lib/esm/wasm.js +10 -6
- package/node_modules/nostr-tools/lib/esm/wasm.js.map +2 -2
- package/node_modules/nostr-tools/lib/nostr.bundle.js +17 -11
- package/node_modules/nostr-tools/lib/nostr.bundle.js.map +2 -2
- package/node_modules/nostr-tools/lib/types/core.d.ts +5 -0
- package/node_modules/nostr-tools/lib/types/nip29.d.ts +243 -3
- package/node_modules/nostr-tools/lib/types/nip29.test.d.ts +1 -0
- package/node_modules/nostr-tools/package.json +1 -1
- package/openclaw.plugin.json +24 -0
- package/package.json +5 -5
|
@@ -23,23 +23,45 @@ __export(nip29_exports, {
|
|
|
23
23
|
GroupAdminPermission: () => GroupAdminPermission,
|
|
24
24
|
encodeGroupReference: () => encodeGroupReference,
|
|
25
25
|
fetchGroupAdminsEvent: () => fetchGroupAdminsEvent,
|
|
26
|
+
fetchGroupLivekitParticipantsEvent: () => fetchGroupLivekitParticipantsEvent,
|
|
26
27
|
fetchGroupMembersEvent: () => fetchGroupMembersEvent,
|
|
27
28
|
fetchGroupMetadataEvent: () => fetchGroupMetadataEvent,
|
|
29
|
+
fetchGroupPinnedEventsEvent: () => fetchGroupPinnedEventsEvent,
|
|
30
|
+
fetchGroupRolesEvent: () => fetchGroupRolesEvent,
|
|
28
31
|
fetchRelayInformationByGroupReference: () => fetchRelayInformationByGroupReference,
|
|
32
|
+
generateCreateGroupEventTemplate: () => generateCreateGroupEventTemplate,
|
|
33
|
+
generateCreateInviteEventTemplate: () => generateCreateInviteEventTemplate,
|
|
34
|
+
generateDeleteEventEventTemplate: () => generateDeleteEventEventTemplate,
|
|
35
|
+
generateDeleteGroupEventTemplate: () => generateDeleteGroupEventTemplate,
|
|
36
|
+
generateEditGroupMetadataEventTemplate: () => generateEditGroupMetadataEventTemplate,
|
|
29
37
|
generateGroupAdminsEventTemplate: () => generateGroupAdminsEventTemplate,
|
|
38
|
+
generateGroupJoinRequestEventTemplate: () => generateGroupJoinRequestEventTemplate,
|
|
39
|
+
generateGroupLeaveRequestEventTemplate: () => generateGroupLeaveRequestEventTemplate,
|
|
40
|
+
generateGroupLivekitParticipantsEventTemplate: () => generateGroupLivekitParticipantsEventTemplate,
|
|
30
41
|
generateGroupMembersEventTemplate: () => generateGroupMembersEventTemplate,
|
|
31
42
|
generateGroupMetadataEventTemplate: () => generateGroupMetadataEventTemplate,
|
|
43
|
+
generateGroupPinnedEventsEventTemplate: () => generateGroupPinnedEventsEventTemplate,
|
|
44
|
+
generateGroupRolesEventTemplate: () => generateGroupRolesEventTemplate,
|
|
45
|
+
generatePutUserEventTemplate: () => generatePutUserEventTemplate,
|
|
46
|
+
generateRemoveUserEventTemplate: () => generateRemoveUserEventTemplate,
|
|
47
|
+
generateUpdatePinListEventTemplate: () => generateUpdatePinListEventTemplate,
|
|
32
48
|
getNormalizedRelayURLByGroupReference: () => getNormalizedRelayURLByGroupReference,
|
|
33
49
|
loadGroup: () => loadGroup,
|
|
34
50
|
loadGroupFromCode: () => loadGroupFromCode,
|
|
35
51
|
parseGroupAdminsEvent: () => parseGroupAdminsEvent,
|
|
36
52
|
parseGroupCode: () => parseGroupCode,
|
|
53
|
+
parseGroupLivekitParticipantsEvent: () => parseGroupLivekitParticipantsEvent,
|
|
37
54
|
parseGroupMembersEvent: () => parseGroupMembersEvent,
|
|
38
55
|
parseGroupMetadataEvent: () => parseGroupMetadataEvent,
|
|
56
|
+
parseGroupPinnedEventsEvent: () => parseGroupPinnedEventsEvent,
|
|
57
|
+
parseGroupRolesEvent: () => parseGroupRolesEvent,
|
|
39
58
|
subscribeRelayGroupsMetadataEvents: () => subscribeRelayGroupsMetadataEvents,
|
|
40
59
|
validateGroupAdminsEvent: () => validateGroupAdminsEvent,
|
|
60
|
+
validateGroupLivekitParticipantsEvent: () => validateGroupLivekitParticipantsEvent,
|
|
41
61
|
validateGroupMembersEvent: () => validateGroupMembersEvent,
|
|
42
|
-
validateGroupMetadataEvent: () => validateGroupMetadataEvent
|
|
62
|
+
validateGroupMetadataEvent: () => validateGroupMetadataEvent,
|
|
63
|
+
validateGroupPinnedEventsEvent: () => validateGroupPinnedEventsEvent,
|
|
64
|
+
validateGroupRolesEvent: () => validateGroupRolesEvent
|
|
43
65
|
});
|
|
44
66
|
module.exports = __toCommonJS(nip29_exports);
|
|
45
67
|
|
|
@@ -196,20 +218,33 @@ var GroupAdminPermission = /* @__PURE__ */ ((GroupAdminPermission2) => {
|
|
|
196
218
|
GroupAdminPermission2["CreateGroup"] = "create-group";
|
|
197
219
|
GroupAdminPermission2["DeleteGroup"] = "delete-group";
|
|
198
220
|
GroupAdminPermission2["CreateInvite"] = "create-invite";
|
|
221
|
+
GroupAdminPermission2["UpdatePinList"] = "update-pin-list";
|
|
199
222
|
return GroupAdminPermission2;
|
|
200
223
|
})(GroupAdminPermission || {});
|
|
224
|
+
function buildGroupMetadataTags(metadata) {
|
|
225
|
+
const tags = [];
|
|
226
|
+
metadata.name && tags.push(["name", metadata.name]);
|
|
227
|
+
metadata.picture && tags.push(["picture", metadata.picture]);
|
|
228
|
+
metadata.banner && tags.push(["banner", metadata.banner]);
|
|
229
|
+
metadata.about && tags.push(["about", metadata.about]);
|
|
230
|
+
metadata.isPrivate && tags.push(["private"]);
|
|
231
|
+
metadata.isRestricted && tags.push(["restricted"]);
|
|
232
|
+
metadata.isHidden && tags.push(["hidden"]);
|
|
233
|
+
metadata.isClosed && tags.push(["closed"]);
|
|
234
|
+
metadata.hasLiveKit && tags.push(["livekit"]);
|
|
235
|
+
metadata.supportedKinds && metadata.supportedKinds.length > 0 && tags.push(["supported_kinds", ...metadata.supportedKinds]);
|
|
236
|
+
metadata.parent && tags.push(["parent", metadata.parent]);
|
|
237
|
+
metadata.children && metadata.children.forEach((child) => {
|
|
238
|
+
tags.push(["child", child]);
|
|
239
|
+
});
|
|
240
|
+
return tags;
|
|
241
|
+
}
|
|
201
242
|
function generateGroupMetadataEventTemplate(group) {
|
|
202
|
-
const tags = [["d", group.metadata.id]];
|
|
203
|
-
group.metadata.name && tags.push(["name", group.metadata.name]);
|
|
204
|
-
group.metadata.picture && tags.push(["picture", group.metadata.picture]);
|
|
205
|
-
group.metadata.about && tags.push(["about", group.metadata.about]);
|
|
206
|
-
group.metadata.isPublic && tags.push(["public"]);
|
|
207
|
-
group.metadata.isOpen && tags.push(["open"]);
|
|
208
243
|
return {
|
|
209
244
|
content: "",
|
|
210
245
|
created_at: Math.floor(Date.now() / 1e3),
|
|
211
246
|
kind: 39e3,
|
|
212
|
-
tags
|
|
247
|
+
tags: [["d", group.metadata.id], ...buildGroupMetadataTags(group.metadata)]
|
|
213
248
|
};
|
|
214
249
|
}
|
|
215
250
|
function validateGroupMetadataEvent(event) {
|
|
@@ -324,17 +359,38 @@ function parseGroupMetadataEvent(event) {
|
|
|
324
359
|
case "picture":
|
|
325
360
|
metadata.picture = value;
|
|
326
361
|
break;
|
|
362
|
+
case "banner":
|
|
363
|
+
metadata.banner = value;
|
|
364
|
+
break;
|
|
327
365
|
case "about":
|
|
328
366
|
metadata.about = value;
|
|
329
367
|
break;
|
|
330
|
-
case "
|
|
331
|
-
metadata.
|
|
368
|
+
case "private":
|
|
369
|
+
metadata.isPrivate = true;
|
|
370
|
+
break;
|
|
371
|
+
case "restricted":
|
|
372
|
+
metadata.isRestricted = true;
|
|
373
|
+
break;
|
|
374
|
+
case "hidden":
|
|
375
|
+
metadata.isHidden = true;
|
|
376
|
+
break;
|
|
377
|
+
case "closed":
|
|
378
|
+
metadata.isClosed = true;
|
|
379
|
+
break;
|
|
380
|
+
case "livekit":
|
|
381
|
+
metadata.hasLiveKit = true;
|
|
332
382
|
break;
|
|
333
|
-
case "
|
|
334
|
-
metadata.
|
|
383
|
+
case "parent":
|
|
384
|
+
metadata.parent = value;
|
|
335
385
|
break;
|
|
336
386
|
}
|
|
337
387
|
}
|
|
388
|
+
const supportedKinds = event.tags.filter(([tag]) => tag === "supported_kinds").flatMap(([, ...values]) => values);
|
|
389
|
+
if (supportedKinds.length > 0)
|
|
390
|
+
metadata.supportedKinds = supportedKinds;
|
|
391
|
+
const children = event.tags.filter(([tag]) => tag === "child").map(([, value]) => value);
|
|
392
|
+
if (children.length > 0)
|
|
393
|
+
metadata.children = children;
|
|
338
394
|
return metadata;
|
|
339
395
|
}
|
|
340
396
|
async function fetchGroupAdminsEvent({
|
|
@@ -394,6 +450,69 @@ async function fetchGroupMembersEvent({
|
|
|
394
450
|
throw new Error(`members for group '${groupReference.id}' not found on ${normalizedRelayURL}`);
|
|
395
451
|
return groupMembersEvent;
|
|
396
452
|
}
|
|
453
|
+
async function fetchGroupRolesEvent({
|
|
454
|
+
pool,
|
|
455
|
+
groupReference,
|
|
456
|
+
relayInformation,
|
|
457
|
+
normalizedRelayURL
|
|
458
|
+
}) {
|
|
459
|
+
if (!normalizedRelayURL) {
|
|
460
|
+
normalizedRelayURL = getNormalizedRelayURLByGroupReference(groupReference);
|
|
461
|
+
}
|
|
462
|
+
if (!relayInformation) {
|
|
463
|
+
relayInformation = await fetchRelayInformation(normalizedRelayURL);
|
|
464
|
+
}
|
|
465
|
+
const groupRolesEvent = await pool.get([normalizedRelayURL], {
|
|
466
|
+
kinds: [39003],
|
|
467
|
+
authors: [relayInformation.pubkey],
|
|
468
|
+
"#d": [groupReference.id]
|
|
469
|
+
});
|
|
470
|
+
if (!groupRolesEvent)
|
|
471
|
+
throw new Error(`roles for group '${groupReference.id}' not found on ${normalizedRelayURL}`);
|
|
472
|
+
return groupRolesEvent;
|
|
473
|
+
}
|
|
474
|
+
async function fetchGroupLivekitParticipantsEvent({
|
|
475
|
+
pool,
|
|
476
|
+
groupReference,
|
|
477
|
+
relayInformation,
|
|
478
|
+
normalizedRelayURL
|
|
479
|
+
}) {
|
|
480
|
+
if (!normalizedRelayURL) {
|
|
481
|
+
normalizedRelayURL = getNormalizedRelayURLByGroupReference(groupReference);
|
|
482
|
+
}
|
|
483
|
+
if (!relayInformation) {
|
|
484
|
+
relayInformation = await fetchRelayInformation(normalizedRelayURL);
|
|
485
|
+
}
|
|
486
|
+
const groupLivekitParticipantsEvent = await pool.get([normalizedRelayURL], {
|
|
487
|
+
kinds: [39004],
|
|
488
|
+
authors: [relayInformation.pubkey],
|
|
489
|
+
"#d": [groupReference.id]
|
|
490
|
+
});
|
|
491
|
+
if (!groupLivekitParticipantsEvent)
|
|
492
|
+
throw new Error(`livekit participants for group '${groupReference.id}' not found on ${normalizedRelayURL}`);
|
|
493
|
+
return groupLivekitParticipantsEvent;
|
|
494
|
+
}
|
|
495
|
+
async function fetchGroupPinnedEventsEvent({
|
|
496
|
+
pool,
|
|
497
|
+
groupReference,
|
|
498
|
+
relayInformation,
|
|
499
|
+
normalizedRelayURL
|
|
500
|
+
}) {
|
|
501
|
+
if (!normalizedRelayURL) {
|
|
502
|
+
normalizedRelayURL = getNormalizedRelayURLByGroupReference(groupReference);
|
|
503
|
+
}
|
|
504
|
+
if (!relayInformation) {
|
|
505
|
+
relayInformation = await fetchRelayInformation(normalizedRelayURL);
|
|
506
|
+
}
|
|
507
|
+
const groupPinnedEventsEvent = await pool.get([normalizedRelayURL], {
|
|
508
|
+
kinds: [39005],
|
|
509
|
+
authors: [relayInformation.pubkey],
|
|
510
|
+
"#d": [groupReference.id]
|
|
511
|
+
});
|
|
512
|
+
if (!groupPinnedEventsEvent)
|
|
513
|
+
throw new Error(`pinned events for group '${groupReference.id}' not found on ${normalizedRelayURL}`);
|
|
514
|
+
return groupPinnedEventsEvent;
|
|
515
|
+
}
|
|
397
516
|
function parseGroupMembersEvent(event) {
|
|
398
517
|
if (!validateGroupMembersEvent(event))
|
|
399
518
|
throw new Error("invalid group members event");
|
|
@@ -408,6 +527,163 @@ function parseGroupMembersEvent(event) {
|
|
|
408
527
|
}
|
|
409
528
|
return members;
|
|
410
529
|
}
|
|
530
|
+
function generateGroupRolesEventTemplate(group, roles) {
|
|
531
|
+
const tags = [["d", group.metadata.id]];
|
|
532
|
+
for (const role of roles) {
|
|
533
|
+
const tag = ["role", role.name];
|
|
534
|
+
role.description && tag.push(role.description);
|
|
535
|
+
tags.push(tag);
|
|
536
|
+
}
|
|
537
|
+
return {
|
|
538
|
+
content: "",
|
|
539
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
540
|
+
kind: 39003,
|
|
541
|
+
tags
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
function validateGroupRolesEvent(event) {
|
|
545
|
+
if (event.kind !== 39003)
|
|
546
|
+
return false;
|
|
547
|
+
const requiredTags = ["d"];
|
|
548
|
+
for (const tag of requiredTags) {
|
|
549
|
+
if (!event.tags.find(([t]) => t == tag))
|
|
550
|
+
return false;
|
|
551
|
+
}
|
|
552
|
+
return true;
|
|
553
|
+
}
|
|
554
|
+
function parseGroupRolesEvent(event) {
|
|
555
|
+
if (!validateGroupRolesEvent(event))
|
|
556
|
+
throw new Error("invalid group roles event");
|
|
557
|
+
const roles = [];
|
|
558
|
+
for (const [tag, name, description] of event.tags) {
|
|
559
|
+
if (tag !== "role")
|
|
560
|
+
continue;
|
|
561
|
+
roles.push({ name, description });
|
|
562
|
+
}
|
|
563
|
+
return roles;
|
|
564
|
+
}
|
|
565
|
+
function generateGroupLivekitParticipantsEventTemplate(group, participants) {
|
|
566
|
+
const tags = [["d", group.metadata.id]];
|
|
567
|
+
participants.forEach((pubkey) => {
|
|
568
|
+
tags.push(["participant", pubkey]);
|
|
569
|
+
});
|
|
570
|
+
return {
|
|
571
|
+
content: "",
|
|
572
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
573
|
+
kind: 39004,
|
|
574
|
+
tags
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
function validateGroupLivekitParticipantsEvent(event) {
|
|
578
|
+
if (event.kind !== 39004)
|
|
579
|
+
return false;
|
|
580
|
+
const requiredTags = ["d"];
|
|
581
|
+
for (const tag of requiredTags) {
|
|
582
|
+
if (!event.tags.find(([t]) => t == tag))
|
|
583
|
+
return false;
|
|
584
|
+
}
|
|
585
|
+
return true;
|
|
586
|
+
}
|
|
587
|
+
function parseGroupLivekitParticipantsEvent(event) {
|
|
588
|
+
if (!validateGroupLivekitParticipantsEvent(event))
|
|
589
|
+
throw new Error("invalid group livekit participants event");
|
|
590
|
+
return event.tags.filter(([tag]) => tag === "participant").map(([, pubkey]) => pubkey);
|
|
591
|
+
}
|
|
592
|
+
function generateGroupPinnedEventsEventTemplate(group, pinnedEvents) {
|
|
593
|
+
const tags = [["d", group.metadata.id]];
|
|
594
|
+
pinnedEvents.forEach((pinnedEvent) => {
|
|
595
|
+
tags.push([pinnedEvent.type, pinnedEvent.value]);
|
|
596
|
+
});
|
|
597
|
+
return {
|
|
598
|
+
content: "",
|
|
599
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
600
|
+
kind: 39005,
|
|
601
|
+
tags
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
function validateGroupPinnedEventsEvent(event) {
|
|
605
|
+
if (event.kind !== 39005)
|
|
606
|
+
return false;
|
|
607
|
+
const requiredTags = ["d"];
|
|
608
|
+
for (const tag of requiredTags) {
|
|
609
|
+
if (!event.tags.find(([t]) => t == tag))
|
|
610
|
+
return false;
|
|
611
|
+
}
|
|
612
|
+
return true;
|
|
613
|
+
}
|
|
614
|
+
function parseGroupPinnedEventsEvent(event) {
|
|
615
|
+
if (!validateGroupPinnedEventsEvent(event))
|
|
616
|
+
throw new Error("invalid group pinned events event");
|
|
617
|
+
const pinnedEvents = [];
|
|
618
|
+
for (const [tag, value] of event.tags) {
|
|
619
|
+
if (tag !== "e" && tag !== "a")
|
|
620
|
+
continue;
|
|
621
|
+
pinnedEvents.push({ type: tag, value });
|
|
622
|
+
}
|
|
623
|
+
return pinnedEvents;
|
|
624
|
+
}
|
|
625
|
+
function generateGroupModerationEventTemplate(kind, groupId, content, tags, previous) {
|
|
626
|
+
const allTags = [["h", groupId], ...tags];
|
|
627
|
+
previous && previous.length > 0 && allTags.push(["previous", ...previous]);
|
|
628
|
+
return {
|
|
629
|
+
content,
|
|
630
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
631
|
+
kind,
|
|
632
|
+
tags: allTags
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
function generatePutUserEventTemplate(groupId, pubkey, roles, reason, previous) {
|
|
636
|
+
return generateGroupModerationEventTemplate(9e3, groupId, reason || "", [["p", pubkey, ...roles || []]], previous);
|
|
637
|
+
}
|
|
638
|
+
function generateRemoveUserEventTemplate(groupId, pubkey, reason, previous) {
|
|
639
|
+
return generateGroupModerationEventTemplate(9001, groupId, reason || "", [["p", pubkey]], previous);
|
|
640
|
+
}
|
|
641
|
+
function generateEditGroupMetadataEventTemplate(group, reason, previous) {
|
|
642
|
+
return generateGroupModerationEventTemplate(
|
|
643
|
+
9002,
|
|
644
|
+
group.metadata.id,
|
|
645
|
+
reason || "",
|
|
646
|
+
buildGroupMetadataTags(group.metadata),
|
|
647
|
+
previous
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
function generateDeleteEventEventTemplate(groupId, eventId, reason, previous) {
|
|
651
|
+
return generateGroupModerationEventTemplate(9005, groupId, reason || "", [["e", eventId]], previous);
|
|
652
|
+
}
|
|
653
|
+
function generateCreateGroupEventTemplate(groupId, reason, previous) {
|
|
654
|
+
return generateGroupModerationEventTemplate(9007, groupId, reason || "", [], previous);
|
|
655
|
+
}
|
|
656
|
+
function generateDeleteGroupEventTemplate(groupId, reason, previous) {
|
|
657
|
+
return generateGroupModerationEventTemplate(9008, groupId, reason || "", [], previous);
|
|
658
|
+
}
|
|
659
|
+
function generateCreateInviteEventTemplate(groupId, code, reason, previous) {
|
|
660
|
+
return generateGroupModerationEventTemplate(9009, groupId, reason || "", [["code", code]], previous);
|
|
661
|
+
}
|
|
662
|
+
function generateUpdatePinListEventTemplate(groupId, pinnedEvents, reason, previous) {
|
|
663
|
+
const tags = pinnedEvents.map((pinnedEvent) => [pinnedEvent.type, pinnedEvent.value]);
|
|
664
|
+
return generateGroupModerationEventTemplate(9010, groupId, reason || "", tags, previous);
|
|
665
|
+
}
|
|
666
|
+
function generateGroupJoinRequestEventTemplate(groupId, inviteCode, reason, previous) {
|
|
667
|
+
const tags = [["h", groupId]];
|
|
668
|
+
inviteCode && tags.push(["code", inviteCode]);
|
|
669
|
+
previous && previous.length > 0 && tags.push(["previous", ...previous]);
|
|
670
|
+
return {
|
|
671
|
+
content: reason || "",
|
|
672
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
673
|
+
kind: 9021,
|
|
674
|
+
tags
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
function generateGroupLeaveRequestEventTemplate(groupId, reason, previous) {
|
|
678
|
+
const tags = [["h", groupId]];
|
|
679
|
+
previous && previous.length > 0 && tags.push(["previous", ...previous]);
|
|
680
|
+
return {
|
|
681
|
+
content: reason || "",
|
|
682
|
+
created_at: Math.floor(Date.now() / 1e3),
|
|
683
|
+
kind: 9022,
|
|
684
|
+
tags
|
|
685
|
+
};
|
|
686
|
+
}
|
|
411
687
|
async function loadGroup({
|
|
412
688
|
pool,
|
|
413
689
|
groupReference,
|