| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
- };
|