Pārlūkot izejas kodu

[add][Closes #22] update read marker
[bugfix] attachment author name hidden when the message author just sen ta message
[bugfix] homogenize liveV and dataV

B Thibault 8 gadi atpakaļ
vecāks
revīzija
e25d9826e9
9 mainītis faili ar 167 papildinājumiem un 70 dzēšanām
  1. 4 1
      cli/data.js
  2. 6 6
      cli/dom.js
  3. 11 0
      cli/workflow.js
  4. 48 48
      srv/public/slack.min.js
  5. 4 3
      srv/public/style.css
  6. 16 0
      srv/src/httpServ.js
  7. 33 3
      srv/src/slack.js
  8. 33 4
      srv/src/slackData.js
  9. 12 5
      srv/src/slackHistory.js

+ 4 - 1
cli/data.js

@@ -125,7 +125,10 @@ function onMsgReceived(chan, msg) {
 **/
 function markRoomAsRead(room) {
     var highlightIndex = HIGHLIGHTED_CHANS.indexOf(room);
-    room.lastRead = room.lastMsg;
+    if (room.lastMsg > room.lastRead) {
+        sendReadMArker(room, room.lastMsg);
+        room.lastRead = room.lastMsg;
+    }
     if (highlightIndex >= 0) {
         HIGHLIGHTED_CHANS.splice(highlightIndex, 1);
         updateTitle();

+ 6 - 6
cli/dom.js

@@ -42,11 +42,10 @@ function createChanListItem(chan) {
     link.textContent = chan.name;
     dom.appendChild(createTypingDisplay());
     dom.appendChild(link);
-    if (HIGHLIGHTED_CHANS.indexOf(chan) >= 0)
-        dom.classList.add(R.klass.unreadHi);
     if (chan.lastMsg > chan.lastRead) {
         dom.classList.add(R.klass.unread);
-        console.log("unread because ", chan);
+        if (HIGHLIGHTED_CHANS.indexOf(chan) >= 0)
+            dom.classList.add(R.klass.unreadHi);
     }
     return dom;
 }
@@ -71,10 +70,11 @@ function createImsListItem(ims) {
     if (SELECTED_ROOM === ims)
         dom.classList.add(R.klass.selected);
 
-    if (HIGHLIGHTED_CHANS.indexOf(ims) >= 0)
-        dom.classList.add(R.klass.unreadHi);
-    if (ims.lastMsg > ims.lastRead)
+    if (ims.lastMsg > ims.lastRead) {
         dom.classList.add(R.klass.unread);
+        if (HIGHLIGHTED_CHANS.indexOf(ims) >= 0)
+            dom.classList.add(R.klass.unreadHi);
+    }
     return dom;
 }
 

+ 11 - 0
cli/workflow.js

@@ -242,6 +242,17 @@ function removeMsg(chan, msg) {
     xhr.send(null);
 }
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} chan
+ * @param {number} ts
+**/
+function sendReadMArker(chan, ts) {
+    var xhr = new XMLHttpRequest();
+    var url = 'api/markread?room=' +chan.id +"&ts=" +ts;
+    xhr.open('POST', url, true);
+    xhr.send(null);
+}
+
 /**
  * @param {string} channelId
  * @param {string} msgId

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

@@ -1,71 +1,71 @@
 function aa(a){this.id=a;this.a={W:"",Y:"",$:"",aa:"",P:"",R:"",T:"",ba:""};this.version=0}function p(a){this.id=a;this.b=this.a=0;this.c={};this.version=0}function q(a){this.id=a;this.c={};this.version=this.b=this.a=this.h=0}function z(a,b){this.id=a;this.g=b;this.version=this.b=this.a=0}function ba(a){this.id=a;this.a={U:"",V:"",s:"",F:"",S:"",Z:""};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={X:"",s:"",F:""};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.A=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 B(){this.C=null;this.l={};this.w={};this.B={};this.c={};this.a=null;this.f={};this.h={version:0,data:{}};this.g={version:0,data:{}};this.b={};this.J=0}function C(a,b){return a.c[b]||a.f[b]||null}function D(a,b){return a.l[b]||a.B[b]||a.w[b]||null}
+function ga(a,b){if(b.service_name)return b.service_name;if(b.app){var c=b.app,d=[],g;for(g in a.f)a.f[g].l===c&&d.push(a.f[g]);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 B(){this.C=null;this.l={};this.w={};this.B={};this.b={};this.a=null;this.f={};this.h={version:0,data:{}};this.g={version:0,data:{}};this.c={};this.J=0}function C(a,b){return a.b[b]||a.f[b]||null}function D(a,b){return a.l[b]||a.B[b]||a.w[b]||null}
 function ha(a){var b=E.a,c;for(c in b.l)if(!1===a(b.l[c]))return;for(c in b.B)if(!1===!a(b.B[c]))return;for(c in b.w)if(!1===!a(b.w[c]))break}"undefined"!==typeof module&&(module.O.ca=B);function ia(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 ja(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 F(a,b,c,d){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&G(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 G(a,b,c){var d=0;b.forEach(function(a){d=Math.max(this.push(a,c),d)}.bind(a));la(a)}
-F.prototype.push=function(a,b){if(a.type&&"message"!==a.type)if("reaction_added"===a.type){var c=H(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=H(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=E.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 H(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.i-c.i})}"undefined"!==typeof module&&(module.O.da=F);var J={},K;function na(){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={N:"Utilisateur inconnu",M:"Channel inconnu",I:"Nouveau message",H:"Reseau",o:"edit&eacute;",G:function(a){return 1===a.length?a[0]+" est en train d'\u00e9crire":a.join(", ")+" sont en train d'\u00e9crire"},D:function(a){"string"!==typeof a&&(a=parseFloat(a));var b=new Date,c=new Date;a=new Date(1E3*a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);c.setTime(b.getTime());c.setDate(c.getDate()-1);return a.getTime()>b.getTime()?a.toLocaleTimeString():a.getTime()>c.getTime()?
+function ka(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 G(a,b,c){var d=0;b.forEach(function(a){d=Math.max(this.push(a,c),d)}.bind(a));la(a)}
+F.prototype.push=function(a,b){var c;if(a.type&&"message"!==a.type)if("reaction_added"===a.type){if(c=H(this,a.item.ts)){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=H(this,a.item.ts))&&ka(c,a.reaction,a.user,b);else return 0;else{var d=!1,g=a.ts,e=a;"message_changed"===a.subtype&&a.previous_message?(g=a.previous_message.ts,e=a.message):"message_deleted"===a.subtype&&a.previous_message&&(g=a.previous_message.ts,e=null);for(var n=
+0,h=this.a.length;n<h;n++)if(this.a[n].id===g){ja(this.a[n],e,b);d=!0;break}d||(c=new ia(a,b),this.a.push(c))}for(;this.a.length>this.b;)this.a.shift();return c?c.i:0};function ma(a){for(var b=E.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 H(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.i-c.i})}"undefined"!==typeof module&&(module.O.da=F);var J={},K;function na(){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={N:"Utilisateur inconnu",M:"Channel inconnu",I:"Nouveau message",H:"Reseau",o:"edit&eacute;",G:function(a){return 1===a.length?a[0]+" est en train d'\u00e9crire":a.join(", ")+" sont en train d'\u00e9crire"},D:function(a){"string"!==typeof a&&(a=parseFloat(a));var b=new Date,c=new Date;a=new Date(1E3*a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);c.setTime(b.getTime());c.setDate(c.getDate()-1);return a.getTime()>b.getTime()?a.toLocaleTimeString():a.getTime()>c.getTime()?
 "hier, "+a.toLocaleTimeString():a.toLocaleString()},j:{fileUploadCancel:"Annuler",neterror:"Impossible de se connecter au chat !"}};J.en={N:"Unknown member",M:"Unknown channel",I:"New message",H:"Network",o:"edited",G:function(a){return 1===a.length?a[0]+" is typing":a.join(", ")+" are typing"},D:function(a){"string"!==typeof a&&(a=parseFloat(a));var b=new Date,c=new Date;a=new Date(1E3*a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);c.setTime(b.getTime());c.setDate(c.getDate()-1);return a.getTime()>b.getTime()?a.toLocaleTimeString():a.getTime()>c.getTime()?"yesterday, "+a.toLocaleTimeString():a.toLocaleString()},
 j:{fileUploadCancel:"Cancel",neterror:"Cannot connect to chat !"}};var L=0;
-function oa(){var a=document.createDocumentFragment(),b=E.a.a?Object.keys(E.a.a.g):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:D(E.a,a).name.localeCompare(D(E.a,b).name)});b.forEach(function(b){b=D(E.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 p&&(c.className="slack-context-room slack-channel");I===b&&c.classList.add("selected");f.textContent=
-b.name;c.appendChild(M());c.appendChild(f);0<=N.indexOf(b)&&c.classList.add("unreadHi");b.b>b.a&&(c.classList.add("unread"),console.log("unread because ",b));c&&a.appendChild(c)}});b=E.a.c?Object.keys(E.a.c):[];b.sort(function(a,b){return E.a.c[a].name.localeCompare(E.a.c[b].name)});b.forEach(function(b){b=C(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.g.name;c.appendChild(M());
-c.appendChild(f);b.g.f||c.classList.add("away");I===b&&c.classList.add("selected");0<=N.indexOf(b)&&c.classList.add("unreadHi");b.b>b.a&&c.classList.add("unread");c&&a.appendChild(c)}});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);O();P();pa(function(a){document.getElementById("slackCtx").style.backgroundImage="url("+a+")"})}
-function qa(){var a=E.a.b,b;for(b in E.a.a.g)if(!E.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 E.a.c)(b=E.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"));ra()}
-function ra(){var a=E.a.b;if(I&&a[I.id]){var b=[],c=!1,d;for(d in a[I.id])(a=C(E.a,d))?b.push(a.name):c=!0;c&&(E.c=0);document.getElementById("whoistyping").textContent=K.G(b)}else document.getElementById("whoistyping").textContent=""}function Q(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network");P()}
+function oa(){var a=document.createDocumentFragment(),b=E.a.a?Object.keys(E.a.a.g):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:D(E.a,a).name.localeCompare(D(E.a,b).name)});b.forEach(function(b){b=D(E.a,b);if(!b.f){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.h-1):b instanceof p&&(c.className="slack-context-room slack-channel");I===b&&c.classList.add("selected");g.textContent=
+b.name;c.appendChild(M());c.appendChild(g);b.b>b.a&&(c.classList.add("unread"),0<=N.indexOf(b)&&c.classList.add("unreadHi"));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=C(E.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.g.name;c.appendChild(M());c.appendChild(g);b.g.f||c.classList.add("away");
+I===b&&c.classList.add("selected");b.b>b.a&&(c.classList.add("unread"),0<=N.indexOf(b)&&c.classList.add("unreadHi"));c&&a.appendChild(c)}});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);O();P();pa(function(a){document.getElementById("slackCtx").style.backgroundImage="url("+a+")"})}
+function qa(){var a=E.a.c,b;for(b in E.a.a.g)if(!E.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 E.a.b)(b=E.a.b[d].b)&&!b.f&&(c=document.getElementById(b.id),a[b.id]?c.classList.add("slack-context-typing"):c.classList.remove("slack-context-typing"));ra()}
+function ra(){var a=E.a.c;if(I&&a[I.id]){var b=[],c=!1,d;for(d in a[I.id])(a=C(E.a,d))?b.push(a.name):c=!0;c&&(E.c=0);document.getElementById("whoistyping").textContent=K.G(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=E.b[a];if(d&&(d=H(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)):sa(a,b,c)}};
+window.toggleReaction=function(a,b,c){var d=E.b[a];if(d&&(d=H(d,b))){var g=E.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)):sa(a,b,c)}};
 function ta(a){a:{for(var b=a,c={};!c[b];){if(a=E.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 ua(a){return a.replace(/:([^ \t:]+):/g,function(b,c){var d=ta(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,k=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=C(E.a,c[0]),c[1]=a?"@"+a.name:K.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=D(E.a,c[0]),c[1]=a?"#"+a.name:K.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=ua(d),l=d.length,h=function(a,b,c){for(;a[b];){var d=a[b];if(("A"<=d&&"Z">=d||"a"<=d&&"z">=d||"0"<=d&&"9">=d||-1!=="\u00e0\u00e8\u00ec\u00f2\u00f9\u00c0\u00c8\u00cc\u00d2\u00d9\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00c1\u00c9\u00cd\u00d3\u00da\u00dd\u00e2\u00ea\u00ee\u00f4\u00fb\u00c2\u00ca\u00ce\u00d4\u00db\u00e3\u00f1\u00f5\u00c3\u00d1\u00d5\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u00e7\u00c7\u00df\u00d8\u00f8\u00c5\u00e5\u00c6\u00e6\u0153".indexOf(d))&&
-a[b]!=c&&a[b+1]==c)return!0;b++}return!1},g=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};k<l&&(" "===d[k]||"\t"===d[k]);)k++;"&gt;"===d.substr(k,4)&&(n=!0,k+=4);for(;k<l;k++){var m=d[k];if("<"===m){do f+=d[k++];while(">"!==d[k-1]);k--}else if(!e["slackmsg-style-bold"]&&"*"===m&&d[k+1]&&h(d,k,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-bold"]=!0,f+=g(e);else if(!e["slackmsg-style-strike"]&&"~"===m&&d[k+1]&&h(d,k,m))Object.keys(e).length&&
-(f+="</span>"),e["slackmsg-style-strike"]=!0,f+=g(e);else if(!e["slackmsg-style-code"]&&"`"===m&&d[k+1]&&h(d,k,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-code"]=!0,f+=g(e);else if(!e["slackmsg-style-italic"]&&"_"===m&&d[k+1]&&h(d,k,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-italic"]=!0,f+=g(e);else{var v=!1,f=f+m;do{if(e["slackmsg-style-bold"]&&"*"!==m&&"*"===d[k+1])delete e["slackmsg-style-bold"],v=!0;else if(e["slackmsg-style-strike"]&&"~"!==m&&"~"===d[k+1])delete e["slackmsg-style-strike"],
-v=!0;else if(e["slackmsg-style-code"]&&"`"!==m&&"`"===d[k+1])delete e["slackmsg-style-code"],v=!0;else if(e["slackmsg-style-italic"]&&"_"!==m&&"_"===d[k+1])delete e["slackmsg-style-italic"],v=!0;else break;m=d[++k]}while(k<l);v&&(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.g?(a=va(a,b,c),a.classList.add("slackmsg-me_message")):a=va(a,b,c);b.o&&a.classList.add("slackmsg-edited");return a}
+function ua(a){return a.replace(/:([^ \t:]+):/g,function(b,c){var d=ta(c);if(d){var g=document.createElement("span");g.className=b===a?"emoji-medium":"emoji-small";g.appendChild(d);return g.outerHTML}return b})}
+function X(a){a=a.split(/\r?\n/g);for(var b=0,c=a.length;b<c;b++){for(var d=a[b].trim(),g="",e={},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=C(E.a,c[0]),c[1]=a?"@"+a.name:K.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=D(E.a,c[0]),c[1]=a?"#"+a.name:K.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=ua(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},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)&&(n=!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 v=!1,g=g+m;do{if(e["slackmsg-style-bold"]&&"*"!==m&&"*"===d[h+1])delete e["slackmsg-style-bold"],v=!0;else if(e["slackmsg-style-strike"]&&"~"!==m&&"~"===d[h+1])delete e["slackmsg-style-strike"],
+v=!0;else if(e["slackmsg-style-code"]&&"`"!==m&&"`"===d[h+1])delete e["slackmsg-style-code"],v=!0;else if(e["slackmsg-style-italic"]&&"_"!==m&&"_"===d[h+1])delete e["slackmsg-style-italic"],v=!0;else break;m=d[++h]}while(h<l);v&&(g+="</span>"+f(e))}}e&&(g+="</span>");a[b]=n?'<span class="slackmsg-style-quote">'+g+"</span>":g}return a.join("<br/>")}function T(a,b,c){b.g?(a=va(a,b,c),a.classList.add("slackmsg-me_message")):a=va(a,b,c);b.o&&a.classList.add("slackmsg-edited");return a}
 function wa(a,b){document.getElementById("linkFavicon").href=a||b?"favicon.png?h="+a+"&m="+b:"favicon_ok.png"}function P(){var a=N.length,b="";if(Y)b="!"+K.H+" - ",document.getElementById("linkFavicon").href="favicon_err.png";else if(a)b="(!"+a+") - ",wa(a,a);else{var c=0;ha(function(a){a.b>a.a&&c++});c&&(b="("+c+") - ");wa(0,c)}b+=E.a.C.name;document.title=b}
 function xa(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(L+3E4<a){var b=new Notification(K.I);L=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
-function ya(){var a=document.createDocumentFragment(),b=I.id,c=null,d=0,f=null;E.b[b]&&E.b[b].a.forEach(function(e){if(!e.b){var k=T(b,e);c&&c.m===e.m&&e.m?(k.classList.add("slackmsg-same-author"),30>Math.abs(d-e.i)?f.classList.add("slackmsg-same-ts"):d=e.i):d=e.i;(!c||c.i<=I.a)&&e.i>I.a&&k.classList.add("slackmsg-first-unread");c=e;f=k;a.appendChild(k)}});var e=document.getElementById("chatWindow");e.textContent="";e.appendChild(a);e.scrollTop=e.scrollHeight-e.clientHeight}
+function ya(){var a=document.createDocumentFragment(),b=I.id,c=null,d=0,g=null;E.b[b]&&E.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)?g.classList.add("slackmsg-same-ts"):d=e.i):d=e.i;(!c||c.i<=I.a)&&e.i>I.a&&h.classList.add("slackmsg-first-unread");c=e;g=h;a.appendChild(h)}});var e=document.getElementById("chatWindow");e.textContent="";e.appendChild(a);e.scrollTop=e.scrollHeight-e.clientHeight}
 function za(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")?Aa.L(document.body,
 function(a){a&&sa(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()),Ba(d))}break}c=c.parentElement}}function U(){document.getElementById("msgInput").focus()}function O(){var a=document.location.hash.substr(1),b=D(E.a,a),a=C(E.a,a);b&&b!==I?Ca(b):a&&a.b&&Ca(a.b)}
 document.addEventListener("DOMContentLoaded",function(){na();document.getElementById("chatWindow").addEventListener("click",za);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),Da(b,a.files[0],function(a){var b=document.getElementById("fileUploadError");a?(b.textContent=a,b.classList.remove("hidden")):(b.classList.add("hidden"),document.getElementById("fileUploadInput").value="",document.getElementById("fileUploadContainer").classList.add("hidden"))}));return!1});
 document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();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&&Ea(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&&Fa();U()});var a=0;document.getElementById("msgInput").addEventListener("input",function(){if(I){var b=Date.now();!(a+3E3<b)||!E.a.a.f&&I instanceof p||(Ga(),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 E.a.g.data){var n=E.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.A.localeCompare(b.A)||a.name.localeCompare(b.name)});
-var d=document.getElementById("slashList"),f=document.createDocumentFragment(),k;d.textContent="";e=0;for(c=b.length;e<c;e++)n=b[e],k!==n.A&&(k=n.A,f.appendChild(Ha(n.A))),f.appendChild(Ia(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=
+!1});window.addEventListener("focus",function(){window.hasFocus=!0;L=0;I&&Fa();U()});var a=0;document.getElementById("msgInput").addEventListener("input",function(){if(I){var b=Date.now();!(a+3E3<b)||!E.a.a.f&&I instanceof p||(Ga(),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 E.a.g.data){var n=E.a.g.data[e];(!g&&n.name.substr(0,d)===c||g&&n.name===c)&&b.push(n)}}b.sort(function(a,b){return a.A.localeCompare(b.A)||a.name.localeCompare(b.name)});
+var d=document.getElementById("slashList"),g=document.createDocumentFragment(),h;d.textContent="";e=0;for(c=b.length;e<c;e++)n=b[e],h!==n.A&&(h=n.A,g.appendChild(Ha(n.A))),g.appendChild(Ia(n));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(){Aa.L(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 Ja(a,b,c,d){var f=ta(c);if(f){for(var e=document.createElement("li"),n=document.createElement("a"),k=document.createElement("span"),l=document.createElement("span"),h=[],g=0,m=d.length;g<m;g++){var v=C(E.a,d[g]);v&&h.push(v.name)}h.sort();l.textContent=h.join(", ");k.appendChild(f);k.className="emoji-small";n.href="javascript:toggleReaction('"+a+"', '"+b+"', '"+c+"')";n.appendChild(k);n.appendChild(l);e.className="slackmsg-reaction-item";e.appendChild(n);return e}return null}
-function va(a,b,c){var d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),n=document.createElement("div"),k=document.createElement("img"),l=document.createElement("span"),h=document.createElement("ul"),g=document.createElement("li"),m=document.createElement("ul"),v=document.createElement("ul"),r=C(E.a,b.m);d.id=a+"_"+b.i;d.className="slackmsg-item";e.className="slackmsg-ts";n.className="slackmsg-msg";k.className="slackmsg-author-img";l.className="slackmsg-author-name";
-h.className="slackmsg-hover";g.className="slackmsg-hover-reply";e.innerHTML=K.D(b.i);n.innerHTML=X(b.text);l.textContent=r?r.name:b.f||"?";k.src=r?r.a.s:"";h.appendChild(g);if("makeEmoji"in window){var w=document.createElement("li"),y=window.makeEmoji("arrow_heading_down"),A=window.makeEmoji("smile"),x=window.makeEmoji("pencil2"),r=window.makeEmoji("x");w.className="slackmsg-hover-reaction";A?(w.classList.add("emoji-small"),w.appendChild(A)):w.style.backgroundImage='url("smile.svg")';y?(g.classList.add("emoji-small"),
-g.appendChild(y)):g.style.backgroundImage='url("repl.svg")';h.appendChild(w);b.m===E.a.a.id&&(g=document.createElement("li"),g.className="slackmsg-hover-edit",x?g.classList.add("emoji-small"):g.style.backgroundImage='url("edit.svg")',g.appendChild(x),h.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),h.appendChild(g))}else g.style.backgroundImage='url("repl.svg")',b.m===E.a.a.id&&
-(g=document.createElement("li"),g.className="slackmsg-hover-edit",g.style.backgroundImage='url("edit.svg")',h.appendChild(g),g=document.createElement("li"),g.className="slackmsg-hover-remove",g.style.backgroundImage='url("remove.svg")',h.appendChild(g));d.appendChild(k);f.appendChild(l);f.appendChild(n);f.appendChild(e);f.appendChild(m);b.o&&(e=document.createElement("div"),e.textContent=K.o,e.className="slackmsg-edited",f.appendChild(e));f.appendChild(v);f.className="slackmsg-content";m.className=
-"slackmsg-attachments";v.className="slackmsg-reactions";if(!0!==c){if(b.a)for(var u in b.a)(c=Ja(a,b.id,u,b.a[u]))&&v.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"),g=document.createElement("img"),h=document.createElement("a"),k=document.createElement("div"),l=document.createElement("div"),t=document.createElement("img"),y=document.createElement("img"),
+function Ja(a,b,c,d){var g=ta(c);if(g){for(var e=document.createElement("li"),n=document.createElement("a"),h=document.createElement("span"),l=document.createElement("span"),k=[],f=0,m=d.length;f<m;f++){var v=C(E.a,d[f]);v&&k.push(v.name)}k.sort();l.textContent=k.join(", ");h.appendChild(g);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 va(a,b,c){var d=document.createElement("div"),g=document.createElement("div"),e=document.createElement("div"),n=document.createElement("div"),h=document.createElement("img"),l=document.createElement("span"),k=document.createElement("ul"),f=document.createElement("li"),m=document.createElement("ul"),v=document.createElement("ul"),r=C(E.a,b.m);d.id=a+"_"+b.i;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";f.className="slackmsg-hover-reply";e.innerHTML=K.D(b.i);n.innerHTML=X(b.text);l.textContent=r?r.name:b.f||"?";h.src=r?r.a.s:"";k.appendChild(f);if("makeEmoji"in window){var w=document.createElement("li"),y=window.makeEmoji("arrow_heading_down"),A=window.makeEmoji("smile"),x=window.makeEmoji("pencil2"),r=window.makeEmoji("x");w.className="slackmsg-hover-reaction";A?(w.classList.add("emoji-small"),w.appendChild(A)):w.style.backgroundImage='url("smile.svg")';y?(f.classList.add("emoji-small"),
+f.appendChild(y)):f.style.backgroundImage='url("repl.svg")';k.appendChild(w);b.m===E.a.a.id&&(f=document.createElement("li"),f.className="slackmsg-hover-edit",x?f.classList.add("emoji-small"):f.style.backgroundImage='url("edit.svg")',f.appendChild(x),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.m===E.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(n);g.appendChild(e);g.appendChild(m);b.o&&(e=document.createElement("div"),e.textContent=K.o,e.className="slackmsg-edited",g.appendChild(e));g.appendChild(v);g.className="slackmsg-content";m.className=
+"slackmsg-attachments";v.className="slackmsg-reactions";if(!0!==c){if(b.a)for(var u in b.a)(c=Ja(a,b.id,u,b.a[u]))&&v.appendChild(c);b.c.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"),y=document.createElement("img"),
 n=document.createElement("div"),u=document.createElement("img"),x=document.createElement("span"),A=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";
+(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");y.className="slackmsg-attachment-img";a.image_url?y.src=a.image_url:y.classList.add("hidden");n.className="slackmsg-attachment-footer";x.className="slackmsg-attachment-footer-text";u.className="slackmsg-attachment-footer-icon";a.footer?(x.innerHTML=X(a.footer),a.footer_icon?u.src=a.footer_icon:u.classList.add("hidden")):(u.classList.add("hidden"),x.classList.add("hidden"));A.className="slackmsg-ts";a.ts?A.innerHTML=K.D(a.ts):A.classList.add("hidden");
-f.appendChild(g);f.appendChild(h);k.appendChild(l);k.appendChild(t);n.appendChild(u);n.appendChild(x);n.appendChild(A);c.appendChild(e);c.appendChild(f);c.appendChild(k);c.appendChild(y);c.appendChild(n);b.appendChild(d);b.appendChild(c);b&&m.appendChild(b)})}d.appendChild(f);d.appendChild(h);return d}function Ha(a){var b=document.createElement("lh");b.textContent=a;b.className="slack-command-header";return b}
-function Ia(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 Aa=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(h),l.parentElement.removeChild(l),!0):!1}function d(a){var b=0,c;a=void 0===a?r.value:a;if(k()){var d=window.searchEmojis(a);c=f(d);for(var g in w)w[g].visible&&(w[g].visible=!1,m.removeChild(w[g].j));
-g=0;for(var h=c.length;g<h;g++){var l=c[g].name,t=w[l];if(!t){var t=w,n=l,u=l,l=window.makeEmoji(d[l]),x=document.createElement("span");x.appendChild(l);x.className="emoji-medium";l=e(u,x);t=t[n]=l}t.visible||(t.visible=!0,m.appendChild(t.j));b++}}for(g in y)y[g].visible&&(y[g].visible=!1,v.removeChild(y[g].j));c=f(E.a.h.data);g=0;for(h=c.length;g<h;g++)l=c[g].name,""!==a&&l.substr(0,a.length)!==a||"alias:"===E.a.h.data[l].substr(0,6)||(t=y[l],t||(d=y,n=t=l,l=E.a.h.data[l],u=document.createElement("span"),
-x=document.createElement("span"),u.className="emoji emoji-custom",u.style.backgroundImage='url("'+l+'")',x.appendChild(u),x.className="emoji-medium",l=e(n,x),t=d[t]=l),t.visible||(t.visible=!0,v.appendChild(t.j)),b++);return b}function f(a){var b=E.a.a.c.b,c=[],d;for(d in a){var e={name:d,K: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.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,j: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 k(){return"searchEmojis"in window}var l=document.createElement("div"),h=document.createElement("div"),g=document.createElement("div"),m=document.createElement("ul"),v=document.createElement("ul"),r=document.createElement("input"),w={},y={},A=document.createElement("div"),
-x=document.createElement("span"),u=document.createElement("span"),t;h.addEventListener("click",function(a){var c=l.getBoundingClientRect();(a.screenY<c.top||a.screenY>c.bottom||a.screenX<c.left||a.screenX>c.right)&&b()});h.className="emojibar-overlay";l.className="emojibar";g.className="emojibar-emojis";A.className="emojibar-detail";x.className="emojibar-detail-img";u.className="emojibar-detail-name";m.className=v.className="emojibar-list";r.className="emojibar-search";A.appendChild(x);A.appendChild(u);
-g.appendChild(n(window.emojiProviderHeader));g.appendChild(m);g.appendChild(n("emojicustom.png"));g.appendChild(v);l.appendChild(g);l.appendChild(A);l.appendChild(r);r.addEventListener("keyup",function(){d()});l.addEventListener("mousemove",function(b){a(b,function(a){var b=a?w[a]||y[a]:null;b?(x.innerHTML=b.j.outerHTML,u.textContent=":"+a+":"):(x.textContent="",u.textContent="")})});l.addEventListener("click",function(b){a(b,function(a){a&&c()&&t&&t(a)})});return{isSupported:k,L:function(a,b){return k()?
-(t=b,a.appendChild(h),a.appendChild(l),r.value="",d(),r.focus(),!0):!1},search:d,close:b}}();var E,N=[];setInterval(function(){var a=E.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&&qa()},1E3);
-function Ka(a,b){if(a!==I||!window.hasFocus){var c=new RegExp("<@"+E.a.a.id),d=!1,f=!1,e=!1;b.forEach(function(b){if(!(parseFloat(b.ts)<=a.a)){f=!0;var k;if(!(k=a instanceof z||b.text.match(c)))a:{k=E.a.a.c.a;for(var h=0,g=k.length;h<g;h++)if(-1!==b.text.indexOf(k[h])){k=!0;break a}k=!1}k&&(-1===N.indexOf(a)&&(e=!0,N.push(a)),d=!0)}});if(f){P();var n=document.getElementById(a.id);n&&(n.classList.add("unread"),d&&n.classList.add("unreadHi"));e&&!window.hasFocus&&xa()}}}
-function Fa(){var a=I,b=N.indexOf(a);a.a=a.b;0<=b&&(N.splice(b,1),P());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}E=new function(){this.c=0;this.a=new B;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<=h;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===
+g.appendChild(f);g.appendChild(h);k.appendChild(l);k.appendChild(t);n.appendChild(u);n.appendChild(x);n.appendChild(A);c.appendChild(e);c.appendChild(g);c.appendChild(k);c.appendChild(y);c.appendChild(n);b.appendChild(d);b.appendChild(c);b&&m.appendChild(b)})}d.appendChild(g);d.appendChild(k);return d}function Ha(a){var b=document.createElement("lh");b.textContent=a;b.className="slack-command-header";return b}
+function Ia(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 Aa=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 w)w[f].visible&&(w[f].visible=!1,m.removeChild(w[f].j));
+f=0;for(var k=c.length;f<k;f++){var l=c[f].name,t=w[l];if(!t){var t=w,n=l,u=l,l=window.makeEmoji(d[l]),x=document.createElement("span");x.appendChild(l);x.className="emoji-medium";l=e(u,x);t=t[n]=l}t.visible||(t.visible=!0,m.appendChild(t.j));b++}}for(f in y)y[f].visible&&(y[f].visible=!1,v.removeChild(y[f].j));c=g(E.a.h.data);f=0;for(k=c.length;f<k;f++)l=c[f].name,""!==a&&l.substr(0,a.length)!==a||"alias:"===E.a.h.data[l].substr(0,6)||(t=y[l],t||(d=y,n=t=l,l=E.a.h.data[l],u=document.createElement("span"),
+x=document.createElement("span"),u.className="emoji emoji-custom",u.style.backgroundImage='url("'+l+'")',x.appendChild(u),x.className="emoji-medium",l=e(n,x),t=d[t]=l),t.visible||(t.visible=!0,v.appendChild(t.j)),b++);return b}function g(a){var b=E.a.a.c.b,c=[],d;for(d in a){var e={name:d,K: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.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,j: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"),f=document.createElement("div"),m=document.createElement("ul"),v=document.createElement("ul"),r=document.createElement("input"),w={},y={},A=document.createElement("div"),
+x=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";A.className="emojibar-detail";x.className="emojibar-detail-img";u.className="emojibar-detail-name";m.className=v.className="emojibar-list";r.className="emojibar-search";A.appendChild(x);A.appendChild(u);
+f.appendChild(n(window.emojiProviderHeader));f.appendChild(m);f.appendChild(n("emojicustom.png"));f.appendChild(v);l.appendChild(f);l.appendChild(A);l.appendChild(r);r.addEventListener("keyup",function(){d()});l.addEventListener("mousemove",function(b){a(b,function(a){var b=a?w[a]||y[a]:null;b?(x.innerHTML=b.j.outerHTML,u.textContent=":"+a+":"):(x.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,N=[];setInterval(function(){var a=E.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&&qa()},1E3);
+function Ka(a,b){if(a!==I||!window.hasFocus){var c=new RegExp("<@"+E.a.a.id),d=!1,g=!1,e=!1;b.forEach(function(b){if(!(parseFloat(b.ts)<=a.a)){g=!0;var h;if(!(h=a instanceof z||b.text.match(c)))a:{h=E.a.a.c.a;for(var k=0,f=h.length;k<f;k++)if(-1!==b.text.indexOf(h[k])){h=!0;break a}h=!1}h&&(-1===N.indexOf(a)&&(e=!0,N.push(a)),d=!0)}});if(g){P();var n=document.getElementById(a.id);n&&(n.classList.add("unread"),d&&n.classList.add("unreadHi"));e&&!window.hasFocus&&xa()}}}
+function Fa(){var a=I,b=N.indexOf(a);if(a.b>a.a){var c=new XMLHttpRequest;c.open("POST","api/markread?room="+a.id+"&ts="+a.b,!0);c.send(null);a.a=a.b}0<=b&&(N.splice(b,1),P());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}E=new function(){this.c=0;this.a=new B;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+=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.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=k.createLinearGradient(0,0,0,h);a.addColorStop(0,"#4D394B");a.addColorStop(1,"#201820");k.fillStyle=a;k.fillRect(0,0,l,h);return k.getImageData(0,0,l,h)}function f(a,b){for(var c=(a.height-b.height)/2,d=0;d<b.height;d++)for(var e=0;e<b.width;e++){var g=b.data[4*(d*b.width+e)]/255,f=4*((d+c)*a.width+e+c);a.data[f]*=g;a.data[f+1]*=g;a.data[f+2]*=g}return a}function e(a,b,c,d){var e=Math.floor(d);a=[a.data[e*l*4+0],a.data[e*l*4+1],a.data[e*l*4+2]];k.fillStyle=
-"#"+(1.1*a[0]<<16|1.1*a[1]<<8|1.1*a[2]).toString(16);k.beginPath();k.moveTo(c+g/2,d+m);k.lineTo(c-m+g,d+g/2);k.lineTo(c+g/2,d-m+g);k.lineTo(c+m,d+g/2);k.closePath();k.fill();k.putImageData(f(k.getImageData(c+m,d+m,v,v),b),c+m,d+m)}var n=document.createElement("canvas"),k=n.getContext("2d"),l=n.width=250,h=n.height=290,g=(l-40)/3,m=.1*g,v=Math.floor(g-2*m),r=.5*v,w;return function(c){if(w)c(w);else{var e=d(),f=[],g;for(g in E.a.c)E.a.c[g].h||f.push({src:"api/avatar?user="+g});b(f,function(b){a(e,b);
-w=n.toDataURL();c(w)})}}}();var Y=0,I=null,S=null,W=null;function La(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,d=2===Math.floor(b.status/100);if(d){Y&&(Y=0,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)),La(a)};b.open("GET","api?v="+E.c,!0);b.send(null)}function Ga(){var a=new XMLHttpRequest;a.open("POST","api/typing?room="+I.id,!0);a.send(null)}
-function Ma(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"],n=Date.now();if(e.bots)for(var k=0,l=e.bots.length;k<l;k++){var h=f.f[e.bots[k].id];h||(h=f.f[e.bots[k].id]=new ea(e.bots[k].id));var g=e.bots[k],m=n;void 0!==g.deleted&&(h.h=g.deleted);void 0!==g.name&&(h.name=g.name);void 0!==g.app_id&&(h.l=g.app_id);g.icons&&(h.a.X=g.icons.image_36,h.a.s=g.icons.image_48,h.a.F=g.icons.image_72);void 0!==g.presence&&(h.f="away"!==g.presence);void 0!==g.isPresent&&
-(h.f=g.isPresent);h.version=Math.max(h.version,m)}if(e.users)for(k=0,l=e.users.length;k<l;k++)(h=f.c[e.users[k].id])||(h=f.c[e.users[k].id]=new ba(e.users[k].id)),g=e.users[k],m=n,void 0!==g.name&&(h.name=g.name),void 0!==g.deleted&&(h.h=g.deleted),void 0!==g.status&&(h.status=g.status),void 0!==g.presence&&(h.f="away"!==g.presence),void 0!==g.isPresent&&(h.f=g.isPresent),g.profile&&(h.a.U=g.profile.image_24,h.a.V=g.profile.image_32,h.a.s=g.profile.image_48,h.a.F=g.profile.image_72,h.a.S=g.profile.image_192,
-h.a.Z=g.profile.image_512),h.version=Math.max(h.version,m);if(e.ims)for(k=0,l=e.ims.length;k<l;k++)if(g=C(f,e.ims[k].user)){g.b||(f.B[e.ims[k].id]=g.b=new z(e.ims[k].id,g));var h=g.b,m=e.ims[k],v=n;void 0!==m.last_read&&(h.a=Math.max(parseFloat(m.last_read),h.a));void 0!==m.last_msg&&(h.b=parseFloat(m.last_msg));m.latest&&(h.b=parseFloat(m.latest.ts));h.f=g.h;h.version=Math.max(h.version,v)}if(e.channels)for(k=0,l=e.channels.length;k<l;k++){(h=f.l[e.channels[k].id])||(h=f.l[e.channels[k].id]=new p(e.channels[k].id));
-g=e.channels[k];m=f;v=n;void 0!==g.name&&(h.name=g.name);void 0!==g.is_archived&&(h.f=g.is_archived);void 0!==g.last_read&&(h.a=Math.max(parseFloat(g.last_read),h.a));void 0!==g.last_msg&&(h.b=parseFloat(g.last_msg));g.latest&&(h.b=parseFloat(g.latest.ts));if(g.members&&(h.c={},g.members))for(var r=0,w=g.members.length;r<w;r++){var y=C(m,g.members[r]);h.c[y.id]=y;y.g[h.id]=h}h.version=Math.max(h.version,v)}k=0;for(l=e.groups.length;k<l;k++){(h=f.w[e.groups[k].id])||(h=f.w[e.groups[k].id]=new q(e.groups[k].id));
-g=f;m=e.groups[k];v=n;r=[];if(m.members){h.c={};w=h.h=0;for(y=m.members.length;w<y;w++){var A=C(g,m.members[w]);h.c[m.members[w]]=A;A.g[h.id]=h;r.push(A.name);h.h++}h.name=r.join(", ")}void 0!==m.is_archived&&(h.f=m.is_archived||!1===m.is_open);void 0!==m.last_read&&(h.a=Math.max(parseFloat(m.last_read),h.a));void 0!==m.last_msg?h.b=parseFloat(m.last_msg):m.latest&&(h.b=parseFloat(m.latest.ts));h.version=Math.max(h.version,v)}e.emojis&&(f.h.data=e.emojis,f.h.version=n);if(void 0!==e.commands){f.g.data=
-{};for(k in e.commands)f.g.data[k]=new fa(f,e.commands[k]);f.g.version=n}e.team&&(f.C||(f.C=new aa(e.team.id)),l=f.C,h=e.team,void 0!==h.name&&(l.name=h.name),h.icon&&(l.a.W=h.icon.image_34,l.a.Y=h.icon.image_44,l.a.$=h.icon.image_68,l.a.aa=h.icon.image_88,l.a.P=h.icon.image_102,l.a.R=h.icon.image_132,l.a.T=h.icon.image_230,l.a.ba=h.icon.image_default),l.version=Math.max(l.version,n));f.J=Math.max(f.J,n);e.self&&(f.a=C(f,e.self.id),f.a.c||(f.a.c=new ca),da(f.a.c,e.self.prefs,n));if(void 0!==e.typing)for(k in f.b=
-e.typing,f.b)for(var x in f.b[k])f.b[k][x]=n}if(b.live){for(var u in b.live)(f=c.b[u])?G(f,b.live[u],d):c.b[u]=new F(u,250,b.live[u],d);for(var t in b.live)(d=D(c.a,t))?(c.b[t].a.length&&(u=c.b[t],d.b=Math.max(d.b,u.a[u.a.length-1].i)),d.f||(Ka(d,b.live[t]),I&&b.live[I.id]&&ya())):E.c=0}b["static"]&&(oa(),b["static"].typing&&qa())}Z()}else setTimeout(Z,1E3*Y)}function Z(){La(Ma)}
+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,v,v),b),c+m,d+m)}var n=document.createElement("canvas"),h=n.getContext("2d"),l=n.width=250,k=n.height=290,f=(l-40)/3,m=.1*f,v=Math.floor(f-2*m),r=.5*v,w;return function(c){if(w)c(w);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);
+w=n.toDataURL();c(w)})}}}();var Y=0,I=null,S=null,W=null;function La(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,d=2===Math.floor(b.status/100);if(d){Y&&(Y=0,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)),La(a)};b.open("GET","api?v="+E.c,!0);b.send(null)}function Ga(){var a=new XMLHttpRequest;a.open("POST","api/typing?room="+I.id,!0);a.send(null)}
+function Ma(a,b){if(a){if(b){var c=E,d=Date.now();b.v&&(c.c=b.v);if(b["static"]){var g=c.a,e=b["static"],n=Date.now();if(e.bots)for(var h=0,l=e.bots.length;h<l;h++){var k=g.f[e.bots[h].id];k||(k=g.f[e.bots[h].id]=new ea(e.bots[h].id));var f=e.bots[h],m=n;void 0!==f.deleted&&(k.h=f.deleted);void 0!==f.name&&(k.name=f.name);void 0!==f.app_id&&(k.l=f.app_id);f.icons&&(k.a.X=f.icons.image_36,k.a.s=f.icons.image_48,k.a.F=f.icons.image_72);void 0!==f.presence&&(k.f="away"!==f.presence);void 0!==f.isPresent&&
+(k.f=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 ba(e.users[h].id)),f=e.users[h],m=n,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.f="away"!==f.presence),void 0!==f.isPresent&&(k.f=f.isPresent),f.profile&&(k.a.U=f.profile.image_24,k.a.V=f.profile.image_32,k.a.s=f.profile.image_48,k.a.F=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=C(g,e.ims[h].user)){f.b||(g.B[e.ims[h].id]=f.b=new z(e.ims[h].id,f));var k=f.b,m=e.ims[h],v=n;void 0!==m.last_read&&(k.a=Math.max(parseFloat(m.last_read),k.a));void 0!==m.last_msg&&(k.b=parseFloat(m.last_msg));m.latest&&(k.b=parseFloat(m.latest.ts));k.f=f.h;k.version=Math.max(k.version,v)}if(e.channels)for(h=0,l=e.channels.length;h<l;h++){(k=g.l[e.channels[h].id])||(k=g.l[e.channels[h].id]=new p(e.channels[h].id));
+f=e.channels[h];m=g;v=n;void 0!==f.name&&(k.name=f.name);void 0!==f.is_archived&&(k.f=f.is_archived);void 0!==f.last_read&&(k.a=Math.max(parseFloat(f.last_read),k.a));void 0!==f.last_msg&&(k.b=parseFloat(f.last_msg));f.latest&&(k.b=parseFloat(f.latest.ts));if(f.members&&(k.c={},f.members))for(var r=0,w=f.members.length;r<w;r++){var y=C(m,f.members[r]);k.c[y.id]=y;y.g[k.id]=k}k.version=Math.max(k.version,v)}h=0;for(l=e.groups.length;h<l;h++){(k=g.w[e.groups[h].id])||(k=g.w[e.groups[h].id]=new q(e.groups[h].id));
+f=g;m=e.groups[h];v=n;r=[];if(m.members){k.c={};w=k.h=0;for(y=m.members.length;w<y;w++){var A=C(f,m.members[w]);k.c[m.members[w]]=A;A.g[k.id]=k;r.push(A.name);k.h++}k.name=r.join(", ")}void 0!==m.is_archived&&(k.f=m.is_archived||!1===m.is_open);void 0!==m.last_read&&(k.a=Math.max(parseFloat(m.last_read),k.a));void 0!==m.last_msg?k.b=parseFloat(m.last_msg):m.latest&&(k.b=parseFloat(m.latest.ts));k.version=Math.max(k.version,v)}e.emojis&&(g.h.data=e.emojis,g.h.version=n);if(void 0!==e.commands){g.g.data=
+{};for(h in e.commands)g.g.data[h]=new fa(g,e.commands[h]);g.g.version=n}e.team&&(g.C||(g.C=new aa(e.team.id)),l=g.C,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,n));g.J=Math.max(g.J,n);e.self&&(g.a=C(g,e.self.id),g.a.c||(g.a.c=new ca),da(g.a.c,e.self.prefs,n));if(void 0!==e.typing)for(h in g.c=
+{},e.typing){g.c[h]={};for(var x in e.typing[h])g.c[h][x]=n}}if(b.live){for(var u in b.live)(g=c.b[u])?G(g,b.live[u],d):c.b[u]=new F(u,250,b.live[u],d);for(var t in b.live)(d=D(c.a,t))?(c.b[t].a.length&&(u=c.b[t],d.b=Math.max(d.b,u.a[u.a.length-1].i)),d.f||(Ka(d,b.live[t]),I&&b.live[I.id]&&ya())):E.c=0}b["static"]&&(oa(),b["static"].typing&&qa())}Z()}else setTimeout(Z,1E3*Y)}function Z(){La(Ma)}
 function Ca(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;ya();U();document.getElementById("fileUploadContainer").classList.add("hidden");Fa();S&&(S=null,R());W&&(W=null,R());ra();I.a&&!E.b[I.id]&&(b=new XMLHttpRequest,
-b.open("GET","api/hist?room="+I.id,!0),b.send(null))}function Da(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)}
+b.open("GET","api/hist?room="+I.id,!0),b.send(null))}function Da(a,b,c){var d=I;new FileReader;var g=new FormData,e=new XMLHttpRequest;g.append("file",b);g.append("filename",a);e.onreadystatechange=function(){4===e.readyState&&(204===e.status?c(null):c(e.statusText))};e.open("POST","api/file?room="+d.id);e.send(g)}
 function Ea(a){if(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=E.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=C(E.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.s,text:c.text,footer:e,ts:c.i}]))}d.open("POST",a,!0);d.send(null);return!0}function Ba(a){var b=new XMLHttpRequest;b.open("DELETE","api/msg?room="+I.id+"&ts="+a.id,!0);b.send(null)}
+if(c){var g=C(E.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:"<@"+g.id+"|"+g.name+">",author_icon:g.a.s,text:c.text,footer:e,ts:c.i}]))}d.open("POST",a,!0);d.send(null);return!0}function Ba(a){var b=new XMLHttpRequest;b.open("DELETE","api/msg?room="+I.id+"&ts="+a.id,!0);b.send(null)}
 function sa(a,b,c){var d=new XMLHttpRequest;d.open("POST","api/reaction?room="+a+"&msg="+b+"&reaction="+encodeURIComponent(c),!0);d.send(null)};

+ 4 - 3
srv/public/style.css

@@ -43,7 +43,7 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slackmsg-content { display: inline-block; }
 .slackmsg-author { display: inline-block; }
 .slackmsg-author-img { max-height: 36px; max-width: 36px; margin-right: 10px; border-radius: 3px; }
-.slackmsg-author-name { display: block; font-style: italic; font-weight: bold; }
+.slackmsg-author-name { display: block; font-weight: bold; }
 .slackmsg-msg { display: inline-block; vertical-align: top; }
 .slackmsg-reactions:empty,.slackmsg-attachments:empty { display: none; }
 .slackmsg-reactions { padding: 0 0 0 40px; margin: 5px 0; }
@@ -51,8 +51,8 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slackmsg-ts { font-size: 0.75em; font-style: italic; }
 
 .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 > .slackmsg-author-img { display: none; }
+.slackmsg-same-author > .slackmsg-content > .slackmsg-author-name { display: none; }
 .slackmsg-same-author:not(.slackmsg-me_message) .slackmsg-content { margin-left: 46px; }
 .slackmsg-same-ts .slackmsg-ts { display: none; }
 
@@ -81,6 +81,7 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; }
 .slackmsg-style-quote { border-left: 3px solid #e3e4e6; padding-left: 10px; }
 
 .slackmsg-attachments { list-style: none; }
+.slackmsg-attachment .slackmsg-author > * { display: inline-block; }
 .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; }

+ 16 - 0
srv/src/httpServ.js

@@ -176,6 +176,22 @@ Server.prototype.onRequest = function(req, res) {
                 }
                 res.end();
             }
+        } else if (req.urlObj.match(["api", "markread"])) {
+            if (!req.urlObj.queryTokens.room || !req.urlObj.queryTokens.ts) {
+                res.writeHeader("400", "Bad request");
+                res.end();
+            } else {
+                var chan = res.slack.data.getChannel(req.urlObj.queryTokens.room[0])
+                    ,ts = parseFloat(req.urlObj.queryTokens.ts[0]);
+                if (!chan)
+                    res.writeHeader("404", "Chan Not Found");
+                else if (isNaN(ts))
+                    res.writeHeader("400", "Invalid date");
+                else
+                    res.slack.markRead(chan, ts);
+                res.end();
+            }
+            sessionManager.saveSession(req.session);
         } else if (req.urlObj.match(["api", "avatar"])) {
             if (!req.urlObj.queryTokens.user) {
                 res.writeHeader("400", "Bad request");

+ 33 - 3
srv/src/slack.js

@@ -29,6 +29,12 @@ const SLACK_ENDPOINT = "https://slack.com/api/"
         ,slashExec: "chat.command"
         ,addReaction: "reactions.add"
         ,removeReaction: "reactions.remove"
+        ,read: {
+            group: "groups.mark"
+            ,im: "im.mark"
+            ,group: "mpim.mark"
+            ,channel: "channels.mark"
+        }
     }
     ,HISTORY_LENGTH = 35
     ,INACTIVE_DELAY = 120000
@@ -233,16 +239,38 @@ Slack.prototype.onMessage = function(msg, t) {
             ,channel = this.data.getChannel(msg["channel"])
             ,histo = this.history[channelId];
         if (histo) {
-            this.data.liveV = Math.max(this.data.liveV, histo.push(msg, t));
+            var lastMsg = histo.push(msg, t);
+            if (lastMsg)
+                this.data.liveV = t;
             histo.resort();
             if (channel)
-                channel.lastMsg = Math.max(this.data.liveV, channel.lastMsg);
+                channel.setLastMsg(lastMsg, t);
         } else if (channel) {
             this.fetchHistory(msg["channel"]);
         }
     }
 };
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} chan
+ * @param {number} ts
+**/
+Slack.prototype.markRead = function(chan, ts) {
+    var apiURI;
+
+    if (chan.id[0] === 'C')
+        apiURI = SLACK_ENDPOINT+GETAPI.read.channel;
+    else if (chan.id[0] === 'G')
+        apiURI = SLACK_ENDPOINT+GETAPI.read.group;
+    else if (chan.id[0] === 'D')
+        apiURI = SLACK_ENDPOINT+GETAPI.read.im;
+
+    httpsRequest(apiURI
+        +"?token=" +this.token
+        +"&channel="+chan.id
+        +"&ts="+ts);
+};
+
 Slack.prototype.connectRtm = function(url, cb) {
     var _this = this;
 
@@ -451,7 +479,9 @@ Slack.prototype.fetchHistory = function(targetId) {
                 history = _this.history[targetId] = new SlackHistory(targetId, HISTORY_LENGTH);
                 history.isNew = true;
             }
-            this.data.liveV = Math.max(history.pushAll(resp.messages, Date.now()), this.data.liveV);
+            var now = Date.now();
+            if (history.pushAll(resp.messages, now))
+                this.data.liveV = now;
         }
     });
 };

