Selaa lähdekoodia

[add] Display group member count next to group channels
[add][bugfix] Restored border color next to attachments
[bugfix][Refs #39] Fixed emoji list ?
[add][Refs #9] slack context style
[add][Refs #9] slack message with same authors does not overlap any more

B Thibault 8 vuotta sitten
vanhempi
commit
40b3cdb355
7 muutettua tiedostoa jossa 102 lisäystä ja 84 poistoa
  1. 5 4
      cli/dom.js
  2. 3 3
      cli/emojiBar.js
  3. 1 0
      cli/resources.js
  4. 5 3
      cli/ui.js
  5. 66 65
      srv/public/slack.min.js
  6. 18 9
      srv/public/style.css
  7. 4 0
      srv/src/slackData.js

+ 5 - 4
cli/dom.js

@@ -31,11 +31,11 @@ function createChanListItem(chan) {
 
     dom.id = chan.id;
     link.href = '#' +chan.id;
-    if (chan.id[0] === 'D')
-        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeDirect;
-    else if (chan.id[0] === 'G')
+    if (chan instanceof SlackGroup) {
         dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeGroup;
-    else if (chan.id[0] === 'C')
+        dom.dataset["count"] = chan.nbMembers -1;
+    }
+    else if (chan instanceof SlackChan)
         dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeChannel;
     if (SELECTED_ROOM === chan)
         dom.classList.add(R.klass.selected);
@@ -279,6 +279,7 @@ function createAttachmentDom(channelId, msg, attachment) {
             color = "#d50200";
     }
     attachmentBlock.style.borderColor = color;
+    attachmentBlock.className = R.klass.msg.attachment.block;
 
     //Pretext
     pretext.className = R.klass.msg.attachment.pretext;

+ 3 - 3
cli/emojiBar.js

@@ -118,13 +118,13 @@ var EMOJI_BAR = (function() {
                 customEmojis.removeChild(emojiCache.custom[i].dom);
             }
         }
-        sortedEmojiNames = sortEmojis(SLACK.context.emojis, SLACK.context.self.prefs.favoriteEmojis);
+        sortedEmojiNames = sortEmojis(SLACK.context.emojis.data, SLACK.context.self.prefs.favoriteEmojis);
         for (var i =0, nbEmojis = sortedEmojiNames.length; i < nbEmojis; i++) {
             var emojiName = sortedEmojiNames[i].name;
-            if ((queryString === '' || emojiName.substr(0, queryString.length) === queryString) && SLACK.context.emojis[emojiName].substr(0, 6) !== 'alias:') {
+            if ((queryString === '' || emojiName.substr(0, queryString.length) === queryString) && SLACK.context.emojis.data[emojiName].substr(0, 6) !== 'alias:') {
                 var e = emojiCache.custom[emojiName];
                 if (!e)
-                    e = emojiCache.custom[emojiName] = makeCustomEmoji(emojiName, SLACK.context.emojis[emojiName]);
+                    e = emojiCache.custom[emojiName] = makeCustomEmoji(emojiName, SLACK.context.emojis.data[emojiName]);
                 if (!e.visible) {
                     e.visible = true;
                     customEmojis.appendChild(e.dom);

+ 1 - 0
cli/resources.js

@@ -111,6 +111,7 @@ var R = {
                 ,list: "slackmsg-attachments"
 
                 ,pretext: "slackmsg-attachment-pretext"
+                ,block: "slackmsg-attachment-block"
                 ,title: "slackmsg-attachment-title"
                 ,text: "slackmsg-attachment-text"
                 ,thumbImg: "slackmsg-attachment-thumb"

+ 5 - 3
cli/ui.js

@@ -673,12 +673,14 @@ document.addEventListener('DOMContentLoaded', function() {
                 ,input = this.value;
             if (this.value[0] === '/') {
                 var endCmd = input.indexOf(' ')
-                    ,inputCmd = input.substr(0, endCmd === -1 ? input.length: endCmd);
+                    ,inputFinished = endCmd !== -1;
+                endCmd = endCmd === -1 ? input.length : endCmd;
+                var inputCmd = input.substr(0, endCmd);
 
                 for (var i in SLACK.context.commands.data) {
                     var currentCmd = SLACK.context.commands.data[i]
-                    if ((endCmd !== -1 && currentCmd.name === inputCmd) ||
-                        (endCmd === -1 && currentCmd.name.substr(0, endCmd) === inputCmd))
+                    if ((!inputFinished && currentCmd.name.substr(0, endCmd) === inputCmd) ||
+                        (inputFinished && currentCmd.name === inputCmd))
                         commands.push(currentCmd);
                 }
             }

+ 66 - 65
srv/public/slack.min.js

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

+ 18 - 9
srv/public/style.css

@@ -5,15 +5,21 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slack-chat-container { display: flex; flex-direction: column; flex: 1; overflow: hidden; padding: 0; }
 
 .slack-context-channellist { padding-left: 0; list-style: none; }
-.slack-context-room { position: relative; }
+.slack-context-room { position: relative; color: #AB9BA9; }
 .slack-context-room > a { display: block; padding: 3px 0 3px 1.5em; text-decoration: none; color: #AB9BA9; margin-right: 15px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; }
+.slack-context-room.slack-ims { color: #4c9689; }
+.slack-context-room.slack-ims.away { color: #AB9BA9; }
 .slack-context-room > a:hover { background-color: rgba(10, 5, 10, .6); }
+.slack-context-room.selected { color: #fff; }
 .slack-context-room.selected > a { background-color: #4c9689; color: #fff; border-top-right-radius: 3px; border-bottom-right-radius: 3px; }
 .slack-context-room.slack-ims { font-style: italic; }
-.slack-context-room.slack-ims.slack-context-typing::before { display: none; }
-.slack-context-room.slack-ims::before { content: " "; position: absolute; display: inline-block; height: 6px; width: 6px; border: 2px solid #4c9689; background: #4c9689; top: 0; bottom: 0; margin: auto auto auto 7px; border-radius: 5px; }
+.slack-context-room::before { position: absolute; display: inline-block; top: 0; bottom: 0; margin: auto auto auto 7px; padding-top: 3px; font-weight: normal; }
+.slack-context-room.slack-context-typing::before { display: none; }
+.slack-context-room.slack-channel::before { content: "#"; }
+.slack-context-room.slack-group::before { content: attr(data-count); font-size: 12px; height: 12px; line-height: 12px; padding: 2px; overflow: hidden; background: #AB9BA9; color: white; border-radius: 5px; }
+.slack-context-room.slack-ims::before { content: " "; height: 6px; width: 6px; padding: 0; border: 2px solid currentColor; background: currentColor; border-radius: 5px; }
 .slack-context-room.slack-ims.selected::before { background-color: white; border-color: white; }
-.slack-context-room.slack-ims.away::before { background: transparent; border-color: #AB9BA9; }
+.slack-context-room.slack-ims.away::before { background: transparent; }
 .slack-context-roominfo { position: absolute; display: block; left: 250px; width: 100%; max-width: 300px; top: 0; height: 100%; z-index: 100; background-color: #4D394B; }
 
 .slack-context .typing-container { position: absolute; left: 6.5px; display: none; }
@@ -35,16 +41,18 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slackmsg-item:hover { background: #F9F9F9; }
 .slackmsg-content { display: inline-block; }
 .slackmsg-author { display: inline-block; }
-.slackmsg-author-img { max-height: 48px; max-width: 48px; margin-right: 15px; }
+.slackmsg-author-img { max-height: 36px; max-width: 36px; margin-right: 10px; }
 .slackmsg-author-name { display: block; font-style: italic; font-weight: bold; }
 .slackmsg-msg { display: inline-block; vertical-align: top; }
 .slackmsg-reactions:empty,.slackmsg-attachments:empty { display: none; }
-.slackmsg-reactions,.slackmsg-attachments { padding: 0 0 0 40px; }
-.slackmsg-ts {}
+.slackmsg-reactions { padding: 0 0 0 40px; margin: 5px 0; }
+.slackmsg-attachments { padding: 0 0 0 40px; }
+.slackmsg-ts { font-size: 0.75em; font-style: italic; }
 
-.slackmsg-item.slackmsg-same-author { margin-top: -15px; }
-.slackmsg-same-author .slackmsg-author-img { visibility: hidden; }
+.slackmsg-same-author:not(.slackmsg-me_message) { padding: 2px 10px; }
+.slackmsg-same-author .slackmsg-author-img { display: none; }
 .slackmsg-same-author .slackmsg-author-name { display: none; }
+.slackmsg-same-author:not(.slackmsg-me_message) .slackmsg-content { margin-left: 46px; }
 .slackmsg-same-ts .slackmsg-ts { display: none; }
 
 .slackmsg-hover { display: none; position: absolute; top: 0; right: 0; margin: 0; list-style: none; padding: 0; }
@@ -74,6 +82,7 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slackmsg-attachments { list-style: none; }
 .slackmsg-attachment .slackmsg-author-img { max-height: 18px; max-width: 18px; vertical-align: middle; margin-right: 5px; }
 .slackmsg-attachment-img { max-height: 200px; max-width: 400px; }
+.slackmsg-attachment-block { border-left: 3px solid; padding-left: 10px; }
 
 .slack-command-list { list-style: none; margin: 10px 10px 0 10px; padding: 0; background: #4D394B; color: #AB9BA9; }
 .slack-command-item { display: flex; margin: 2px 0; }

+ 4 - 0
srv/src/slackData.js

@@ -134,6 +134,8 @@ function SlackGroup(id) {
     this.id = id;
     /** @type {Object.<string, SlackUser|SlackBot>} */
     this.members = {};
+    /** @type {number} */
+    this.nbMembers = 0;
     /** @type {string} */
     this.name;
     /** @type {number} */
@@ -169,11 +171,13 @@ SlackGroup.prototype.update = function(slack, groupData, t) {
     if (groupData["members"]) {
         /** @type {Object.<string, SlackUser|SlackBot>} */
         this.members = {};
+        this.nbMembers = 0;
         for (var i =0, nbMembers = groupData["members"].length; i < nbMembers; i++) {
             var member = slack.getMember(groupData["members"][i]);
             this.members[groupData["members"][i]] = member;
             member.channels[this.id] = this;
             memberNames.push(member.name);
+            this.nbMembers++;
         }
         this.name = memberNames.join(", ");
     }