From 9b08550885ebb8380920ba9d4398495d93b1a9fa Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 19 Jan 2024 16:13:00 -0300 Subject: [PATCH] some beginnings of nip29 helpers. --- nip29.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 7 +++++- 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 nip29.ts diff --git a/nip29.ts b/nip29.ts new file mode 100644 index 0000000..55ab4e9 --- /dev/null +++ b/nip29.ts @@ -0,0 +1,60 @@ +import type { Event } from './pure' + +export type Group = { + id: string + name?: string + picture?: string + about?: string + relay?: string + public?: boolean + open?: boolean +} + +export function parseGroup(event: Event): Group { + const chan: Partial = {} + for (let i = 0; i < event.tags.length; i++) { + const tag = event.tags[i] + switch (tag[0]) { + case 'd': + chan.id = tag[1] || '' + break + case 'name': + chan.name = tag[1] || '' + break + case 'about': + chan.about = tag[1] || '' + break + case 'picture': + chan.picture = tag[1] || '' + break + case 'open': + chan.open = true + break + case 'public': + chan.public = true + break + } + } + return chan as Group +} + +export type Member = { + pubkey: string + label?: string + permissions: string[] +} + +export function parseMembers(event: Event): Member[] { + const members = [] + for (let i = 0; i < event.tags.length; i++) { + const tag = event.tags[i] + if (tag.length < 2) continue + if (tag[0] !== 'p') continue + if (!tag[1].match(/^[0-9a-f]{64}$/)) continue + const member: Member = { pubkey: tag[1], permissions: [] } + if (tag.length > 2) member.label = tag[2] + if (tag.length > 3) member.permissions = tag.slice(3) + members.push(member) + } + return members +} diff --git a/package.json b/package.json index 13be146..7cfb3f1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "type": "module", "name": "nostr-tools", - "version": "2.1.3", + "version": "2.1.4", "description": "Tools for making a Nostr client.", "repository": { "type": "git", @@ -130,6 +130,11 @@ "require": "./lib/cjs/nip28.js", "types": "./lib/types/nip28.d.ts" }, + "./nip29": { + "import": "./lib/esm/nip29.js", + "require": "./lib/cjs/nip29.js", + "types": "./lib/types/nip29.d.ts" + }, "./nip30": { "import": "./lib/esm/nip30.js", "require": "./lib/cjs/nip30.js",