mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-01 20:42:50 +08:00
fix(auto-pause): never treat a failed clientlist as "channel empty"; default OFF
Auto-pause within the first seconds of playback (and re-pause after a manual
play) whenever a listener is actually in the channel.
Root cause (confirmed live against a TS3 server): the full-client
`clientlist -uid -away -voice -groups` command TIMES OUT when other clients are
present in the bot's channel. `getClientsInChannel()` catches the error and
returns `[]`, so the occupancy callers computed `userCount = [].length - 1 = -1`,
which `decideOccupancyAction` reads as `-1 <= 0` → "channel empty" → pause. With
the bot alone, clientlist succeeds (returns just the bot), so the bug only
surfaced when someone was listening — exactly the report.
Fix: a connected bot is always a member of its own channel, so a valid query
returns >= 1 (itself). A length of 0 therefore means the query FAILED, not that
the channel is empty. New pure helper `occupancyFromClientList()` maps a
0-length result to `null` ("occupancy unknown"); `refreshOccupancy()` and the
30s idle poller skip the auto-pause / idle-disconnect decision when the count is
unknown instead of mis-reading it as empty. This also removes a latent
false-positive idle-disconnect on the same failed query.
Also default `autoPauseOnEmpty` to OFF (occupancy detection is unreliable on
some servers); users can opt in from Settings.
Verified live with two clients in one channel: clientlist returns 0 → helper
returns null → no false pause (control: bot alone returns 1 → 0 others, normal).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
75f09694a3
commit
d3fd547ea0
6 files changed
+57
-11
No files matched your search
@@ -49,7 +49,8 @@ describe("config", () => {
|
||||
// defaults should fill in the rest
|
||||
expect(loaded.theme).toBe("dark");
|
||||
expect(loaded.commandPrefix).toBe("!");
|
||||
expect(loaded.autoPauseOnEmpty).toBe(true);
|
||||
// auto-pause defaults OFF (occupancy detection is unreliable on some servers)
|
||||
expect(loaded.autoPauseOnEmpty).toBe(false);
|
||||
});
|
||||
|
||||
// --- #86: config.json must live under (and be created in) the persisted data dir ---
|
||||
|
||||
+4
-1
@@ -36,7 +36,10 @@ export function getDefaultConfig(): BotConfig {
|
||||
adminPassword: "",
|
||||
adminGroups: [],
|
||||
autoReturnDelay: 300,
|
||||
autoPauseOnEmpty: true,
|
||||
// Default OFF: occupancy detection relies on the full-client `clientlist`
|
||||
// command, which is unreliable on some servers (it can time out when other
|
||||
// clients are present). Users can opt in from the web UI.
|
||||
autoPauseOnEmpty: false,
|
||||
idleTimeoutMinutes: 0,
|
||||
publicUrl: "",
|
||||
trustProxy: false,
|
||||
|
||||
Reference in new issue
Block a user