From c7cedbbfe00f113fb7a3b4a70becd1c4d2006968 Mon Sep 17 00:00:00 2001 From: Izan Gil <66965250+SrIzan10@users.noreply.github.com> Date: Fri, 6 Mar 2026 23:42:20 +0100 Subject: [PATCH] chore(chat): exclude chat grants from adding numbers to viewer count --- apps/chat/src/index.ts | 19 +++++++++++++------ apps/chat/src/types/chat.ts | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/chat/src/index.ts b/apps/chat/src/index.ts index d43f266..5e14070 100644 --- a/apps/chat/src/index.ts +++ b/apps/chat/src/index.ts @@ -473,6 +473,7 @@ app.get( socket.personalChannel = personalChannel; socket.viewerId = randomString(10); socket.isModerator = isModerator; + socket.excludeFromViewerCount = Boolean(dbGrant); socketState.targetUsername = username; socketState.channelId = channel.id; @@ -493,6 +494,8 @@ app.get( rateLimitWindowSeconds: moderationSettings.rateLimitWindowSeconds, slowModeSeconds: moderationSettings.slowModeSeconds, }); + + socketState.excludeFromViewerCount = Boolean(dbGrant); socket.send( JSON.stringify({ @@ -557,7 +560,9 @@ app.get( if (!streamInfo) return; - await redis.del(`viewer:${socketState.targetUsername}:${socketState.viewerId}`); + if (!socketState.excludeFromViewerCount) { + await redis.del(`viewer:${socketState.targetUsername}:${socketState.viewerId}`); + } }, async onMessage(evt, ws) { let outcome = 'ignored'; @@ -574,11 +579,13 @@ app.get( stopTimer = startChatMessageTimer(messageType); if (msg.type === 'ping') { - await redis.setex( - `viewer:${socketState.targetUsername}:${socketState.viewerId}`, - 30, - '1' - ); + if (!socketState.excludeFromViewerCount) { + await redis.setex( + `viewer:${socketState.targetUsername}:${socketState.viewerId}`, + 30, + '1' + ); + } socket.send(JSON.stringify({ type: 'pong' })); outcome = 'pong'; return; diff --git a/apps/chat/src/types/chat.ts b/apps/chat/src/types/chat.ts index 6e7694c..7bff06e 100644 --- a/apps/chat/src/types/chat.ts +++ b/apps/chat/src/types/chat.ts @@ -41,6 +41,7 @@ export interface ChatSocket { isModerator?: boolean; metricsTracked?: boolean; metricsAuthMethod?: string; + excludeFromViewerCount?: boolean; raw?: | (ModifiedWebSocket & { targetUsername?: string; @@ -50,6 +51,7 @@ export interface ChatSocket { isModerator?: boolean; metricsTracked?: boolean; metricsAuthMethod?: string; + excludeFromViewerCount?: boolean; }) | null; }