+ 33 - 4
srv/src/slackData.js

@@ -129,6 +129,15 @@ SlackChan.prototype.update = function(chanData, slackData, t) {
     this.version = Math.max(this.version, t);
 }
 
+SlackChan.prototype.setLastMsg = function(lastMsg, t) {
+    if (this.lastMsg < lastMsg) {
+        this.lastMsg = lastMsg;
+        this.version = t;
+        return true;
+    }
+    return false;
+}
+
 /**
  * @constructor
  * @param {string} id
@@ -206,6 +215,15 @@ SlackGroup.prototype.update = function(slack, groupData, t) {
     this.version = Math.max(this.version, t);
 }
 
+SlackGroup.prototype.setLastMsg = function(lastMsg, t) {
+    if (this.lastMsg < lastMsg) {
+        this.lastMsg = lastMsg;
+        this.version = t;
+        return true;
+    }
+    return false;
+}
+
 /**
  * @constructor
  * @param {string} id
@@ -241,6 +259,15 @@ SlackIms.prototype.update = function(user, imsData, t) {
     this.version = Math.max(this.version, t);
 }
 
+SlackIms.prototype.setLastMsg = function(lastMsg, t) {
+    if (this.lastMsg < lastMsg) {
+        this.lastMsg = lastMsg;
+        this.version = t;
+        return true;
+    }
+    return false;
+}
+
 /**
  * @constructor
 **/
