79 lines
2.4 KiB
TypeScript
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(),
|
|
)
|
|
}
|