Files
welshman/packages/app/src/plugins/rooms.ts
T
Jon Staab 22a666d497
tests / tests (push) Failing after 5m17s
Format
2026-06-22 10:23:15 -07:00

79 lines
2.4 KiB
TypeScript

import {
RoomCreateBuilder,
RoomDeleteBuilder,
RoomEditBuilder,
RoomJoinBuilder,
RoomLeaveBuilder,
RoomAddMemberBuilder,
RoomRemoveMemberBuilder,
} from "@welshman/domain"
import {Thunks} from "./thunk.js"
import type {ThunkOptions} from "./thunk.js"
import type {IApp} from "../app.js"
// Room metadata used when publishing NIP-29 room events. `h` is the group id.
export type RoomMeta = {
h: string
name?: string
about?: string
picture?: string
pictureMeta?: string[]
isClosed?: boolean
isHidden?: boolean
isPrivate?: boolean
isRestricted?: boolean
livekit?: boolean
}
/**
* NIP-29 relay-based group (room) management. Each method publishes the relevant
* room event to the given relay as the app's user.
*/
export class Rooms {
constructor(readonly app: IApp) {}
private publish = (url: string, event: ThunkOptions["event"]) =>
this.app.use(Thunks).publish({event, relays: [url]})
create = async (url: string, room: RoomMeta) =>
this.publish(url, await new RoomCreateBuilder().setGroup(room.h).toTemplate())
delete = async (url: string, room: RoomMeta) =>
this.publish(url, await new RoomDeleteBuilder().setGroup(room.h).toTemplate())
edit = async (url: string, room: RoomMeta) => {
const builder = new RoomEditBuilder().setGroup(room.h)
if (room.name) builder.setName(room.name)
if (room.about) builder.setAbout(room.about)
if (room.picture) builder.setPicture(room.picture, room.pictureMeta)
builder
.setClosed(Boolean(room.isClosed))
.setHidden(Boolean(room.isHidden))
.setPrivate(Boolean(room.isPrivate))
.setRestricted(Boolean(room.isRestricted))
.setLivekit(Boolean(room.livekit))
return this.publish(url, await builder.toTemplate())
}
join = async (url: string, room: RoomMeta) =>
this.publish(url, await new RoomJoinBuilder().setGroup(room.h).toTemplate())
leave = async (url: string, room: RoomMeta) =>
this.publish(url, await new RoomLeaveBuilder().setGroup(room.h).toTemplate())
addMember = async (url: string, room: RoomMeta, pubkey: string) =>
this.publish(
url,
await new RoomAddMemberBuilder().setGroup(room.h).addPubkey(pubkey).toTemplate(),
)
removeMember = async (url: string, room: RoomMeta, pubkey: string) =>
this.publish(
url,
await new RoomRemoveMemberBuilder().setGroup(room.h).addPubkey(pubkey).toTemplate(),
)
}