diff --git a/package.json b/package.json index d19b9fb..48f3f4a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@welshman", "private": true, - "version": "0.3.5", + "version": "0.3.6", "workspaces": [ "packages/*" ], diff --git a/packages/app/package.json b/packages/app/package.json index 64f7d17..1237eb1 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/app", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of svelte stores for use in building nostr client applications.", diff --git a/packages/app/src/commands.ts b/packages/app/src/commands.ts index 65cff3b..37cfe45 100644 --- a/packages/app/src/commands.ts +++ b/packages/app/src/commands.ts @@ -10,6 +10,11 @@ import { getListTags, getRelayTags, makeList, + makeRoomCreateEvent, + makeRoomDeleteEvent, + makeRoomEditEvent, + makeRoomJoinEvent, + makeRoomLeaveEvent, RelayMode, INBOX_RELAYS, FOLLOWS, @@ -17,6 +22,7 @@ import { MUTES, PINS, } from "@welshman/util" +import type {RoomMeta} from "@welshman/util" import {Nip59, stamp} from "@welshman/signer" import {Router, addMaximalFallbacks} from "@welshman/router" import { @@ -29,6 +35,8 @@ import { import {nip44EncryptToSelf, signer} from "./session.js" import {ThunkOptions, MergedThunk, publishThunk} from "./thunk.js" +// NIP 65 + export const removeRelay = async (url: string, mode: RelayMode) => { const list = get(userRelaySelections) || makeList({kind: RELAYS}) const dup = getRelayTags(getListTags(list)).find(nthEq(1, url)) @@ -60,6 +68,8 @@ export const addRelay = async (url: string, mode: RelayMode) => { return publishThunk({event, relays}) } +// NIP 17 + export const removeInboxRelay = async (url: string) => { const list = get(userInboxRelaySelections) || makeList({kind: INBOX_RELAYS}) const event = await removeFromList(list, url).reconcile(nip44EncryptToSelf) @@ -76,6 +86,8 @@ export const addInboxRelay = async (url: string) => { return publishThunk({event, relays}) } +// NIP 02 + export const unfollow = async (value: string) => { const list = get(userFollows) || makeList({kind: FOLLOWS}) const event = await removeFromList(list, value).reconcile(nip44EncryptToSelf) @@ -124,6 +136,8 @@ export const pin = async (tag: string[]) => { return publishThunk({event, relays}) } +// NIP 59 + export type SendWrappedOptions = Omit & { template: EventTemplate pubkeys: string[] @@ -145,6 +159,8 @@ export const sendWrapped = async ({template, pubkeys, ...options}: SendWrappedOp ) } +// NIP 86 + export const manageRelay = async (url: string, request: ManagementRequest) => { url = url.replace(/^ws/, "http") @@ -153,3 +169,20 @@ export const manageRelay = async (url: string, request: ManagementRequest) => { return sendManagementRequest(url, request, authEvent) } + +// NIP 29 + +export const createRoom = (url: string, room: RoomMeta) => + publishThunk({event: makeRoomCreateEvent(room), relays: [url]}) + +export const deleteRoom = (url: string, room: RoomMeta) => + publishThunk({event: makeRoomDeleteEvent(room), relays: [url]}) + +export const editRoom = (url: string, room: RoomMeta) => + publishThunk({event: makeRoomEditEvent(room), relays: [url]}) + +export const joinRoom = (url: string, room: RoomMeta) => + publishThunk({event: makeRoomJoinEvent(room), relays: [url]}) + +export const leaveRoom = (url: string, room: RoomMeta) => + publishThunk({event: makeRoomLeaveEvent(room), relays: [url]}) diff --git a/packages/content/package.json b/packages/content/package.json index 9701175..5e8c39f 100644 --- a/packages/content/package.json +++ b/packages/content/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/content", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities for parsing nostr note content.", diff --git a/packages/editor/package.json b/packages/editor/package.json index e54e999..2257778 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/editor", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A batteries-included nostr editor.", diff --git a/packages/editor/src/extensions/Welshman.ts b/packages/editor/src/extensions/Welshman.ts index 3ba6eb2..75f4d4d 100644 --- a/packages/editor/src/extensions/Welshman.ts +++ b/packages/editor/src/extensions/Welshman.ts @@ -19,7 +19,7 @@ import type { ImageOptions, LinkOptions, NSecRejectOptions, -} from "nostr-editor-coracle-workaround" +} from "nostr-editor" import { NostrExtension, Bolt11Extension, @@ -32,7 +32,7 @@ import { TagExtension, VideoExtension, NSecRejectExtension, -} from "nostr-editor-coracle-workaround" +} from "nostr-editor" import {WordCount} from "./WordCount.js" import {CodeInline, type CodeInlineOptions} from "./CodeInline.js" import {BreakOrSubmit, type BreakOrSubmitOptions} from "./BreakOrSubmit.js" diff --git a/packages/editor/src/index.ts b/packages/editor/src/index.ts index 6cbec8e..01cad3f 100644 --- a/packages/editor/src/index.ts +++ b/packages/editor/src/index.ts @@ -2,4 +2,4 @@ export * from "./nodeviews/index.js" export * from "./extensions/index.js" export * from "./plugins/index.js" export {Editor, NodeViewProps} from "@tiptap/core" -export {UploadTask, FileAttributes} from "nostr-editor-coracle-workaround" +export {UploadTask, FileAttributes} from "nostr-editor" diff --git a/packages/editor/src/plugins/TippySuggestion.ts b/packages/editor/src/plugins/TippySuggestion.ts index 9a2222c..4aa57d4 100644 --- a/packages/editor/src/plugins/TippySuggestion.ts +++ b/packages/editor/src/plugins/TippySuggestion.ts @@ -2,7 +2,7 @@ import type {Instance} from "tippy.js" import tippy from "tippy.js" import {nprofileEncode} from "nostr-tools/nip19" import type {Editor} from "@tiptap/core" -import {makeNProfileAttrs} from "nostr-editor-coracle-workaround" +import {makeNProfileAttrs} from "nostr-editor" import {PluginKey} from "@tiptap/pm/state" import Suggestion from "@tiptap/suggestion" import {throttle, enumerate, clamp} from "@welshman/lib" diff --git a/packages/feeds/package.json b/packages/feeds/package.json index 9093989..318831e 100644 --- a/packages/feeds/package.json +++ b/packages/feeds/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/feeds", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "Utilities for building dynamic nostr feeds.", diff --git a/packages/lib/package.json b/packages/lib/package.json index d09507d..0e78444 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/lib", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities.", diff --git a/packages/net/package.json b/packages/net/package.json index d97b7a9..aaa1050 100644 --- a/packages/net/package.json +++ b/packages/net/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/net", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "Utilities for connecting with nostr relays.", diff --git a/packages/relay/package.json b/packages/relay/package.json index 192d591..6f09206 100644 --- a/packages/relay/package.json +++ b/packages/relay/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/relay", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "An in-memory nostr relay implementation.", diff --git a/packages/router/package.json b/packages/router/package.json index 1458b8d..d2b1daa 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/router", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities for nostr relay selection.", diff --git a/packages/signer/package.json b/packages/signer/package.json index 444840c..3c71a45 100644 --- a/packages/signer/package.json +++ b/packages/signer/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/signer", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A nostr signer implemenation supporting several login methods.", diff --git a/packages/store/package.json b/packages/store/package.json index 7be549d..c8c8896 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/store", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of utilities based on svelte/store for use with welshman", diff --git a/packages/util/package.json b/packages/util/package.json index f19ad74..3fd5269 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@welshman/util", - "version": "0.3.5", + "version": "0.3.6", "author": "hodlbod", "license": "MIT", "description": "A collection of nostr-related utilities.", diff --git a/packages/util/src/Kinds.ts b/packages/util/src/Kinds.ts index 6748235..7d2e3ba 100644 --- a/packages/util/src/Kinds.ts +++ b/packages/util/src/Kinds.ts @@ -106,16 +106,17 @@ export const DVM_RESPONSE_OTS = 6900 export const DVM_RESPONSE_OP_RETURN = 6901 export const DVM_RESPONSE_PUBLISH_SCHEDULE = 6905 export const DVM_FEEDBACK = 7000 -export const GROUP_ADD_USER = 9000 -export const GROUP_REMOVE_USER = 9001 -export const GROUP_EDIT_META = 9002 -export const GROUP_ADD_PERM = 9003 -export const GROUP_REMOVE_PERM = 9004 -export const GROUP_DELETE_EVENT = 9005 -export const GROUP_EDIT_STATUS = 9006 -export const GROUP_CREATE = 9007 -export const GROUP_JOIN = 9021 -export const GROUP_LEAVE = 9022 +export const ROOM_ADD_USER = 9000 +export const ROOM_REMOVE_USER = 9001 +export const ROOM_EDIT_META = 9002 +export const ROOM_ADD_PERM = 9003 +export const ROOM_REMOVE_PERM = 9004 +export const ROOM_DELETE_EVENT = 9005 +export const ROOM_EDIT_STATUS = 9006 +export const ROOM_CREATE = 9007 +export const ROOM_DELETE = 9008 +export const ROOM_JOIN = 9021 +export const ROOM_LEAVE = 9022 export const ZAP_GOAL = 9041 export const ZAP_REQUEST = 9734 export const ZAP_RESPONSE = 9735 @@ -128,7 +129,7 @@ export const COMMUNITIES = 10004 export const CHANNELS = 10005 export const BLOCKED_RELAYS = 10006 export const SEARCH_RELAYS = 10007 -export const GROUPS = 10009 +export const ROOMS = 10009 export const FEEDS = 10014 export const TOPICS = 10015 export const EMOJIS = 10030 @@ -178,9 +179,9 @@ export const EVENT_RSVP = 31925 export const HANDLER_RECOMMENDATION = 31989 export const HANDLER_INFORMATION = 31990 export const COMMUNITY = 34550 -export const GROUP = 35834 -export const GROUP_META = 39000 -export const GROUP_ADMINS = 39001 +export const ROOM = 35834 +export const ROOM_META = 39000 +export const ROOM_ADMINS = 39001 export const DEPRECATED_RELAY_RECOMMENDATION = 2 export const DEPRECATED_DIRECT_MESSAGE = 4 diff --git a/packages/util/src/Room.ts b/packages/util/src/Room.ts new file mode 100644 index 0000000..d27b93b --- /dev/null +++ b/packages/util/src/Room.ts @@ -0,0 +1,56 @@ +import {randomId, nthNe} from "@welshman/lib" +import { + ROOM_META, + ROOM_DELETE, + ROOM_CREATE, + ROOM_EDIT_META, + ROOM_JOIN, + ROOM_LEAVE, +} from "./Kinds.js" +import {makeEvent, TrustedEvent, getIdentifier} from "./Events.js" + +export type RoomMeta = { + id: string + tags: string[][] + event?: TrustedEvent +} + +export type PublishedRoomMeta = Omit & { + event: TrustedEvent +} + +export const makeRoomMeta = (room: Partial = {}): RoomMeta => ({ + id: randomId(), + tags: [], + ...room, +}) + +export const readRoomMeta = (event: TrustedEvent): PublishedRoomMeta => { + if (event.kind !== ROOM_META) { + throw new Error("Invalid group meta event") + } + + const id = getIdentifier(event) + + if (!id) { + throw new Error("Group meta event had no d tag") + } + + const tags = event.tags.filter(nthNe(0, "d")) + + return {id, tags, event} +} + +export const makeRoomCreateEvent = (room: RoomMeta) => + makeEvent(ROOM_CREATE, {tags: [["h", room.id]]}) + +export const makeRoomDeleteEvent = (room: RoomMeta) => + makeEvent(ROOM_DELETE, {tags: [["h", room.id]]}) + +export const makeRoomEditEvent = (room: RoomMeta) => + makeEvent(ROOM_EDIT_META, {tags: [["h", room.id], ...room.tags]}) + +export const makeRoomJoinEvent = (room: RoomMeta) => makeEvent(ROOM_JOIN, {tags: [["h", room.id]]}) + +export const makeRoomLeaveEvent = (room: RoomMeta) => + makeEvent(ROOM_LEAVE, {tags: [["h", room.id]]}) diff --git a/packages/util/src/index.ts b/packages/util/src/index.ts index e92c46b..d44d606 100644 --- a/packages/util/src/index.ts +++ b/packages/util/src/index.ts @@ -12,5 +12,6 @@ export * from "./Nip86.js" export * from "./Nip98.js" export * from "./Profile.js" export * from "./Relay.js" +export * from "./Room.js" export * from "./Tags.js" export * from "./Zaps.js"