Merge pull request 'Node page Discord picker: org's servers + voice channels, not raw IDs (#213 item 3)' (#220) from feat/213-node-join-picker into main
Build & Deploy / Build & push images (push) Successful in 4m58s
Build & Deploy / Deploy Firestore rules & indexes (push) Successful in 29s
Build & Deploy / Deploy to VM (push) Successful in 2m37s
Build & Deploy / Report a failed deploy (push) Skipped

Reviewed-on: #220
This commit was merged in pull request #220.
This commit is contained in:
2026-10-04 22:05:49 -04:00
11 changed files with 1230 additions and 104 deletions
@@ -30,6 +30,19 @@ class C2Client:
return {"guild_id": str(guild_id), "org_id": None, "systems": [], "nodes": [],
"streams": [], "bots": [], "error": True}
async def put_guild_directory(self, guild_id: int | str, payload: dict) -> bool:
"""This server's name + voice channels, for the web node-page picker
(server-26#213). Names only — no members, no messages, no tokens."""
try:
async with httpx.AsyncClient(timeout=10) as client:
r = await client.put(f"{self.base}/discord/guilds/{guild_id}/directory",
json=payload, headers=self._headers())
r.raise_for_status()
return True
except Exception as e:
logger.error(f"C2 put_guild_directory({guild_id}) failed: {e}")
return False
async def start_stream(self, payload: dict) -> tuple[bool, dict]:
"""Returns (ok, body). On a refusal body carries detail/code/invite."""
try: