slack.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /**
  2. * slack
  3. */
  4. module.exports = function(crowi) {
  5. 'use strict';
  6. var debug = require('debug')('crowi:util:slack'),
  7. Config = crowi.model('Config'),
  8. Botkit = require('botkit'),
  9. sprintf = require('sprintf'),
  10. bot = null,
  11. slack = {};
  12. slack.controller = undefined;
  13. slack.createBot = function() {
  14. // alreay created
  15. if (bot) {
  16. return bot;
  17. }
  18. var config = crowi.getConfig();
  19. if (!slack.controller) {
  20. slack.configureSlackApp();
  21. }
  22. if (!slack.controller) {
  23. return false;
  24. }
  25. if (Config.hasSlackToken(config)) {
  26. bot = slack.controller.spawn({token: config.notification['slack:token']});
  27. } else {
  28. bot = slack.controller.spawn();
  29. }
  30. return bot;
  31. };
  32. slack.configureSlackApp = function ()
  33. {
  34. var config = crowi.getConfig();
  35. if (Config.hasSlackConfig(config)) {
  36. slack.controller = Botkit.slackbot();
  37. slack.controller.configureSlackApp({
  38. clientId: config.notification['slack:clientId'],
  39. clientSecret: config.notification['slack:clientSecret'],
  40. redirectUri: slack.getSlackAuthCallbackUrl(),
  41. scopes: ['chat:write:bot']
  42. });
  43. return true;
  44. }
  45. return false;
  46. }
  47. // hmmm
  48. slack.getSlackAuthCallbackUrl = function()
  49. {
  50. var config = crowi.getConfig();
  51. // Web アクセスがきてないと app:url がセットされないので crowi.setupSlack 時にはできない
  52. // cli, bot 系作るときに問題なりそう
  53. return (config.crowi['app:url'] || '') + '/admin/notification/slackAuth';
  54. }
  55. slack.getAuthorizeURL = function () {
  56. if (!slack.controller) {
  57. slack.configureSlackApp();
  58. }
  59. if (!slack.controller) {
  60. return '';
  61. }
  62. return slack.controller.getAuthorizeURL();
  63. }
  64. slack.post = function (message) {
  65. var bot = slack.createBot();
  66. return new Promise(function(resolve, reject) {
  67. bot.api.chat.postMessage(message, function(err, res) {
  68. if (err) {
  69. debug('Post error', err, res);
  70. debug('Sent data to slack is:', message);
  71. return reject(err);
  72. }
  73. resolve(res);
  74. });
  75. });
  76. };
  77. slack.convertMarkdownToMrkdwn = function(body) {
  78. body = body
  79. .replace(/\n\*\s(.+)/g, '\n• $1')
  80. .replace(/#{1,}\s?(.+)/g, '\n*$1*')
  81. .replace(/(\[(.+)\]\((https?:\/\/.+)\))/g, '<$3|$2>');
  82. return body;
  83. };
  84. slack.prepareAttachmentTextForCreate = function(page, user) {
  85. var body = page.revision.body;
  86. if (body.length > 2000) {
  87. body = body.substr(0, 2000) + '...';
  88. }
  89. return this.convertMarkdownToMrkdwn(body);
  90. };
  91. slack.prepareAttachmentTextForUpdate = function(page, user, previousRevision) {
  92. var diff = require('diff');
  93. var diffText = ''
  94. diff.diffLines(previousRevision.body, page.revision.body).forEach(function(line) {
  95. debug('diff line', line)
  96. if (line.added) {
  97. diffText += '+' + line.value.replace(/\n/g, '\n+ ');
  98. } else if (line.removed) {
  99. diffText += '-' + line.value.replace(/\n/g, '\n- ');
  100. } else {
  101. diffText += '...\n';
  102. }
  103. });
  104. debug('diff is', diffText)
  105. return diffText;
  106. };
  107. slack.prepareSlackMessage = function(page, user, channel, updateType, previousRevision) {
  108. var config = crowi.getConfig();
  109. var url = config.crowi['app:url'] || '';
  110. var body = page.revision.body;
  111. if (updateType == 'create') {
  112. body = this.prepareAttachmentTextForCreate(page, user);
  113. } else {
  114. body = this.prepareAttachmentTextForUpdate(page, user, previousRevision);
  115. }
  116. var attachment = {
  117. color: '#263a3c',
  118. author_name: '@' + user.username,
  119. author_link: url + '/user/' + user.username,
  120. author_icon: user.image,
  121. title: page.path,
  122. title_link: url + page.path,
  123. text: body,
  124. mrkdwn_in: ["text"],
  125. };
  126. if (user.image) {
  127. attachment.author_icon = user.image;
  128. }
  129. var message = {
  130. channel: '#' + channel,
  131. username: 'Crowi',
  132. text: this.getSlackMessageText(page.path, user, updateType),
  133. attachments: [attachment],
  134. };
  135. return message;
  136. };
  137. slack.getSlackMessageText = function(path, user, updateType) {
  138. var text;
  139. if (updateType == 'create') {
  140. text = sprintf('%s created a new page! %s', user.username, path);
  141. } else {
  142. text = sprintf('%s updated %s', user.username, path);
  143. }
  144. return text;
  145. };
  146. return slack;
  147. };