Radio bot online with presence but never in voice on live — root cause pending the admin-page reading #39

Closed
opened 2026-10-04 22:43:17 -04:00 by logan · 2 comments
Owner

Owner report, prod fabdf58 / nodes on v1 (44e41b3): the radio bot comes online with the right presence but never joins the voice channel. PR #38 makes the failure readable and makes presence honest. The root cause is not confirmed yet.

Discriminator: the "Desired → actual" cell for this stream in Settings › Discord › Radio channels (with #38 deployed)

Cell reads Meaning / next step
error + "lacks Connect / View Channel / Speak" or "channel is full" Channel permission override or user limit. Fix it in Discord, no code change
error + "timed out" Discord never answered the join even though permissions are OK. Most likely Discord voice/DAVE handshake. Check the edge log for discord.py voice_state lines
error + "RuntimeError: davey/PyNaCl library needed" The node's image is missing voice deps, so it is stale. Re-pull (the floor is now discord.py[voice]>=2.7)
connected but the bot is not visible in that channel The stream points at a different guild/channel than the one being watched, or the bot shown online is a different bot user (see below)
pending and never connecting Desired state never reached this node (topic/seq/placement). If so, the bot shown online is not this node's session

Pre-#38 reading (v1 still live)

On v1, presence "Listening to " proves channel.connect() succeeded at least once (presence is set only after a join and never cleared). If the bot instead shows "Listening to the radio", that is the server discord-bot's presence (drb-server-discord-bot/app/bot.py). That means either the wrong bot is being watched or the main bot's token was added to the radio pool. POST /tokens does not reject the main bot's token. If that is the case, file a server-26 follow-up.

Evidence ruled out: DAVE deps for a current build (uv resolves discord.py 2.7.1 + davey 0.1.6 for py3.14 aarch64/x86_64). Guild cache (Intents.guilds set, guild.me is always cached). Swallowed errors: all voice paths publish actual.error.

Owner report, prod fabdf58 / nodes on v1 (44e41b3): the radio bot comes online with the right presence but never joins the voice channel. PR #38 makes the failure readable and makes presence honest. **The root cause is not confirmed yet.** ## Discriminator: the "Desired → actual" cell for this stream in Settings › Discord › Radio channels (with #38 deployed) | Cell reads | Meaning / next step | |---|---| | `error` + "lacks Connect / View Channel / Speak" or "channel is full" | Channel permission override or user limit. Fix it in Discord, no code change | | `error` + "timed out" | Discord never answered the join even though permissions are OK. Most likely Discord voice/DAVE handshake. Check the edge log for discord.py `voice_state` lines | | `error` + "RuntimeError: davey/PyNaCl library needed" | The node's image is missing voice deps, so it is stale. Re-pull (the floor is now `discord.py[voice]>=2.7`) | | `connected` but the bot is not visible in that channel | The stream points at a different guild/channel than the one being watched, or the bot shown online is a different bot user (see below) | | `pending` and never `connecting` | Desired state never reached this node (topic/seq/placement). If so, the bot shown online is not this node's session | ## Pre-#38 reading (v1 still live) On v1, presence "Listening to <system>" proves `channel.connect()` succeeded at least once (presence is set only after a join and never cleared). If the bot instead shows "Listening to **the radio**", that is the *server* discord-bot's presence (`drb-server-discord-bot/app/bot.py`). That means either the wrong bot is being watched or the main bot's token was added to the radio pool. `POST /tokens` does not reject the main bot's token. If that is the case, file a server-26 follow-up. Evidence ruled out: DAVE deps for a current build (uv resolves discord.py 2.7.1 + davey 0.1.6 for py3.14 aarch64/x86_64). Guild cache (`Intents.guilds` set, guild.me is always cached). Swallowed errors: all voice paths publish `actual.error`.
Author
Owner

Review correction to the reading guide: a stale (pre-2.7, no-DAVE) image would NOT show RuntimeError ... davey. discord.py <2.7 has no DAVE code; Discord closes the voice ws with 4017, discord.py retries 5x (1/3/5/7/9s backoff) and hits its 30s wait_for -> the admin page shows connect_timeout ("timed out"). The davey RuntimeError only happens with 2.7+ installed without davey, which the [voice] extra prevents. So: "timed out" -> grep the node's edge-node log for 4017 (stale image) vs no 4017 (UDP egress / handshake). Also verified independently: PyPI shows davey first in the [voice] extra at 2.7.0 (2026-02-27); requirements.txt last changed 2026-08-16, so the registry buildcache layer cannot predate 2.7. And the main bot (Server drb-server-discord-bot/app/bot.py:28) sets "Listening to the radio" on ready; confirm which bot the owner is looking at first. Fixups pushed to PR #38 in 2065446.

Review correction to the reading guide: a stale (pre-2.7, no-DAVE) image would NOT show `RuntimeError ... davey`. discord.py <2.7 has no DAVE code; Discord closes the voice ws with 4017, discord.py retries 5x (1/3/5/7/9s backoff) and hits its 30s `wait_for` -> the admin page shows `connect_timeout` ("timed out"). The davey RuntimeError only happens with 2.7+ installed without davey, which the `[voice]` extra prevents. So: "timed out" -> grep the node's edge-node log for `4017` (stale image) vs no 4017 (UDP egress / handshake). Also verified independently: PyPI shows davey first in the `[voice]` extra at 2.7.0 (2026-02-27); requirements.txt last changed 2026-08-16, so the registry buildcache layer cannot predate 2.7. And the main bot (Server `drb-server-discord-bot/app/bot.py:28`) sets "Listening to the radio" on ready; confirm which bot the owner is looking at first. Fixups pushed to PR #38 in 2065446.
logan added the area/discord
priority
p1
status
needs-info
type
bug
labels 2026-10-05 02:05:13 -04:00
Author
Owner

Closing per owner (2026-10-27): the radio bot does join voice on live now, so the root-cause hunt is moot. Reopen if it comes back.

Closing per owner (2026-10-27): the radio bot does join voice on live now, so the root-cause hunt is moot. Reopen if it comes back.
logan closed this issue 2026-10-27 19:27:08 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/node-26#39