feat(soundboard): shared room/space packs (like emoji/stickers), grid picker, management
CI / Build & Quality Checks (push) Successful in 10m56s
CI / Trigger Desktop Build (push) Successful in 8s

Soundboard v2 — a near-parallel of the custom-emoji image-pack system for
in-call audio clips.

- Data model: 3-tier packs mirroring MSC2545 — room/space pack (state event
  io.lotus.soundboard, inherited by child rooms via parent-space aggregation),
  global refs (io.lotus.soundboard_rooms), and the personal pack
  (io.lotus.soundboard account data; the v1 flat-list content is migrated to the
  pack shape on read). New plugins/soundboard/ (readers, SoundboardPack, utils) +
  hooks/useSoundboardPacks (useRelevantSoundboardPacks = user U global U room,
  deduped). Unit-tested (migration + slug).
- Management: reusable SoundboardPackEditor (name + emoji + per-clip volume +
  delete + upload + batched save), power-level-gated for room packs like emoji
  packs; a Soundboard page wired into Room + Space settings.
- In-call: CallSoundboard rewritten as a Discord-style grid grouped by pack
  (emoji + name tiles), sourcing room+parent-space U personal clips; a Manage
  toggle embeds the editors; per-clip volume x master volume on playback.
- Spam guard: host gates on a playing key (fork enforces one clip at a time).
- Control bar: Mute-Screenshare moved next to the Screenshare button.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 23:21:50 -04:00
parent dca51a41ef
commit a9505ca5b2
25 changed files with 1353 additions and 304 deletions
+5 -2
View File
@@ -10,9 +10,12 @@ export enum AccountDataEvent {
PoniesUserEmotes = 'im.ponies.user_emotes',
PoniesEmoteRooms = 'im.ponies.emote_rooms',
// [P5-15] Personal, uploadable in-call soundboard clips (synced across
// devices like custom emoji/sticker packs).
// [P5-15] Personal soundboard pack (synced across devices). v2 content is a
// SoundboardContent pack ({pack, clips}); v1 was {clips: [...]} (migrated on read).
LotusSoundboard = 'io.lotus.soundboard',
// [P5-15 v2] Global refs: room soundboard packs the user enabled everywhere
// (mirrors im.ponies.emote_rooms).
LotusSoundboardRooms = 'io.lotus.soundboard_rooms',
// [P4-1] Per-thread notification mode overrides (All/Mentions/Mute) plus the
// global default behavior for threads.
+3
View File
@@ -42,6 +42,9 @@ export enum StateEvent {
PowerLevelTags = 'in.cinny.room.power_level_tags',
LotusVoiceLimit = 'io.lotus.voice_limit',
LotusRoomQuality = 'io.lotus.room_quality',
// [P5-15 v2] Room/Space soundboard pack (mirrors PoniesRoomEmotes). Per
// state-key, aggregated with parent-space packs like custom emoji.
LotusSoundboardRoom = 'io.lotus.soundboard',
}
export enum MessageEvent {