فهرست منبع

[add][Refs #29] attachment action buttons

B Thibault 8 سال پیش
والد
کامیت
726d698b92
10فایلهای تغییر یافته به همراه284 افزوده شده و 98 حذف شده
  1. 8 4
      Makefile
  2. 9 2
      cli/data.js
  3. 54 11
      cli/dom.js
  4. 2 0
      cli/resources.js
  5. 18 1
      cli/ui.js
  6. 38 0
      cli/workflow.js
  7. 74 74
      srv/public/slack.min.js
  8. 5 0
      srv/src/httpServ.js
  9. 63 0
      srv/src/slack.js
  10. 13 6
      srv/src/slackHistory.js

+ 8 - 4
Makefile

@@ -20,18 +20,22 @@ OUTPUT=		srv/public/slack.min.js
 
 CLOSURE=	cli/closure-compiler-v20170218.jar
 
-all:
+all:	core
+
+core:
 	java -jar ${CLOSURE} --compilation_level ADVANCED --language_in=ECMASCRIPT5_STRICT --warning_level=VERBOSE --js_output_file ${OUTPUT} ${SRC}
 
-debug:
+core-debug:
 	java -jar ${CLOSURE} --compilation_level WHITESPACE_ONLY --language_in=ECMASCRIPT5_STRICT --js_output_file ${OUTPUT} ${SRC}
 
 $OUTPUT: all
 
-clean:
+clean:	core-clean
+
+core-clean:
 	$(RM) $(OUTPUT)
 
 re:	clean all
 
-.PHONY: all debug clean re
+.PHONY: all clean re core core-debug core-clean
 

+ 9 - 2
cli/data.js

@@ -91,14 +91,15 @@ function isHighlighted(text) {
 
 /**
  * @param {Room} chan
- * @param {Array.<*>} msg
+ * @param {Array.<Message!>} msg
 **/
 function onMsgReceived(chan, msg) {
     if (chan !== SELECTED_ROOM || !window.hasFocus) {
         var selfReg = new RegExp("<@" +SLACK.context.self.id)
             ,highligted = false
             ,areNew = false
-            ,newHighlited = false;
+            ,newHighlited = false
+            ,typingUpdated = false;
         msg.forEach(function(i) {
             if (parseFloat(i["ts"]) <= chan.lastRead) {
                 return;
@@ -111,6 +112,10 @@ function onMsgReceived(chan, msg) {
                 }
                 highligted = true;
             }
+            if (SLACK.context.typing[chan.id] && SLACK.context.typing[chan.id][i.userId]) {
+                SLACK.context.typing[chan.id][i.userId] = 0;
+                typingUpdated = true;
+            }
         });
         if (areNew) {
             updateTitle();
@@ -126,6 +131,8 @@ function onMsgReceived(chan, msg) {
             }
         }
     }
+    if (typingUpdated)
+        onTypingUpdated();
 }
 
 /**

+ 54 - 11
cli/dom.js

@@ -241,11 +241,14 @@ function doCreateMessageDom(channelId, msg, skipAttachment) {
             var reac = createReactionDom(channelId, msg.id, reaction, msg.reactions[reaction]);
             reac && reactions.appendChild(reac);
         }
-        msg.attachments.forEach(function(attachment) {
-            var domAttachment = createAttachmentDom(channelId, msg, attachment);
-            if (domAttachment)
-                attachments.appendChild(domAttachment);
-        });
+        for (var i =0, nbAttachments = msg.attachments.length; i < nbAttachments; i++) {
+            var attachment = msg.attachments[i];
+            if (attachment) {
+                var domAttachment = createAttachmentDom(channelId, msg, attachment, i);
+                if (domAttachment)
+                    attachments.appendChild(domAttachment);
+            }
+        }
     }
     dom.appendChild(msgBlock);
     dom.appendChild(hover);
@@ -287,9 +290,10 @@ function createMessageGroupDom(user, userName) {
  * @param {string} channelId
  * @param {Message} msg
  * @param {*} attachment
+ * @param {number} attachmentIndex
  * @return {Element|null}
 **/
-function createAttachmentDom(channelId, msg, attachment) {
+function createAttachmentDom(channelId, msg, attachment, attachmentIndex) {
     var rootDom = document.createElement("li")
         ,attachmentBlock = document.createElement("div")
 
@@ -364,11 +368,11 @@ function createAttachmentDom(channelId, msg, attachment) {
     //Text
     textBlock.className = R.klass.msg.attachment.content;
     var textContent = formatText(attachment["text"] || "");
-    if (textContent !== '') {
+    textDom.className = R.klass.msg.attachment.text;
+    if (textContent && textContent != "") {
         textDom.innerHTML = textContent;
-        textDom.className = R.klass.msg.attachment.text;
     } else {
-        textDom.className = R.klass.msg.attachment.text +' ' +R.klass.hidden;
+        textDom.classList.add(R.klass.hidden);
     }
 
     // Img (small one)
@@ -378,6 +382,9 @@ function createAttachmentDom(channelId, msg, attachment) {
         img.src = attachment["thumb_url"];
         thumbImgDom.appendChild(img);
         attachmentBlock.classList.add(R.klass.msg.attachment.hasThumb);
+
+        if (attachment["video_html"])
+            thumbImgDom.dataset.video = attachment["video_html"];
     } else {
         thumbImgDom.classList.add(R.klass.hidden);
     }
@@ -413,20 +420,56 @@ function createAttachmentDom(channelId, msg, attachment) {
     }
 
     // TODO Field [ {title, value, short } ]
-    // TODO actions (button stuff)
-
     textBlock.appendChild(textDom);
     textBlock.appendChild(thumbImgDom);
     attachmentBlock.appendChild(titleBlock);
     attachmentBlock.appendChild(authorBlock);
     attachmentBlock.appendChild(textBlock);
     attachmentBlock.appendChild(imgDom);
+
+    if (attachment["actions"]) {
+        var buttons;
+
+        for (var i =0, nbAttachments = attachment["actions"].length; i < nbAttachments; i++) {
+            var action = attachment["actions"][i];
+
+            if (action) {
+                var button = createActionButtonDom(attachmentIndex, i, action);
+
+                if (button) {
+                    if (!buttons) {
+                        buttons = document.createElement("ul");
+                        buttons.className = R.klass.msg.attachment.actions;
+                        attachmentBlock.appendChild(buttons);
+                    }
+                    buttons.appendChild(button);
+                }
+            }
+        }
+    }
+
     attachmentBlock.appendChild(footerBlock);
     rootDom.appendChild(pretext);
     rootDom.appendChild(attachmentBlock);
     return rootDom;
 }
 
+/**
+ * @param {number} attachmentIndex
+ * @param {number} actionIndex
+ * @param {*} action
+ * @return {Element}
+**/
+function createActionButtonDom(attachmentIndex, actionIndex, action) {
+    var li = document.createElement("li");
+
+    li.textContent = action["text"];
+    li.dataset.attachmentIndex = attachmentIndex;
+    li.dataset.actionIndex = actionIndex;
+    li.className = R.klass.msg.attachment.actionItem;
+    return li;
+}
+
 /**
  * @param {Chatter} user
  * @return {Element}

+ 2 - 0
cli/resources.js

@@ -120,6 +120,8 @@ var R = {
                 ,text: "slackmsg-attachment-text"
                 ,thumbImg: "slackmsg-attachment-thumb"
                 ,img: "slackmsg-attachment-img"
+                ,actions: "slackmsg-attachment-actions"
+                ,actionItem: "slackmsg-attachment-actions-item"
                 ,footer: "slackmsg-attachment-footer"
                 ,footerText: "slackmsg-attachment-footer-text"
                 ,footerIcon: "slackmsg-attachment-footer-icon"

+ 18 - 1
cli/ui.js

@@ -286,6 +286,8 @@ function formatEmojis(inputString) {
  * @return {string}
 **/
 function formatText(fullText) {
+    if (!fullText || fullText == "")
+        return "";
     var msgContents = fullText.split(/\r?\n/g);
 
     for (var msgContentIndex=0, nbMsgContents = msgContents.length; msgContentIndex < nbMsgContents; msgContentIndex++) {
@@ -420,7 +422,7 @@ function formatText(fullText) {
         else
             msgContents[msgContentIndex] = _msgContent;
     }
-    return msgContents.join('<br/>');
+    return msgContents.length === 0 ? "" : msgContents.join('<br/>');
 }
 
 /**
@@ -580,6 +582,21 @@ function chatClickDelegate(e) {
     while (target !== e.currentTarget && target) {
         if (target.classList.contains(R.klass.msg.hover.container)) {
             return;
+        } else if (target.parentElement && target.classList.contains(R.klass.msg.attachment.actionItem)) {
+            var messageId = getMessageId(e, target)
+                ,attachmentIndex = target.dataset.attachmentIndex
+                ,actionIndex = target.dataset.actionIndex;
+
+            if (messageId && attachmentIndex !== undefined && actionIndex !== undefined) {
+                messageId = parseFloat(messageId.split("_")[1]);
+                var msg = SLACK.history[SELECTED_ROOM.id].getMessage(messageId);
+
+                if (msg && msg.attachments[attachmentIndex] && msg.attachments[attachmentIndex].actions && msg.attachments[attachmentIndex].actions[actionIndex]) {
+                    var payload = getActionPayload(SELECTED_ROOM.id, msg, msg.attachments[attachmentIndex], msg.attachments[attachmentIndex].actions[actionIndex]);
+
+                    sendCommand(payload, msg.userId);
+                }
+            }
         } else if (target.parentElement && target.parentElement.classList.contains(R.klass.msg.hover.container)) {
             var messageId = getMessageId(e, target);
             if (messageId) {

+ 38 - 0
cli/workflow.js

@@ -147,6 +147,44 @@ function uploadFile(chan, filename, file, callback) {
     xhr.send(formData);
 }
 
+/**
+ * @param {string} payload
+ * @param {string} serviceId
+ * @param {(function((string|null)))=} callback
+**/
+function sendCommand(payload, serviceId, callback) {
+    var formData = new FormData()
+        ,xhr = new XMLHttpRequest();
+
+    formData.append("payload", payload);
+    formData.append("service_id", serviceId);
+    if (callback) {
+        xhr.onreadystatechange = function() {
+            if (xhr.readyState === 4) {
+                if (xhr.status === 204) {
+                    callback(null);
+                } else {
+                    callback(xhr.statusText);
+                }
+            }
+        }
+    }
+    xhr.open('POST', "api/attachmentAction");
+    xhr.send(formData);
+}
+
+function getActionPayload(channelId, msg, attachment, action) {
+    var payload = {
+        "actions": [ action ]
+        ,"attachment_id": attachment["id"]
+        ,"callback_id": attachment["callback_id"]
+        ,"channel_id": channelId
+        ,"is_ephemeral": msg instanceof NoticeMessage
+        ,"message_ts": msg["id"]
+    };
+    return JSON.stringify(payload);
+}
+
 /**
  * @param {Room} chan
  * @param {Command!} cmd

+ 74 - 74
srv/public/slack.min.js

@@ -1,74 +1,74 @@
-function n(a){this.id=a;this.version=0}n.prototype.update=function(a,b){void 0!==a.name&&(this.name=a.name);this.version=Math.max(this.version,b)};function ba(a){this.a=a.desc;this.name=a.name;this.type=a.type;this.usage=a.usage;this.B=a.category}function ca(){this.b={};this.a=[]}
-ca.prototype.update=function(a,b){this.b=JSON.parse(a.emoji_use);a.highlight_words?this.a=(a.highlight_words||"").split(",").filter(function(a){return""!==a.trim()}):a.highlights&&(this.a=a.highlights);this.version=Math.max(this.version,b)};function da(){this.j=null;this.f={};this.a={};this.b=null;this.h={version:0,data:{}};this.g={version:0,data:{}};this.c={};this.s=0}"undefined"!==typeof module&&(module.w.O=da,module.w.P=n,module.w.S=ba);function r(a){this.id=a;this.m=!1;this.a=this.b=0;this.g={};this.version=0}
-r.prototype.update=function(a,b,c){void 0!==a.name&&(this.name=a.name);void 0!==a.is_archived&&(this.h=a.is_archived);void 0!==a.is_member&&(this.s=a.is_member);void 0!==a.last_read&&(this.b=Math.max(parseFloat(a.last_read),this.b));void 0!==a.last_msg&&(this.a=parseFloat(a.last_msg));void 0!==a.is_private&&(this.j=a.is_private);a.latest&&(this.a=parseFloat(a.latest.ts));void 0!==a.is_starred&&(this.m=a.is_starred);if(a.members&&(this.g={},a.members))for(var d=0,g=a.members.length;d<g;d++){var e=
-b.a[a.members[d]];this.g[e.id]=e;e.f[this.id]=this}this.version=Math.max(this.version,c)};function v(a,b){r.call(this,a);this.c=b;this.name=this.c.name;this.j=!0;b.h=this}v.prototype=Object.create(r.prototype);v.prototype.constructor=v;"undefined"!==typeof module&&(module.w.X=r,module.w.W=v);function w(a,b){this.o=a.user;this.c=a.username;this.id=a.id||a.ts;this.i=parseFloat(a.ts);this.text="";this.g=[];this.b=this.u=this.m=!1;this.a={};this.version=b;this.update(a,b)}function y(a,b){w.call(this,a,b)}function A(a,b){w.call(this,a,b)}
-w.prototype.update=function(a,b){if(a){this.text=a.text||"";a.attachments&&(this.g=a.attachments);this.m=!!a.is_starred;this.u=!!a.edited;this.b=!!a.removed;var c=this;this.a={};(a.reactions||[]).forEach(function(a){c.a[a.name]=[];a.users.forEach(function(b){c.a[a.name].push(b)})})}else this.b=!0;this.version=b};function ea(a,b,c,d){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&fa(this,c,d)}function fa(a,b,c){var d=0;b.forEach(function(a){d=Math.max(ga(this,a,c),d)}.bind(a));ha(a)}
-function ga(a,b,c){for(var d=!1,g,e=0,k=a.a.length;e<k;e++){var f=a.a[e];if(f.id===b.id){g=f.update(b,c);d=!0;break}}d||(f=!0===b.isMeMessage?new y(b,c):!0===b.isNotice?new A(b,c):new w(b,c),a.a.push(f),g=f.i);for(;a.a.length>a.b;)a.a.shift();return g||0}function ia(a){for(var b=D.b[E.id],c=0,d=b.a.length;c<d&&a>=b.a[c].i;c++)if(b.a[c].i===a)return b.a[c];return null}function ha(a){a.a.sort(function(a,c){return a.i-c.i})}y.prototype=Object.create(w.prototype);y.prototype.constructor=y;
-A.prototype=Object.create(w.prototype);A.prototype.constructor=A;"undefined"!==typeof module&&(module.w={U:w,T:y,V:A,Y:ea});function F(a){this.id=a;this.b={small:"",N:""};this.f={};this.h=this.a=null;this.version=0}F.prototype.update=function(a,b){void 0!==a.name&&(this.name=a.name);void 0!==a.deleted&&(this.g=a.deleted);void 0!==a.status&&(this.status=a.status);void 0!==a.presence&&(this.c="away"!==a.presence);void 0!==a.isPresent&&(this.c=a.isPresent);a.isBot&&(this.s=a.isBot);a.profile&&(this.b.small=a.profile.icon_small,this.b.N=a.profile.icon_large);this.version=Math.max(this.version,b)};
-"undefined"!==typeof module&&(module.w.R=F);var G={},H;function ja(){var a;if(!a){for(var b=0,c=navigator.languages.length;b<c;b++)if(G.hasOwnProperty(navigator.languages[b])){a=navigator.languages[b];break}a||(a="en")}H=G[a];console.log("Loading language pack: "+a);if(H.l)for(b in H.l)document.getElementById(b).textContent=H.l[b]};G.fr={M:"Utilisateur inconnu",L:"Channel inconnu",G:"Nouveau message",F:"Reseau",u:"(edit&eacute;)",H:"(visible seulement par vous)",m:"Favoris",f:"Discutions",J:"Discutions priv\u00e9es",D:function(a){"string"!==typeof a&&(a=parseFloat(a));var b=new Date,c=new Date;a=new Date(1E3*a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);c.setTime(b.getTime());c.setDate(c.getDate()-1);return a.getTime()>b.getTime()?a.toLocaleTimeString():a.getTime()>c.getTime()?"hier, "+a.toLocaleTimeString():
-a.toLocaleString()},l:{fileUploadCancel:"Annuler",neterror:"Impossible de se connecter au chat !"}};G.en={M:"Unknown member",L:"Unknown channel",G:"New message",F:"Network",u:"(edited)",H:"(only visible to you)",m:"Starred",f:"Channels",J:"Direct messages",D:function(a){"string"!==typeof a&&(a=parseFloat(a));var b=new Date,c=new Date;a=new Date(1E3*a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);c.setTime(b.getTime());c.setDate(c.getDate()-1);return a.getTime()>b.getTime()?a.toLocaleTimeString():a.getTime()>c.getTime()?"yesterday, "+a.toLocaleTimeString():a.toLocaleString()},
-l:{fileUploadCancel:"Cancel",neterror:"Cannot connect to chat !"}};var I=[],J=0;
-function ka(){var a=document.createDocumentFragment(),b=Object.keys(D.a.f||{}),c=[],d=[],g=[],e=[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:D.a.f[a].name.localeCompare(D.a.f[b].name)});b.forEach(function(a){a=D.a.f[a];if(!a.h&&!1!==a.s)if(a instanceof v){if(!a.c.g){var b;b=document.createElement("li");var l=document.createElement("a");b.id="room_"+a.id;l.href="#"+a.id;b.className="slack-context-room slack-ims";l.textContent=a.c.name;b.appendChild(K());b.appendChild(l);a.c.c||b.classList.add("away");
-E===a&&b.classList.add("selected");a.a>a.b&&(b.classList.add("unread"),0<=L.indexOf(a)&&b.classList.add("unreadHi"));b&&(a.m?c.push(b):e.push(b))}}else b=document.createElement("li"),l=document.createElement("a"),b.id="room_"+a.id,l.href="#"+a.id,a.j?(b.className="slack-context-room slack-group",b.dataset.count=Object.keys(a.g||{}).length):b.className="slack-context-room slack-channel",E===a&&b.classList.add("selected"),l.textContent=a.name,b.appendChild(K()),b.appendChild(l),a.a>a.b&&(b.classList.add("unread"),
-0<=L.indexOf(a)&&b.classList.add("unreadHi")),b&&(a.m?c.push(b):a.j?g.push(b):d.push(b))});c.length&&a.appendChild(M(H.m));c.forEach(function(b){a.appendChild(b)});d.length&&a.appendChild(M(H.f));d.forEach(function(b){a.appendChild(b)});g.forEach(function(b){a.appendChild(b)});e.length&&a.appendChild(M(H.J));e.forEach(function(b){a.appendChild(b)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);la();N();ma(function(a){document.getElementById("slackCtx").style.backgroundImage=
-"url("+a+")"})}function na(){var a=D.a.c,b;for(b in D.a.b.f)if(!D.a.b.f[b].h){var c=document.getElementById("room_"+b);a[b]?c.classList.add("slack-context-typing"):c.classList.remove("slack-context-typing")}for(var d in D.a.a)(b=D.a.a[d].h)&&!b.h&&(c=document.getElementById("room_"+b.id))&&(a[b.id]?c.classList.add("slack-context-typing"):c.classList.remove("slack-context-typing"));oa()}
-function oa(){var a=D.a.c;document.getElementById("whoistyping").textContent="";if(E&&a[E.id]){var b=document.createDocumentFragment(),c=!1,d;for(d in a[E.id])(a=D.a.a[d])?b.appendChild(pa(a)):c=!0;c&&(D.c=0);document.getElementById("whoistyping").appendChild(b)}}function O(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network");N()}
-function qa(){var a=E.name||(E.c?E.c.name:void 0);if(!a){var b=[];E.g.forEach(function(a){b.push(a.name)});a=b.join(", ")}document.getElementById("currentRoomTitle").textContent=a;ra();Q();document.getElementById("fileUploadContainer").classList.add("hidden");R();S&&(S=null,T());U&&(U=null,T());oa()}
-function T(){if(S){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){S=null;T()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(V("reply_"+E.id,S,!0))}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";Q()}
-function W(){if(U){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){U=null;W()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(V("edit_"+E.id,U,!0));document.getElementById("msgInput").value=U.text}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";Q()}
-window.toggleReaction=function(a,b,c){var d=D.b[a];if(d){a:{for(var g=0,e=d.a.length;g<e;g++)if(d.a[g].id==b){d=d.a[g];break a}d=null}d&&(g=D.a.b.id,d.a[c]&&-1!==d.a[c].indexOf(g)?(d=new XMLHttpRequest,d.open("DELETE","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0),d.send(null)):sa(a,b,c))}};
-function ta(a){a:{for(var b=a,c={};!c[b];){if(a=D.a.h.data[b])if("alias:"==a.substr(0,6))c[b]=!0,b=a.substr(6);else{b=document.createElement("span");b.className="emoji-custom emoji";b.style.backgroundImage="url('"+a+"')";a=b;break a}break}a=b}"string"===typeof a&&"makeEmoji"in window&&(a=window.makeEmoji(a));return"string"===typeof a?null:a}
-function ua(a){return a.replace(/:([^ \t:]+):/g,function(b,c){var d=ta(c);if(d){var g=document.createElement("span");g.className=b===a?"emoji-medium":"emoji-small";g.appendChild(d);return g.outerHTML}return b})}
-function X(a){a=a.split(/\r?\n/g);for(var b=0,c=a.length;b<c;b++){for(var d=a[b].trim(),g="",e={},k=!1,f=0,d=d.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){c=c.split("|");if("@"===b)c[1]?"@"!==c[1][0]&&(c[1]="@"+c[1]):(a=D.a.a[c[0]],c[1]=a?"@"+a.name:H.M),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-user";else if("#"===b)c[1]?"#"!==c[1][0]&&(c[1]="#"+c[1]):(a=D.a.f[c[0]],c[1]=a?"#"+a.name:H.L),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-chan";else if(-1!==c[0].indexOf("://"))c[1]||
-(c[1]=c[0]),c[2]="slackmsg-link";else return a;return'<a href="'+c[0]+'" class="'+c[2]+'"'+(b?"":' target="_blank"')+">"+c[1]+"</a>"}),d=ua(d),l=d.length,h=function(a,b,c){for(;a[b];){var d=a[b];if(("A"<=d&&"Z">=d||"a"<=d&&"z">=d||"0"<=d&&"9">=d||-1!=="\u00e0\u00e8\u00ec\u00f2\u00f9\u00c0\u00c8\u00cc\u00d2\u00d9\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00c1\u00c9\u00cd\u00d3\u00da\u00dd\u00e2\u00ea\u00ee\u00f4\u00fb\u00c2\u00ca\u00ce\u00d4\u00db\u00e3\u00f1\u00f5\u00c3\u00d1\u00d5\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u00e7\u00c7\u00df\u00d8\u00f8\u00c5\u00e5\u00c6\u00e6\u0153".indexOf(d))&&
-a[b]!=c&&a[b+1]==c)return!0;b++}return!1},q=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};f<l&&(" "===d[f]||"\t"===d[f]);)f++;"&gt;"===d.substr(f,4)&&(k=!0,f+=4);for(;f<l;f++){var m=d[f];if("<"===m){do g+=d[f++];while(">"!==d[f-1]);f--}else if(!e["slackmsg-style-bold"]&&"*"===m&&d[f+1]&&h(d,f,m))Object.keys(e).length&&(g+="</span>"),e["slackmsg-style-bold"]=!0,g+=q(e);else if(!e["slackmsg-style-strike"]&&"~"===m&&d[f+1]&&h(d,f,m))Object.keys(e).length&&
-(g+="</span>"),e["slackmsg-style-strike"]=!0,g+=q(e);else if(!e["slackmsg-style-code"]&&"`"===m&&d[f+1]&&h(d,f,m))Object.keys(e).length&&(g+="</span>"),e["slackmsg-style-code"]=!0,g+=q(e);else if(!e["slackmsg-style-italic"]&&"_"===m&&d[f+1]&&h(d,f,m))Object.keys(e).length&&(g+="</span>"),e["slackmsg-style-italic"]=!0,g+=q(e);else{var p=!1,g=g+m;do{if(e["slackmsg-style-bold"]&&"*"!==m&&"*"===d[f+1])delete e["slackmsg-style-bold"],p=!0;else if(e["slackmsg-style-strike"]&&"~"!==m&&"~"===d[f+1])delete e["slackmsg-style-strike"],
-p=!0;else if(e["slackmsg-style-code"]&&"`"!==m&&"`"===d[f+1])delete e["slackmsg-style-code"],p=!0;else if(e["slackmsg-style-italic"]&&"_"!==m&&"_"===d[f+1])delete e["slackmsg-style-italic"],p=!0;else break;m=d[++f]}while(f<l);p&&(g+="</span>"+q(e))}}e&&(g+="</span>");a[b]=k?'<span class="slackmsg-style-quote">'+g+"</span>":g}return a.join("<br/>")}
-function V(a,b,c){b instanceof y?(a=va(a,b,c),a.classList.add("slackmsg-me_message")):a=va(a,b,c);b.u&&a.classList.add("slackmsg-edited");b instanceof A&&a.classList.add("slackmsg-notice");return a}function wa(a,b){document.getElementById("linkFavicon").href=a||b?"favicon.png?h="+a+"&m="+b:"favicon_ok.png"}
-function N(){var a=L.length,b="";if(Y)b="!"+H.F+" - ",document.getElementById("linkFavicon").href="favicon_err.png";else if(a)b="(!"+a+") - ",wa(a,a);else{var a=0,c;for(c in D.a.f){var d=D.a.f[c];d.a>d.b&&a++}a&&(b="("+a+") - ");wa(0,a)}D.a.j&&(b+=D.a.j.name);document.title=b}
-function xa(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(J+3E4<a){var b=new Notification(H.G);J=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
-function ra(){var a=document.createDocumentFragment(),b=E.id,c=null,d=0,g=null,e;I=[];D.b[b]&&D.b[b].a.forEach(function(f){if(!f.b){var l=V(b,f),h=!1;c&&c.o===f.o&&f.o?30>Math.abs(d-f.i)&&!(f instanceof y)?g.classList.add("slackmsg-same-ts"):d=f.i:(d=f.i,h=!0);(!c||c.i<=E.b)&&f.i>E.b&&l.classList.add("slackmsg-first-unread");if(f instanceof y)g=c=null,d=0,a.appendChild(l),e=null;else{if(h||!e){var h=D.a.a[f.o],k=f.c,m=document.createElement("div"),p=document.createElement("div"),t=document.createElement("span");
-m.A=document.createElement("img");m.A.className="slackmsg-author-img";t.className="slackmsg-author-name";h?(t.textContent=h.name,m.A.src=h.b.small):(t.textContent=k||"?",m.A.src="");p.appendChild(m.A);p.appendChild(t);p.className="slackmsg-author";m.className="slackmsg-authorGroup";m.appendChild(p);m.content=document.createElement("div");m.content.className="slackmsg-author-messages";m.appendChild(m.content);e=m;I.push(e);a.appendChild(e)}c=f;g=l;e.content.appendChild(l)}}});var k=document.getElementById("chatWindow");
-k.textContent="";k.appendChild(a);k.scrollTop=k.scrollHeight-k.clientHeight;window.hasFocus&&R()}
-function ya(a){function b(a,b){for(b=b||a.target;b!==a.currentTarget&&b;){if(b.classList.contains("slackmsg-item"))return b.id;b=b.parentElement}}for(var c=a.target;c!==a.currentTarget&&c&&!c.classList.contains("slackmsg-hover");){if(c.parentElement&&c.parentElement.classList.contains("slackmsg-hover")){if(a=b(a,c)){a=parseFloat(a.split("_")[1]);var d=ia(a);d&&c.classList.contains("slackmsg-hover-reply")?(U&&(U=null,W()),S!==d&&(S=d,T())):d&&c.classList.contains("slackmsg-hover-reaction")?za.K(document.body,
-function(a){a&&sa(E.id,d.id,a)}):d&&c.classList.contains("slackmsg-hover-edit")?(S&&(S=null,T()),U!==d&&(U=d,W())):d&&c.classList.contains("slackmsg-hover-remove")&&(S&&(S=null,T()),U&&(U=null,W()),Aa(d))}break}c=c.parentElement}}function Q(){document.getElementById("msgInput").focus()}function la(){var a=document.location.hash.substr(1),b=D.a.f[a];b&&b!==E?Ba(b):(a=D.a.a[a])&&a.j&&Ba(a.j)}
-function Ca(){var a=document.getElementById("chatWindow").getBoundingClientRect().top;I.forEach(function(b){var c=b.A,d=c.clientHeight;b=b.getBoundingClientRect();c.style.top=Math.max(0,Math.min(a-b.top,b.height-d-d/2))+"px"})}
-document.addEventListener("DOMContentLoaded",function(){ja();document.getElementById("chatWindow").addEventListener("click",ya);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&la()});document.getElementById("fileUploadCancel").addEventListener("click",function(a){a.preventDefault();document.getElementById("fileUploadError").classList.add("hidden");document.getElementById("fileUploadContainer").classList.add("hidden");document.getElementById("fileUploadInput").value=
-"";return!1});document.getElementById("fileUploadForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("fileUploadInput");var b=a.value;b&&(b=b.substr(b.lastIndexOf("\\")+1),Da(b,a.files[0],function(a){var b=document.getElementById("fileUploadError");a?(b.textContent=a,b.classList.remove("hidden")):(b.classList.add("hidden"),document.getElementById("fileUploadInput").value="",document.getElementById("fileUploadContainer").classList.add("hidden"))}));return!1});
-document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();E&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");E&&a.value&&Ea(a.value)&&(a.value="",S&&(S=null,T()),U&&(U=null,T()),document.getElementById("slashList").textContent="");Q();return!1});window.addEventListener("blur",function(){window.hasFocus=
-!1});window.addEventListener("focus",function(){window.hasFocus=!0;J=0;E&&R();Q()});document.getElementById("chatWindow").addEventListener("scroll",Ca);var a=0;document.getElementById("msgInput").addEventListener("input",function(){if(E){var b=Date.now();a+3E3<b&&(D.a.b.c||E instanceof v)&&(Fa(),a=b);var b=[],c=this.value;if("/"===this.value[0]){var d=c.indexOf(" "),g=-1!==d,d=-1===d?c.length:d,c=c.substr(0,d),e;for(e in D.a.g.data){var k=D.a.g.data[e];(!g&&k.name.substr(0,d)===c||g&&k.name===c)&&
-b.push(k)}}b.sort(function(a,b){return a.B.localeCompare(b.B)||a.name.localeCompare(b.name)});var d=document.getElementById("slashList"),g=document.createDocumentFragment(),f;d.textContent="";e=0;for(c=b.length;e<c;e++)k=b[e],f!==k.B&&(f=k.B,g.appendChild(Ga(k.B))),g.appendChild(Ha(k));d.appendChild(g)}});window.hasFocus=!0;(function(){var a=document.getElementById("emojiButton");if("makeEmoji"in window){var c=window.makeEmoji("smile");c?a.innerHTML="<span class='emoji-small'>"+c.outerHTML+"</span>":
-a.style.backgroundImage='url("smile.svg")';(c=window.makeEmoji("paperclip"))?document.getElementById("attachFile").innerHTML="<span class='emoji-small'>"+c.outerHTML+"</span>":document.getElementById("attachFile").style.backgroundImage='url("public/paperclip.svg")';a.addEventListener("click",function(){za.K(document.body,function(a){a&&(document.getElementById("msgInput").value+=":"+a+":");Q()})})}else a.classList.add("hidden")})();Z()});function K(){var a=document.createElement("span"),b=document.createElement("span"),c=document.createElement("span"),d=document.createElement("span");a.className="typing-container";b.className="typing-dot1";c.className="typing-dot2";d.className="typing-dot3";b.textContent=c.textContent=d.textContent=".";a.appendChild(b);a.appendChild(c);a.appendChild(d);return a}var M=function(){var a={};return function(b){var c=a[b];c||(c=a[b]=document.createElement("header"),c.textContent=b);return c}}();
-function Ia(a,b,c,d){var g=ta(c);if(g){for(var e=document.createElement("li"),k=document.createElement("a"),f=document.createElement("span"),l=document.createElement("span"),h=[],q=0,m=d.length;q<m;q++){var p=D.a.a[d[q]];p&&h.push(p.name)}h.sort();l.textContent=h.join(", ");f.appendChild(g);f.className="emoji-small";k.href="javascript:toggleReaction('"+a+"', '"+b+"', '"+c+"')";k.appendChild(f);k.appendChild(l);e.className="slackmsg-reaction-item";e.appendChild(k);return e}console.warn("Reaction id not found: "+
-c);return null}
-function va(a,b,c){var d=document.createElement("div"),g=document.createElement("div"),e=document.createElement("div"),k=document.createElement("div"),f=document.createElement("span"),l=document.createElement("ul"),h=document.createElement("li"),q=document.createElement("ul"),m=document.createElement("ul"),p=D.a.a[b.o];d.id=a+"_"+b.i;d.className="slackmsg-item";e.className="slackmsg-ts";k.className="slackmsg-msg";f.className="slackmsg-author-name";l.className="slackmsg-hover";h.className="slackmsg-hover-reply";
-e.innerHTML=H.D(b.i);k.innerHTML=X(b.text);f.textContent=p?p.name:b.c||"?";l.appendChild(h);if("makeEmoji"in window){var t=document.createElement("li"),x=window.makeEmoji("arrow_heading_down"),z=window.makeEmoji("smile"),C=window.makeEmoji("pencil2"),p=window.makeEmoji("x");t.className="slackmsg-hover-reaction";z?(t.classList.add("emoji-small"),t.appendChild(z)):t.style.backgroundImage='url("smile.svg")';x?(h.classList.add("emoji-small"),h.appendChild(x)):h.style.backgroundImage='url("repl.svg")';
-l.appendChild(t);b.o===D.a.b.id&&(h=document.createElement("li"),h.className="slackmsg-hover-edit",C?h.classList.add("emoji-small"):h.style.backgroundImage='url("edit.svg")',h.appendChild(C),l.appendChild(h),h=document.createElement("li"),h.className="slackmsg-hover-remove",p?h.classList.add("emoji-small"):h.style.backgroundImage='url("remove.svg")',h.appendChild(p),l.appendChild(h))}else h.style.backgroundImage='url("repl.svg")',b.o===D.a.b.id&&(h=document.createElement("li"),h.className="slackmsg-hover-edit",
-h.style.backgroundImage='url("edit.svg")',l.appendChild(h),h=document.createElement("li"),h.className="slackmsg-hover-remove",h.style.backgroundImage='url("remove.svg")',l.appendChild(h));b instanceof A&&(p=document.createElement("span"),p.className="slackmsg-notice",p.textContent=H.H,g.appendChild(p));g.appendChild(f);g.appendChild(k);g.appendChild(e);g.appendChild(q);b.u&&(e=document.createElement("div"),e.innerHTML=H.u,e.className="slackmsg-edited",g.appendChild(e));g.appendChild(m);g.className=
-"slackmsg-content";q.className="slackmsg-attachments";m.className="slackmsg-reactions";if(!0!==c){if(b.a)for(var u in b.a)(c=Ia(a,b.id,u,b.a[u]))&&m.appendChild(c);b.g.forEach(function(a){var b=document.createElement("li"),c=document.createElement("div"),d=document.createElement("div"),e=document.createElement("a"),g=document.createElement("div"),f=document.createElement("img"),h=document.createElement("a"),l=document.createElement("div"),m=document.createElement("div"),k=document.createElement("div"),
-p=document.createElement("img"),u=document.createElement("div");b.className="slackmsg-attachment";var t="#e3e4e6";a.color&&("#"===a.color[0]?t=a.color[0]:"good"===a.color?t="#2fa44f":"warning"===a.color?t="#de9e31":"danger"===a.color&&(t="#d50200"));c.style.borderColor=t;c.className="slackmsg-attachment-block";d.className="slackmsg-attachment-pretext";a.pretext?d.innerHTML=X(a.pretext):d.classList.add("hidden");e.target="_blank";a.title?(e.innerHTML=X(a.title),a.title_link&&(e.href=a.title_link),
-e.className="slackmsg-attachment-title"):e.className="hidden slackmsg-attachment-title";h.target="_blank";g.className="slackmsg-author";a.author_name&&(h.innerHTML=X(a.author_name),h.href=a.author_link||"",h.className="slackmsg-author-name",f.className="slackmsg-author-img",a.author_icon&&(f.src=a.author_icon,g.appendChild(f)),g.appendChild(h));l.className="slackmsg-attachment-content";f=X(a.text||"");""!==f?(m.innerHTML=f,m.className="slackmsg-attachment-text"):m.className="slackmsg-attachment-text hidden";
-k.className="slackmsg-attachment-thumb";a.thumb_url?(f=document.createElement("img"),f.src=a.thumb_url,k.appendChild(f),c.classList.add("has-thumb")):k.classList.add("hidden");p.className="slackmsg-attachment-img";a.image_url?p.src=a.image_url:p.classList.add("hidden");u.className="slackmsg-attachment-footer";a.footer&&(f=document.createElement("span"),f.className="slackmsg-attachment-footer-text",f.innerHTML=X(a.footer),a.footer_icon&&(h=document.createElement("img"),h.src=a.footer_icon,h.className=
-"slackmsg-attachment-footer-icon",u.appendChild(h)),u.appendChild(f));a.ts&&(f=document.createElement("span"),f.className="slackmsg-ts",f.innerHTML=H.D(a.ts),u.appendChild(f));l.appendChild(m);l.appendChild(k);c.appendChild(e);c.appendChild(g);c.appendChild(l);c.appendChild(p);c.appendChild(u);b.appendChild(d);b.appendChild(c);b&&q.appendChild(b)})}d.appendChild(g);d.appendChild(l);return d}
-function pa(a){var b=document.createElement("li"),c=document.createElement("span");c.textContent=a.name;b.appendChild(K());b.appendChild(c);return b}function Ga(a){var b=document.createElement("lh");b.textContent=a;b.className="slack-command-header";return b}
-function Ha(a){var b=document.createElement("li"),c=document.createElement("span"),d=document.createElement("span"),g=document.createElement("span");c.textContent=a.name;d.textContent=a.usage;g.textContent=a.a;b.appendChild(c);b.appendChild(d);b.appendChild(g);b.className="slack-command-item";c.className="slack-command-name";d.className="slack-command-usage";g.className="slack-command-desc";return b};var za=function(){function a(a,b){for(var c=a.target;c!==l&&c&&"LI"!==c.nodeName;)c=c.parentElement;c&&"LI"===c.nodeName&&c.id&&"emojibar-"===c.id.substr(0,9)?b(c.id.substr(9)):b(null)}function b(){if(!c())return!1;B&&B(null);return!0}function c(){return l.parentElement?(l.parentElement.removeChild(h),l.parentElement.removeChild(l),!0):!1}function d(a){var b=0,c;a=void 0===a?t.value:a;if(f()){var d=window.searchEmojis(a);c=g(d);for(var h in x)x[h].visible&&(x[h].visible=!1,m.removeChild(x[h].l));
-h=0;for(var l=c.length;h<l;h++){var k=c[h].name,u=x[k];if(!u){var u=x,aa=k,B=k,k=window.makeEmoji(d[k]),q=document.createElement("span");q.appendChild(k);q.className="emoji-medium";k=e(B,q);u=u[aa]=k}u.visible||(u.visible=!0,m.appendChild(u.l));b++}}for(h in z)z[h].visible&&(z[h].visible=!1,p.removeChild(z[h].l));c=g(D.a.h.data);h=0;for(l=c.length;h<l;h++)k=c[h].name,""!==a&&k.substr(0,a.length)!==a||"alias:"===D.a.h.data[k].substr(0,6)||(u=z[k],u||(d=z,aa=u=k,k=D.a.h.data[k],B=document.createElement("span"),
-q=document.createElement("span"),B.className="emoji emoji-custom",B.style.backgroundImage='url("'+k+'")',q.appendChild(B),q.className="emoji-medium",k=e(aa,q),u=d[u]=k),u.visible||(u.visible=!0,p.appendChild(u.l)),b++);return b}function g(a){var b=D.a.b.a.b,c=[],d;for(d in a){var e={name:d,I:0,count:0};a[d].names&&a[d].names.forEach(function(a){e.count+=b[a]||0});c.push(e)}return c=c.sort(function(a,b){var c=b.count-a.count;return c?c:a.I-b.I})}function e(a,b){var c=document.createElement("li");c.appendChild(b);
-c.className="emojibar-list-item";c.id="emojibar-"+a;return{visible:!1,l:c}}function k(a){var b=document.createElement("img"),c=document.createElement("div");b.src=a;c.appendChild(b);c.className="emojibar-header";return c}function f(){return"searchEmojis"in window}var l=document.createElement("div"),h=document.createElement("div"),q=document.createElement("div"),m=document.createElement("ul"),p=document.createElement("ul"),t=document.createElement("input"),x={},z={},C=document.createElement("div"),
-u=document.createElement("span"),P=document.createElement("span"),B;h.addEventListener("click",function(a){var c=l.getBoundingClientRect();(a.screenY<c.top||a.screenY>c.bottom||a.screenX<c.left||a.screenX>c.right)&&b()});h.className="emojibar-overlay";l.className="emojibar";q.className="emojibar-emojis";C.className="emojibar-detail";u.className="emojibar-detail-img";P.className="emojibar-detail-name";m.className=p.className="emojibar-list";t.className="emojibar-search";C.appendChild(u);C.appendChild(P);
-q.appendChild(k(window.emojiProviderHeader));q.appendChild(m);q.appendChild(k("emojicustom.png"));q.appendChild(p);l.appendChild(q);l.appendChild(C);l.appendChild(t);t.addEventListener("keyup",function(){d()});l.addEventListener("mousemove",function(b){a(b,function(a){var b=a?x[a]||z[a]:null;b?(u.innerHTML=b.l.outerHTML,P.textContent=":"+a+":"):(u.textContent="",P.textContent="")})});l.addEventListener("click",function(b){a(b,function(a){a&&c()&&B&&B(a)})});return{isSupported:f,K:function(a,b){return f()?
-(B=b,a.appendChild(h),a.appendChild(l),t.value="",d(),t.focus(),!0):!1},search:d,close:b}}();var D,L=[];function Ja(){this.c=0;this.a=new da;this.b={}}
-Ja.prototype.update=function(a){var b=Date.now();a.v&&(this.c=a.v);if(a["static"]){var c=this.a,d=a["static"],g=Date.now();if(d.users)for(var e=0,k=d.users.length;e<k;e++){var f=c.a[d.users[e].id];f||(f=c.a[d.users[e].id]=new F(d.users[e].id));f.update(d.users[e],g)}if(d.channels)for(e=0,k=d.channels.length;e<k;e++){f=c.f[d.channels[e].id];if(!f){var f=c.f,l=d.channels[e].id,h;h=d.channels[e];h=h.pv?new v(h.id,c.a[h.user]):new r(h.id);f=f[l]=h}f.update(d.channels[e],c,g)}d.emojis&&(c.h.data=d.emojis,
-c.h.version=g);if(void 0!==d.commands){c.g.data={};for(e in d.commands)c.g.data[e]=new ba(d.commands[e]);c.g.version=g}d.team&&(c.j||(c.j=new n(d.team.id)),c.j.update(d.team,g));c.s=Math.max(c.s,g);d.self&&(c.b=c.a[d.self.id]||null,c.b?(c.b.a||(c.b.a=new ca),c.b.a.update(d.self.prefs,g)):c.s=0);if(void 0!==d.typing)for(e in c.c={},d.typing){c.c[e]={};for(var q in d.typing[e])c.c[e][q]=g}}for(var m in this.a.f){var p=this.a.f[m];p.a===p.b&&(c=L.indexOf(p),-1!==c&&L.splice(c,1))}if(a.live){for(p in a.live)(m=
-this.b[p])?fa(m,a.live[p],b):this.b[p]=new ea(p,250,a.live[p],b);for(var t in a.live)(b=this.a.f[t])?(this.b[t].a.length&&(p=this.b[t],b.a=Math.max(b.a,p.a[p.a.length-1].i)),b.h||(Ka(b,a.live[t]),E&&a.live[E.id]&&ra())):D.c=0}a["static"]&&(ka(),a["static"].typing&&na())};setInterval(function(){var a=D.a,b=Date.now(),c=!1,d;for(d in a.c){var g=!0,e;for(e in a.c[d])a.c[d][e]+3E3<b?(delete a.c[d][e],c=!0):g=!1;g&&(delete a.c[d],c=!0)}c&&na()},1E3);
-function Ka(a,b){if(a!==E||!window.hasFocus){var c=new RegExp("<@"+D.a.b.id),d=!1,g=!1,e=!1;b.forEach(function(b){if(!(parseFloat(b.ts)<=a.b)){g=!0;var f;if(!(f=a instanceof v||b.text.match(c)))a:{f=D.a.b.a.a;for(var h=0,k=f.length;h<k;h++)if(-1!==b.text.indexOf(f[h])){f=!0;break a}f=!1}f&&(-1===L.indexOf(a)&&(e=!0,L.push(a)),d=!0)}});if(g){N();var k=document.getElementById("room_"+a.id);k&&(k.classList.add("unread"),d&&k.classList.add("unreadHi"));e&&!window.hasFocus&&xa()}}}
-function R(){var a=E,b=L.indexOf(a);if(a.a>a.b){var c=new XMLHttpRequest;c.open("POST","api/markread?room="+a.id+"&ts="+a.a,!0);c.send(null);a.b=a.a}0<=b&&(L.splice(b,1),N());a=document.getElementById("room_"+a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}D=new Ja;var ma=function(){function a(a,b){b.sort(function(){return Math.random()-.5});for(var c=0,d=20;d<l-40;d+=q)for(var f=0;f+q<=h;f+=q)e(a,b[c],d,f),c++,c===b.length&&(b.sort(function(a,b){return a.C?b.C?Math.random()-.5:-1:1}),c=0)}function b(a,d){for(var e=0,f=a.length;e<f;e++)if(void 0===a[e].C){c(a[e].src,function(c){a[e].C=c;b(a,d)});return}var g=[];a.forEach(function(a){a.C&&g.push(a.C)});d(g)}function c(a,b){var c=new XMLHttpRequest;c.responseType="blob";c.onreadystatechange=function(){if(4===
-c.readyState)if(c.response){var a=new Image;a.onload=function(){var c=document.createElement("canvas");c.height=c.width=t;c=c.getContext("2d");c.drawImage(a,0,0,t,t);for(var c=c.getImageData(0,0,t,t),d=0,e=0;e<c.width*c.height*4;e+=4)c.data[e]=c.data[e+1]=c.data[e+2]=(c.data[e]+c.data[e+1]+c.data[e+2])/3,c.data[e+3]=50,d+=c.data[e];if(50>d/(c.height*c.width))for(e=0;e<c.width*c.height*4;e+=4)c.data[e]=c.data[e+1]=c.data[e+2]=255-c.data[e];b(c)};a.onerror=function(){b(null)};a.src=window.URL.createObjectURL(c.response)}else b(null)};
-c.open("GET",a,!0);c.send(null)}function d(){var a=f.createLinearGradient(0,0,0,h);a.addColorStop(0,"#4D394B");a.addColorStop(1,"#201820");f.fillStyle=a;f.fillRect(0,0,l,h);return f.getImageData(0,0,l,h)}function g(a,b){for(var c=(a.height-b.height)/2,d=0;d<b.height;d++)for(var e=0;e<b.width;e++){var f=b.data[4*(d*b.width+e)]/255,g=4*((d+c)*a.width+e+c);a.data[g]*=f;a.data[g+1]*=f;a.data[g+2]*=f}return a}function e(a,b,c,d){var e=Math.floor(d);a=[a.data[e*l*4+0],a.data[e*l*4+1],a.data[e*l*4+2]];f.fillStyle=
-"#"+(1.1*a[0]<<16|1.1*a[1]<<8|1.1*a[2]).toString(16);f.beginPath();f.moveTo(c+q/2,d+m);f.lineTo(c-m+q,d+q/2);f.lineTo(c+q/2,d-m+q);f.lineTo(c+m,d+q/2);f.closePath();f.fill();f.putImageData(g(f.getImageData(c+m,d+m,p,p),b),c+m,d+m)}var k=document.createElement("canvas"),f=k.getContext("2d"),l=k.width=250,h=k.height=290,q=(l-40)/3,m=.1*q,p=Math.floor(q-2*m),t=.5*p,x,z=[],C=!1;return function(c){if(x)c(x);else if(C)z.push(c);else{var e=d(),f=[];C=!0;z.push(c);for(var g in D.a.a)D.a.a[g].g||D.a.a[g].s||
-f.push({src:"api/avatar?user="+g});b(f,function(b){a(e,b);x=k.toDataURL();z.forEach(function(a){a(x)})})}}}();var Y=0,E=null,S=null,U=null;function La(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,d=2===Math.floor(b.status/100);if(d){Y&&(Y=0,O(!0));c=b.response;try{c=JSON.parse(c)}catch(g){c=null}}else Y?(Y+=Math.floor((Y||5)/2),Y=Math.min(60,Y)):(Y=5,O(!1));a(d,c)}else Y&&(Y=0,O(!0)),La(a)};b.open("GET","api?v="+D.c,!0);b.send(null)}function Fa(){var a=new XMLHttpRequest;a.open("POST","api/typing?room="+E.id,!0);a.send(null)}
-function Ma(a,b){a?(b&&D.update(b),Z()):setTimeout(Z,1E3*Y)}function Z(){La(Ma)}function Ba(a){E&&document.getElementById("room_"+E.id).classList.remove("selected");document.getElementById("room_"+a.id).classList.add("selected");document.body.classList.remove("no-room-selected");E=a;qa();E.a&&!D.b[E.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+E.id,!0),a.send(null))}
-function Da(a,b,c){var d=E;new FileReader;var g=new FormData,e=new XMLHttpRequest;g.append("file",b);g.append("filename",a);e.onreadystatechange=function(){4===e.readyState&&(204===e.status?c(null):c(e.statusText))};e.open("POST","api/file?room="+d.id);e.send(g)}
-function Ea(a){if(U){var b=new XMLHttpRequest;b.open("PUT","api/msg?room="+E.id+"&ts="+U.id+"&text="+encodeURIComponent(a),!0);b.send(null);return!0}if("/"===a[0]){var c=a.indexOf(" "),b=-1===c?"":a.substr(c);return(a=D.a.g.data[a.substr(0,-1===c?void 0:c)])?(c=new XMLHttpRequest,c.open("POST","api/cmd?room="+E.id+"&cmd="+encodeURIComponent(a.name.substr(1))+"&args="+encodeURIComponent(b.trim()),!0),c.send(null),!0):!1}var b=E,c=S,d=new XMLHttpRequest;a="api/msg?room="+b.id+"&text="+encodeURIComponent(a);
-if(c){var g=D.a.a[c.o],e="Message";"C"===b.id[0]?e="Channel message":"D"===b.id[0]?e="Direct message":"G"===b.id[0]&&(e="Group message");a+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:c.text,author_name:"<@"+g.id+"|"+g.name+">",author_icon:g.b.small,text:c.text,footer:e,ts:c.i}]))}d.open("POST",a,!0);d.send(null);return!0}function Aa(a){var b=new XMLHttpRequest;b.open("DELETE","api/msg?room="+E.id+"&ts="+a.id,!0);b.send(null)}
-function sa(a,b,c){var d=new XMLHttpRequest;d.open("POST","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0);d.send(null)};
+function m(a){this.id=a;this.version=0}m.prototype.update=function(a,c){void 0!==a.name&&(this.name=a.name);this.version=Math.max(this.version,c)};function aa(a){this.a=a.desc;this.name=a.name;this.type=a.type;this.usage=a.usage;this.B=a.category}function ba(){this.b={};this.a=[]}
+ba.prototype.update=function(a,c){this.b=JSON.parse(a.emoji_use);a.highlight_words?this.a=(a.highlight_words||"").split(",").filter(function(a){return""!==a.trim()}):a.highlights&&(this.a=a.highlights);this.version=Math.max(this.version,c)};function ca(){this.j=null;this.f={};this.a={};this.b=null;this.h={version:0,data:{}};this.g={version:0,data:{}};this.c={};this.s=0}"undefined"!==typeof module&&(module.w.R=ca,module.w.S=m,module.w.U=aa);function r(a){this.id=a;this.o=!1;this.a=this.b=0;this.g={};this.version=0}
+r.prototype.update=function(a,c,b){void 0!==a.name&&(this.name=a.name);void 0!==a.is_archived&&(this.h=a.is_archived);void 0!==a.is_member&&(this.s=a.is_member);void 0!==a.last_read&&(this.b=Math.max(parseFloat(a.last_read),this.b));void 0!==a.last_msg&&(this.a=parseFloat(a.last_msg));void 0!==a.is_private&&(this.j=a.is_private);a.latest&&(this.a=parseFloat(a.latest.ts));void 0!==a.is_starred&&(this.o=a.is_starred);if(a.members&&(this.g={},a.members))for(var d=0,h=a.members.length;d<h;d++){var e=
+c.a[a.members[d]];this.g[e.id]=e;e.f[this.id]=this}this.version=Math.max(this.version,b)};function B(a,c){r.call(this,a);this.c=c;this.name=this.c.name;this.j=!0;c.h=this}B.prototype=Object.create(r.prototype);B.prototype.constructor=B;"undefined"!==typeof module&&(module.w.Z=r,module.w.Y=B);function C(a,c){this.l=a.user;this.h=a.username;this.id=a.id||a.ts;this.i=parseFloat(a.ts);this.b="";this.a=[];this.g=this.u=this.o=!1;this.c={};this.version=c;this.update(a,c)}function D(a,c){C.call(this,a,c)}function E(a,c){C.call(this,a,c)}
+C.prototype.update=function(a,c){if(a){if(this.b=a.text||"",a.attachments&&(this.a=a.attachments),this.o=!!a.is_starred,this.u=!!a.edited,this.g=!!a.removed,a.reactions){var b={};a.reactions.forEach(function(a){b[a.name]=[];a.users.forEach(function(c){b[a.name].push(c)})});this.c=b}}else this.g=!0;this.version=c};function F(a,c,b,d){this.id="string"===typeof a?a:a.id;this.a=[];this.b=c;b&&da(this,b,d)}function da(a,c,b){var d=0;c.forEach(function(a){d=Math.max(this.push(a,b),d)}.bind(a));ea(a)}
+F.prototype.push=function(a,c){for(var b=!1,d,h=0,e=this.a.length;h<e;h++){var g=this.a[h];if(g.id===a.id){d=g.update(a,c);b=!0;break}}b||(g=!0===a.isMeMessage?new D(a,c):!0===a.isNotice?new E(a,c):new C(a,c),this.a.push(g),d=g.i);for(;this.a.length>this.b;)this.a.shift();return d||0};function fa(a){for(var c=H.b[I.id],b=0,d=c.a.length;b<d&&a>=c.a[b].i;b++)if(c.a[b].i===a)return c.a[b];return null}function ea(a){a.a.sort(function(a,b){return a.i-b.i})}D.prototype=Object.create(C.prototype);
+D.prototype.constructor=D;E.prototype=Object.create(C.prototype);E.prototype.constructor=E;"undefined"!==typeof module&&(module.w={W:C,V:D,X:E,$:F});function J(a){this.id=a;this.b={small:"",P:""};this.f={};this.h=this.a=null;this.version=0}J.prototype.update=function(a,c){void 0!==a.name&&(this.name=a.name);void 0!==a.deleted&&(this.g=a.deleted);void 0!==a.status&&(this.status=a.status);void 0!==a.presence&&(this.c="away"!==a.presence);void 0!==a.isPresent&&(this.c=a.isPresent);a.isBot&&(this.s=a.isBot);a.profile&&(this.b.small=a.profile.icon_small,this.b.P=a.profile.icon_large);this.version=Math.max(this.version,c)};
+"undefined"!==typeof module&&(module.w.T=J);var K={},L;function ga(){var a;if(!a){for(var c=0,b=navigator.languages.length;c<b;c++)if(K.hasOwnProperty(navigator.languages[c])){a=navigator.languages[c];break}a||(a="en")}L=K[a];console.log("Loading language pack: "+a);if(L.m)for(c in L.m)document.getElementById(c).textContent=L.m[c]};K.fr={M:"Utilisateur inconnu",L:"Channel inconnu",G:"Nouveau message",F:"Reseau",u:"(edit&eacute;)",H:"(visible seulement par vous)",o:"Favoris",f:"Discutions",J:"Discutions priv\u00e9es",D:function(a){"string"!==typeof a&&(a=parseFloat(a));var c=new Date,b=new Date;a=new Date(1E3*a);c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0);b.setTime(c.getTime());b.setDate(b.getDate()-1);return a.getTime()>c.getTime()?a.toLocaleTimeString():a.getTime()>b.getTime()?"hier, "+a.toLocaleTimeString():
+a.toLocaleString()},m:{fileUploadCancel:"Annuler",neterror:"Impossible de se connecter au chat !"}};K.en={M:"Unknown member",L:"Unknown channel",G:"New message",F:"Network",u:"(edited)",H:"(only visible to you)",o:"Starred",f:"Channels",J:"Direct messages",D:function(a){"string"!==typeof a&&(a=parseFloat(a));var c=new Date,b=new Date;a=new Date(1E3*a);c.setHours(0);c.setMinutes(0);c.setSeconds(0);c.setMilliseconds(0);b.setTime(c.getTime());b.setDate(b.getDate()-1);return a.getTime()>c.getTime()?a.toLocaleTimeString():a.getTime()>b.getTime()?"yesterday, "+a.toLocaleTimeString():a.toLocaleString()},
+m:{fileUploadCancel:"Cancel",neterror:"Cannot connect to chat !"}};var M=[],N=0;
+function ha(){var a=document.createDocumentFragment(),c=Object.keys(H.a.f||{}),b=[],d=[],h=[],e=[];c.sort(function(a,c){return a[0]!==c[0]?a[0]-c[0]:H.a.f[a].name.localeCompare(H.a.f[c].name)});c.forEach(function(a){a=H.a.f[a];if(!a.h&&!1!==a.s)if(a instanceof B){if(!a.c.g){var c;c=document.createElement("li");var g=document.createElement("a");c.id="room_"+a.id;g.href="#"+a.id;c.className="slack-context-room slack-ims";g.textContent=a.c.name;c.appendChild(O());c.appendChild(g);a.c.c||c.classList.add("away");
+I===a&&c.classList.add("selected");a.a>a.b&&(c.classList.add("unread"),0<=Q.indexOf(a)&&c.classList.add("unreadHi"));c&&(a.o?b.push(c):e.push(c))}}else c=document.createElement("li"),g=document.createElement("a"),c.id="room_"+a.id,g.href="#"+a.id,a.j?(c.className="slack-context-room slack-group",c.dataset.count=Object.keys(a.g||{}).length):c.className="slack-context-room slack-channel",I===a&&c.classList.add("selected"),g.textContent=a.name,c.appendChild(O()),c.appendChild(g),a.a>a.b&&(c.classList.add("unread"),
+0<=Q.indexOf(a)&&c.classList.add("unreadHi")),c&&(a.o?b.push(c):a.j?h.push(c):d.push(c))});b.length&&a.appendChild(R(L.o));b.forEach(function(c){a.appendChild(c)});d.length&&a.appendChild(R(L.f));d.forEach(function(c){a.appendChild(c)});h.forEach(function(c){a.appendChild(c)});e.length&&a.appendChild(R(L.J));e.forEach(function(c){a.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);ia();S();ja(function(a){document.getElementById("slackCtx").style.backgroundImage=
+"url("+a+")"})}function ka(){var a=H.a.c,c;for(c in H.a.b.f)if(!H.a.b.f[c].h){var b=document.getElementById("room_"+c);a[c]?b.classList.add("slack-context-typing"):b.classList.remove("slack-context-typing")}for(var d in H.a.a)(c=H.a.a[d].h)&&!c.h&&(b=document.getElementById("room_"+c.id))&&(a[c.id]?b.classList.add("slack-context-typing"):b.classList.remove("slack-context-typing"));la()}
+function la(){var a=H.a.c;document.getElementById("whoistyping").textContent="";if(I&&a[I.id]){var c=document.createDocumentFragment(),b=!1,d;for(d in a[I.id])(a=H.a.a[d])?c.appendChild(ma(a)):b=!0;b&&(H.c=0);document.getElementById("whoistyping").appendChild(c)}}function na(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network");S()}
+function oa(){var a=I.name||(I.c?I.c.name:void 0);if(!a){var c=[];I.g.forEach(function(a){c.push(a.name)});a=c.join(", ")}document.getElementById("currentRoomTitle").textContent=a;pa();T();document.getElementById("fileUploadContainer").classList.add("hidden");qa();U&&(U=null,V());W&&(W=null,V());la()}
+function V(){if(U){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),c=document.createElement("a");c.addEventListener("click",function(){U=null;V()});c.className="replyto-close";c.textContent="x";a.textContent="";a.appendChild(c);a.appendChild(ra("reply_"+I.id,U,!0))}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";T()}
+function X(){if(W){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),c=document.createElement("a");c.addEventListener("click",function(){W=null;X()});c.className="replyto-close";c.textContent="x";a.textContent="";a.appendChild(c);a.appendChild(ra("edit_"+I.id,W,!0));document.getElementById("msgInput").value=W.b}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";T()}
+window.toggleReaction=function(a,c,b){var d=H.b[a];if(d){a:{for(var h=0,e=d.a.length;h<e;h++)if(d.a[h].id==c){d=d.a[h];break a}d=null}d&&(h=H.a.b.id,d.c[b]&&-1!==d.c[b].indexOf(h)?(d=new XMLHttpRequest,d.open("DELETE","api/reaction?room="+a+"&msg="+c+"&reaction="+encodeURIComponent(b),!0),d.send(null)):sa(a,c,b))}};
+function ta(a){a:{for(var c=a,b={};!b[c];){if(a=H.a.h.data[c])if("alias:"==a.substr(0,6))b[c]=!0,c=a.substr(6);else{c=document.createElement("span");c.className="emoji-custom emoji";c.style.backgroundImage="url('"+a+"')";a=c;break a}break}a=c}"string"===typeof a&&"makeEmoji"in window&&(a=window.makeEmoji(a));return"string"===typeof a?null:a}
+function ua(a){return a.replace(/:([^ \t:]+):/g,function(c,b){var d=ta(b);if(d){var h=document.createElement("span");h.className=c===a?"emoji-medium":"emoji-small";h.appendChild(d);return h.outerHTML}return c})}
+function Y(a){if(!a||""==a)return"";a=a.split(/\r?\n/g);for(var c=0,b=a.length;c<b;c++){for(var d=a[c].trim(),h="",e={},g=!1,f=0,d=d.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,c,b){b=b.split("|");if("@"===c)b[1]?"@"!==b[1][0]&&(b[1]="@"+b[1]):(a=H.a.a[b[0]],b[1]=a?"@"+a.name:L.M),b[0]="#"+b[0],b[2]="slackmsg-link slackmsg-link-user";else if("#"===c)b[1]?"#"!==b[1][0]&&(b[1]="#"+b[1]):(a=H.a.f[b[0]],b[1]=a?"#"+a.name:L.L),b[0]="#"+b[0],b[2]="slackmsg-link slackmsg-link-chan";else if(-1!==b[0].indexOf("://"))b[1]||
+(b[1]=b[0]),b[2]="slackmsg-link";else return a;return'<a href="'+b[0]+'" class="'+b[2]+'"'+(c?"":' target="_blank"')+">"+b[1]+"</a>"}),d=ua(d),p=d.length,k=function(a,c,b){for(;a[c];){var d=a[c];if(("A"<=d&&"Z">=d||"a"<=d&&"z">=d||"0"<=d&&"9">=d||-1!=="\u00e0\u00e8\u00ec\u00f2\u00f9\u00c0\u00c8\u00cc\u00d2\u00d9\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00c1\u00c9\u00cd\u00d3\u00da\u00dd\u00e2\u00ea\u00ee\u00f4\u00fb\u00c2\u00ca\u00ce\u00d4\u00db\u00e3\u00f1\u00f5\u00c3\u00d1\u00d5\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u00e7\u00c7\u00df\u00d8\u00f8\u00c5\u00e5\u00c6\u00e6\u0153".indexOf(d))&&
+a[c]!=b&&a[c+1]==b)return!0;c++}return!1},u=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};f<p&&(" "===d[f]||"\t"===d[f]);)f++;"&gt;"===d.substr(f,4)&&(g=!0,f+=4);for(;f<p;f++){var l=d[f];if("<"===l){do h+=d[f++];while(">"!==d[f-1]);f--}else if(!e["slackmsg-style-bold"]&&"*"===l&&d[f+1]&&k(d,f,l))Object.keys(e).length&&(h+="</span>"),e["slackmsg-style-bold"]=!0,h+=u(e);else if(!e["slackmsg-style-strike"]&&"~"===l&&d[f+1]&&k(d,f,l))Object.keys(e).length&&
+(h+="</span>"),e["slackmsg-style-strike"]=!0,h+=u(e);else if(!e["slackmsg-style-code"]&&"`"===l&&d[f+1]&&k(d,f,l))Object.keys(e).length&&(h+="</span>"),e["slackmsg-style-code"]=!0,h+=u(e);else if(!e["slackmsg-style-italic"]&&"_"===l&&d[f+1]&&k(d,f,l))Object.keys(e).length&&(h+="</span>"),e["slackmsg-style-italic"]=!0,h+=u(e);else{var n=!1,h=h+l;do{if(e["slackmsg-style-bold"]&&"*"!==l&&"*"===d[f+1])delete e["slackmsg-style-bold"],n=!0;else if(e["slackmsg-style-strike"]&&"~"!==l&&"~"===d[f+1])delete e["slackmsg-style-strike"],
+n=!0;else if(e["slackmsg-style-code"]&&"`"!==l&&"`"===d[f+1])delete e["slackmsg-style-code"],n=!0;else if(e["slackmsg-style-italic"]&&"_"!==l&&"_"===d[f+1])delete e["slackmsg-style-italic"],n=!0;else break;l=d[++f]}while(f<p);n&&(h+="</span>"+u(e))}}e&&(h+="</span>");a[c]=g?'<span class="slackmsg-style-quote">'+h+"</span>":h}return a.length?a.join("<br/>"):""}
+function ra(a,c,b){c instanceof D?(a=va(a,c,b),a.classList.add("slackmsg-me_message")):a=va(a,c,b);c.u&&a.classList.add("slackmsg-edited");c instanceof E&&a.classList.add("slackmsg-notice");return a}function wa(a,c){document.getElementById("linkFavicon").href=a||c?"favicon.png?h="+a+"&m="+c:"favicon_ok.png"}
+function S(){var a=Q.length,c="";if(Z)c="!"+L.F+" - ",document.getElementById("linkFavicon").href="favicon_err.png";else if(a)c="(!"+a+") - ",wa(a,a);else{var a=0,b;for(b in H.a.f){var d=H.a.f[b];d.a>d.b&&a++}a&&(c="("+a+") - ");wa(0,a)}H.a.j&&(c+=H.a.j.name);document.title=c}
+function xa(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(N+3E4<a){var c=new Notification(L.G);N=a;setTimeout(function(){c.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
+function pa(){var a=document.createDocumentFragment(),c=I.id,b=null,d=0,h=null,e;M=[];H.b[c]&&H.b[c].a.forEach(function(f){if(!f.g){var g=ra(c,f),k=!1;b&&b.l===f.l&&f.l?30>Math.abs(d-f.i)&&!(f instanceof D)?h.classList.add("slackmsg-same-ts"):d=f.i:(d=f.i,k=!0);(!b||b.i<=I.b)&&f.i>I.b&&g.classList.add("slackmsg-first-unread");if(f instanceof D)h=b=null,d=0,a.appendChild(g),e=null;else{if(k||!e){var k=H.a.a[f.l],u=f.h,l=document.createElement("div"),n=document.createElement("div"),t=document.createElement("span");
+l.A=document.createElement("img");l.A.className="slackmsg-author-img";t.className="slackmsg-author-name";k?(t.textContent=k.name,l.A.src=k.b.small):(t.textContent=u||"?",l.A.src="");n.appendChild(l.A);n.appendChild(t);n.className="slackmsg-author";l.className="slackmsg-authorGroup";l.appendChild(n);l.content=document.createElement("div");l.content.className="slackmsg-author-messages";l.appendChild(l.content);e=l;M.push(e);a.appendChild(e)}b=f;h=g;e.content.appendChild(g)}}});var g=document.getElementById("chatWindow");
+g.textContent="";g.appendChild(a);g.scrollTop=g.scrollHeight-g.clientHeight;window.hasFocus&&qa()}
+function ya(a){function c(a,c){for(c=c||a.target;c!==a.currentTarget&&c;){if(c.classList.contains("slackmsg-item"))return c.id;c=c.parentElement}}for(var b=a.target;b!==a.currentTarget&&b&&!b.classList.contains("slackmsg-hover");){if(b.parentElement&&b.classList.contains("slackmsg-attachment-actions-item")){var d=c(a,b),h=b.dataset.O,e=b.dataset.N;if(d&&void 0!==h&&void 0!==e){var d=parseFloat(d.split("_")[1]),g=fa(d);g&&g.a[h]&&g.a[h].actions&&g.a[h].actions[e]&&(d=za(g,g.a[h],g.a[h].actions[e]),
+Aa(d,g.l))}}else if(b.parentElement&&b.parentElement.classList.contains("slackmsg-hover")){if(d=c(a,b))d=parseFloat(d.split("_")[1]),(g=fa(d))&&b.classList.contains("slackmsg-hover-reply")?(W&&(W=null,X()),U!==g&&(U=g,V())):g&&b.classList.contains("slackmsg-hover-reaction")?Ba.K(document.body,function(a){a&&sa(I.id,g.id,a)}):g&&b.classList.contains("slackmsg-hover-edit")?(U&&(U=null,V()),W!==g&&(W=g,X())):g&&b.classList.contains("slackmsg-hover-remove")&&(U&&(U=null,V()),W&&(W=null,X()),Ca(g));break}b=
+b.parentElement}}function T(){document.getElementById("msgInput").focus()}function ia(){var a=document.location.hash.substr(1),c=H.a.f[a];c&&c!==I?Da(c):(a=H.a.a[a])&&a.j&&Da(a.j)}function Ea(){var a=document.getElementById("chatWindow").getBoundingClientRect().top;M.forEach(function(c){var b=c.A,d=b.clientHeight;c=c.getBoundingClientRect();b.style.top=Math.max(0,Math.min(a-c.top,c.height-d-d/2))+"px"})}
+document.addEventListener("DOMContentLoaded",function(){ga();document.getElementById("chatWindow").addEventListener("click",ya);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&ia()});document.getElementById("fileUploadCancel").addEventListener("click",function(a){a.preventDefault();document.getElementById("fileUploadError").classList.add("hidden");document.getElementById("fileUploadContainer").classList.add("hidden");document.getElementById("fileUploadInput").value=
+"";return!1});document.getElementById("fileUploadForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("fileUploadInput");var c=a.value;c&&(c=c.substr(c.lastIndexOf("\\")+1),Fa(c,a.files[0],function(a){var c=document.getElementById("fileUploadError");a?(c.textContent=a,c.classList.remove("hidden")):(c.classList.add("hidden"),document.getElementById("fileUploadInput").value="",document.getElementById("fileUploadContainer").classList.add("hidden"))}));return!1});
+document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();I&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");I&&a.value&&Ga(a.value)&&(a.value="",U&&(U=null,V()),W&&(W=null,V()),document.getElementById("slashList").textContent="");T();return!1});window.addEventListener("blur",function(){window.hasFocus=
+!1});window.addEventListener("focus",function(){window.hasFocus=!0;N=0;I&&qa();T()});document.getElementById("chatWindow").addEventListener("scroll",Ea);var a=0;document.getElementById("msgInput").addEventListener("input",function(){if(I){var c=Date.now();a+3E3<c&&(H.a.b.c||I instanceof B)&&(Ha(),a=c);var c=[],b=this.value;if("/"===this.value[0]){var d=b.indexOf(" "),h=-1!==d,d=-1===d?b.length:d,b=b.substr(0,d),e;for(e in H.a.g.data){var g=H.a.g.data[e];(!h&&g.name.substr(0,d)===b||h&&g.name===b)&&
+c.push(g)}}c.sort(function(a,c){return a.B.localeCompare(c.B)||a.name.localeCompare(c.name)});var d=document.getElementById("slashList"),h=document.createDocumentFragment(),f;d.textContent="";e=0;for(b=c.length;e<b;e++)g=c[e],f!==g.B&&(f=g.B,h.appendChild(Ia(g.B))),h.appendChild(Ja(g));d.appendChild(h)}});window.hasFocus=!0;(function(){var a=document.getElementById("emojiButton");if("makeEmoji"in window){var b=window.makeEmoji("smile");b?a.innerHTML="<span class='emoji-small'>"+b.outerHTML+"</span>":
+a.style.backgroundImage='url("smile.svg")';(b=window.makeEmoji("paperclip"))?document.getElementById("attachFile").innerHTML="<span class='emoji-small'>"+b.outerHTML+"</span>":document.getElementById("attachFile").style.backgroundImage='url("public/paperclip.svg")';a.addEventListener("click",function(){Ba.K(document.body,function(a){a&&(document.getElementById("msgInput").value+=":"+a+":");T()})})}else a.classList.add("hidden")})();Ka()});function O(){var a=document.createElement("span"),c=document.createElement("span"),b=document.createElement("span"),d=document.createElement("span");a.className="typing-container";c.className="typing-dot1";b.className="typing-dot2";d.className="typing-dot3";c.textContent=b.textContent=d.textContent=".";a.appendChild(c);a.appendChild(b);a.appendChild(d);return a}var R=function(){var a={};return function(c){var b=a[c];b||(b=a[c]=document.createElement("header"),b.textContent=c);return b}}();
+function va(a,c,b){var d=document.createElement("div"),h=document.createElement("div"),e=document.createElement("div"),g=document.createElement("div"),f=document.createElement("span"),p=document.createElement("ul"),k=document.createElement("li"),u=document.createElement("ul"),l=document.createElement("ul"),n=H.a.a[c.l];d.id=a+"_"+c.i;d.className="slackmsg-item";e.className="slackmsg-ts";g.className="slackmsg-msg";f.className="slackmsg-author-name";p.className="slackmsg-hover";k.className="slackmsg-hover-reply";
+e.innerHTML=L.D(c.i);g.innerHTML=Y(c.b);f.textContent=n?n.name:c.h||"?";p.appendChild(k);if("makeEmoji"in window){var t=document.createElement("li"),w=window.makeEmoji("arrow_heading_down"),y=window.makeEmoji("smile"),x=window.makeEmoji("pencil2"),n=window.makeEmoji("x");t.className="slackmsg-hover-reaction";y?(t.classList.add("emoji-small"),t.appendChild(y)):t.style.backgroundImage='url("smile.svg")';w?(k.classList.add("emoji-small"),k.appendChild(w)):k.style.backgroundImage='url("repl.svg")';p.appendChild(t);
+c.l===H.a.b.id&&(k=document.createElement("li"),k.className="slackmsg-hover-edit",x?k.classList.add("emoji-small"):k.style.backgroundImage='url("edit.svg")',k.appendChild(x),p.appendChild(k),k=document.createElement("li"),k.className="slackmsg-hover-remove",n?k.classList.add("emoji-small"):k.style.backgroundImage='url("remove.svg")',k.appendChild(n),p.appendChild(k))}else k.style.backgroundImage='url("repl.svg")',c.l===H.a.b.id&&(k=document.createElement("li"),k.className="slackmsg-hover-edit",k.style.backgroundImage=
+'url("edit.svg")',p.appendChild(k),k=document.createElement("li"),k.className="slackmsg-hover-remove",k.style.backgroundImage='url("remove.svg")',p.appendChild(k));c instanceof E&&(n=document.createElement("span"),n.className="slackmsg-notice",n.textContent=L.H,h.appendChild(n));h.appendChild(f);h.appendChild(g);h.appendChild(e);h.appendChild(u);c.u&&(e=document.createElement("div"),e.innerHTML=L.u,e.className="slackmsg-edited",h.appendChild(e));h.appendChild(l);h.className="slackmsg-content";u.className=
+"slackmsg-attachments";l.className="slackmsg-reactions";if(!0!==b){if(c.c)for(var v in c.c){b=a;e=c.id;g=v;f=c.c[v];if(n=ta(g)){for(var k=document.createElement("li"),x=document.createElement("a"),t=document.createElement("span"),w=document.createElement("span"),y=[],z=0,A=f.length;z<A;z++){var q=H.a.a[f[z]];q&&y.push(q.name)}y.sort();w.textContent=y.join(", ");t.appendChild(n);t.className="emoji-small";x.href="javascript:toggleReaction('"+b+"', '"+e+"', '"+g+"')";x.appendChild(t);x.appendChild(w);
+k.className="slackmsg-reaction-item";k.appendChild(x);b=k}else console.warn("Reaction id not found: "+g),b=null;b&&l.appendChild(b)}a=0;for(l=c.a.length;a<l;a++)if(b=c.a[a]){v=void 0;var e=a,g=document.createElement("li"),f=document.createElement("div"),n=document.createElement("div"),x=document.createElement("a"),t=document.createElement("div"),q=document.createElement("img"),G=document.createElement("a"),w=document.createElement("div"),y=document.createElement("div"),z=document.createElement("div"),
+A=document.createElement("img"),k=document.createElement("div");g.className="slackmsg-attachment";var P="#e3e4e6";b.color&&("#"===b.color[0]?P=b.color[0]:"good"===b.color?P="#2fa44f":"warning"===b.color?P="#de9e31":"danger"===b.color&&(P="#d50200"));f.style.borderColor=P;f.className="slackmsg-attachment-block";n.className="slackmsg-attachment-pretext";b.pretext?n.innerHTML=Y(b.pretext):n.classList.add("hidden");x.target="_blank";b.title?(x.innerHTML=Y(b.title),b.title_link&&(x.href=b.title_link),
+x.className="slackmsg-attachment-title"):x.className="hidden slackmsg-attachment-title";G.target="_blank";t.className="slackmsg-author";b.author_name&&(G.innerHTML=Y(b.author_name),G.href=b.author_link||"",G.className="slackmsg-author-name",q.className="slackmsg-author-img",b.author_icon&&(q.src=b.author_icon,t.appendChild(q)),t.appendChild(G));w.className="slackmsg-attachment-content";q=Y(b.text||"");y.className="slackmsg-attachment-text";q&&""!=q?y.innerHTML=q:y.classList.add("hidden");z.className=
+"slackmsg-attachment-thumb";b.thumb_url?(q=document.createElement("img"),q.src=b.thumb_url,z.appendChild(q),f.classList.add("has-thumb"),b.video_html&&(z.dataset.video=b.video_html)):z.classList.add("hidden");A.className="slackmsg-attachment-img";b.image_url?A.src=b.image_url:A.classList.add("hidden");k.className="slackmsg-attachment-footer";b.footer&&(q=document.createElement("span"),q.className="slackmsg-attachment-footer-text",q.innerHTML=Y(b.footer),b.footer_icon&&(G=document.createElement("img"),
+G.src=b.footer_icon,G.className="slackmsg-attachment-footer-icon",k.appendChild(G)),k.appendChild(q));b.ts&&(q=document.createElement("span"),q.className="slackmsg-ts",q.innerHTML=L.D(b.ts),k.appendChild(q));w.appendChild(y);w.appendChild(z);f.appendChild(x);f.appendChild(t);f.appendChild(w);f.appendChild(A);if(b.actions)for(x=0,t=b.actions.length;x<t;x++)if(w=b.actions[x])if(y=e,z=x,A=document.createElement("li"),A.textContent=w.text,A.dataset.O=y,A.dataset.N=z,A.className="slackmsg-attachment-actions-item",
+w=A)v||(v=document.createElement("ul"),v.className="slackmsg-attachment-actions",f.appendChild(v)),v.appendChild(w);f.appendChild(k);g.appendChild(n);g.appendChild(f);(v=g)&&u.appendChild(v)}}d.appendChild(h);d.appendChild(p);return d}function ma(a){var c=document.createElement("li"),b=document.createElement("span");b.textContent=a.name;c.appendChild(O());c.appendChild(b);return c}function Ia(a){var c=document.createElement("lh");c.textContent=a;c.className="slack-command-header";return c}
+function Ja(a){var c=document.createElement("li"),b=document.createElement("span"),d=document.createElement("span"),h=document.createElement("span");b.textContent=a.name;d.textContent=a.usage;h.textContent=a.a;c.appendChild(b);c.appendChild(d);c.appendChild(h);c.className="slack-command-item";b.className="slack-command-name";d.className="slack-command-usage";h.className="slack-command-desc";return c};var Ba=function(){function a(a,c){for(var b=a.target;b!==p&&b&&"LI"!==b.nodeName;)b=b.parentElement;b&&"LI"===b.nodeName&&b.id&&"emojibar-"===b.id.substr(0,9)?c(b.id.substr(9)):c(null)}function c(){if(!b())return!1;A&&A(null);return!0}function b(){return p.parentElement?(p.parentElement.removeChild(k),p.parentElement.removeChild(p),!0):!1}function d(a){var c=0,b;a=void 0===a?t.value:a;if(f()){var d=window.searchEmojis(a);b=h(d);for(var g in w)w[g].visible&&(w[g].visible=!1,l.removeChild(w[g].m));
+g=0;for(var k=b.length;g<k;g++){var q=b[g].name,v=w[q];if(!v){var v=w,A=q,p=q,q=window.makeEmoji(d[q]),z=document.createElement("span");z.appendChild(q);z.className="emoji-medium";q=e(p,z);v=v[A]=q}v.visible||(v.visible=!0,l.appendChild(v.m));c++}}for(g in y)y[g].visible&&(y[g].visible=!1,n.removeChild(y[g].m));b=h(H.a.h.data);g=0;for(k=b.length;g<k;g++)q=b[g].name,""!==a&&q.substr(0,a.length)!==a||"alias:"===H.a.h.data[q].substr(0,6)||(v=y[q],v||(d=y,A=v=q,q=H.a.h.data[q],p=document.createElement("span"),
+z=document.createElement("span"),p.className="emoji emoji-custom",p.style.backgroundImage='url("'+q+'")',z.appendChild(p),z.className="emoji-medium",q=e(A,z),v=d[v]=q),v.visible||(v.visible=!0,n.appendChild(v.m)),c++);return c}function h(a){var c=H.a.b.a.b,b=[],d;for(d in a){var e={name:d,I:0,count:0};a[d].names&&a[d].names.forEach(function(a){e.count+=c[a]||0});b.push(e)}return b=b.sort(function(a,c){var b=c.count-a.count;return b?b:a.I-c.I})}function e(a,c){var b=document.createElement("li");b.appendChild(c);
+b.className="emojibar-list-item";b.id="emojibar-"+a;return{visible:!1,m:b}}function g(a){var c=document.createElement("img"),b=document.createElement("div");c.src=a;b.appendChild(c);b.className="emojibar-header";return b}function f(){return"searchEmojis"in window}var p=document.createElement("div"),k=document.createElement("div"),u=document.createElement("div"),l=document.createElement("ul"),n=document.createElement("ul"),t=document.createElement("input"),w={},y={},x=document.createElement("div"),
+v=document.createElement("span"),z=document.createElement("span"),A;k.addEventListener("click",function(a){var b=p.getBoundingClientRect();(a.screenY<b.top||a.screenY>b.bottom||a.screenX<b.left||a.screenX>b.right)&&c()});k.className="emojibar-overlay";p.className="emojibar";u.className="emojibar-emojis";x.className="emojibar-detail";v.className="emojibar-detail-img";z.className="emojibar-detail-name";l.className=n.className="emojibar-list";t.className="emojibar-search";x.appendChild(v);x.appendChild(z);
+u.appendChild(g(window.emojiProviderHeader));u.appendChild(l);u.appendChild(g("emojicustom.png"));u.appendChild(n);p.appendChild(u);p.appendChild(x);p.appendChild(t);t.addEventListener("keyup",function(){d()});p.addEventListener("mousemove",function(c){a(c,function(a){var c=a?w[a]||y[a]:null;c?(v.innerHTML=c.m.outerHTML,z.textContent=":"+a+":"):(v.textContent="",z.textContent="")})});p.addEventListener("click",function(c){a(c,function(a){a&&b()&&A&&A(a)})});return{isSupported:f,K:function(a,c){return f()?
+(A=c,a.appendChild(k),a.appendChild(p),t.value="",d(),t.focus(),!0):!1},search:d,close:c}}();var H,Q=[];function La(){this.c=0;this.a=new ca;this.b={}}
+La.prototype.update=function(a){var c=Date.now();a.v&&(this.c=a.v);if(a["static"]){var b=this.a,d=a["static"],h=Date.now();if(d.users)for(var e=0,g=d.users.length;e<g;e++){var f=b.a[d.users[e].id];f||(f=b.a[d.users[e].id]=new J(d.users[e].id));f.update(d.users[e],h)}if(d.channels)for(e=0,g=d.channels.length;e<g;e++){f=b.f[d.channels[e].id];if(!f){var f=b.f,p=d.channels[e].id,k;k=d.channels[e];k=k.pv?new B(k.id,b.a[k.user]):new r(k.id);f=f[p]=k}f.update(d.channels[e],b,h)}d.emojis&&(b.h.data=d.emojis,
+b.h.version=h);if(void 0!==d.commands){b.g.data={};for(e in d.commands)b.g.data[e]=new aa(d.commands[e]);b.g.version=h}d.team&&(b.j||(b.j=new m(d.team.id)),b.j.update(d.team,h));b.s=Math.max(b.s,h);d.self&&(b.b=b.a[d.self.id]||null,b.b?(b.b.a||(b.b.a=new ba),b.b.a.update(d.self.prefs,h)):b.s=0);if(void 0!==d.typing)for(e in b.c={},d.typing){b.c[e]={};for(var u in d.typing[e])b.c[e][u]=h}}for(var l in this.a.f){var n=this.a.f[l];n.a===n.b&&(b=Q.indexOf(n),-1!==b&&Q.splice(b,1))}if(a.live){for(n in a.live)(l=
+this.b[n])?da(l,a.live[n],c):this.b[n]=new F(n,250,a.live[n],c);for(var t in a.live)(c=this.a.f[t])?(this.b[t].a.length&&(n=this.b[t],c.a=Math.max(c.a,n.a[n.a.length-1].i)),c.h||(Ma(c,a.live[t]),I&&a.live[I.id]&&pa())):H.c=0}a["static"]&&(ha(),a["static"].typing&&ka())};setInterval(function(){var a=H.a,c=Date.now(),b=!1,d;for(d in a.c){var h=!0,e;for(e in a.c[d])a.c[d][e]+3E3<c?(delete a.c[d][e],b=!0):h=!1;h&&(delete a.c[d],b=!0)}b&&ka()},1E3);
+function Ma(a,c){if(a!==I||!window.hasFocus){var b=new RegExp("<@"+H.a.b.id),d=!1,h=!1,e=!1,g=!1;c.forEach(function(c){if(!(parseFloat(c.ts)<=a.b)){h=!0;var f;if(!(f=a instanceof B||c.b.match(b)))a:{f=H.a.b.a.a;for(var p=0,l=f.length;p<l;p++)if(-1!==c.b.indexOf(f[p])){f=!0;break a}f=!1}f&&(-1===Q.indexOf(a)&&(e=!0,Q.push(a)),d=!0);H.a.c[a.id]&&H.a.c[a.id][c.l]&&(H.a.c[a.id][c.l]=0,g=!0)}});if(h){S();var f=document.getElementById("room_"+a.id);f&&(f.classList.add("unread"),d&&f.classList.add("unreadHi"));
+e&&!window.hasFocus&&xa()}}g&&ka()}function qa(){var a=I,c=Q.indexOf(a);if(a.a>a.b){var b=new XMLHttpRequest;b.open("POST","api/markread?room="+a.id+"&ts="+a.a,!0);b.send(null);a.b=a.a}0<=c&&(Q.splice(c,1),S());a=document.getElementById("room_"+a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}H=new La;var ja=function(){function a(a,c){c.sort(function(){return Math.random()-.5});for(var b=0,d=20;d<p-40;d+=u)for(var f=0;f+u<=k;f+=u)e(a,c[b],d,f),b++,b===c.length&&(c.sort(function(a,c){return a.C?c.C?Math.random()-.5:-1:1}),b=0)}function c(a,d){for(var e=0,f=a.length;e<f;e++)if(void 0===a[e].C){b(a[e].src,function(b){a[e].C=b;c(a,d)});return}var g=[];a.forEach(function(a){a.C&&g.push(a.C)});d(g)}function b(a,c){var b=new XMLHttpRequest;b.responseType="blob";b.onreadystatechange=function(){if(4===
+b.readyState)if(b.response){var a=new Image;a.onload=function(){var b=document.createElement("canvas");b.height=b.width=t;b=b.getContext("2d");b.drawImage(a,0,0,t,t);for(var b=b.getImageData(0,0,t,t),d=0,e=0;e<b.width*b.height*4;e+=4)b.data[e]=b.data[e+1]=b.data[e+2]=(b.data[e]+b.data[e+1]+b.data[e+2])/3,b.data[e+3]=50,d+=b.data[e];if(50>d/(b.height*b.width))for(e=0;e<b.width*b.height*4;e+=4)b.data[e]=b.data[e+1]=b.data[e+2]=255-b.data[e];c(b)};a.onerror=function(){c(null)};a.src=window.URL.createObjectURL(b.response)}else c(null)};
+b.open("GET",a,!0);b.send(null)}function d(){var a=f.createLinearGradient(0,0,0,k);a.addColorStop(0,"#4D394B");a.addColorStop(1,"#201820");f.fillStyle=a;f.fillRect(0,0,p,k);return f.getImageData(0,0,p,k)}function h(a,c){for(var b=(a.height-c.height)/2,d=0;d<c.height;d++)for(var e=0;e<c.width;e++){var f=c.data[4*(d*c.width+e)]/255,g=4*((d+b)*a.width+e+b);a.data[g]*=f;a.data[g+1]*=f;a.data[g+2]*=f}return a}function e(a,c,b,d){var e=Math.floor(d);a=[a.data[e*p*4+0],a.data[e*p*4+1],a.data[e*p*4+2]];f.fillStyle=
+"#"+(1.1*a[0]<<16|1.1*a[1]<<8|1.1*a[2]).toString(16);f.beginPath();f.moveTo(b+u/2,d+l);f.lineTo(b-l+u,d+u/2);f.lineTo(b+u/2,d-l+u);f.lineTo(b+l,d+u/2);f.closePath();f.fill();f.putImageData(h(f.getImageData(b+l,d+l,n,n),c),b+l,d+l)}var g=document.createElement("canvas"),f=g.getContext("2d"),p=g.width=250,k=g.height=290,u=(p-40)/3,l=.1*u,n=Math.floor(u-2*l),t=.5*n,w,y=[],x=!1;return function(b){if(w)b(w);else if(x)y.push(b);else{var e=d(),f=[];x=!0;y.push(b);for(var h in H.a.a)H.a.a[h].g||H.a.a[h].s||
+f.push({src:"api/avatar?user="+h});c(f,function(b){a(e,b);w=g.toDataURL();y.forEach(function(a){a(w)})})}}}();var Z=0,I=null,U=null,W=null;function Na(a){var c=new XMLHttpRequest;c.timeout=6E4;c.onreadystatechange=function(){if(4===c.readyState)if(c.status){var b=null,d=2===Math.floor(c.status/100);if(d){Z&&(Z=0,na(!0));b=c.response;try{b=JSON.parse(b)}catch(h){b=null}}else Z?(Z+=Math.floor((Z||5)/2),Z=Math.min(60,Z)):(Z=5,na(!1));a(d,b)}else Z&&(Z=0,na(!0)),Na(a)};c.open("GET","api?v="+H.c,!0);c.send(null)}function Ha(){var a=new XMLHttpRequest;a.open("POST","api/typing?room="+I.id,!0);a.send(null)}
+function Oa(a,c){a?(c&&H.update(c),Ka()):setTimeout(Ka,1E3*Z)}function Ka(){Na(Oa)}function Da(a){I&&document.getElementById("room_"+I.id).classList.remove("selected");document.getElementById("room_"+a.id).classList.add("selected");document.body.classList.remove("no-room-selected");I=a;oa();I.a&&!H.b[I.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+I.id,!0),a.send(null))}
+function Fa(a,c,b){var d=I;new FileReader;var h=new FormData,e=new XMLHttpRequest;h.append("file",c);h.append("filename",a);e.onreadystatechange=function(){4===e.readyState&&(204===e.status?b(null):b(e.statusText))};e.open("POST","api/file?room="+d.id);e.send(h)}function Aa(a,c){var b=new FormData,d=new XMLHttpRequest;b.append("payload",a);b.append("service_id",c);d.open("POST","api/attachmentAction");d.send(b)}
+function za(a,c,b){return JSON.stringify({actions:[b],attachment_id:c.id,callback_id:c.callback_id,channel_id:I.id,is_ephemeral:a instanceof E,message_ts:a.id})}
+function Ga(a){if(W){var c=new XMLHttpRequest;c.open("PUT","api/msg?room="+I.id+"&ts="+W.id+"&text="+encodeURIComponent(a),!0);c.send(null);return!0}if("/"===a[0]){var b=a.indexOf(" "),c=-1===b?"":a.substr(b);return(a=H.a.g.data[a.substr(0,-1===b?void 0:b)])?(b=new XMLHttpRequest,b.open("POST","api/cmd?room="+I.id+"&cmd="+encodeURIComponent(a.name.substr(1))+"&args="+encodeURIComponent(c.trim()),!0),b.send(null),!0):!1}var c=I,b=U,d=new XMLHttpRequest;a="api/msg?room="+c.id+"&text="+encodeURIComponent(a);
+if(b){var h=H.a.a[b.l],e="Message";"C"===c.id[0]?e="Channel message":"D"===c.id[0]?e="Direct message":"G"===c.id[0]&&(e="Group message");a+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:b.b,author_name:"<@"+h.id+"|"+h.name+">",author_icon:h.b.small,text:b.b,footer:e,ts:b.i}]))}d.open("POST",a,!0);d.send(null);return!0}function Ca(a){var c=new XMLHttpRequest;c.open("DELETE","api/msg?room="+I.id+"&ts="+a.id,!0);c.send(null)}
+function sa(a,c,b){var d=new XMLHttpRequest;d.open("POST","api/reaction?room="+a+"&msg="+c+"&reaction="+encodeURIComponent(b),!0);d.send(null)};

+ 5 - 0
srv/src/httpServ.js

@@ -311,6 +311,11 @@ Server.prototype.onRequest = function(req, res) {
                 res.writeHeader("400", "Bad Request");
                 res.end();
             }
+        } else if (req.urlObj.match(["api", "attachmentAction"])) {
+            sessionManager.saveSession(req.session);
+            res.slack.sendAction(req.headers["content-type"], req, (result) => {
+                res.end(result);
+            });
         } else if (req.urlObj.match(["api"])) {
             res.slack.onRequest(
                 (req.urlObj.queryTokens.v ? req.urlObj.queryTokens.v[0] : 0) || 0

+ 63 - 0
srv/src/slack.js

@@ -29,6 +29,7 @@ const SLACK_ENDPOINT = "https://slack.com/api/"
         ,slashExec: "chat.command"
         ,addReaction: "reactions.add"
         ,removeReaction: "reactions.remove"
+        ,sendAction: "chat.attachmentAction"
         ,read: {
             group: "groups.mark"
             ,im: "im.mark"
@@ -364,6 +365,68 @@ Slack.prototype.openUploadFileStream = function(channel, contentType, callback)
     return req;
 };
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} channel
+ * @param {string} contentType
+ * @param {function(string|null)} callback
+**/
+Slack.prototype.sendAction = function(contentType, payloadStream, callback) {
+    var req = https.request({
+        hostname: SLACK_HOSTNAME
+        ,method: 'POST'
+        ,path: SLACK_ENDPOINT_PATH +GETAPI.sendAction
+            +"?token=" +this.token
+        ,headers: {
+            "Content-Type": contentType
+        }
+    }, (res) => {
+        var resp;
+        res.on("data", (chunk) => {
+            resp = resp ? Buffer.concat([resp, chunk], resp.length +chunk.length) : Buffer.from(chunk);
+        });
+        res.once("end", () => {
+            callback(resp);
+        });
+    });
+    payloadStream.pipe(req, { end: true });
+};
+
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} channel
+ * @param {string} contentType
+ * @param {function(string|null)} callback
+**/
+Slack.prototype.openUploadFileStream = function(channel, contentType, callback) {
+    var req = https.request({
+        hostname: SLACK_HOSTNAME
+        ,method: 'POST'
+        ,path: SLACK_ENDPOINT_PATH +GETAPI.postFile
+            +"?token=" +this.token
+            +"&channels=" +channel.id
+        ,headers: {
+            "Content-Type": contentType
+        }
+    }, (res) => {
+        var errorJson;
+        res.on("data", (chunk) => {
+            errorJson = errorJson ? Buffer.concat([errorJson, chunk], errorJson.length +chunk.length) : Buffer.from(chunk);
+        });
+        res.once("end", () => {
+            if (res.statusCode === 200) {
+                callback(null);
+            } else {
+                try {
+                    errorJson = JSON.parse(errorJson.toString());
+                } catch(e) {
+                    callback("error");
+                    return;
+                }
+                callback(errorJson["error"] || "error");
+            }
+        });
+    });
+    return req;
+};
 /**
  * @param {SlackChan|SlackGroup|SlackIms} channel
  * @param {string} msgId

+ 13 - 6
srv/src/slackHistory.js

@@ -18,12 +18,12 @@ SlackHistory.prototype = Object.create(RoomHistory.prototype);
 SlackHistory.prototype.constructor = SlackHistory;
 
 SlackHistory.prototype.messageFactory = function(ev, ts) {
+    if (!ev["user"])
+        ev["user"] = ev["bot_id"];
     if (ev["is_ephemeral"] === true)
         return new NoticeMessage(ev, ts);
     if (ev["subtype"] === "me_message")
         return new MeMessage(ev, ts);
-    if (!ev["user"])
-        ev["user"] = ev["bot_id"];
     return new Message(ev, ts);
 }
 
@@ -37,11 +37,18 @@ SlackHistory.prototype.push = function(ev, t) {
             ,targetId = ev["ts"]
             ,modifArg = ev;
 
-        if (ev["subtype"] === "message_changed" && ev["previous_message"]) {
-            targetId = ev["previous_message"]["ts"];
+        if (ev["subtype"] === "message_changed") {
+            if (ev["previous_message"]) {
+                targetId = ev["previous_message"]["ts"];
+            } else if (ev["message"]) {
+                targetId = ev["message"]["ts"];
+            }
             modifArg = ev["message"]
-        } else if (ev["subtype"] === "message_deleted" && ev["previous_message"]) {
-            targetId = ev["previous_message"]["ts"];
+        } else if (ev["subtype"] === "message_deleted" && (ev["previous_message"] || ev["deleted_ts"])) {
+            if (ev["previous_message"])
+                targetId = ev["previous_message"]["ts"];
+            else
+                targetId = ev["deleted_ts"];
             modifArg = null;
         }
         for (var i =0, nbMsg = this.messages.length; i < nbMsg; i++) {