fix: separate bot vs viewer WebSocket connections, add client identification

The dashboard's own WS connection was being counted as a bot subscriber,
causing "1 bot connected" with no bots actually present. Now WS clients
send a role ("bot" or "viewer") in the subscribe message. Only bots count
toward the subscriber total. Bot plugins also send a configurable client_id
so the dashboard shows which specific bots are connected.

Made-with: Cursor
This commit is contained in:
cottongin
2026-03-12 07:51:55 -04:00
parent 658c0d4a15
commit d6d5ac10e6
8 changed files with 184 additions and 35 deletions

View File

@@ -61,3 +61,12 @@ conf.registerGlobalValue(
"""IRC channel to send announce messages to.""",
),
)
conf.registerGlobalValue(
NtrPlaylist,
"clientId",
registry.String(
"limnoria",
"""Identifier for this bot when connecting to the announce WebSocket.""",
),
)

View File

@@ -144,6 +144,7 @@ class NtrPlaylist(callbacks.Plugin):
ws_url = self.registryValue("wsUrl")
token = self.registryValue("adminToken")
channel = self.registryValue("announceChannel")
client_id = self.registryValue("clientId") or "limnoria"
if not ws_url or not token:
LOGGER.warning("wsUrl or adminToken not configured, WS listener sleeping")
@@ -154,7 +155,12 @@ class NtrPlaylist(callbacks.Plugin):
try:
ws = websocket.WebSocket()
ws.connect(ws_url, timeout=10)
ws.send(json.dumps({"type": "subscribe", "token": token}))
ws.send(json.dumps({
"type": "subscribe",
"token": token,
"role": "bot",
"client_id": client_id,
}))
LOGGER.info("Connected to announce WebSocket at %s", ws_url)
backoff = 5

View File

@@ -24,6 +24,7 @@ class NtrPlaylistSection(types.StaticSection):
display_timezone = types.ValidatedAttribute("display_timezone", default="America/New_York")
ws_url = types.ValidatedAttribute("ws_url", default="ws://127.0.0.1:8000/ws/announce")
announce_channel = types.ValidatedAttribute("announce_channel", default="#sewerchat")
client_id = types.ValidatedAttribute("client_id", default="sopel")
_ws_stop = None
@@ -54,6 +55,7 @@ def _ws_listener(bot):
ws_url = bot.settings.ntr_playlist.ws_url
token = bot.settings.ntr_playlist.admin_token
channel = bot.settings.ntr_playlist.announce_channel
client_id = bot.settings.ntr_playlist.client_id or "sopel"
if not ws_url or not token:
LOGGER.warning("ws_url or admin_token not configured, WS listener sleeping")
@@ -64,7 +66,12 @@ def _ws_listener(bot):
try:
ws = websocket.WebSocket()
ws.connect(ws_url, timeout=10)
ws.send(json.dumps({"type": "subscribe", "token": token}))
ws.send(json.dumps({
"type": "subscribe",
"token": token,
"role": "bot",
"client_id": client_id,
}))
LOGGER.info("Connected to announce WebSocket at %s", ws_url)
backoff = 5