{ "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 } } }