A new send-message module owns everything a dashboard sends: the PIN
(switchable off in admin), the unlock tokens, the Send message and Quick
replies tiles, the quick replies and quick emojis. It opens no upstream
connection of its own — it finds every module declaring
provides: ["messaging"] through the shell's module list and hands each
message to that module's POST /messaging/send over loopback, so Slack keeps
its one Slack connection and ProdCom its one ProdCom connection. Providers
check the browser's unlock token with GET /verify over loopback before
touching their upstream, so no browser on the network can post as the
location without having entered the PIN here.
Slack 1.3.0 is view-only plus reactions: the Sending group, PIN, send tiles
and quick replies are gone; it serves the messaging descriptor (channels as
recipients) and its reactions ride on the Send Message unlock. A layout's
old Send message / Quick replies tiles draw nothing until removed.
ProdCom 1.4.0 serves the descriptor as identities — only channels with
typingEnabled, since typed text goes out *as* a channel — and posts with
POST /api/v1/channels/{id}/send. Its tile is a click-to-target like Slack's
(accent stripe along the bottom), and typed entries carry a keyboard mark.
The tiles: click any Slack or ProdCom transcript to point sends there; a
Send as menu (only for platforms with identities, hidden otherwise) picks
the ProdCom channel to speak as; the choice is saved with the tile so named
layouts remember it. Wording follows the role — "Send message to #ops…" /
"Send message to ProdCom as FOH…". The PIN pad's dots ride on a real
numeric input so a phone's keyboard appears. Outcome is an icon beside
Send (check / blocked, five seconds, sentence as tooltip). A pill on the
box's bottom edge trades box height for rows of quick-emoji keys, a row
at a time; the single row scrolls sideways on a narrow tile with Send
pinned in place.
The module guide documents the provider contract and the page bus
(window.proddashMessaging + proddash:messaging:* events) the tiles share;
the ProdCom mock gained the send route.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
96 lines
3.8 KiB
JSON
96 lines
3.8 KiB
JSON
{
|
||
"id": "slack",
|
||
"name": "Slack",
|
||
"version": "1.3.0",
|
||
"proddash": ">=1.4.0",
|
||
"description": "Live transcripts of this location's Slack channels; messages and reactions leave as the location through the Send Message module",
|
||
"provides": [
|
||
"messaging"
|
||
],
|
||
"client": "client.js",
|
||
"server": "server.js",
|
||
"style": "style.css",
|
||
"minSize": {
|
||
"w": 2,
|
||
"h": 2
|
||
},
|
||
"defaultSize": {
|
||
"w": 4,
|
||
"h": 4
|
||
},
|
||
"configGroups": {
|
||
"Slack account": {
|
||
"collapsed": "whenSet",
|
||
"help": "Create a Slack app in the workspace (api.slack.com/apps → Create New App → From scratch) and, under OAuth & Permissions → User Token Scopes, add channels:history, channels:read, groups:history, groups:read, chat:write, users:read, reactions:write (emoji reactions) and emoji:read (the workspace's custom emoji). Sign in to Slack as this location's account — the one named for the campus — open the app's OAuth & Permissions page and press Install to Workspace (or Reinstall to Workspace), then copy the User OAuth Token (xoxp-…) it shows and paste it here: messages sent from this machine through the Send Message module are then literally from the location. A bot token (xoxb-…) works too; it posts as the app, with \"Send as\" naming the location."
|
||
},
|
||
"Channels": {
|
||
"help": "Every channel picked here becomes its own transcript tile in the + picker, titled with the channel's name, and a destination the Send Message module's tiles can post to: a click on a transcript points them at its channel (its bottom edge lights up in the accent colour) — that is the only way a Slack channel is chosen; the Send as menu is for platforms that send as an identity. Only channels the account has joined are listed; join one in Slack first. Each channel is read on its own schedule, all of them together kept inside Slack's rate limit."
|
||
}
|
||
},
|
||
"configSchema": {
|
||
"token": {
|
||
"type": "password",
|
||
"label": "Token",
|
||
"default": "",
|
||
"group": "Slack account",
|
||
"help": "The location account's User OAuth Token (xoxp-…, recommended) or a Bot User OAuth Token (xoxb-…)."
|
||
},
|
||
"sendAs": {
|
||
"type": "string",
|
||
"label": "Send as",
|
||
"default": "",
|
||
"group": "Slack account",
|
||
"help": "Only used with a bot token — a user token always sends as its own account; needs the chat:write.customize scope. Applies to messages the Send Message module posts through this account."
|
||
},
|
||
"channels": {
|
||
"type": "multiselect",
|
||
"label": "Channels",
|
||
"default": [],
|
||
"group": "Channels",
|
||
"optionsRoute": "/channels",
|
||
"help": "One transcript tile per channel, and one destination each for the Send Message module. Only channels the account has joined are listed — join one in Slack first."
|
||
},
|
||
"pollSeconds": {
|
||
"type": "number",
|
||
"label": "Refresh interval (s)",
|
||
"default": 2,
|
||
"group": "Transcript",
|
||
"help": "How often each channel is re-read (1 s at the fastest). With several channels the interval stretches so the module stays inside Slack's rate limit — at least 1.5 s × the number of channels; the health line shows the interval in use."
|
||
},
|
||
"historyCount": {
|
||
"type": "number",
|
||
"label": "Messages kept",
|
||
"default": 40,
|
||
"group": "Transcript"
|
||
},
|
||
"includeReplies": {
|
||
"type": "switch",
|
||
"label": "Thread replies",
|
||
"default": false,
|
||
"group": "Transcript"
|
||
}
|
||
},
|
||
"instanceSchema": {
|
||
"showAvatars": {
|
||
"type": "switch",
|
||
"label": "Avatars",
|
||
"default": true
|
||
},
|
||
"showTimes": {
|
||
"type": "switch",
|
||
"label": "Timestamps",
|
||
"default": true
|
||
},
|
||
"showNames": {
|
||
"type": "switch",
|
||
"label": "Names",
|
||
"default": true
|
||
},
|
||
"showSystem": {
|
||
"type": "switch",
|
||
"label": "Channel notices",
|
||
"default": true
|
||
}
|
||
}
|
||
}
|