@@ -673,10 +700,12 @@ SlackData.prototype.updateStatic = function(data, t) {
         this.self.prefs.update(data["self"]["prefs"], t);
     }
     if (data["typing"] !== undefined) {
-        this.typing = data["typing"];
-        for (var i in this.typing)
-            for (var j in this.typing[i])
+        this.typing = {};
+        for (var i in data["typing"]) {
+            this.typing[i] = {};
+            for (var j in data["typing"][i])
                 this.typing[i][j] = t;
+        }
     }
 };
 
@@ -839,7 +868,7 @@ SlackData.prototype.onMessage = function(msg, 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"];
+            channel.lastRead = parseFloat(msg["ts"]);
             this.staticV = channel.version = t;
         }
     }

+ 12 - 5
srv/src/slackHistory.js

@@ -186,6 +186,7 @@ SlackHistory.prototype.pushAll = function(evts, t) {
  * @return {number} ts
 **/
 SlackHistory.prototype.push = function(ev, t) {
+    var msg;
     if (!ev["type"] || ev["type"] === "message") {
         var exists = false
             ,targetId = ev["ts"]
@@ -205,18 +206,20 @@ SlackHistory.prototype.push = function(ev, t) {
                 break;
             }
         }
-        if (!exists)
-            this.messages.push(new SlackMessage(ev, t));
+        if (!exists) {
+            msg = new SlackMessage(ev, t);
+            this.messages.push(msg);
+        }
     } else if (ev["type"] === "reaction_added") {
-        this.addReaction(ev["reaction"], ev["user"], ev["item"]["ts"], t);
+        msg = this.addReaction(ev["reaction"], ev["user"], ev["item"]["ts"], t);
     } else if (ev["type"] === "reaction_removed") {
-        this.removeReaction(ev["reaction"], ev["user"], ev["item"]["ts"], t);
+        msg = this.removeReaction(ev["reaction"], ev["user"], ev["item"]["ts"], t);
     } else {
         return 0;
     }
     while (this.messages.length > this.keepMessages)
         this.messages.shift();
-    return t;
+    return msg ? msg.ts : 0;
 }
 
 SlackHistory.prototype.lastMessage = function() {
@@ -228,11 +231,13 @@ SlackHistory.prototype.lastMessage = function() {
  * @param {string} userId
  * @param {string} msgId
  * @param {number} ts
+ * @return {SlackMessage|null}
 **/
 SlackHistory.prototype.addReaction = function(reaction, userId, msgId, ts) {
     var msg = this.getMessageById(msgId);
     if (msg)
         msg.addReaction(reaction, userId, ts);
+    return msg;
 }
 
 /**
@@ -240,11 +245,13 @@ SlackHistory.prototype.addReaction = function(reaction, userId, msgId, ts) {
  * @param {string} userId
  * @param {string} msgId
  * @param {number} ts
+ * @return {SlackMessage|null}
 **/
 SlackHistory.prototype.removeReaction = function(reaction, userId, msgId, ts) {
     var msg = this.getMessageById(msgId);
     if (msg)
         msg.removeReaction(reaction, userId, ts);
+    return msg;
 }
 
 /**