Pārlūkot izejas kodu

[add][Refs #22] Mark chan as unread according to channel#lastRead

B Thibault 8 gadi atpakaļ
vecāks
revīzija
203b61775b
4 mainītis faili ar 157 papildinājumiem un 94 dzēšanām
  1. 38 18
      cli/data.js
  2. 72 71
      srv/public/slack.min.js
  3. 43 5
      srv/src/slackData.js
  4. 4 0
      srv/src/slackHistory.js

+ 38 - 18
cli/data.js

@@ -6,7 +6,7 @@ var
     SLACK
 
     /**
-     * @type {Object.<string, {hl: number, unread: number}>} number of unread per chan
+     * @type {Object.<string, {hl: boolean, unread: boolean}>} number of unread per chan
     **/
     ,UNREAD_CHANS = {};
 
@@ -32,29 +32,45 @@ SlackWrapper.prototype.update = function(data) {
         this.lastServerVersion = data["v"];
     if (data["static"]) {
         this.context.updateStatic(data["static"], Date.now());
-        onContextUpdated();
-        if (data["static"]["typing"])
-            onTypingUpdated();
+        UNREAD_CHANS = {};
+        this.context.forEachChans(function(i) {
+            if (i.lastMsg > i.lastRead) {
+                UNREAD_CHANS[i.id] = {
+                    hl: false
+                    ,unread: true
+                }
+            }
+            return true;
+        });
     }
     if (data["live"]) {
         for (var i in data["live"]) {
             var history = this.history[i];
             if (!history)
-                this.history[i] = new SlackHistory(i, 250, data["live"][i], now);
+                history = this.history[i] = new SlackHistory(i, 250, data["live"][i], now);
             else
                 history.pushAll(data["live"][i], now);
         }
         for (var roomId in data["live"]) {
             var chan = this.context.getChannel(roomId);
             if (chan) {
+                if (this.history[roomId].messages.length)
+                    chan.lastMsg = Math.max(chan.lastMsg, this.history[roomId].lastMessage().ts);
                 if (!chan.archived) {
                     onMsgReceived(chan, data["live"][roomId]);
                     if (SELECTED_ROOM && data["live"][SELECTED_ROOM.id])
                         onRoomUpdated();
                 }
+            } else {
+                outOfSync();
             }
         }
     }
+    if (data["static"]) {
+        onContextUpdated();
+        if (data["static"]["typing"])
+            onTypingUpdated();
+    }
 };
 
 setInterval(function() {
@@ -70,7 +86,6 @@ function isHighlighted(text) {
     var highlights = SLACK.context.self.prefs.highlights;
     for (var i =0, nbHighlights = highlights.length; i < nbHighlights; i++)
         if (text.indexOf(highlights[i]) !== -1) {
-            console.log("Found highlight " +highlights[i] +" in " +text);
             return true;
         }
     return false;
@@ -85,23 +100,28 @@ function onMsgReceived(chan, msg) {
         var selfReg = new RegExp("<@" +SLACK.context.self.id)
             ,highligted = false
             ,newHighlited = false;
-        if (!UNREAD_CHANS[chan.id]) {
-            UNREAD_CHANS[chan.id] = { hl: 0, unread: 0 };
-        }
         msg.forEach(function(i) {
-            // TODO check read
-            if (chan.id[0] === 'D' || i.text.match(selfReg) || isHighlighted(i.text)) {
+            if (parseFloat(i["ts"]) <= chan.lastRead) {
+                return;
+            }
+            if (!UNREAD_CHANS[chan.id]) {
+                UNREAD_CHANS[chan.id] = {
+                    hl: false
+                    ,unread: true
+                };
+            }
+            if (chan instanceof SlackGroup || chan instanceof SlackIms || i.text.match(selfReg) || isHighlighted(i.text)) {
                 newHighlited |= !UNREAD_CHANS[chan.id].hl;
-                UNREAD_CHANS[chan.id].hl++;
+                UNREAD_CHANS[chan.id].hl = true;
                 highligted = true;
-            } else {
-                UNREAD_CHANS[chan.id].unread++;
             }
         });
         updateTitle();
-        document.getElementById(chan.id).classList.add(R.klass.unread);
-        if (highligted) {
-            document.getElementById(chan.id).classList.add(R.klass.unreadHi);
+        var dom = document.getElementById(chan.id);
+        if (dom) {
+            dom.classList.add(R.klass.unread);
+            if (highligted)
+                dom.classList.add(R.klass.unreadHi);
         }
         if (newHighlited && !window.hasFocus) {
             // TODO setting
@@ -115,7 +135,7 @@ function onMsgReceived(chan, msg) {
 **/
 function markRoomAsRead(room) {
     if (UNREAD_CHANS[room.id]) {
-        UNREAD_CHANS[room.id] = { hl: 0, unread: 0 };
+        delete UNREAD_CHANS[room.id];
         updateTitle();
     }
     var roomLi = document.getElementById(room.id);

+ 72 - 71
srv/public/slack.min.js

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

+ 43 - 5
srv/src/slackData.js

@@ -74,7 +74,9 @@ function SlackChan(chanId) {
     /** @type {boolean} */
     this.isMember;
     /** @type {number} */
-    this.lastRead;
+    this.lastRead = 0;
+    /** @type {number} */
+    this.lastMsg = 0;
     /** @type {Object.<string, SlackBot|SlackUser>} */
     this.members = {};
     /** @type {string|undefined} */
@@ -104,6 +106,8 @@ SlackChan.prototype.update = function(chanData, slackData, t) {
     if (chanData["is_archived"] !== undefined) this.archived = chanData["is_archived"];
     if (chanData["is_member"] !== undefined) this.isMember = chanData["is_member"];
     if (chanData["last_read"] !== undefined) this.lastRead = parseFloat(chanData["last_read"]);
+    if (chanData["last_msg"] !== undefined) this.lastMsg = parseFloat(chanData["last_msg"]);
+    if (chanData["latest"]) this.lastMsg = parseFloat(chanData["latest"]["ts"]);
     if (chanData["members"]) {
         this.members = {};
         if (chanData["members"]) for (var i =0, nbMembers = chanData["members"].length; i < nbMembers; i++) {
@@ -145,7 +149,9 @@ function SlackGroup(id) {
     /** @type {boolean} */
     this.archived;
     /** @type {number} */
-    this.lastRead;
+    this.lastRead = 0;
+    /** @type {number} */
+    this.lastMsg = 0;
     /** @type {string|undefined} */
     this.topic;
     /** @type {number|undefined} */
@@ -185,6 +191,8 @@ SlackGroup.prototype.update = function(slack, groupData, t) {
     if (groupData["creator"] !== undefined) this.creator = slack.getMember(groupData["creator"]);
     if (groupData["is_archived"] !== undefined) this.archived = groupData["is_archived"] || groupData["is_open"] === false;
     if (groupData["last_read"] !== undefined) this.lastRead = parseFloat(groupData["last_read"]);
+    if (groupData["last_msg"] !== undefined) this.lastMsg = parseFloat(groupData["last_msg"]);
+    else if (groupData["latest"]) this.lastMsg = parseFloat(groupData["latest"]["ts"]);
     if (groupData["topic"]) {
         this.topic = groupData["topic"]["value"];
         this.topicCreator = slack.getMember(groupData["topic"]["creator"]);
@@ -211,7 +219,9 @@ function SlackIms(id, user) {
     /** @type {SlackUser|SlackBot} */
     this.user = user;
     /** @type {number} */
-    this.lastRead;
+    this.lastRead = 0;
+    /** @type {number} */
+    this.lastMsg = 0;
     /** @type {boolean} */
     this.archived;
     /** @type {number} */
@@ -223,8 +233,10 @@ function SlackIms(id, user) {
  * @param {*} imsData
 **/
 SlackIms.prototype.update = function(user, imsData, t) {
-    this.created = imsData["created"];
-    this.lastRead = parseFloat(imsData["last_read"]);
+    if (imsData["created"] !== undefined) this.created = imsData["created"];
+    if (imsData["last_read"] !== undefined) this.lastRead = parseFloat(imsData["last_read"]);
+    if (imsData["last_msg"] !== undefined) this.lastMsg = parseFloat(imsData["last_msg"]);
+    if (imsData["latest"]) this.lastMsg = parseFloat(imsData["latest"]["ts"]);
     this.archived = user.deleted;
     this.version = Math.max(this.version, t);
 }
@@ -502,6 +514,7 @@ SlackChan.prototype.toStatic = function(t) {
         ,"is_archived": this.archived
         ,"is_member": this.isMember
         ,"last_read": this.lastRead
+        ,"last_msg": this.lastMsg
     };
     if (this.isMember) {
         res["members"] = this.members ? Object.keys(this.members) : [];
@@ -555,6 +568,7 @@ SlackGroup.prototype.toStatic = function(t) {
         ,"creator": this.creator.id
         ,"is_archived": this.archived
         ,"last_read": this.lastRead
+        ,"last_msg": this.lastMsg
     };
     for (var mId in this.members) {
         res["members"].push(mId);
@@ -582,6 +596,7 @@ SlackIms.prototype.toStatic = function(t) {
         ,"created": this.created
         ,"user": this.user.id
         ,"last_read": this.lastRead
+        ,"last_msg": this.lastMsg
     };
 }
 
@@ -703,6 +718,23 @@ SlackData.prototype.getChannel = function(chanId) {
     return this.channels[chanId] || this.ims[chanId] || this.groups[chanId] || null;
 };
 
+/**
+ * @param {function((SlackGroup|SlackIms|SlackChan)):boolean} cb should return false to stop iterating
+ * @return {boolean} true if iterated through all entities
+**/
+SlackData.prototype.forEachChans = function(cb) {
+    for (var i in this.channels) {
+        if (!cb(this.channels[i])) return false;
+    }
+    for (var i in this.ims) {
+        if (!cb(this.ims[i])) return false;
+    }
+    for (var i in this.groups) {
+        if (!cb(this.groups[i])) return false;
+    }
+    return true;
+}
+
 /** @return {Object} */
 SlackData.prototype.buildStatic = function(t, now) {
     var res = {
@@ -804,6 +836,12 @@ SlackData.prototype.onMessage = function(msg, t) {
         this.typing[msg["channel"]] = this.typing[msg["channel"]] || {};
         this.typing[msg["channel"]][msg["user"]] = t;
         this.staticV = Math.max(this.staticV, t);
+    } else if (msg["type"] === "im_marked" || msg["type"] === "channel_marked" || msg["type"] === "group_marked") {
+        var channel = this.getChannel(msg["channel"]);
+        if (channel) {
+            channel.lastRead = msg["ts"];
+            this.staticV = channel.version = t;
+        }
     }
 }
 

+ 4 - 0
srv/src/slackHistory.js

@@ -219,6 +219,10 @@ SlackHistory.prototype.push = function(ev, t) {
     return t;
 }
 
+SlackHistory.prototype.lastMessage = function() {
+    return this.messages[this.messages.length -1];
+}
+
 /**
  * @param {string} reaction
  * @param {string} userId