This is a Slack bot that automatically links to Linear.app issues. Sort of how like the Github autolinks work, except for Slack.
For example, you type Check out SE-12
, the bot will then link to https://linear.app/{team}/se-12
This is a Slack bot that automatically links to Linear.app issues. Sort of how like the Github autolinks work, except for Slack.
For example, you type Check out SE-12
, the bot will then link to https://linear.app/{team}/se-12
const { App, ExpressReceiver } = require('@slack/bolt'); | |
const serverlessExpress = require('@vendia/serverless-express'); | |
// Define team prefixes here | |
const TEAM_PREFIXES = ['SE']; | |
// Define linear team | |
const LINEAR_TEAM = `fsf`; | |
// ----- That's pretty much it... | |
const LINEAR_LINK = `https://linear.app/${LINEAR_TEAM}/issue` | |
const expressReceiver = new ExpressReceiver({ | |
signingSecret: process.env.SLACK_SIGNING_SECRET, | |
processBeforeResponse: true | |
}); | |
const app = new App({ | |
token: process.env.SLACK_BOT_TOKEN, | |
receiver: expressReceiver | |
}); | |
const regexp = buildRegex(); | |
app.message(regexp, sendLink); | |
async function sendLink({ message, context, say }) { | |
const issue = context.matches[0]; | |
// @todo- validate that the issue is valid based on team provided. | |
// for example, if team is 'se' and an issue that was found in context was se- (no number), | |
// it should error. should always check against length of the actual team prefix as well. | |
const text = `${LINEAR_LINK}/${issue}` | |
let thread_ts = message.ts | |
if (message.thread_ts) { | |
thread_ts = message.thread_ts | |
} | |
await say({text, thread_ts}); | |
} | |
function buildRegex() { | |
// match prefixes with upper and lowercase values | |
const matches = TEAM_PREFIXES.map(s => s.toUpperCase()).join('|') + "|" + TEAM_PREFIXES.map(s => s.toLowerCase()).join('|') | |
// We only care about the first match, no need for a global identifier | |
const r = `(${matches})-(.*?)[0-9]*` | |
return new RegExp(r) | |
} | |
module.exports.handler = serverlessExpress({ | |
app: expressReceiver.app | |
}); |