import { MatrixEvent } from 'matrix-js-sdk'; import { PackAddress } from '../custom-emoji/PackAddress'; import { SoundboardClipReader } from './SoundboardClipReader'; import { SoundboardClipsReader } from './SoundboardClipsReader'; import { SoundboardMetaReader } from './SoundboardMetaReader'; import { SoundboardContent } from './types'; /** Parallels custom-emoji/ImagePack. Holds a soundboard pack's meta + clips. */ export class SoundboardPack { public readonly id: string; public readonly deleted: boolean; public readonly address: PackAddress | undefined; public readonly meta: SoundboardMetaReader; public readonly clips: SoundboardClipsReader; private clipsMemo: SoundboardClipReader[] | undefined; constructor(id: string, content: SoundboardContent, address: PackAddress | undefined) { this.id = id; this.address = address; this.deleted = content.pack === undefined && content.clips === undefined; this.meta = new SoundboardMetaReader(content.pack ?? {}); this.clips = new SoundboardClipsReader(content.clips ?? {}); } static fromMatrixEvent(id: string, matrixEvent: MatrixEvent): SoundboardPack { const roomId = matrixEvent.getRoomId(); const stateKey = matrixEvent.getStateKey(); const address = roomId && typeof stateKey === 'string' ? new PackAddress(roomId, stateKey) : undefined; return new SoundboardPack(id, matrixEvent.getContent(), address); } getClips(): SoundboardClipReader[] { if (this.clipsMemo) return this.clipsMemo; this.clipsMemo = Array.from(this.clips.collection.values()); return this.clipsMemo; } getAvatarUrl(): string | undefined { if (this.meta.avatar) return this.meta.avatar; return undefined; } }