Live symptom: the radio bot shows "Listening to <system>" but is not in the voice channel. - Presence was set once on the first successful join and never cleared, so a bot whose voice dropped (or whose rejoin kept failing) still looked healthy. Presence is now synced at the end of every reconcile: set only while a voice connection for that bot is up, cleared otherwise. - Pre-check the bot's permissions (View Channel, Connect, Speak) and the channel's user limit before joining. Discord silently ignores a join the bot may not make; discord.py then times out after 30s and the admin page read "Could not connect to the voice channel (TimeoutError: )". Now: code missing_permissions / channel_full with the missing permission named. - A connect timeout gets its own code (connect_timeout) and readable text. - requirements: discord.py[voice]>=2.7 — Discord has required DAVE E2EE voice since 2026-03-01 and 2.7 is the first discord.py with it (the extra pulls davey). Today's resolution was already 2.7.1 + davey 0.1.6; this stops an older resolution from ever being accepted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 lines
305 B
Plaintext
13 lines
305 B
Plaintext
fastapi
|
|
uvicorn[standard]
|
|
pydantic-settings
|
|
paho-mqtt>=2.0.0
|
|
httpx
|
|
# >=2.7: Discord requires DAVE (E2EE) voice since 2026-03-01; 2.7 is the first
|
|
# discord.py with it (the [voice] extra pulls `davey`). Older releases cannot join voice.
|
|
discord.py[voice]>=2.7
|
|
PyNaCl
|
|
python-multipart
|
|
pytest
|
|
pytest-asyncio
|