const { WebClient, IncomingWebhook } = require('@slack/client'); const humanizeDuration = require('humanize-duration'); const { sprintf } = require('sprintf-js'); const EMAIL_REGEX = /^(.*)@(.*)$/; function generateAnnoyMessage(config, now, usersList, phrases) { if (!usersList.length) { const isMonday = now.weekday() === 1; if (isMonday) { return config.completeMessage; } return null; } let phrase = config.annoyMessage; if (phrases.length) { phrase = phrases[Math.floor(Math.random() * phrases.length)].phrase; } return sprintf(phrase, usersList.join(', ')); } function annoySlackUsers(config, logger, now, users, phrases) { const usersList = users.map(({ id }) => `<@${id}>`); const message = generateAnnoyMessage(config, now, usersList, phrases); if (!message) { logger.info('[SLACK] No users to annoy'); return null; } logger.info('[SLACK] Annoying users:', users.map(({ name }) => name)); const t0 = Date.now(); const webhook = new IncomingWebhook(config.slack.webhookUrl); return new Promise((resolve, reject) => { webhook.send(message, err => { const t1 = Date.now(); logger.debug(`[SLACK] Took ${humanizeDuration(t1 - t0)} to send message to Slack channel`); if (err) { return reject(err); } return resolve(message); }); }); } function getAllSlackUsersWithNames(config, logger) { return new Promise((resolve, reject) => { logger.debug('[SLACK] Getting all Slack user details...'); const t0 = Date.now(); const webClient = new WebClient(config.slack.token); webClient.users.list({}, (err, info) => { if (err) { return reject(err); } const users = info.members .filter(user => user && !user.deleted && user.name && user.profile && user.profile.email && user.profile.email.match(EMAIL_REGEX) ) .map(user => { const [, shortName] = user.profile.email.match(EMAIL_REGEX); return { id: user.id, name: user.name, shortName, email: user.profile.email.toLowerCase() }; }); const t1 = Date.now(); logger.debug(`[SLACK] Took ${humanizeDuration(t1 - t0)} to fetch slack user details`); return resolve(users); }); }); } module.exports = { annoySlackUsers, getAllSlackUsersWithNames };