slackHistory.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. const Message = require('./message.js').Message
  2. ,MeMessage = require('./message.js').MeMessage
  3. ,NoticeMessage = require('./message.js').NoticeMessage
  4. ,RoomHistory = require('./message.js').RoomHistory;
  5. /**
  6. * @constructor
  7. * @extends {RoomHistory}
  8. * @param {string} serviceId
  9. * @param {Room|string} room or roomId
  10. * @param {string} idPrefix
  11. * @param {number} keepMessages number of messages to keep in memory
  12. * @param {Array=} evts
  13. * @param {number=} now
  14. **/
  15. function SlackHistory(remoteId, room, idPrefix, keepMessages, evts, now) {
  16. RoomHistory.call(this, room, keepMessages, evts, now);
  17. /** @const @type {string} */
  18. this.remoteId = remoteId;
  19. /** @const @type {string} */
  20. this.idPrefix = idPrefix;
  21. }
  22. SlackHistory.prototype = Object.create(RoomHistory.prototype);
  23. SlackHistory.prototype.constructor = SlackHistory;
  24. SlackHistory.prototype.messageFactory = function(ev, ts) {
  25. if (!ev["user"])
  26. ev["user"] = ev["bot_id"];
  27. ev["user"] = this.idPrefix +ev["user"];
  28. if (ev["reactions"]) {
  29. ev["reactions"].forEach((r) => {
  30. for (var i =0, nbUsers =r["users"].length; i < nbUsers; i++)
  31. r["users"][i] = this.idPrefix +r["users"][i];
  32. });
  33. }
  34. if (ev["is_ephemeral"] === true)
  35. return new NoticeMessage(ev, ts);
  36. if (ev["subtype"] === "me_message")
  37. return new MeMessage(ev, ts);
  38. return new Message(ev, ts);
  39. };
  40. /**
  41. * @return {number} ts
  42. **/
  43. SlackHistory.prototype.push = function(ev, t) {
  44. var msg;
  45. if (!ev["type"] || ev["type"] === "message") {
  46. var exists = false
  47. ,targetId = ev["ts"]
  48. ,modifArg = ev;
  49. if (ev["subtype"] === "message_changed") {
  50. if (ev["previous_message"])
  51. targetId = ev["previous_message"]["ts"];
  52. else if (ev["message"])
  53. targetId = ev["message"]["ts"];
  54. modifArg = ev["message"]
  55. } else if (ev["subtype"] === "message_deleted" && (ev["previous_message"] || ev["deleted_ts"])) {
  56. if (ev["previous_message"])
  57. targetId = ev["previous_message"]["ts"];
  58. else
  59. targetId = ev["deleted_ts"];
  60. modifArg = null;
  61. }
  62. if (modifArg) {
  63. if (modifArg["edited"])
  64. modifArg["edited"] = Math.round(parseFloat(modifArg["edited"]["ts"]) * 1000);
  65. if (modifArg["ts"])
  66. modifArg["ts"] = parseFloat(modifArg["ts"]) * 1000;
  67. if (!modifArg["id"])
  68. modifArg["id"] = targetId;
  69. if (modifArg["attachments"] && modifArg["attachments"].length)
  70. modifArg["attachments"].forEach((a) => {
  71. a.ts *= 1000;
  72. });
  73. }
  74. for (var i =0, nbMsg = this.messages.length; i < nbMsg; i++) {
  75. msg = this.messages[i];
  76. if (msg.id === targetId) {
  77. msg.update(modifArg, t);
  78. exists = true;
  79. break;
  80. }
  81. }
  82. if (!exists) {
  83. msg = this.messageFactory(ev, t);
  84. this.messages.push(msg);
  85. }
  86. } else if (ev["type"] === "reaction_added") {
  87. msg = this.addReaction(ev["reaction"], this.idPrefix +ev["user"], ev["item"]["ts"], t);
  88. } else if (ev["type"] === "reaction_removed") {
  89. msg = this.removeReaction(ev["reaction"], this.idPrefix +ev["user"], ev["item"]["ts"], t);
  90. } else {
  91. return 0;
  92. }
  93. while (this.messages.length > this.keepMessages)
  94. this.messages.shift();
  95. return msg ? msg.ts : 0;
  96. };
  97. SlackHistory.prototype.resort = function() {
  98. this.messages.sort(function(a, b) {
  99. return a.ts -b.ts;
  100. });
  101. };
  102. module.exports.SlackHistory = SlackHistory;