slack.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. const { WebClient, IncomingWebhook } = require('@slack/client');
  2. const humanizeDuration = require('humanize-duration');
  3. const { sprintf } = require('sprintf-js');
  4. const EMAIL_REGEX = /^(.*)@(.*)$/;
  5. function generateAnnoyMessage(config, now, usersList, phrases) {
  6. if (!usersList.length) {
  7. const isMonday = now.weekday() === 1;
  8. if (isMonday) {
  9. return config.completeMessage;
  10. }
  11. return null;
  12. }
  13. let phrase = config.annoyMessage;
  14. if (phrases.length) {
  15. phrase = phrases[Math.floor(Math.random() * phrases.length)].phrase;
  16. }
  17. return sprintf(phrase, usersList.join(', '));
  18. }
  19. function annoySlackUsers(config, logger, now, users, phrases) {
  20. const usersList = users.map(({ id }) => `<@${id}>`);
  21. const message = generateAnnoyMessage(config, now, usersList, phrases);
  22. if (!message) {
  23. logger.info('[SLACK] No users to annoy');
  24. return null;
  25. }
  26. logger.info('[SLACK] Annoying users:', users.map(({ name }) => name));
  27. const t0 = Date.now();
  28. const webhook = new IncomingWebhook(config.slack.webhookUrl);
  29. return new Promise((resolve, reject) => {
  30. webhook.send(message, err => {
  31. const t1 = Date.now();
  32. logger.debug(`[SLACK] Took ${humanizeDuration(t1 - t0)} to send message to Slack channel`);
  33. if (err) {
  34. return reject(err);
  35. }
  36. return resolve(message);
  37. });
  38. });
  39. }
  40. function getAllSlackUsersWithNames(config, logger) {
  41. return new Promise((resolve, reject) => {
  42. logger.debug('[SLACK] Getting all Slack user details...');
  43. const t0 = Date.now();
  44. const webClient = new WebClient(config.slack.token);
  45. webClient.users.list({}, (err, info) => {
  46. if (err) {
  47. return reject(err);
  48. }
  49. const users = info.members
  50. .filter(user => user &&
  51. !user.deleted &&
  52. user.name &&
  53. user.profile &&
  54. user.profile.email &&
  55. user.profile.email.match(EMAIL_REGEX)
  56. )
  57. .map(user => {
  58. const [, shortName] = user.profile.email.match(EMAIL_REGEX);
  59. return {
  60. id: user.id,
  61. name: user.name,
  62. shortName,
  63. email: user.profile.email.toLowerCase()
  64. };
  65. });
  66. const t1 = Date.now();
  67. logger.debug(`[SLACK] Took ${humanizeDuration(t1 - t0)} to fetch slack user details`);
  68. return resolve(users);
  69. });
  70. });
  71. }
  72. module.exports = {
  73. annoySlackUsers,
  74. getAllSlackUsersWithNames
  75. };