From 2762e9a4eff92d17f557eaaca51c7424cfeb0fb2 Mon Sep 17 00:00:00 2001 From: J3vb Date: Thu, 2 Apr 2026 17:00:27 +0200 Subject: [PATCH] chore: remove soundboard feature entirely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Soundboard was never implemented — remove USE_SOUNDBOARD permission bit, rate limiter, protocol entry, admin mockup reference, TODOS entry, and all related test assertions. --- Client/tauri-client/src/lib/rate-limiter.ts | 7 ------- Client/tauri-client/src/lib/types.ts | 3 --- Client/tauri-client/tests/unit/rate-limiter.test.ts | 11 ----------- Client/tauri-client/tests/unit/types.test.ts | 3 --- Server/admin/static/admin-mockup.html | 1 - Server/permissions/permissions.go | 1 - Server/permissions/permissions_test.go | 5 ++--- TODOS.md | 10 ---------- docs/protocol.md | 1 - docs/schema.md | 1 - 10 files changed, 2 insertions(+), 41 deletions(-) diff --git a/Client/tauri-client/src/lib/rate-limiter.ts b/Client/tauri-client/src/lib/rate-limiter.ts index 4d05ec63..47158d1e 100644 --- a/Client/tauri-client/src/lib/rate-limiter.ts +++ b/Client/tauri-client/src/lib/rate-limiter.ts @@ -169,11 +169,6 @@ export function createVideoCameraLimiter(): RateLimiter { return createRateLimiter(2, 1_000); } -/** Soundboard: 1 per 3 seconds. */ -export function createSoundboardLimiter(): RateLimiter { - return createRateLimiter(1, 3_000); -} - // --------------------------------------------------------------------------- // Bundled set of all protocol limiters // --------------------------------------------------------------------------- @@ -185,7 +180,6 @@ export interface RateLimiterSet { readonly reactions: RateLimiter; readonly voice: RateLimiter; readonly voiceVideo: RateLimiter; - readonly soundboard: RateLimiter; } export function createRateLimiterSet(): RateLimiterSet { @@ -196,6 +190,5 @@ export function createRateLimiterSet(): RateLimiterSet { reactions: createReactionLimiter(), voice: createVoiceLimiter(), voiceVideo: createVideoCameraLimiter(), - soundboard: createSoundboardLimiter(), }); } diff --git a/Client/tauri-client/src/lib/types.ts b/Client/tauri-client/src/lib/types.ts index ad1790dd..080df99d 100644 --- a/Client/tauri-client/src/lib/types.ts +++ b/Client/tauri-client/src/lib/types.ts @@ -128,7 +128,6 @@ export enum Permission { READ_MESSAGES = 0x2, ATTACH_FILES = 0x20, ADD_REACTIONS = 0x40, - USE_SOUNDBOARD = 0x100, CONNECT_VOICE = 0x200, SPEAK_VOICE = 0x400, USE_VIDEO = 0x800, @@ -421,8 +420,6 @@ export interface VoiceScreensharePayload { readonly enabled: boolean; } -// Soundboard feature deferred — see TODOS.md - // ----------------------------------------------------------------------------- // Discriminated Union: Server → Client Messages // ----------------------------------------------------------------------------- diff --git a/Client/tauri-client/tests/unit/rate-limiter.test.ts b/Client/tauri-client/tests/unit/rate-limiter.test.ts index def79686..05c03f31 100644 --- a/Client/tauri-client/tests/unit/rate-limiter.test.ts +++ b/Client/tauri-client/tests/unit/rate-limiter.test.ts @@ -7,7 +7,6 @@ import { createPresenceLimiter, createReactionLimiter, createVoiceLimiter, - createSoundboardLimiter, createChatLimiter, createVideoCameraLimiter, } from "@lib/rate-limiter"; @@ -256,15 +255,6 @@ describe("Pre-configured limiters", () => { expect(limiter.tryConsume()).toBe(true); expect(limiter.tryConsume()).toBe(false); }); - - it("createSoundboardLimiter: 1 per 3s", () => { - const limiter = createSoundboardLimiter(); - expect(limiter.tryConsume()).toBe(true); - expect(limiter.tryConsume()).toBe(false); - - vi.advanceTimersByTime(3_001); - expect(limiter.tryConsume()).toBe(true); - }); }); // --------------------------------------------------------------------------- @@ -281,7 +271,6 @@ describe("createRateLimiterSet", () => { "reactions", "voice", "voiceVideo", - "soundboard", ] as const; for (const key of expectedKeys) { diff --git a/Client/tauri-client/tests/unit/types.test.ts b/Client/tauri-client/tests/unit/types.test.ts index 22c1ac20..4c938d86 100644 --- a/Client/tauri-client/tests/unit/types.test.ts +++ b/Client/tauri-client/tests/unit/types.test.ts @@ -213,8 +213,6 @@ describe("ClientMessage types", () => { payload: { message_id: 1, emoji: "👍" }, }; expect(reactionAdd.type).toBe("reaction_add"); - - // soundboard_play type removed — see TODOS.md }); it("includes voice mute type", () => { @@ -232,7 +230,6 @@ describe("Permission bitfield", () => { expect(P.READ_MESSAGES).toBe(0x2); expect(P.ATTACH_FILES).toBe(0x20); expect(P.ADD_REACTIONS).toBe(0x40); - expect(P.USE_SOUNDBOARD).toBe(0x100); expect(P.CONNECT_VOICE).toBe(0x200); expect(P.SPEAK_VOICE).toBe(0x400); expect(P.USE_VIDEO).toBe(0x800); diff --git a/Server/admin/static/admin-mockup.html b/Server/admin/static/admin-mockup.html index 14f99569..583534ee 100644 --- a/Server/admin/static/admin-mockup.html +++ b/Server/admin/static/admin-mockup.html @@ -352,7 +352,6 @@ const PERMS = [ { name:'Read Messages', bit:0x2 }, { name:'Attach Files', bit:0x20 }, { name:'Add Reactions', bit:0x40 }, - { name:'Use Soundboard', bit:0x100 }, { name:'Connect Voice', bit:0x200 }, { name:'Speak Voice', bit:0x400 }, { name:'Use Video', bit:0x800 }, diff --git a/Server/permissions/permissions.go b/Server/permissions/permissions.go index c1656146..a74bb721 100644 --- a/Server/permissions/permissions.go +++ b/Server/permissions/permissions.go @@ -10,7 +10,6 @@ const ( ReadMessages = int64(0x0002) // bit 1 AttachFiles = int64(0x0020) // bit 5 AddReactions = int64(0x0040) // bit 6 - UseSoundboard = int64(0x0100) // bit 8 ConnectVoice = int64(0x0200) // bit 9 SpeakVoice = int64(0x0400) // bit 10 UseVideo = int64(0x0800) // bit 11 diff --git a/Server/permissions/permissions_test.go b/Server/permissions/permissions_test.go index 228f4fa9..f1e8cf54 100644 --- a/Server/permissions/permissions_test.go +++ b/Server/permissions/permissions_test.go @@ -19,7 +19,6 @@ func TestPermissionBitValues(t *testing.T) { {"ReadMessages", permissions.ReadMessages, 0x0002}, {"AttachFiles", permissions.AttachFiles, 0x0020}, {"AddReactions", permissions.AddReactions, 0x0040}, - {"UseSoundboard", permissions.UseSoundboard, 0x0100}, {"ConnectVoice", permissions.ConnectVoice, 0x0200}, {"SpeakVoice", permissions.SpeakVoice, 0x0400}, {"UseVideo", permissions.UseVideo, 0x0800}, @@ -116,7 +115,7 @@ func TestHasPerm_AllBitsSet(t *testing.T) { allPerms := int64(0x7FFFFFFF) perms := []int64{ permissions.SendMessages, permissions.ReadMessages, permissions.AttachFiles, - permissions.AddReactions, permissions.UseSoundboard, permissions.ConnectVoice, + permissions.AddReactions, permissions.ConnectVoice, permissions.SpeakVoice, permissions.UseVideo, permissions.ShareScreen, permissions.ManageMessages, permissions.ManageChannels, permissions.KickMembers, permissions.BanMembers, permissions.MuteMembers, permissions.ManageRoles, @@ -370,7 +369,7 @@ func TestRoleHierarchy_MemberHasBasicPerms(t *testing.T) { func TestPermissionBits_AreDistinctPowersOfTwo(t *testing.T) { bits := []int64{ permissions.SendMessages, permissions.ReadMessages, permissions.AttachFiles, - permissions.AddReactions, permissions.UseSoundboard, permissions.ConnectVoice, + permissions.AddReactions, permissions.ConnectVoice, permissions.SpeakVoice, permissions.UseVideo, permissions.ShareScreen, permissions.ManageMessages, permissions.ManageChannels, permissions.KickMembers, permissions.BanMembers, permissions.MuteMembers, permissions.ManageRoles, diff --git a/TODOS.md b/TODOS.md index a29f12e1..d8f8ef05 100644 --- a/TODOS.md +++ b/TODOS.md @@ -57,16 +57,6 @@ Deferred work items from engineering reviews. ## Deferred (from 2026-04-01 eng review — Open Source Ready) -### Soundboard Feature - -**What:** Full-stack soundboard: sound upload/storage, playback to voice channel, UI component. -**Why:** Community feature for voice channels. Protocol type was pre-defined but nothing else existed. -**Pros:** Fun social feature for voice users. LiveKit supports audio injection. -**Cons:** Requires server-side audio mixing or LiveKit Ingress API. Significant scope (1-2 weeks human / 3-4h CC). -**Context:** Dead `SoundboardPlayPayload` protocol type removed in this PR. Feature needs: upload endpoint, storage, DB schema for sounds, playback handler, broadcast to voice participants, UI picker component. Consider LiveKit Ingress API for server-side audio injection. -**Depends on:** Voice infrastructure (done), LiveKit integration (done). -**Added:** 2026-04-01 (eng review of Open Source Ready plan) - ### DM Sidebar Incremental Reconciliation **What:** Replace O(n) DOM rebuild of DM sidebar with incremental reconciliation (differ/patch per DM item). diff --git a/docs/protocol.md b/docs/protocol.md index 94a5c150..be8410db 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -804,7 +804,6 @@ All rate limits are enforced server-side using a token bucket rate limiter. | `voice_camera` | 2/sec | Requires USE_VIDEO | | `voice_screenshare` | 2/sec | Requires SHARE_SCREEN | | `voice_token_refresh` | 1/60sec | Must be in voice | -| `soundboard_play` | N/A | Not yet implemented server-side | | `ping` | None | Heartbeat | ### Server -> Client (25+ types) diff --git a/docs/schema.md b/docs/schema.md index 5e5fab04..9c6283dd 100644 --- a/docs/schema.md +++ b/docs/schema.md @@ -354,7 +354,6 @@ Permissions are stored as an integer bitfield (31 bits used) in `roles.permissio | 1 | `0x2` | `READ_MESSAGES` | View messages in text channels | | 5 | `0x20` | `ATTACH_FILES` | Upload file attachments | | 6 | `0x40` | `ADD_REACTIONS` | Add emoji reactions | -| 8 | `0x100` | `USE_SOUNDBOARD` | Play sounds in voice channels | | 9 | `0x200` | `CONNECT_VOICE` | Join voice channels | | 10 | `0x400` | `SPEAK_VOICE` | Transmit audio in voice channels | | 11 | `0x800` | `USE_VIDEO` | Enable camera in voice channels |