Browse Source

[add][Closes #30] Can edit its own messages

B Thibault 8 years ago
parent
commit
c0affb9ff9
7 changed files with 170 additions and 54 deletions
  1. 1 0
      cli/resources.js
  2. 70 1
      cli/ui.js
  3. 16 0
      cli/workflow.js
  4. 1 0
      srv/public/edit.svg
  5. 55 53
      srv/public/slack.min.js
  6. 12 0
      srv/src/httpServ.js
  7. 15 0
      srv/src/slack.js

+ 1 - 0
cli/resources.js

@@ -78,6 +78,7 @@ var R = {
                 container: "slackmsg-hover"
                 ,reply: "slackmsg-hover-reply"
                 ,reaction: "slackmsg-hover-reaction"
+                ,edit: "slackmsg-hover-edit"
                 ,remove: "slackmsg-hover-remove"
             }
 

+ 70 - 1
cli/ui.js

@@ -2,6 +2,9 @@ var
     /** @type {SlackMessage|null} */
     REPLYING_TO = null
 
+    /** @type {SlackMessage|null} */
+    ,EDITING = null
+
     /**
      * Minimum time between 2 notifications (ms)
      * @const
@@ -131,6 +134,10 @@ function onRoomSelected() {
         REPLYING_TO = null;
         onReplyingToUpdated();
     }
+    if (EDITING) {
+        EDITING = null;
+        onReplyingToUpdated();
+    }
 }
 
 function onReplyingToUpdated() {
@@ -147,8 +154,34 @@ function onReplyingToUpdated() {
         domParent.textContent = "";
         domParent.appendChild(closeLink);
         domParent.appendChild(createMessageDom("reply_" +SELECTED_ROOM.id, REPLYING_TO, true));
+        focusInput();
     } else {
         document.body.classList.remove(R.klass.replyingTo);
+        document.getElementById(R.id.message.replyTo).textContent = "";
+        focusInput();
+    }
+}
+
+function onEditingUpdated() {
+    if (EDITING) {
+        document.body.classList.add(R.klass.replyingTo);
+        var domParent = document.getElementById(R.id.message.replyTo)
+            ,closeLink = document.createElement("a");
+        closeLink.addEventListener("click", function() {
+            EDITING = null;
+            onEditingUpdated();
+        });
+        closeLink.className = R.klass.msg.replyTo.close;
+        closeLink.textContent = 'x';
+        domParent.textContent = "";
+        domParent.appendChild(closeLink);
+        domParent.appendChild(createMessageDom("edit_" +SELECTED_ROOM.id, EDITING, true));
+        document.getElementById(R.id.message.input).value = EDITING.text;
+        focusInput();
+    } else {
+        document.body.classList.remove(R.klass.replyingTo);
+        document.getElementById(R.id.message.replyTo).textContent = "";
+        focusInput();
     }
 }
 
@@ -242,6 +275,7 @@ function doCreateMessageDom(channelId, msg, skipAttachment) {
         var hoverReaction = document.createElement("li")
             ,domReply = window['makeEmoji']("arrow_heading_down")
             ,domReaction = window['makeEmoji']("smile")
+            ,domEdit = window['makeEmoji']("pencil2")
             ,domRemove = window['makeEmoji']("x");
 
         hoverReaction.className = R.klass.msg.hover.reaction;
@@ -262,7 +296,16 @@ function doCreateMessageDom(channelId, msg, skipAttachment) {
         hover.appendChild(hoverReaction);
 
         if (msg.userId === SLACK.context.self.id) {
-            var hoverRemove = document.createElement("li")
+            var hoverEdit = document.createElement("li");
+            hoverEdit.className = R.klass.msg.hover.edit;
+            if (domEdit)
+                hoverEdit.classList.add(R.klass.emoji.small);
+            else
+                hoverEdit.style.backgroundImage = 'url("edit.svg")';
+            hoverEdit.appendChild(domEdit);
+            hover.appendChild(hoverEdit);
+
+            var hoverRemove = document.createElement("li");
             hoverRemove.className = R.klass.msg.hover.remove;
             if (domRemove)
                 hoverRemove.classList.add(R.klass.emoji.small);
@@ -275,6 +318,11 @@ function doCreateMessageDom(channelId, msg, skipAttachment) {
     } else {
         hoverReply.style.backgroundImage = 'url("repl.svg")';
         if (msg.userId === SLACK.context.self.id) {
+            var hoverEdit = document.createElement("li");
+            hoverEdit.className = R.klass.msg.hover.edit;
+            hoverEdit.style.backgroundImage = 'url("edit.svg")';
+            hover.appendChild(hoverEdit);
+
             var hoverRemove = document.createElement("li")
             hoverRemove.className = R.klass.msg.hover.remove;
             hoverRemove.style.backgroundImage = 'url("remove.svg")';
@@ -785,6 +833,10 @@ function chatClickDelegate(e) {
                 var msg = SLACK.history[SELECTED_ROOM.id].getMessage(messageId);
 
                 if (msg && target.classList.contains(R.klass.msg.hover.reply)) {
+                    if (EDITING) {
+                        EDITING = null;
+                        onEditingUpdated();
+                    }
                     if (REPLYING_TO !== msg) {
                         REPLYING_TO = msg;
                         onReplyingToUpdated();
@@ -794,12 +846,25 @@ function chatClickDelegate(e) {
                         if (emoji)
                             addReaction(SELECTED_ROOM.id, msg.id, emoji);
                     });
+                } else if (msg && target.classList.contains(R.klass.msg.hover.edit)) {
+                    if (REPLYING_TO) {
+                        REPLYING_TO = null;
+                        onReplyingToUpdated();
+                    }
+                    if (EDITING !== msg) {
+                        EDITING = msg;
+                        onEditingUpdated();
+                    }
                 } else if (msg && target.classList.contains(R.klass.msg.hover.remove)) {
                     //TODO promt confirm
                     if (REPLYING_TO) {
                         REPLYING_TO = null;
                         onReplyingToUpdated();
                     }
+                    if (EDITING) {
+                        EDITING = null;
+                        onEditingUpdated();
+                    }
                     removeMsg(SELECTED_ROOM, msg);
                 }
             }
@@ -877,6 +942,10 @@ document.addEventListener('DOMContentLoaded', function() {
                     REPLYING_TO = null;
                     onReplyingToUpdated();
                 }
+                if (EDITING) {
+                    EDITING = null;
+                    onReplyingToUpdated();
+                }
             }
         }
         focusInput();

+ 16 - 0
cli/workflow.js

@@ -199,6 +199,10 @@ function sendMeMessage(chan, msg) {
 **/
 function onTextEntered(input, skipCommand) {
     var success = true;
+    if (EDITING) {
+        editMsg(SELECTED_ROOM, input, EDITING);
+        return true;
+    }
     if (input[0] === '/' && skipCommand !== true) {
         var endCmd = input.indexOf(' ')
             ,cmd = input.substr(1, endCmd === -1 ? undefined : endCmd -1)
@@ -210,6 +214,18 @@ function onTextEntered(input, skipCommand) {
     return true;
 }
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} chan
+ * @param {string} text
+ * @param {SlackMessage|null=} msg
+**/
+function editMsg(chan, text, msg) {
+    var xhr = new XMLHttpRequest();
+    var url = 'api/msg?room=' +chan.id +"&ts=" +msg.id +"&text=" +encodeURIComponent(text);
+    xhr.open('PUT', url, true);
+    xhr.send(null);
+}
+
 /**
  * @param {SlackChan|SlackGroup|SlackIms} chan
  * @param {SlackMessage|null=} msg

+ 1 - 0
srv/public/edit.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" enable-background="new 0 0 64 64"><path transform="matrix(.7072-.707.707.7072-13.9145 31.7241)" fill="#ffce31" d="m8.8 22.1h45.1v21.1h-45.1z"/><path d="m61.3 4.6l-1.9-1.9c-3.6-3.6-9.4-3.6-13.1 0l-6.5 6.5 15 15 6.5-6.5c3.6-3.6 3.6-9.5 0-13.1" fill="#ed4c5c"/><path transform="matrix(.7071-.7071.7071.7071.0023 37.4923)" fill="#93a2aa" d="m42.4 8.2h5.8v21.1h-5.8z"/><path transform="matrix(.7071-.7071.7071.7071.00263 37.4922)" fill="#c7d3d8" d="m42.4 10.4h5.8v16.6h-5.8z"/><path fill="#fed0ac" d="m7.9 41.1l-6.5 17 4.5 4.5 17-6.5z"/><path d="m.3 61.1c-.9 2.4.3 3.5 2.7 2.6l8.2-3.1-7.7-7.7-3.2 8.2" fill="#333"/><path transform="matrix(.7071-.7071.7071.7071-13.8881 25.9017)" fill="#ffdf85" d="m4.6 26.2h39.4v7h-39.4z"/><path transform="matrix(.7071-.7071.7071.7071-18.0167 35.8688)" fill="#ff8736" d="m14.6 36.2h39.4v7h-39.4z"/></svg>

+ 55 - 53
srv/public/slack.min.js

@@ -1,56 +1,58 @@
 function aa(a){this.id=a;this.a={S:"",U:"",W:"",X:"",L:"",M:"",O:"",Y:""}}function ba(a){this.id=a;this.a={}}function ca(a){this.id=a;this.a={}}function da(a,b){this.id=a;this.f=b}function ea(a){this.id=a;this.a={P:"",R:"",m:"",A:"",N:"",V:""};this.h={};this.c=this.b=null}function fa(){this.b={};this.a=[]}function ga(a,b){a.b=JSON.parse(b.emoji_use);b.highlight_words?a.a=(b.highlight_words||"").split(",").filter(function(a){return""!==a.trim()}):b.highlights&&(a.a=b.highlights)}
-function ha(a){this.id=a;this.a={T:"",m:"",A:""};this.c=this.b=null}function p(){this.f=null;this.h={};this.w={};this.C={};this.b={};this.a=null;this.l={};this.c={}}function t(a,b){return a.b[b]||a.l[b]||null}function y(a,b){return a.h[b]||a.C[b]||a.w[b]||null}"undefined"!==typeof module&&(module.K.Z=p);function ia(a,b){this.i=a.user||a.bot_id;this.h=a.username;this.id=a.ts;this.b=b||parseFloat(a.ts);this.text=a.text||"";this.f=a.attachments||[];this.j=!!a.edited;this.c=a.removed||!1;this.l="me_message"===a.subtype||a.isMeMessage;this.a={};this.version=this.b;var c=this;a.reactions&&a.reactions.forEach(function(a){c.a[a.name]=[];a.users.forEach(function(b){c.a[a.name].push(b)})})}
-function ja(a,b,c){b?(a.text=b.text||"",b.attachments&&(a.f=b.attachments),a.j=!!b.edited,a.c=!!b.removed,b.reactions&&(a.a={},b.reactions.forEach(function(b){a.a[b.name]=[];b.users.forEach(function(c){a.a[b.name].push(c)})}))):a.c=!0;a.version=c}function A(a,b,c){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&B(this,c)}function ka(a,b,c,e){var f=!1;a.a[b]&&(1===a.a[b].length&&a.a[b][0]===c?(delete a.a[b],f=!0):a.a[b]=a.a[b].filter(function(a){return a!==c?!1:f=!0}));f&&(a.version=e)}
+function ha(a){this.id=a;this.a={T:"",m:"",A:""};this.c=this.b=null}function p(){this.f=null;this.h={};this.w={};this.C={};this.b={};this.a=null;this.l={};this.c={}}function q(a,b){return a.b[b]||a.l[b]||null}function y(a,b){return a.h[b]||a.C[b]||a.w[b]||null}"undefined"!==typeof module&&(module.K.Z=p);function ia(a,b){this.i=a.user||a.bot_id;this.h=a.username;this.id=a.ts;this.b=b||parseFloat(a.ts);this.text=a.text||"";this.f=a.attachments||[];this.j=!!a.edited;this.c=a.removed||!1;this.l="me_message"===a.subtype||a.isMeMessage;this.a={};this.version=this.b;var c=this;a.reactions&&a.reactions.forEach(function(a){c.a[a.name]=[];a.users.forEach(function(b){c.a[a.name].push(b)})})}
+function ja(a,b,c){b?(a.text=b.text||"",b.attachments&&(a.f=b.attachments),a.j=!!b.edited,a.c=!!b.removed,b.reactions&&(a.a={},b.reactions.forEach(function(b){a.a[b.name]=[];b.users.forEach(function(c){a.a[b.name].push(c)})}))):a.c=!0;a.version=c}function z(a,b,c){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&B(this,c)}function ka(a,b,c,d){var f=!1;a.a[b]&&(1===a.a[b].length&&a.a[b][0]===c?(delete a.a[b],f=!0):a.a[b]=a.a[b].filter(function(a){return a!==c?!1:f=!0}));f&&(a.version=d)}
 function B(a,b){var c=0;b.forEach(function(a){c=Math.max(this.push(a),c)}.bind(a));la(a)}
-A.prototype.push=function(a){var b=parseFloat(a.ts);if(a.type&&"message"!==a.type)if("reaction_added"===a.type){var c=C(this,a.item.ts);if(c){var e=a.reaction;a=a.user;c.a[e]||(c.a[e]=[]);c.a[e].push(a);c.version=b}}else if("reaction_removed"===a.type)(c=C(this,a.item.ts))&&ka(c,a.reaction,a.user,b);else return 0;else{var c=!1,e=a.ts,f=a;"message_changed"===a.subtype&&a.previous_message?(e=a.previous_message.ts,f=a.message):"message_deleted"===a.subtype&&a.previous_message&&(e=a.previous_message.ts,
-f=null);for(var d=0,l=this.a.length;d<l;d++)if(this.a[d].id===e){ja(this.a[d],f,b);c=!0;break}c||this.a.push(new ia(a,b))}for(;this.a.length>this.b;)this.a.shift();return b};function ma(a){for(var b=D.b[E.id],c=0,e=b.a.length;c<e&&a>=b.a[c].b;c++)if(b.a[c].b===a)return b.a[c];return null}function C(a,b){for(var c=0,e=a.a.length;c<e;c++)if(a.a[c].id==b)return a.a[c];return null}function la(a){a.a.sort(function(a,c){return a.b-c.b})}"undefined"!==typeof module&&(module.K.$=A);var F={},G;function na(){var a;if(!a){for(var b=0,c=navigator.languages.length;b<c;b++)if(F.hasOwnProperty(navigator.languages[b])){a=navigator.languages[b];break}a||(a="en")}G=F[a];console.log("Loading language pack: "+a);if(G.g)for(b in G.g)document.getElementById(b).textContent=G.g[b]};F.fr={J:"Utilisateur inconnu",I:"Channel inconnu",F:"Nouveau message",D:"Reseau",j:"edit&eacute;",u: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()},g:{fileUploadCancel:"Annuler",neterror:"Impossible de se connecter au chat !"}};F.en={J:"Unknown member",I:"Unknown channel",F:"New message",D:"Network",j:"edited",u: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()},g:{fileUploadCancel:"Cancel",neterror:"Cannot connect to chat !"}};var J=null,K=0;
+z.prototype.push=function(a){var b=parseFloat(a.ts);if(a.type&&"message"!==a.type)if("reaction_added"===a.type){var c=C(this,a.item.ts);if(c){var d=a.reaction;a=a.user;c.a[d]||(c.a[d]=[]);c.a[d].push(a);c.version=b}}else if("reaction_removed"===a.type)(c=C(this,a.item.ts))&&ka(c,a.reaction,a.user,b);else return 0;else{var c=!1,d=a.ts,f=a;"message_changed"===a.subtype&&a.previous_message?(d=a.previous_message.ts,f=a.message):"message_deleted"===a.subtype&&a.previous_message&&(d=a.previous_message.ts,
+f=null);for(var e=0,l=this.a.length;e<l;e++)if(this.a[e].id===d){ja(this.a[e],f,b);c=!0;break}c||this.a.push(new ia(a,b))}for(;this.a.length>this.b;)this.a.shift();return b};function ma(a){for(var b=D.b[E.id],c=0,d=b.a.length;c<d&&a>=b.a[c].b;c++)if(b.a[c].b===a)return b.a[c];return null}function C(a,b){for(var c=0,d=a.a.length;c<d;c++)if(a.a[c].id==b)return a.a[c];return null}function la(a){a.a.sort(function(a,c){return a.b-c.b})}"undefined"!==typeof module&&(module.K.$=z);var F={},G;function na(){var a;if(!a){for(var b=0,c=navigator.languages.length;b<c;b++)if(F.hasOwnProperty(navigator.languages[b])){a=navigator.languages[b];break}a||(a="en")}G=F[a];console.log("Loading language pack: "+a);if(G.g)for(b in G.g)document.getElementById(b).textContent=G.g[b]};F.fr={J:"Utilisateur inconnu",I:"Channel inconnu",F:"Nouveau message",D:"Reseau",j:"edit&eacute;",u: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()},g:{fileUploadCancel:"Annuler",neterror:"Impossible de se connecter au chat !"}};F.en={J:"Unknown member",I:"Unknown channel",F:"New message",D:"Network",j:"edited",u: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()},g:{fileUploadCancel:"Cancel",neterror:"Cannot connect to chat !"}};var H=null,I=null,L=0;
 function oa(){var a=document.createDocumentFragment(),b=D.a.a?Object.keys(D.a.a.h):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:y(D.a,a).name.localeCompare(y(D.a,b).name)});b.forEach(function(b){b=y(D.a,b);if(!b.b){var c=document.createElement("li"),f=document.createElement("a");c.id=b.id;f.href="#"+b.id;"D"===b.id[0]?c.className="slack-context-room slack-ims":"G"===b.id[0]?c.className="slack-context-room slack-group":"C"===b.id[0]&&(c.className="slack-context-room slack-channel");f.textContent=
-b.name;c.appendChild(f);c&&a.appendChild(c)}});b=D.a.b?Object.keys(D.a.b):[];b.sort(function(a,b){return D.a.b[a].name.localeCompare(D.a.b[b].name)});b.forEach(function(b){b=t(D.a,b);if(!b.f){b=b.b;var c=document.createElement("li"),f=document.createElement("a");c.id=b.id;f.href="#"+b.id;c.className="slack-context-room slack-ims";f.textContent=b.f.name;c.appendChild(f);c&&a.appendChild(c)}});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);L();
-M();pa(function(a){document.getElementById("slackCtx").style.backgroundImage="url("+a+")"})}function N(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network");M()}
-function O(){if(J){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){J=null;O()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(P("reply_"+E.id,J,!0))}else document.body.classList.remove("replyingTo")}
-function qa(a,b,c,e){var f=Q(c);if(f){for(var d=document.createElement("li"),l=document.createElement("a"),g=document.createElement("span"),h=document.createElement("span"),m=[],k=0,n=e.length;k<n;k++){var u=t(D.a,e[k]);u&&m.push(u.name)}m.sort();h.textContent=m.join(", ");g.appendChild(f);g.className="emoji-small";l.href="javascript:toggleReaction('"+a+"', '"+b+"', '"+c+"')";l.appendChild(g);l.appendChild(h);d.className="slackmsg-reaction-item";d.appendChild(l);return d}return null}
-window.toggleReaction=function(a,b,c){var e=D.b[a];if(e&&(e=C(e,b))){var f=D.a.a.id;e.a[c]&&-1!==e.a[c].indexOf(f)?(e=new XMLHttpRequest,e.open("DELETE","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0),e.send(null)):R(a,b,c)}};
-function S(a,b,c){var e=document.createElement("div"),f=document.createElement("div"),d=document.createElement("div"),l=document.createElement("div"),g=document.createElement("img"),h=document.createElement("span"),m=document.createElement("ul"),k=document.createElement("li"),n=document.createElement("ul"),u=document.createElement("ul"),q=t(D.a,b.i);e.id=a+"_"+b.b;e.className="slackmsg-item";d.className="slackmsg-ts";l.className="slackmsg-msg";g.className="slackmsg-author-img";h.className="slackmsg-author-name";
-m.className="slackmsg-hover";k.className="slackmsg-hover-reply";d.innerHTML=G.u(b.b);l.innerHTML=T(b.text);h.textContent=q?q.name:b.h||"?";g.src=q?q.a.m:"";m.appendChild(k);if("makeEmoji"in window){var r=document.createElement("li"),w=window.makeEmoji("arrow_heading_down"),x=window.makeEmoji("smile"),q=window.makeEmoji("x");r.className="slackmsg-hover-reaction";x?(r.classList.add("emoji-small"),r.appendChild(x)):r.style.backgroundImage='url("smile.svg")';w?(k.classList.add("emoji-small"),k.appendChild(w)):
-k.style.backgroundImage='url("repl.svg")';m.appendChild(r);b.i===D.a.a.id&&(k=document.createElement("li"),k.className="slackmsg-hover-remove",q?k.classList.add("emoji-small"):k.style.backgroundImage='url("remove.svg")',k.appendChild(q),m.appendChild(k))}else k.style.backgroundImage='url("repl.svg")',b.i===D.a.a.id&&(k=document.createElement("li"),k.className="slackmsg-hover-remove",k.style.backgroundImage='url("remove.svg")',m.appendChild(k));e.appendChild(g);f.appendChild(h);f.appendChild(l);f.appendChild(d);
-f.appendChild(n);b.j&&(d=document.createElement("div"),d.textContent=G.j,d.className="slackmsg-edited",f.appendChild(d));f.appendChild(u);f.className="slackmsg-content";n.className="slackmsg-attachments";u.className="slackmsg-reactions";if(!0!==c){if(b.a)for(var z in b.a)(c=qa(a,b.id,z,b.a[z]))&&u.appendChild(c);b.f.forEach(function(a){var b=document.createElement("li"),c=document.createElement("div"),e=document.createElement("div"),d=document.createElement("a"),f=document.createElement("div"),g=
-document.createElement("img"),r=document.createElement("a"),w=document.createElement("div"),h=document.createElement("div"),l=document.createElement("img"),k=document.createElement("img"),v=document.createElement("div"),x=document.createElement("img"),q=document.createElement("span"),z=document.createElement("span");b.className="slackmsg-attachment";var m="#e3e4e6";a.color&&("#"===a.color[0]?m=a.color[0]:"good"===a.color?m="#2fa44f":"warning"===a.color?m="#de9e31":"danger"===a.color&&(m="#d50200"));
-c.style.borderColor=m;e.className="slackmsg-attachment-pretext";a.pretext?e.innerHTML=T(a.pretext):e.classList.add("hidden");d.target="_blank";a.title?(d.innerHTML=T(a.title),a.title_link&&(d.href=a.title_link),d.className="slackmsg-attachment-title"):d.className="hidden slackmsg-attachment-title";r.target="_blank";f.className="slackmsg-author";a.author_name?(r.innerHTML=T(a.author_name),r.href=a.author_link||"",r.className="slackmsg-author-name",g.className="slackmsg-author-img",a.author_icon?g.src=
-a.author_icon:g.classList.add("hidden")):f.classList.add("hidden");h.innerHTML=T(a.text||"");h.a="slackmsg-attachment-text";l.className="slackmsg-attachment-thumb";a.thumb_url?l.src=a.thumb_url:l.classList.add("hidden");k.className="slackmsg-attachment-img";a.image_url?k.src=a.image_url:k.classList.add("hidden");v.className="slackmsg-attachment-footer";q.className="slackmsg-attachment-footer-text";x.className="slackmsg-attachment-footer-icon";a.footer?(q.innerHTML=T(a.footer),a.footer_icon?x.src=
-a.footer_icon:x.classList.add("hidden")):(x.classList.add("hidden"),q.classList.add("hidden"));z.className="slackmsg-ts";a.ts?z.innerHTML=G.u(a.ts):z.classList.add("hidden");f.appendChild(g);f.appendChild(r);w.appendChild(h);w.appendChild(l);v.appendChild(x);v.appendChild(q);v.appendChild(z);c.appendChild(d);c.appendChild(f);c.appendChild(w);c.appendChild(k);c.appendChild(v);b.appendChild(e);b.appendChild(c);b&&n.appendChild(b)})}e.appendChild(f);e.appendChild(m);return e}
-function Q(a){a:{for(var b=a,c={};!c[b];){if(a=D.a.c[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 ra(a){return a.replace(/:([^ \t:]+):/g,function(b,c){var e=Q(c);if(e){var f=document.createElement("span");f.className=b===a?"emoji-medium":"emoji-small";f.appendChild(e);return f.outerHTML}return b})}
-function T(a){a=a.split(/\r?\n/g);for(var b=0,c=a.length;b<c;b++){for(var e=a[b].trim(),f="",d={},l=!1,g=0,e=e.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){c=c.split("|");if("@"===b)c[1]?"@"!==c[1][0]&&(c[1]="@"+c[1]):(a=t(D.a,c[0]),c[1]=a?"@"+a.name:G.J),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-user";else if("#"===b)c[1]?"#"!==c[1][0]&&(c[1]="#"+c[1]):(a=y(D.a,c[0]),c[1]=a?"#"+a.name:G.I),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>"}),e=ra(e),h=e.length,m=function(a,b,c){for(;a[b];){var e=a[b];if(("A"<=e&&"Z">=e||"a"<=e&&"z">=e||"0"<=e&&"9">=e||-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(e))&&
-a[b]!=c&&a[b+1]==c)return!0;b++}return!1},k=function(a){return Object.keys(d).length?'<span class="'+Object.keys(a).join(" ")+'">':""};g<h&&(" "===e[g]||"\t"===e[g]);)g++;"&gt;"===e.substr(g,4)&&(l=!0,g+=4);for(;g<h;g++){var n=e[g];if("<"===n){do f+=e[g++];while(">"!==e[g-1]);g--}else if(!d["slackmsg-style-bold"]&&"*"===n&&e[g+1]&&m(e,g,n))Object.keys(d).length&&(f+="</span>"),d["slackmsg-style-bold"]=!0,f+=k(d);else if(!d["slackmsg-style-strike"]&&"~"===n&&e[g+1]&&m(e,g,n))Object.keys(d).length&&
-(f+="</span>"),d["slackmsg-style-strike"]=!0,f+=k(d);else if(!d["slackmsg-style-code"]&&"`"===n&&e[g+1]&&m(e,g,n))Object.keys(d).length&&(f+="</span>"),d["slackmsg-style-code"]=!0,f+=k(d);else if(!d["slackmsg-style-italic"]&&"_"===n&&e[g+1]&&m(e,g,n))Object.keys(d).length&&(f+="</span>"),d["slackmsg-style-italic"]=!0,f+=k(d);else{var u=!1,f=f+n;do{if(d["slackmsg-style-bold"]&&"*"!==n&&"*"===e[g+1])delete d["slackmsg-style-bold"],u=!0;else if(d["slackmsg-style-strike"]&&"~"!==n&&"~"===e[g+1])delete d["slackmsg-style-strike"],
-u=!0;else if(d["slackmsg-style-code"]&&"`"!==n&&"`"===e[g+1])delete d["slackmsg-style-code"],u=!0;else if(d["slackmsg-style-italic"]&&"_"!==n&&"_"===e[g+1])delete d["slackmsg-style-italic"],u=!0;else break;n=e[++g]}while(g<h);u&&(f+="</span>"+k(d))}}d&&(f+="</span>");a[b]=l?'<span class="slackmsg-style-quote">'+f+"</span>":f}return a.join("<br/>")}function P(a,b,c){b.l?(a=S(a,b,c),a.classList.add("slackmsg-me_message")):a=S(a,b,c);b.j&&a.classList.add("slackmsg-edited");return a}
-function M(){var a=0,b=0,c="";if(U)c="!"+G.D+" - ",document.getElementById("linkFavicon").href="favicon_err.png";else{for(var e in V)V.hasOwnProperty(e)&&(a+=V[e].B,b+=V[e].s);b?c="(!"+b+") - ":a&&(c="("+a+") - ");document.getElementById("linkFavicon").href=b||a?"favicon.png?h="+b+"&m="+a:"favicon_ok.png"}c+=D.a.f.name;document.title=c}
-function sa(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(K+3E4<a){var b=new Notification(G.F);K=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
-function W(){var a=document.createDocumentFragment(),b=E.id,c=null,e=0,f=null;D.b[b]&&D.b[b].a.forEach(function(d){if(!d.c){var g=P(b,d);c&&c.i===d.i&&d.i?(g.classList.add("slackmsg-same-author"),30>Math.abs(e-d.b)?f.classList.add("slackmsg-same-ts"):e=d.b):e=d.b;c=d;f=g;a.appendChild(g)}});var d=document.getElementById("chatWindow");d.textContent="";d.appendChild(a);d.scrollTop=d.scrollHeight-d.clientHeight}
-function ta(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 e=ma(a);e&&c.classList.contains("slackmsg-hover-reply")?J!==e&&(J=e,O()):e&&c.classList.contains("slackmsg-hover-reaction")?X.H(document.body,function(a){a&&
-R(E.id,e.id,a)}):e&&c.classList.contains("slackmsg-hover-remove")&&(J&&(J=null,O()),ua(e))}break}c=c.parentElement}}function Y(){document.getElementById("msgInput").focus()}function L(){var a=document.location.hash.substr(1),b=y(D.a,a),a=t(D.a,a);b&&b!==E?va(b):a&&a.b&&va(a.b)}
-document.addEventListener("DOMContentLoaded",function(){na();document.getElementById("chatWindow").addEventListener("click",ta);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&L()});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),wa(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&&xa(a.value)&&(a.value="",J&&(J=null,O()));Y();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=
-!0;K=0;E&&ya();Y()});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(){X.H(document.body,function(a){a&&(document.getElementById("msgInput").value+=":"+a+":");Y()})})}else a.classList.add("hidden")})();Z()});var X=function(){function a(a,b){for(var c=a.target;c!==h&&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;H&&H(null);return!0}function c(){return h.parentElement?(h.parentElement.removeChild(m),h.parentElement.removeChild(h),!0):!1}function e(a){var b=0,c;a=void 0===a?q.value:a;if(g()){var e=window.searchEmojis(a);c=f(e);for(var h in r)r[h].visible&&(r[h].visible=!1,n.removeChild(r[h].g));h=
-0;for(var l=c.length;h<l;h++){var k=c[h].name,v=r[k];if(!v){var v=r,x=k,I=k,k=window.makeEmoji(e[k]),m=document.createElement("span");m.appendChild(k);m.className="emoji-medium";k=d(I,m);v=v[x]=k}v.visible||(v.visible=!0,n.appendChild(v.g));b++}}for(h in w)w[h].visible&&(w[h].visible=!1,u.removeChild(w[h].g));c=f(D.a.c);h=0;for(l=c.length;h<l;h++)k=c[h].name,""!==a&&k.substr(0,a.length)!==a||"alias:"===D.a.c[k].substr(0,6)||(v=w[k],v||(e=w,x=v=k,k=D.a.c[k],I=document.createElement("span"),m=document.createElement("span"),
-I.className="emoji emoji-custom",I.style.backgroundImage='url("'+k+'")',m.appendChild(I),m.className="emoji-medium",k=d(x,m),v=e[v]=k),v.visible||(v.visible=!0,u.appendChild(v.g)),b++);return b}function f(a){var b=D.a.a.c.b,c=[],e;for(e in a)c.push({name:e,G:0,count:b[e]||0});return c=c.sort(function(a,b){var c=b.count-a.count;return c?c:a.G-b.G})}function d(a,b){var c=document.createElement("li");c.appendChild(b);c.className="emojibar-list-item";c.id="emojibar-"+a;return{visible:!1,g:c}}function l(a){var b=
-document.createElement("img"),c=document.createElement("div");b.src=a;c.appendChild(b);c.className="emojibar-header";return c}function g(){return"searchEmojis"in window}var h=document.createElement("div"),m=document.createElement("div"),k=document.createElement("div"),n=document.createElement("ul"),u=document.createElement("ul"),q=document.createElement("input"),r={},w={},x=document.createElement("div"),z=document.createElement("span"),v=document.createElement("span"),H;m.addEventListener("click",
-function(a){var c=h.getBoundingClientRect();(a.screenY<c.top||a.screenY>c.bottom||a.screenX<c.left||a.screenX>c.right)&&b()});m.className="emojibar-overlay";h.className="emojibar";k.className="emojibar-emojis";x.className="emojibar-detail";z.className="emojibar-detail-img";v.className="emojibar-detail-name";n.className=u.className="emojibar-list";q.className="emojibar-search";x.appendChild(z);x.appendChild(v);k.appendChild(l(window.emojiProviderHeader));k.appendChild(n);k.appendChild(l("emojicustom.png"));
-k.appendChild(u);h.appendChild(k);h.appendChild(x);h.appendChild(q);q.addEventListener("keyup",function(){e()});h.addEventListener("mousemove",function(b){a(b,function(a){var b=a?r[a]||w[a]:null;b?(z.innerHTML=b.g.outerHTML,v.textContent=":"+a+":"):(z.textContent="",v.textContent="")})});h.addEventListener("click",function(b){a(b,function(a){a&&c()&&H&&H(a)})});return{isSupported:g,H:function(a,b){return g()?(H=b,a.appendChild(m),a.appendChild(h),q.value="",e(),q.focus(),!0):!1},search:e,close:b}}();var D,V={};
-function za(a,b){if(a!==E||!window.hasFocus){var c=new RegExp("<@"+D.a.a.id),e=!1,f=!1;V[a.id]||(V[a.id]={s:0,B:0});b.forEach(function(b){var d;if(!(d="D"===a.id[0]||b.text.match(c)))a:{b=b.text;d=D.a.a.c.a;for(var g=0,h=d.length;g<h;g++)if(-1!==b.indexOf(d[g])){console.log("Found highlight "+d[g]+" in "+b);d=!0;break a}d=!1}d?(f|=!V[a.id].s,V[a.id].s++,e=!0):V[a.id].B++});M();document.getElementById(a.id).classList.add("unread");e&&document.getElementById(a.id).classList.add("unreadHi");f&&!window.hasFocus&&
-sa()}}function ya(){var a=E;V[a.id]&&(V[a.id]={s:0,B:0},M());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}D=new function(){this.c=0;this.a=new p;this.b={}};var pa=function(){function a(a,b){b.sort(function(){return Math.random()-.5});for(var c=0,e=20;e<h-40;e+=k)for(var g=0;g+k<=m;g+=k)d(a,b[c],e,g),c++,c===b.length&&(b.sort(function(a,b){return a.o?b.o?Math.random()-.5:-1:1}),c=0)}function b(a,e){for(var d=0,g=a.length;d<g;d++)if(void 0===a[d].o){c(a[d].src,function(c){a[d].o=c;b(a,e)});return}var f=[];a.forEach(function(a){a.o&&f.push(a.o)});e(f)}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=q;c=c.getContext("2d");c.drawImage(a,0,0,q,q);for(var c=c.getImageData(0,0,q,q),e=0,d=0;d<c.width*c.height*4;d+=4)c.data[d]=c.data[d+1]=c.data[d+2]=(c.data[d]+c.data[d+1]+c.data[d+2])/3,c.data[d+3]=50,e+=c.data[d];if(50>e/(c.height*c.width))for(d=0;d<c.width*c.height*4;d+=4)c.data[d]=c.data[d+1]=c.data[d+2]=255-c.data[d];b(c)};a.src=window.URL.createObjectURL(c.response)}else b(null)};
-c.open("GET",a,!0);c.send(null)}function e(){var a=g.createLinearGradient(0,0,0,m);a.addColorStop(0,"#4D394B");a.addColorStop(1,"#201820");g.fillStyle=a;g.fillRect(0,0,h,m);return g.getImageData(0,0,h,m)}function f(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 g=b.data[4*(d*b.width+e)]/255,f=4*((d+c)*a.width+e+c);a.data[f]*=g;a.data[f+1]*=g;a.data[f+2]*=g}return a}function d(a,b,c,d){var e=Math.floor(d);a=[a.data[e*h*4+0],a.data[e*h*4+1],a.data[e*h*4+2]];g.fillStyle=
-"#"+(1.1*a[0]<<16|1.1*a[1]<<8|1.1*a[2]).toString(16);g.beginPath();g.moveTo(c+k/2,d+n);g.lineTo(c-n+k,d+k/2);g.lineTo(c+k/2,d-n+k);g.lineTo(c+n,d+k/2);g.closePath();g.fill();g.putImageData(f(g.getImageData(c+n,d+n,u,u),b),c+n,d+n)}var l=document.createElement("canvas"),g=l.getContext("2d"),h=l.width=250,m=l.height=290,k=(h-40)/3,n=.1*k,u=Math.floor(k-2*n),q=.5*u;return function(c){var d=e(),g=[],f;for(f in D.a.b)D.a.b[f].f||g.push({src:"api/avatar?user="+f});b(g,function(b){a(d,b);c(l.toDataURL())})}}();var U=0,E=null;function Aa(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,e=2===Math.floor(b.status/100);if(e){U&&(U=0,N(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else U?(U+=Math.floor((U||5)/2),U=Math.min(60,U)):(U=5,N(!1));a(e,c)}else U&&(U=0,N(!0)),Aa(a)};b.open("GET","api?v="+D.c,!0);b.send(null)}
-function Ba(a,b){if(a){if(b){var c=D;b.v&&(c.c=b.v);if(b["static"]){var e=c.a,f=b["static"];if(f.bots)for(var d=0,l=f.bots.length;d<l;d++){var g=e.l[f.bots[d].id];g||(g=e.l[f.bots[d].id]=new ha(f.bots[d].id));var h=f.bots[d];g.f=h.deleted;g.name=h.name;g.a.T=h.icons.image_36;g.a.m=h.icons.image_48;g.a.A=h.icons.image_72}if(f.users)for(d=0,l=f.users.length;d<l;d++)(g=e.b[f.users[d].id])||(g=e.b[f.users[d].id]=new ea(f.users[d].id)),h=f.users[d],g.name=h.name,g.f=h.deleted,g.status=h.status,g.a.P=h.profile.image_24,
-g.a.R=h.profile.image_32,g.a.m=h.profile.image_48,g.a.A=h.profile.image_72,g.a.N=h.profile.image_192,g.a.V=h.profile.image_512;if(f.ims)for(d=0,l=f.ims.length;d<l;d++)if(h=t(e,f.ims[d].user))h.b||(e.C[f.ims[d].id]=h.b=new da(f.ims[d].id,h)),g=h.b,g.c=parseFloat(f.ims[d].last_read),g.b=h.f;if(f.channels)for(d=0,l=f.channels.length;d<l;d++){(g=e.h[f.channels[d].id])||(g=e.h[f.channels[d].id]=new ba(f.channels[d].id));var h=f.channels[d],m=e;g.name=h.name;g.b=h.is_archived;g.c=parseFloat(h.last_read);
-g.a={};if(h.members)for(var k=0,n=h.members.length;k<n;k++){var u=t(m,h.members[k]);g.a[u.id]=u;u.h[g.id]=g}}d=0;for(l=f.groups.length;d<l;d++){(g=e.w[f.groups[d].id])||(g=e.w[f.groups[d].id]=new ca(f.groups[d].id));h=e;m=f.groups[d];k=[];g.a={};n=0;for(u=m.members.length;n<u;n++){var q=t(h,m.members[n]);g.a[m.members[n]]=q;q.h[g.id]=g;k.push(q.name)}g.name=k.join(", ");g.b=m.is_archived;g.c=parseFloat(m.last_read)}f.emojis&&(e.c=f.emojis);e.f||(e.f=new aa(f.team.id));d=e.f;l=f.team;d.name=l.name;
-d.a.S=l.icon.image_34;d.a.U=l.icon.image_44;d.a.W=l.icon.image_68;d.a.X=l.icon.image_88;d.a.L=l.icon.image_102;d.a.M=l.icon.image_132;d.a.O=l.icon.image_230;d.a.Y=l.icon.image_default;f.self&&(e.a=t(e,f.self.id),e.a.c||(e.a.c=new fa),ga(e.a.c,f.self.prefs));oa()}if(b.live){for(var r in b.live)(e=c.b[r])?B(e,b.live[r]):c.b[r]=new A(r,250,b.live[r]);for(var w in b.live)(r=y(c.a,w))&&!r.b&&(za(r,b.live[w]),E&&b.live[E.id]&&W())}}Z()}else setTimeout(Z,1E3*U)}function Z(){Aa(Ba)}
-function va(a){E&&document.getElementById(E.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");E=a;a=E.name||(E.f?E.f.name:void 0);if(!a){a=[];for(var b in E.a)a.push(E.a[b].name);a=a.join(", ")}document.getElementById("currentRoomTitle").textContent=a;W();Y();document.getElementById("fileUploadContainer").classList.add("hidden");ya();J&&(J=null,O());E.c&&!D.b[E.id]&&(b=new XMLHttpRequest,b.open("GET","api/hist?room="+
-E.id,!0),b.send(null))}function wa(a,b,c){var e=E;new FileReader;var f=new FormData,d=new XMLHttpRequest;f.append("file",b);f.append("filename",a);d.onreadystatechange=function(){4===d.readyState&&(204===d.status?c(null):c(d.statusText))};d.open("POST","api/file?room="+e.id);d.send(f)}
-function Ca(a,b){var c=E;if("me"==a){if(J)return!1;var e=new XMLHttpRequest;e.open("POST","api/msg?room="+c.id+"&me&text="+encodeURIComponent(b),!0);e.send(null);return!0}if("shrug"==a)return b.length&&(b+=" "),xa(b+"\u00af_(\u30c4)_/\u00af",!0);console.log("Unknown command "+a);return!1}
-function xa(a,b){if("/"===a[0]&&!0!==b){var c=a.indexOf(" ");return Ca(a.substr(1,-1===c?void 0:c-1),(-1===c?"":a.substr(c)).trim())}var c=E,e=J,f=new XMLHttpRequest,d="api/msg?room="+c.id+"&text="+encodeURIComponent(a);if(e){var l=t(D.a,e.i),g="Message";"C"===c.id[0]?g="Channel message":"D"===c.id[0]?g="Direct message":"G"===c.id[0]&&(g="Group message");d+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:e.text,author_name:"<@"+l.id+"|"+l.name+">",author_icon:l.a.m,text:e.text,footer:g,
-ts:e.b}]))}f.open("POST",d,!0);f.send(null);return!0}function ua(a){var b=new XMLHttpRequest;b.open("DELETE","api/msg?room="+E.id+"&ts="+a.id,!0);b.send(null)}function R(a,b,c){var e=new XMLHttpRequest;e.open("POST","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0);e.send(null)};
+b.name;c.appendChild(f);c&&a.appendChild(c)}});b=D.a.b?Object.keys(D.a.b):[];b.sort(function(a,b){return D.a.b[a].name.localeCompare(D.a.b[b].name)});b.forEach(function(b){b=q(D.a,b);if(!b.f){b=b.b;var c=document.createElement("li"),f=document.createElement("a");c.id=b.id;f.href="#"+b.id;c.className="slack-context-room slack-ims";f.textContent=b.f.name;c.appendChild(f);c&&a.appendChild(c)}});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);M();
+N();pa(function(a){document.getElementById("slackCtx").style.backgroundImage="url("+a+")"})}function O(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network");N()}
+function P(){if(H){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){H=null;P()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(Q("reply_"+E.id,H,!0))}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";R()}
+function S(){if(I){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){I=null;S()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(Q("edit_"+E.id,I,!0));document.getElementById("msgInput").value=I.text}else document.body.classList.remove("replyingTo"),document.getElementById("replyToContainer").textContent="";R()}
+function qa(a,b,c,d){var f=T(c);if(f){for(var e=document.createElement("li"),l=document.createElement("a"),g=document.createElement("span"),h=document.createElement("span"),m=[],k=0,n=d.length;k<n;k++){var v=q(D.a,d[k]);v&&m.push(v.name)}m.sort();h.textContent=m.join(", ");g.appendChild(f);g.className="emoji-small";l.href="javascript:toggleReaction('"+a+"', '"+b+"', '"+c+"')";l.appendChild(g);l.appendChild(h);e.className="slackmsg-reaction-item";e.appendChild(l);return e}return null}
+window.toggleReaction=function(a,b,c){var d=D.b[a];if(d&&(d=C(d,b))){var f=D.a.a.id;d.a[c]&&-1!==d.a[c].indexOf(f)?(d=new XMLHttpRequest,d.open("DELETE","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0),d.send(null)):U(a,b,c)}};
+function V(a,b,c){var d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),l=document.createElement("div"),g=document.createElement("img"),h=document.createElement("span"),m=document.createElement("ul"),k=document.createElement("li"),n=document.createElement("ul"),v=document.createElement("ul"),r=q(D.a,b.i);d.id=a+"_"+b.b;d.className="slackmsg-item";e.className="slackmsg-ts";l.className="slackmsg-msg";g.className="slackmsg-author-img";h.className="slackmsg-author-name";
+m.className="slackmsg-hover";k.className="slackmsg-hover-reply";e.innerHTML=G.u(b.b);l.innerHTML=W(b.text);h.textContent=r?r.name:b.h||"?";g.src=r?r.a.m:"";m.appendChild(k);if("makeEmoji"in window){var u=document.createElement("li"),w=window.makeEmoji("arrow_heading_down"),x=window.makeEmoji("smile"),A=window.makeEmoji("pencil2"),r=window.makeEmoji("x");u.className="slackmsg-hover-reaction";x?(u.classList.add("emoji-small"),u.appendChild(x)):u.style.backgroundImage='url("smile.svg")';w?(k.classList.add("emoji-small"),
+k.appendChild(w)):k.style.backgroundImage='url("repl.svg")';m.appendChild(u);b.i===D.a.a.id&&(k=document.createElement("li"),k.className="slackmsg-hover-edit",A?k.classList.add("emoji-small"):k.style.backgroundImage='url("edit.svg")',k.appendChild(A),m.appendChild(k),k=document.createElement("li"),k.className="slackmsg-hover-remove",r?k.classList.add("emoji-small"):k.style.backgroundImage='url("remove.svg")',k.appendChild(r),m.appendChild(k))}else k.style.backgroundImage='url("repl.svg")',b.i===D.a.a.id&&
+(k=document.createElement("li"),k.className="slackmsg-hover-edit",k.style.backgroundImage='url("edit.svg")',m.appendChild(k),k=document.createElement("li"),k.className="slackmsg-hover-remove",k.style.backgroundImage='url("remove.svg")',m.appendChild(k));d.appendChild(g);f.appendChild(h);f.appendChild(l);f.appendChild(e);f.appendChild(n);b.j&&(e=document.createElement("div"),e.textContent=G.j,e.className="slackmsg-edited",f.appendChild(e));f.appendChild(v);f.className="slackmsg-content";n.className=
+"slackmsg-attachments";v.className="slackmsg-reactions";if(!0!==c){if(b.a)for(var t in b.a)(c=qa(a,b.id,t,b.a[t]))&&v.appendChild(c);b.f.forEach(function(a){var b=document.createElement("li"),c=document.createElement("div"),d=document.createElement("div"),e=document.createElement("a"),f=document.createElement("div"),g=document.createElement("img"),u=document.createElement("a"),w=document.createElement("div"),h=document.createElement("div"),l=document.createElement("img"),k=document.createElement("img"),
+t=document.createElement("div"),x=document.createElement("img"),r=document.createElement("span"),m=document.createElement("span");b.className="slackmsg-attachment";var A="#e3e4e6";a.color&&("#"===a.color[0]?A=a.color[0]:"good"===a.color?A="#2fa44f":"warning"===a.color?A="#de9e31":"danger"===a.color&&(A="#d50200"));c.style.borderColor=A;d.className="slackmsg-attachment-pretext";a.pretext?d.innerHTML=W(a.pretext):d.classList.add("hidden");e.target="_blank";a.title?(e.innerHTML=W(a.title),a.title_link&&
+(e.href=a.title_link),e.className="slackmsg-attachment-title"):e.className="hidden slackmsg-attachment-title";u.target="_blank";f.className="slackmsg-author";a.author_name?(u.innerHTML=W(a.author_name),u.href=a.author_link||"",u.className="slackmsg-author-name",g.className="slackmsg-author-img",a.author_icon?g.src=a.author_icon:g.classList.add("hidden")):f.classList.add("hidden");h.innerHTML=W(a.text||"");h.a="slackmsg-attachment-text";l.className="slackmsg-attachment-thumb";a.thumb_url?l.src=a.thumb_url:
+l.classList.add("hidden");k.className="slackmsg-attachment-img";a.image_url?k.src=a.image_url:k.classList.add("hidden");t.className="slackmsg-attachment-footer";r.className="slackmsg-attachment-footer-text";x.className="slackmsg-attachment-footer-icon";a.footer?(r.innerHTML=W(a.footer),a.footer_icon?x.src=a.footer_icon:x.classList.add("hidden")):(x.classList.add("hidden"),r.classList.add("hidden"));m.className="slackmsg-ts";a.ts?m.innerHTML=G.u(a.ts):m.classList.add("hidden");f.appendChild(g);f.appendChild(u);
+w.appendChild(h);w.appendChild(l);t.appendChild(x);t.appendChild(r);t.appendChild(m);c.appendChild(e);c.appendChild(f);c.appendChild(w);c.appendChild(k);c.appendChild(t);b.appendChild(d);b.appendChild(c);b&&n.appendChild(b)})}d.appendChild(f);d.appendChild(m);return d}
+function T(a){a:{for(var b=a,c={};!c[b];){if(a=D.a.c[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 ra(a){return a.replace(/:([^ \t:]+):/g,function(b,c){var d=T(c);if(d){var f=document.createElement("span");f.className=b===a?"emoji-medium":"emoji-small";f.appendChild(d);return f.outerHTML}return b})}
+function W(a){a=a.split(/\r?\n/g);for(var b=0,c=a.length;b<c;b++){for(var d=a[b].trim(),f="",e={},l=!1,g=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=q(D.a,c[0]),c[1]=a?"@"+a.name:G.J),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-user";else if("#"===b)c[1]?"#"!==c[1][0]&&(c[1]="#"+c[1]):(a=y(D.a,c[0]),c[1]=a?"#"+a.name:G.I),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=ra(d),h=d.length,m=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},k=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};g<h&&(" "===d[g]||"\t"===d[g]);)g++;"&gt;"===d.substr(g,4)&&(l=!0,g+=4);for(;g<h;g++){var n=d[g];if("<"===n){do f+=d[g++];while(">"!==d[g-1]);g--}else if(!e["slackmsg-style-bold"]&&"*"===n&&d[g+1]&&m(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-bold"]=!0,f+=k(e);else if(!e["slackmsg-style-strike"]&&"~"===n&&d[g+1]&&m(d,g,n))Object.keys(e).length&&
+(f+="</span>"),e["slackmsg-style-strike"]=!0,f+=k(e);else if(!e["slackmsg-style-code"]&&"`"===n&&d[g+1]&&m(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-code"]=!0,f+=k(e);else if(!e["slackmsg-style-italic"]&&"_"===n&&d[g+1]&&m(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-italic"]=!0,f+=k(e);else{var v=!1,f=f+n;do{if(e["slackmsg-style-bold"]&&"*"!==n&&"*"===d[g+1])delete e["slackmsg-style-bold"],v=!0;else if(e["slackmsg-style-strike"]&&"~"!==n&&"~"===d[g+1])delete e["slackmsg-style-strike"],
+v=!0;else if(e["slackmsg-style-code"]&&"`"!==n&&"`"===d[g+1])delete e["slackmsg-style-code"],v=!0;else if(e["slackmsg-style-italic"]&&"_"!==n&&"_"===d[g+1])delete e["slackmsg-style-italic"],v=!0;else break;n=d[++g]}while(g<h);v&&(f+="</span>"+k(e))}}e&&(f+="</span>");a[b]=l?'<span class="slackmsg-style-quote">'+f+"</span>":f}return a.join("<br/>")}function Q(a,b,c){b.l?(a=V(a,b,c),a.classList.add("slackmsg-me_message")):a=V(a,b,c);b.j&&a.classList.add("slackmsg-edited");return a}
+function N(){var a=0,b=0,c="";if(X)c="!"+G.D+" - ",document.getElementById("linkFavicon").href="favicon_err.png";else{for(var d in Y)Y.hasOwnProperty(d)&&(a+=Y[d].B,b+=Y[d].s);b?c="(!"+b+") - ":a&&(c="("+a+") - ");document.getElementById("linkFavicon").href=b||a?"favicon.png?h="+b+"&m="+a:"favicon_ok.png"}c+=D.a.f.name;document.title=c}
+function sa(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(L+3E4<a){var b=new Notification(G.F);L=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
+function ta(){var a=document.createDocumentFragment(),b=E.id,c=null,d=0,f=null;D.b[b]&&D.b[b].a.forEach(function(e){if(!e.c){var g=Q(b,e);c&&c.i===e.i&&e.i?(g.classList.add("slackmsg-same-author"),30>Math.abs(d-e.b)?f.classList.add("slackmsg-same-ts"):d=e.b):d=e.b;c=e;f=g;a.appendChild(g)}});var e=document.getElementById("chatWindow");e.textContent="";e.appendChild(a);e.scrollTop=e.scrollHeight-e.clientHeight}
+function ua(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=ma(a);d&&c.classList.contains("slackmsg-hover-reply")?(I&&(I=null,S()),H!==d&&(H=d,P())):d&&c.classList.contains("slackmsg-hover-reaction")?va.H(document.body,
+function(a){a&&U(E.id,d.id,a)}):d&&c.classList.contains("slackmsg-hover-edit")?(H&&(H=null,P()),I!==d&&(I=d,S())):d&&c.classList.contains("slackmsg-hover-remove")&&(H&&(H=null,P()),I&&(I=null,S()),wa(d))}break}c=c.parentElement}}function R(){document.getElementById("msgInput").focus()}function M(){var a=document.location.hash.substr(1),b=y(D.a,a),a=q(D.a,a);b&&b!==E?xa(b):a&&a.b&&xa(a.b)}
+document.addEventListener("DOMContentLoaded",function(){na();document.getElementById("chatWindow").addEventListener("click",ua);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&M()});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),ya(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&&za(a.value)&&(a.value="",H&&(H=null,P()),I&&(I=null,P()));R();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=
+!0;L=0;E&&Aa();R()});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(){va.H(document.body,function(a){a&&(document.getElementById("msgInput").value+=":"+a+":");R()})})}else a.classList.add("hidden")})();Z()});var va=function(){function a(a,b){for(var c=a.target;c!==h&&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;J&&J(null);return!0}function c(){return h.parentElement?(h.parentElement.removeChild(m),h.parentElement.removeChild(h),!0):!1}function d(a){var b=0,c;a=void 0===a?r.value:a;if(g()){var d=window.searchEmojis(a);c=f(d);for(var h in u)u[h].visible&&(u[h].visible=!1,n.removeChild(u[h].g));
+h=0;for(var k=c.length;h<k;h++){var l=c[h].name,t=u[l];if(!t){var t=u,x=l,K=l,l=window.makeEmoji(d[l]),m=document.createElement("span");m.appendChild(l);m.className="emoji-medium";l=e(K,m);t=t[x]=l}t.visible||(t.visible=!0,n.appendChild(t.g));b++}}for(h in w)w[h].visible&&(w[h].visible=!1,v.removeChild(w[h].g));c=f(D.a.c);h=0;for(k=c.length;h<k;h++)l=c[h].name,""!==a&&l.substr(0,a.length)!==a||"alias:"===D.a.c[l].substr(0,6)||(t=w[l],t||(d=w,x=t=l,l=D.a.c[l],K=document.createElement("span"),m=document.createElement("span"),
+K.className="emoji emoji-custom",K.style.backgroundImage='url("'+l+'")',m.appendChild(K),m.className="emoji-medium",l=e(x,m),t=d[t]=l),t.visible||(t.visible=!0,v.appendChild(t.g)),b++);return b}function f(a){var b=D.a.a.c.b,c=[],d;for(d in a)c.push({name:d,G:0,count:b[d]||0});return c=c.sort(function(a,b){var c=b.count-a.count;return c?c:a.G-b.G})}function e(a,b){var c=document.createElement("li");c.appendChild(b);c.className="emojibar-list-item";c.id="emojibar-"+a;return{visible:!1,g:c}}function l(a){var b=
+document.createElement("img"),c=document.createElement("div");b.src=a;c.appendChild(b);c.className="emojibar-header";return c}function g(){return"searchEmojis"in window}var h=document.createElement("div"),m=document.createElement("div"),k=document.createElement("div"),n=document.createElement("ul"),v=document.createElement("ul"),r=document.createElement("input"),u={},w={},x=document.createElement("div"),A=document.createElement("span"),t=document.createElement("span"),J;m.addEventListener("click",
+function(a){var c=h.getBoundingClientRect();(a.screenY<c.top||a.screenY>c.bottom||a.screenX<c.left||a.screenX>c.right)&&b()});m.className="emojibar-overlay";h.className="emojibar";k.className="emojibar-emojis";x.className="emojibar-detail";A.className="emojibar-detail-img";t.className="emojibar-detail-name";n.className=v.className="emojibar-list";r.className="emojibar-search";x.appendChild(A);x.appendChild(t);k.appendChild(l(window.emojiProviderHeader));k.appendChild(n);k.appendChild(l("emojicustom.png"));
+k.appendChild(v);h.appendChild(k);h.appendChild(x);h.appendChild(r);r.addEventListener("keyup",function(){d()});h.addEventListener("mousemove",function(b){a(b,function(a){var b=a?u[a]||w[a]:null;b?(A.innerHTML=b.g.outerHTML,t.textContent=":"+a+":"):(A.textContent="",t.textContent="")})});h.addEventListener("click",function(b){a(b,function(a){a&&c()&&J&&J(a)})});return{isSupported:g,H:function(a,b){return g()?(J=b,a.appendChild(m),a.appendChild(h),r.value="",d(),r.focus(),!0):!1},search:d,close:b}}();var D,Y={};
+function Ba(a,b){if(a!==E||!window.hasFocus){var c=new RegExp("<@"+D.a.a.id),d=!1,f=!1;Y[a.id]||(Y[a.id]={s:0,B:0});b.forEach(function(b){var e;if(!(e="D"===a.id[0]||b.text.match(c)))a:{b=b.text;e=D.a.a.c.a;for(var g=0,h=e.length;g<h;g++)if(-1!==b.indexOf(e[g])){console.log("Found highlight "+e[g]+" in "+b);e=!0;break a}e=!1}e?(f|=!Y[a.id].s,Y[a.id].s++,d=!0):Y[a.id].B++});N();document.getElementById(a.id).classList.add("unread");d&&document.getElementById(a.id).classList.add("unreadHi");f&&!window.hasFocus&&
+sa()}}function Aa(){var a=E;Y[a.id]&&(Y[a.id]={s:0,B:0},N());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}D=new function(){this.c=0;this.a=new p;this.b={}};var pa=function(){function a(a,b){b.sort(function(){return Math.random()-.5});for(var c=0,d=20;d<h-40;d+=k)for(var g=0;g+k<=m;g+=k)e(a,b[c],d,g),c++,c===b.length&&(b.sort(function(a,b){return a.o?b.o?Math.random()-.5:-1:1}),c=0)}function b(a,d){for(var e=0,g=a.length;e<g;e++)if(void 0===a[e].o){c(a[e].src,function(c){a[e].o=c;b(a,d)});return}var f=[];a.forEach(function(a){a.o&&f.push(a.o)});d(f)}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=r;c=c.getContext("2d");c.drawImage(a,0,0,r,r);for(var c=c.getImageData(0,0,r,r),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.src=window.URL.createObjectURL(c.response)}else b(null)};
+c.open("GET",a,!0);c.send(null)}function d(){var a=g.createLinearGradient(0,0,0,m);a.addColorStop(0,"#4D394B");a.addColorStop(1,"#201820");g.fillStyle=a;g.fillRect(0,0,h,m);return g.getImageData(0,0,h,m)}function f(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 g=b.data[4*(d*b.width+e)]/255,f=4*((d+c)*a.width+e+c);a.data[f]*=g;a.data[f+1]*=g;a.data[f+2]*=g}return a}function e(a,b,c,d){var e=Math.floor(d);a=[a.data[e*h*4+0],a.data[e*h*4+1],a.data[e*h*4+2]];g.fillStyle=
+"#"+(1.1*a[0]<<16|1.1*a[1]<<8|1.1*a[2]).toString(16);g.beginPath();g.moveTo(c+k/2,d+n);g.lineTo(c-n+k,d+k/2);g.lineTo(c+k/2,d-n+k);g.lineTo(c+n,d+k/2);g.closePath();g.fill();g.putImageData(f(g.getImageData(c+n,d+n,v,v),b),c+n,d+n)}var l=document.createElement("canvas"),g=l.getContext("2d"),h=l.width=250,m=l.height=290,k=(h-40)/3,n=.1*k,v=Math.floor(k-2*n),r=.5*v;return function(c){var e=d(),g=[],f;for(f in D.a.b)D.a.b[f].f||g.push({src:"api/avatar?user="+f});b(g,function(b){a(e,b);c(l.toDataURL())})}}();var X=0,E=null;function Ca(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){X&&(X=0,O(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else X?(X+=Math.floor((X||5)/2),X=Math.min(60,X)):(X=5,O(!1));a(d,c)}else X&&(X=0,O(!0)),Ca(a)};b.open("GET","api?v="+D.c,!0);b.send(null)}
+function Da(a,b){if(a){if(b){var c=D;b.v&&(c.c=b.v);if(b["static"]){var d=c.a,f=b["static"];if(f.bots)for(var e=0,l=f.bots.length;e<l;e++){var g=d.l[f.bots[e].id];g||(g=d.l[f.bots[e].id]=new ha(f.bots[e].id));var h=f.bots[e];g.f=h.deleted;g.name=h.name;g.a.T=h.icons.image_36;g.a.m=h.icons.image_48;g.a.A=h.icons.image_72}if(f.users)for(e=0,l=f.users.length;e<l;e++)(g=d.b[f.users[e].id])||(g=d.b[f.users[e].id]=new ea(f.users[e].id)),h=f.users[e],g.name=h.name,g.f=h.deleted,g.status=h.status,g.a.P=h.profile.image_24,
+g.a.R=h.profile.image_32,g.a.m=h.profile.image_48,g.a.A=h.profile.image_72,g.a.N=h.profile.image_192,g.a.V=h.profile.image_512;if(f.ims)for(e=0,l=f.ims.length;e<l;e++)if(h=q(d,f.ims[e].user))h.b||(d.C[f.ims[e].id]=h.b=new da(f.ims[e].id,h)),g=h.b,g.c=parseFloat(f.ims[e].last_read),g.b=h.f;if(f.channels)for(e=0,l=f.channels.length;e<l;e++){(g=d.h[f.channels[e].id])||(g=d.h[f.channels[e].id]=new ba(f.channels[e].id));var h=f.channels[e],m=d;g.name=h.name;g.b=h.is_archived;g.c=parseFloat(h.last_read);
+g.a={};if(h.members)for(var k=0,n=h.members.length;k<n;k++){var v=q(m,h.members[k]);g.a[v.id]=v;v.h[g.id]=g}}e=0;for(l=f.groups.length;e<l;e++){(g=d.w[f.groups[e].id])||(g=d.w[f.groups[e].id]=new ca(f.groups[e].id));h=d;m=f.groups[e];k=[];g.a={};n=0;for(v=m.members.length;n<v;n++){var r=q(h,m.members[n]);g.a[m.members[n]]=r;r.h[g.id]=g;k.push(r.name)}g.name=k.join(", ");g.b=m.is_archived;g.c=parseFloat(m.last_read)}f.emojis&&(d.c=f.emojis);d.f||(d.f=new aa(f.team.id));e=d.f;l=f.team;e.name=l.name;
+e.a.S=l.icon.image_34;e.a.U=l.icon.image_44;e.a.W=l.icon.image_68;e.a.X=l.icon.image_88;e.a.L=l.icon.image_102;e.a.M=l.icon.image_132;e.a.O=l.icon.image_230;e.a.Y=l.icon.image_default;f.self&&(d.a=q(d,f.self.id),d.a.c||(d.a.c=new fa),ga(d.a.c,f.self.prefs));oa()}if(b.live){for(var u in b.live)(d=c.b[u])?B(d,b.live[u]):c.b[u]=new z(u,250,b.live[u]);for(var w in b.live)(u=y(c.a,w))&&!u.b&&(Ba(u,b.live[w]),E&&b.live[E.id]&&ta())}}Z()}else setTimeout(Z,1E3*X)}function Z(){Ca(Da)}
+function xa(a){E&&document.getElementById(E.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");E=a;a=E.name||(E.f?E.f.name:void 0);if(!a){a=[];for(var b in E.a)a.push(E.a[b].name);a=a.join(", ")}document.getElementById("currentRoomTitle").textContent=a;ta();R();document.getElementById("fileUploadContainer").classList.add("hidden");Aa();H&&(H=null,P());I&&(I=null,P());E.c&&!D.b[E.id]&&(b=new XMLHttpRequest,b.open("GET",
+"api/hist?room="+E.id,!0),b.send(null))}function ya(a,b,c){var d=E;new FileReader;var f=new FormData,e=new XMLHttpRequest;f.append("file",b);f.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(f)}
+function Ea(a,b){var c=E;if("me"==a){if(H)return!1;var d=new XMLHttpRequest;d.open("POST","api/msg?room="+c.id+"&me&text="+encodeURIComponent(b),!0);d.send(null);return!0}if("shrug"==a)return b.length&&(b+=" "),za(b+"\u00af_(\u30c4)_/\u00af",!0);console.log("Unknown command "+a);return!1}
+function za(a,b){if(I){var c=new XMLHttpRequest;c.open("PUT","api/msg?room="+E.id+"&ts="+I.id+"&text="+encodeURIComponent(a),!0);c.send(null);return!0}if("/"===a[0]&&!0!==b)return c=a.indexOf(" "),Ea(a.substr(1,-1===c?void 0:c-1),(-1===c?"":a.substr(c)).trim());var c=E,d=H,f=new XMLHttpRequest,e="api/msg?room="+c.id+"&text="+encodeURIComponent(a);if(d){var l=q(D.a,d.i),g="Message";"C"===c.id[0]?g="Channel message":"D"===c.id[0]?g="Direct message":"G"===c.id[0]&&(g="Group message");e+="&attachments="+
+encodeURIComponent(JSON.stringify([{fallback:d.text,author_name:"<@"+l.id+"|"+l.name+">",author_icon:l.a.m,text:d.text,footer:g,ts:d.b}]))}f.open("POST",e,!0);f.send(null);return!0}function wa(a){var b=new XMLHttpRequest;b.open("DELETE","api/msg?room="+E.id+"&ts="+a.id,!0);b.send(null)}function U(a,b,c){var d=new XMLHttpRequest;d.open("POST","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0);d.send(null)};

+ 12 - 0
srv/src/httpServ.js

@@ -194,6 +194,18 @@ Server.prototype.onRequest = function(req, res) {
                         res.writeHeader("404", "Channel not found");
                     }
                 }
+            } else if (req.method === "PUT") {
+                if (!req.urlObj.queryTokens.room || !req.urlObj.queryTokens.ts || !req.urlObj.queryTokens.text) {
+                    res.writeHeader("400", "Bad request");
+                } else {
+                    var chan = res.slack.data.getChannel(req.urlObj.queryTokens.room[0]);
+                    if (chan) {
+                        res.slack.editMsg(chan, req.urlObj.queryTokens.ts[0], req.urlObj.queryTokens.text);
+                        res.writeHeader("204", "No Content");
+                    } else {
+                        res.writeHeader("404", "Channel not found");
+                    }
+                }
             } else {
                 res.writeHeader("400", "Bad request");
             }

+ 15 - 0
srv/src/slack.js

@@ -20,6 +20,7 @@ const SLACK_ENDPOINT = "https://slack.com/api/"
         ,groupHistory: "groups.history"
         ,postMsg: "chat.postMessage"
         ,postMeMsg: "chat.meMessage"
+        ,editMsg: "chat.update"
         ,removeMsg: "chat.delete"
         ,postFile: "files.upload"
         ,emojiList: "emoji.list"
@@ -346,6 +347,20 @@ Slack.prototype.removeMsg = function(channel, msgId) {
         +"&as_user=true");
 };
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} channel
+ * @param {string} msgId
+ * @param {string} text
+**/
+Slack.prototype.editMsg = function(channel, msgId, text) {
+    httpsRequest(SLACK_ENDPOINT +GETAPI.editMsg
+        +"?token=" +this.token
+        +"&channel=" +channel.id
+        +"&ts=" +msgId
+        +"&text=" +text.join("\n")
+        +"&as_user=true");
+};
+
 Slack.prototype.fetchHistory = function(targetId) {
     var _this = this
         ,baseUrl = "";