chore: remove soundboard feature entirely

Soundboard was never implemented — remove USE_SOUNDBOARD permission bit,
rate limiter, protocol entry, admin mockup reference, TODOS entry, and
all related test assertions.
This commit is contained in:
J3vb
2026-04-02 17:00:27 +02:00
parent 56d330b930
commit 2762e9a4ef
10 changed files with 2 additions and 41 deletions
@@ -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(),
});
}
-3
View File
@@ -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
// -----------------------------------------------------------------------------
@@ -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) {
@@ -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);
-1
View File
@@ -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 },
-1
View File
@@ -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
+2 -3
View File
@@ -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,
-10
View File
@@ -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).
-1
View File
@@ -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)
-1
View File
@@ -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 |