Emoji: every standard :code: in a message becomes its character (the full Slack table ships as emoji.json, from iamcal/emoji-data, MIT); the workspace's custom emoji come from emoji.list and draw as images proxied through the module; skin tones work on both. Reactions: messages show their reactions as pills (the location's own in the accent). A right-click on a message opens a menu — the admin's quick emojis, then a search over every emoji — and a click on a pill adds or takes back the location's reaction. It goes through the same gate as a send (reactions:write on the app). Rows follow the ProdCom transcript's layout: a square profile image or bot icon (initials on a hue tint when there is none), the name line with its time, the text, the reactions. The accent bar on the location's own messages is gone. Send message: the admin's quick emojis sit left of Send, one press sends one. The PIN pad submits by itself once the PIN's digits are in (the server sends the length, never the PIN) — no ✓ key; in a tile too short for the keypad the dots and a hint remain and the keyboard still works. One PIN unlocks every Slack tile on the page (Send message, Quick replies, reactions) until auto-lock; a remount keeps it, a reload asks again. The transcript's gear lists its three switches without a group. The mock serves reactions.add/remove, emoji.list and profile images. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
125 lines
5.3 KiB
JSON
125 lines
5.3 KiB
JSON
{
|
||
"id": "slack",
|
||
"name": "Slack",
|
||
"version": "1.2.0",
|
||
"proddash": ">=1.4.0",
|
||
"description": "Live transcripts of this location's Slack channels, plus PIN-protected sending as the location",
|
||
"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 from this machine 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. The Send message and Quick replies tiles post to whichever transcript was clicked last — its bottom edge lights up in the accent colour — and to the first channel here until one is clicked. 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."
|
||
},
|
||
"Sending": {
|
||
"toggle": "sendEnabled",
|
||
"help": "Messages and emoji reactions leave this machine only after the PIN is entered — on a Send or Quick replies tile, or in the reaction menu a right-click on a transcript message opens. One PIN unlocks every Slack tile on that dashboard page until Auto-lock minutes pass without a send; a reload asks again. Sending stays refused until a 4–8 digit PIN is set here. A message goes to the channel of the transcript clicked last. Quick emojis are sent with one press from the Send message tile and offered first when reacting. Quick replies are one per line, Label | Message, with an optional | #channel-name to bind that one to a channel: a bound reply always goes there, whichever transcript is selected."
|
||
}
|
||
},
|
||
"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."
|
||
},
|
||
"channels": {
|
||
"type": "multiselect",
|
||
"label": "Channels",
|
||
"default": [],
|
||
"group": "Channels",
|
||
"optionsRoute": "/channels",
|
||
"help": "One transcript tile per channel; the first one is where sends go until a transcript is clicked. 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"
|
||
},
|
||
"sendEnabled": {
|
||
"type": "switch",
|
||
"label": "Sending",
|
||
"default": false,
|
||
"group": "Sending"
|
||
},
|
||
"pin": {
|
||
"type": "password",
|
||
"label": "PIN",
|
||
"default": "",
|
||
"group": "Sending",
|
||
"help": "4–8 digits; the pad unlocks by itself once they are all in."
|
||
},
|
||
"pinIdleMinutes": {
|
||
"type": "number",
|
||
"label": "Auto-lock (min)",
|
||
"default": 10,
|
||
"group": "Sending"
|
||
},
|
||
"quickReplies": {
|
||
"type": "text",
|
||
"label": "Quick replies",
|
||
"default": "",
|
||
"group": "Sending",
|
||
"help": "One per line: Label | Message. Add | #channel-name to bind one to a channel — it then ignores which transcript is selected."
|
||
},
|
||
"quickEmojis": {
|
||
"type": "string",
|
||
"label": "Quick emojis",
|
||
"default": "👍 🙏 ✅ 👀 🎉",
|
||
"group": "Sending",
|
||
"help": "Emoji or :codes: separated by spaces, eight at most. One press sends one from the Send message tile; they also head the reaction menu."
|
||
}
|
||
},
|
||
"instanceSchema": {
|
||
"showTimes": {
|
||
"type": "switch",
|
||
"label": "Timestamps",
|
||
"default": true
|
||
},
|
||
"showNames": {
|
||
"type": "switch",
|
||
"label": "Names",
|
||
"default": true
|
||
},
|
||
"showSystem": {
|
||
"type": "switch",
|
||
"label": "System lines",
|
||
"default": true
|
||
}
|
||
}
|
||
}
|