浏览代码

[add][bugfix] hide commands that start with input command when input command is done typing (now typing args)
[refactor] splitted ui.js in dom.js

B Thibault 8 年之前
父节点
当前提交
ed7d653b8e
共有 5 个文件被更改,包括 480 次插入477 次删除
  1. 1 0
      Makefile
  2. 404 0
      cli/dom.js
  3. 7 415
      cli/ui.js
  4. 6 0
      cli/workflow.js
  5. 62 62
      srv/public/slack.min.js

+ 1 - 0
Makefile

@@ -8,6 +8,7 @@ SRC=		srv/src/slackData.js	\
 			\
 			cli/resources.js		\
 			cli/ui.js				\
+			cli/dom.js				\
 			cli/emojiBar.js			\
 			cli/data.js				\
 			cli/contextBackground.js\

+ 404 - 0
cli/dom.js

@@ -0,0 +1,404 @@
+
+/**
+ * @return {Element!}
+**/
+function createTypingDisplay() {
+    var dom = document.createElement("span")
+        ,dot1 = document.createElement("span")
+        ,dot2 = document.createElement("span")
+        ,dot3 = document.createElement("span");
+
+    dom.className = R.klass.typing.container;
+    dot1.className = R.klass.typing.dot1;
+    dot2.className = R.klass.typing.dot2;
+    dot3.className = R.klass.typing.dot3;
+
+    dot1.textContent = dot2.textContent = dot3.textContent = '.';
+
+    dom.appendChild(dot1);
+    dom.appendChild(dot2);
+    dom.appendChild(dot3);
+    return dom;
+}
+
+/**
+ * @param {SlackChan|SlackGroup} chan
+ * @return {Element}
+**/
+function createChanListItem(chan) {
+    var dom = document.createElement("li")
+        ,link = document.createElement("a");
+
+    dom.id = chan.id;
+    link.href = '#' +chan.id;
+    if (chan.id[0] === 'D')
+        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeDirect;
+    else if (chan.id[0] === 'G')
+        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeGroup;
+    else if (chan.id[0] === 'C')
+        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeChannel;
+    if (SELECTED_ROOM === chan)
+        dom.classList.add(R.klass.selected);
+    link.textContent = chan.name;
+    dom.appendChild(createTypingDisplay());
+    dom.appendChild(link);
+    if (UNREAD_CHANS[chan.id]) {
+        if (UNREAD_CHANS[chan.id].hl)
+            dom.classList.add(R.klass.unreadHi);
+        if (UNREAD_CHANS[chan.id].unread)
+            dom.classList.add(R.klass.unread);
+    }
+    return dom;
+}
+
+/**
+ * @param {SlackIms} ims
+ * @return {Element}
+**/
+function createImsListItem(ims) {
+    var dom = document.createElement("li")
+        ,link = document.createElement("a");
+
+    dom.id = ims.id;
+    link.href = '#' +ims.id;
+    dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeDirect;
+    link.textContent = ims.user.name;
+    dom.appendChild(createTypingDisplay());
+    dom.appendChild(link);
+
+    if (!ims.user.presence)
+        dom.classList.add(R.klass.presenceAway);
+    if (SELECTED_ROOM === ims)
+        dom.classList.add(R.klass.selected);
+
+    if (UNREAD_CHANS[ims.id]) {
+        if (UNREAD_CHANS[ims.id].hl)
+            dom.classList.add(R.klass.unreadHi);
+        if (UNREAD_CHANS[ims.id].unread)
+            dom.classList.add(R.klass.unread);
+    }
+    return dom;
+}
+
+/**
+ * @param {string} chanId
+ * @param {string} msgId
+ * @param {string} reaction
+ * @param {Array.<string>} users
+ * @return {Element|null}
+**/
+function createReactionDom(chanId, msgId, reaction, users) {
+    var emojiDom = makeEmojiDom(reaction);
+    if (emojiDom) {
+        var dom = document.createElement("li")
+            ,a = document.createElement("a")
+            ,emojiContainer = document.createElement("span")
+            ,userList = document.createElement("span")
+            ,userNames = [];
+
+        for (var i =0, nbUser = users.length; i < nbUser; i++) {
+            var user = SLACK.context.getMember(users[i]);
+            if (user)
+                userNames.push(user.name);
+        }
+        userNames.sort();
+        userList.textContent = userNames.join(", ");
+        emojiContainer.appendChild(emojiDom);
+        emojiContainer.className = R.klass.emoji.small;
+        a.href = "javascript:toggleReaction('" +chanId +"', '" +msgId +"', '" +reaction +"')";
+        a.appendChild(emojiContainer);
+        a.appendChild(userList);
+        dom.className = R.klass.msg.reactions.item;
+        dom.appendChild(a);
+        return dom;
+    }
+    return null;
+}
+
+/**
+ * @param {string} channelId
+ * @param {SlackMessage} msg
+ * @param {boolean=} skipAttachment
+ * @return {Element}
+**/
+function doCreateMessageDom(channelId, msg, skipAttachment) {
+    var dom = document.createElement("div")
+        ,msgBlock = document.createElement("div")
+        ,ts = document.createElement("div")
+        ,text = document.createElement("div")
+        ,authorImg = document.createElement("img")
+        ,authorName = document.createElement("span")
+        ,hover = document.createElement("ul")
+        ,hoverReply = document.createElement("li")
+        ,attachments = document.createElement("ul")
+        ,reactions = document.createElement("ul")
+        ,sender = SLACK.context.getMember(msg.userId);
+
+    dom.id = channelId +"_" +msg.ts;
+    dom.className = R.klass.msg.item;
+    ts.className = R.klass.msg.ts;
+    text.className = R.klass.msg.msg;
+    authorImg.className = R.klass.msg.authorAvatar;
+    authorName.className = R.klass.msg.authorname;
+    hover.className = R.klass.msg.hover.container;
+    hoverReply.className = R.klass.msg.hover.reply;
+    ts.innerHTML = locale.formatDate(msg.ts);
+    text.innerHTML = formatSlackText(msg.text);
+    authorName.textContent = sender ? sender.name : (msg.username || "?");
+    authorImg.src = sender ? sender.icons.image_48 : "";
+    hover.appendChild(hoverReply);
+    if ('makeEmoji' in window) {
+        var hoverReaction = document.createElement("li")
+            ,domReply = window['makeEmoji']("arrow_heading_down")
+            ,domReaction = window['makeEmoji']("smile")
+            ,domEdit = window['makeEmoji']("pencil2")
+            ,domRemove = window['makeEmoji']("x");
+
+        hoverReaction.className = R.klass.msg.hover.reaction;
+
+        if (domReaction) {
+            hoverReaction.classList.add(R.klass.emoji.small);
+            hoverReaction.appendChild(domReaction);
+        } else {
+            hoverReaction.style.backgroundImage = 'url("smile.svg")';
+        }
+
+        if (domReply) {
+            hoverReply.classList.add(R.klass.emoji.small);
+            hoverReply.appendChild(domReply);
+        } else {
+            hoverReply.style.backgroundImage = 'url("repl.svg")';
+        }
+        hover.appendChild(hoverReaction);
+
+        if (msg.userId === SLACK.context.self.id) {
+            var hoverEdit = document.createElement("li");
+            hoverEdit.className = R.klass.msg.hover.edit;
+            if (domEdit)
+                hoverEdit.classList.add(R.klass.emoji.small);
+            else
+                hoverEdit.style.backgroundImage = 'url("edit.svg")';
+            hoverEdit.appendChild(domEdit);
+            hover.appendChild(hoverEdit);
+
+            var hoverRemove = document.createElement("li");
+            hoverRemove.className = R.klass.msg.hover.remove;
+            if (domRemove)
+                hoverRemove.classList.add(R.klass.emoji.small);
+            else
+                hoverRemove.style.backgroundImage = 'url("remove.svg")';
+            hoverRemove.appendChild(domRemove);
+            hover.appendChild(hoverRemove);
+        }
+
+    } else {
+        hoverReply.style.backgroundImage = 'url("repl.svg")';
+        if (msg.userId === SLACK.context.self.id) {
+            var hoverEdit = document.createElement("li");
+            hoverEdit.className = R.klass.msg.hover.edit;
+            hoverEdit.style.backgroundImage = 'url("edit.svg")';
+            hover.appendChild(hoverEdit);
+
+            var hoverRemove = document.createElement("li")
+            hoverRemove.className = R.klass.msg.hover.remove;
+            hoverRemove.style.backgroundImage = 'url("remove.svg")';
+            hover.appendChild(hoverRemove);
+        }
+    }
+    dom.appendChild(authorImg);
+    msgBlock.appendChild(authorName);
+    msgBlock.appendChild(text);
+    msgBlock.appendChild(ts);
+    msgBlock.appendChild(attachments);
+    if (msg.edited) {
+        var edited = document.createElement("div");
+        edited.textContent = locale.edited;
+        edited.className = R.klass.msg.edited;
+        msgBlock.appendChild(edited);
+    }
+    msgBlock.appendChild(reactions);
+    msgBlock.className = R.klass.msg.content;
+    attachments.className = R.klass.msg.attachment.list;
+    reactions.className = R.klass.msg.reactions.container;
+    if (skipAttachment !== true) {
+        if (msg.reactions) for (var reaction in msg.reactions) {
+            var reac = createReactionDom(channelId, msg.id, reaction, msg.reactions[reaction]);
+            reac && reactions.appendChild(reac);
+        }
+        msg.attachments.forEach(function(attachment) {
+            var domAttachment = createAttachmentDom(channelId, msg, attachment);
+            if (domAttachment)
+                attachments.appendChild(domAttachment);
+        });
+    }
+    dom.appendChild(msgBlock);
+    dom.appendChild(hover);
+    return dom;
+}
+
+/**
+ * @param {string} channelId
+ * @param {SlackMessage} msg
+ * @param {*} attachment
+ * @return {Element|null}
+**/
+function createAttachmentDom(channelId, msg, attachment) {
+    var rootDom = document.createElement("li")
+        ,attachmentBlock = document.createElement("div")
+
+        ,pretext = document.createElement("div")
+
+        ,titleBlock = document.createElement("a")
+
+        ,authorBlock = document.createElement("div")
+        ,authorImg = document.createElement("img")
+        ,authorName = document.createElement("a")
+
+        ,textBlock = document.createElement("div")
+        ,textDom = document.createElement("div")
+        ,thumbImgDom = document.createElement("img")
+        ,imgDom = document.createElement("img")
+
+        ,footerBlock = document.createElement("div")
+        ,footerIcon = document.createElement("img")
+        ,footerText = document.createElement("span")
+        ,footerTs = document.createElement("span")
+    ;
+
+    rootDom.className = R.klass.msg.attachment.container;
+    //Color
+    var color = "#e3e4e6";
+    if (attachment["color"]) {
+        if (attachment["color"][0] === '#')
+            color = attachment["color"][0];
+        else if (attachment["color"] === "good")
+            color = "#2fa44f";
+        else if (attachment["color"] === "warning")
+            color = "#de9e31";
+        else if (attachment["color"] === "danger")
+            color = "#d50200";
+    }
+    attachmentBlock.style.borderColor = color;
+
+    //Pretext
+    pretext.className = R.klass.msg.attachment.pretext;
+    if (attachment["pretext"]) {
+        pretext.innerHTML = formatSlackText(attachment["pretext"]);
+    } else {
+        pretext.classList.add(R.klass.hidden);
+    }
+
+    //Title
+    titleBlock.target = "_blank";
+    if (attachment["title"]) {
+        titleBlock.innerHTML = formatSlackText(attachment["title"]);
+        if (attachment["title_link"]) {
+            titleBlock.href = attachment["title_link"];
+        }
+        titleBlock.className = R.klass.msg.attachment.title;
+
+    } else {
+        titleBlock.className = R.klass.hidden + " " +R.klass.msg.attachment.title;
+    }
+
+    //Author
+    authorName.target = "_blank";
+    authorBlock.className = R.klass.msg.author;
+    if (attachment["author_name"]) {
+        authorName.innerHTML = formatSlackText(attachment["author_name"]);
+        authorName.href = attachment["author_link"] || "";
+        authorName.className = R.klass.msg.authorname;
+        authorImg.className = R.klass.msg.authorAvatar;
+        if (attachment["author_icon"])
+            authorImg.src = attachment["author_icon"];
+        else
+            authorImg.classList.add(R.klass.hidden);
+    } else {
+        authorBlock.classList.add(R.klass.hidden);
+    }
+
+    //Text
+    textDom.innerHTML = formatSlackText(attachment["text"] || "");
+    textDom.klassName = R.klass.msg.attachment.text;
+
+    // Img (small one)
+    thumbImgDom.className = R.klass.msg.attachment.thumbImg;
+    if (attachment["thumb_url"])
+        thumbImgDom.src = attachment["thumb_url"];
+    else
+        thumbImgDom.classList.add(R.klass.hidden);
+
+    //Img (the big one)
+    imgDom.className = R.klass.msg.attachment.img;
+    if (attachment["image_url"])
+        imgDom.src = attachment["image_url"];
+    else
+        imgDom.classList.add(R.klass.hidden);
+
+    //Footer
+    footerBlock.className = R.klass.msg.attachment.footer;
+    footerText.className = R.klass.msg.attachment.footerText;
+    footerIcon.className = R.klass.msg.attachment.footerIcon;
+    if (attachment["footer"]) {
+        footerText.innerHTML = formatSlackText(attachment["footer"]);
+        if (attachment["footer_icon"])
+            footerIcon.src = attachment["footer_icon"];
+        else
+            footerIcon.classList.add(R.klass.hidden);
+    } else {
+        footerIcon.classList.add(R.klass.hidden);
+        footerText.classList.add(R.klass.hidden);
+    }
+
+    //Ts
+    footerTs.className = R.klass.msg.ts;
+    if (attachment["ts"])
+        footerTs.innerHTML = locale.formatDate(attachment["ts"]);
+    else
+        footerTs.classList.add(R.klass.hidden);
+
+    // TODO Field [ {title, value, short } ]
+    // TODO actions (button stuff)
+
+    authorBlock.appendChild(authorImg);
+    authorBlock.appendChild(authorName);
+    textBlock.appendChild(textDom);
+    textBlock.appendChild(thumbImgDom);
+    footerBlock.appendChild(footerIcon);
+    footerBlock.appendChild(footerText);
+    footerBlock.appendChild(footerTs);
+    attachmentBlock.appendChild(titleBlock);
+    attachmentBlock.appendChild(authorBlock);
+    attachmentBlock.appendChild(textBlock);
+    attachmentBlock.appendChild(imgDom);
+    attachmentBlock.appendChild(footerBlock);
+    rootDom.appendChild(pretext);
+    rootDom.appendChild(attachmentBlock);
+    return rootDom;
+}
+
+/**
+ * @param {SlackCommand} cmd
+ * @return {Element}
+**/
+function createSlashAutocompleteDom(cmd) {
+    var li = document.createElement("li")
+        ,name = document.createElement("span")
+        ,usage = document.createElement("span")
+        ,desc = document.createElement("span");
+
+    name.textContent = cmd.name;
+    usage.textContent = cmd.usage;
+    desc.textContent = cmd.desc;
+
+    li.appendChild(name);
+    li.appendChild(usage);
+    li.appendChild(desc);
+
+    li.className = R.klass.commands.item;
+    name.className = R.klass.commands.name;
+    usage.className = R.klass.commands.usage;
+    desc.className = R.klass.commands.desc;
+    return li;
+}
+

+ 7 - 415
cli/ui.js

@@ -1,16 +1,10 @@
 var
-    /** @type {SlackMessage|null} */
-    REPLYING_TO = null
-
-    /** @type {SlackMessage|null} */
-    ,EDITING = null
-
     /**
      * Minimum time between 2 notifications (ms)
      * @const
      * @type {number}
     **/
-    ,NOTIFICATION_COOLDOWN = 30 * 1000 //30 sec
+    NOTIFICATION_COOLDOWN = 30 * 1000 //30 sec
 
     /**
      * Maximum time the notification will stay visible (ms)
@@ -24,87 +18,6 @@ var
 
 ;
 
-/**
- * @return {Element!}
-**/
-function createTypingDisplay() {
-    var dom = document.createElement("span")
-        ,dot1 = document.createElement("span")
-        ,dot2 = document.createElement("span")
-        ,dot3 = document.createElement("span");
-
-    dom.className = R.klass.typing.container;
-    dot1.className = R.klass.typing.dot1;
-    dot2.className = R.klass.typing.dot2;
-    dot3.className = R.klass.typing.dot3;
-
-    dot1.textContent = dot2.textContent = dot3.textContent = '.';
-
-    dom.appendChild(dot1);
-    dom.appendChild(dot2);
-    dom.appendChild(dot3);
-    return dom;
-}
-
-/**
- * @param {SlackChan|SlackGroup} chan
- * @return {Element}
-**/
-function createChanListItem(chan) {
-    var dom = document.createElement("li")
-        ,link = document.createElement("a");
-
-    dom.id = chan.id;
-    link.href = '#' +chan.id;
-    if (chan.id[0] === 'D')
-        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeDirect;
-    else if (chan.id[0] === 'G')
-        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeGroup;
-    else if (chan.id[0] === 'C')
-        dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeChannel;
-    if (SELECTED_ROOM === chan)
-        dom.classList.add(R.klass.selected);
-    link.textContent = chan.name;
-    dom.appendChild(createTypingDisplay());
-    dom.appendChild(link);
-    if (UNREAD_CHANS[chan.id]) {
-        if (UNREAD_CHANS[chan.id].hl)
-            dom.classList.add(R.klass.unreadHi);
-        if (UNREAD_CHANS[chan.id].unread)
-            dom.classList.add(R.klass.unread);
-    }
-    return dom;
-}
-
-/**
- * @param {SlackIms} ims
- * @return {Element}
-**/
-function createImsListItem(ims) {
-    var dom = document.createElement("li")
-        ,link = document.createElement("a");
-
-    dom.id = ims.id;
-    link.href = '#' +ims.id;
-    dom.className = R.klass.chatList.entry + " " +R.klass.chatList.typeDirect;
-    link.textContent = ims.user.name;
-    dom.appendChild(createTypingDisplay());
-    dom.appendChild(link);
-
-    if (!ims.user.presence)
-        dom.classList.add(R.klass.presenceAway);
-    if (SELECTED_ROOM === ims)
-        dom.classList.add(R.klass.selected);
-
-    if (UNREAD_CHANS[ims.id]) {
-        if (UNREAD_CHANS[ims.id].hl)
-            dom.classList.add(R.klass.unreadHi);
-        if (UNREAD_CHANS[ims.id].unread)
-            dom.classList.add(R.klass.unread);
-    }
-    return dom;
-}
-
 function onContextUpdated() {
     var chanListFram = document.createDocumentFragment()
         ,sortedChans = SLACK.context.self ? Object.keys(SLACK.context.self.channels) : [];
@@ -267,41 +180,6 @@ function onEditingUpdated() {
     }
 }
 
-/**
- * @param {string} chanId
- * @param {string} msgId
- * @param {string} reaction
- * @param {Array.<string>} users
- * @return {Element|null}
-**/
-function createReactionDom(chanId, msgId, reaction, users) {
-    var emojiDom = makeEmojiDom(reaction);
-    if (emojiDom) {
-        var dom = document.createElement("li")
-            ,a = document.createElement("a")
-            ,emojiContainer = document.createElement("span")
-            ,userList = document.createElement("span")
-            ,userNames = [];
-
-        for (var i =0, nbUser = users.length; i < nbUser; i++) {
-            var user = SLACK.context.getMember(users[i]);
-            if (user)
-                userNames.push(user.name);
-        }
-        userNames.sort();
-        userList.textContent = userNames.join(", ");
-        emojiContainer.appendChild(emojiDom);
-        emojiContainer.className = R.klass.emoji.small;
-        a.href = "javascript:toggleReaction('" +chanId +"', '" +msgId +"', '" +reaction +"')";
-        a.appendChild(emojiContainer);
-        a.appendChild(userList);
-        dom.className = R.klass.msg.reactions.item;
-        dom.appendChild(a);
-        return dom;
-    }
-    return null;
-}
-
 /**
  * @param {string} chanId
  * @param {string} msgId
@@ -321,127 +199,6 @@ window['toggleReaction'] = function(chanId, msgId, reaction) {
     }
 };
 
-/**
- * @param {string} channelId
- * @param {SlackMessage} msg
- * @param {boolean=} skipAttachment
- * @return {Element}
-**/
-function doCreateMessageDom(channelId, msg, skipAttachment) {
-    var dom = document.createElement("div")
-        ,msgBlock = document.createElement("div")
-        ,ts = document.createElement("div")
-        ,text = document.createElement("div")
-        ,authorImg = document.createElement("img")
-        ,authorName = document.createElement("span")
-        ,hover = document.createElement("ul")
-        ,hoverReply = document.createElement("li")
-        ,attachments = document.createElement("ul")
-        ,reactions = document.createElement("ul")
-        ,sender = SLACK.context.getMember(msg.userId);
-
-    dom.id = channelId +"_" +msg.ts;
-    dom.className = R.klass.msg.item;
-    ts.className = R.klass.msg.ts;
-    text.className = R.klass.msg.msg;
-    authorImg.className = R.klass.msg.authorAvatar;
-    authorName.className = R.klass.msg.authorname;
-    hover.className = R.klass.msg.hover.container;
-    hoverReply.className = R.klass.msg.hover.reply;
-    ts.innerHTML = locale.formatDate(msg.ts);
-    text.innerHTML = formatSlackText(msg.text);
-    authorName.textContent = sender ? sender.name : (msg.username || "?");
-    authorImg.src = sender ? sender.icons.image_48 : "";
-    hover.appendChild(hoverReply);
-    if ('makeEmoji' in window) {
-        var hoverReaction = document.createElement("li")
-            ,domReply = window['makeEmoji']("arrow_heading_down")
-            ,domReaction = window['makeEmoji']("smile")
-            ,domEdit = window['makeEmoji']("pencil2")
-            ,domRemove = window['makeEmoji']("x");
-
-        hoverReaction.className = R.klass.msg.hover.reaction;
-
-        if (domReaction) {
-            hoverReaction.classList.add(R.klass.emoji.small);
-            hoverReaction.appendChild(domReaction);
-        } else {
-            hoverReaction.style.backgroundImage = 'url("smile.svg")';
-        }
-
-        if (domReply) {
-            hoverReply.classList.add(R.klass.emoji.small);
-            hoverReply.appendChild(domReply);
-        } else {
-            hoverReply.style.backgroundImage = 'url("repl.svg")';
-        }
-        hover.appendChild(hoverReaction);
-
-        if (msg.userId === SLACK.context.self.id) {
-            var hoverEdit = document.createElement("li");
-            hoverEdit.className = R.klass.msg.hover.edit;
-            if (domEdit)
-                hoverEdit.classList.add(R.klass.emoji.small);
-            else
-                hoverEdit.style.backgroundImage = 'url("edit.svg")';
-            hoverEdit.appendChild(domEdit);
-            hover.appendChild(hoverEdit);
-
-            var hoverRemove = document.createElement("li");
-            hoverRemove.className = R.klass.msg.hover.remove;
-            if (domRemove)
-                hoverRemove.classList.add(R.klass.emoji.small);
-            else
-                hoverRemove.style.backgroundImage = 'url("remove.svg")';
-            hoverRemove.appendChild(domRemove);
-            hover.appendChild(hoverRemove);
-        }
-
-    } else {
-        hoverReply.style.backgroundImage = 'url("repl.svg")';
-        if (msg.userId === SLACK.context.self.id) {
-            var hoverEdit = document.createElement("li");
-            hoverEdit.className = R.klass.msg.hover.edit;
-            hoverEdit.style.backgroundImage = 'url("edit.svg")';
-            hover.appendChild(hoverEdit);
-
-            var hoverRemove = document.createElement("li")
-            hoverRemove.className = R.klass.msg.hover.remove;
-            hoverRemove.style.backgroundImage = 'url("remove.svg")';
-            hover.appendChild(hoverRemove);
-        }
-    }
-    dom.appendChild(authorImg);
-    msgBlock.appendChild(authorName);
-    msgBlock.appendChild(text);
-    msgBlock.appendChild(ts);
-    msgBlock.appendChild(attachments);
-    if (msg.edited) {
-        var edited = document.createElement("div");
-        edited.textContent = locale.edited;
-        edited.className = R.klass.msg.edited;
-        msgBlock.appendChild(edited);
-    }
-    msgBlock.appendChild(reactions);
-    msgBlock.className = R.klass.msg.content;
-    attachments.className = R.klass.msg.attachment.list;
-    reactions.className = R.klass.msg.reactions.container;
-    if (skipAttachment !== true) {
-        if (msg.reactions) for (var reaction in msg.reactions) {
-            var reac = createReactionDom(channelId, msg.id, reaction, msg.reactions[reaction]);
-            reac && reactions.appendChild(reac);
-        }
-        msg.attachments.forEach(function(attachment) {
-            var domAttachment = createAttachmentDom(channelId, msg, attachment);
-            if (domAttachment)
-                attachments.appendChild(domAttachment);
-        });
-    }
-    dom.appendChild(msgBlock);
-    dom.appendChild(hover);
-    return dom;
-}
-
 /**
  * Try to resolve emoji from customized context
  * @param {string} emoji
@@ -636,147 +393,6 @@ function formatSlackText(fullText) {
     return msgContents.join('<br/>');
 }
 
-/**
- * @param {string} channelId
- * @param {SlackMessage} msg
- * @param {*} attachment
- * @return {Element|null}
-**/
-function createAttachmentDom(channelId, msg, attachment) {
-    var rootDom = document.createElement("li")
-        ,attachmentBlock = document.createElement("div")
-
-        ,pretext = document.createElement("div")
-
-        ,titleBlock = document.createElement("a")
-
-        ,authorBlock = document.createElement("div")
-        ,authorImg = document.createElement("img")
-        ,authorName = document.createElement("a")
-
-        ,textBlock = document.createElement("div")
-        ,textDom = document.createElement("div")
-        ,thumbImgDom = document.createElement("img")
-        ,imgDom = document.createElement("img")
-
-        ,footerBlock = document.createElement("div")
-        ,footerIcon = document.createElement("img")
-        ,footerText = document.createElement("span")
-        ,footerTs = document.createElement("span")
-    ;
-
-    rootDom.className = R.klass.msg.attachment.container;
-    //Color
-    var color = "#e3e4e6";
-    if (attachment["color"]) {
-        if (attachment["color"][0] === '#')
-            color = attachment["color"][0];
-        else if (attachment["color"] === "good")
-            color = "#2fa44f";
-        else if (attachment["color"] === "warning")
-            color = "#de9e31";
-        else if (attachment["color"] === "danger")
-            color = "#d50200";
-    }
-    attachmentBlock.style.borderColor = color;
-
-    //Pretext
-    pretext.className = R.klass.msg.attachment.pretext;
-    if (attachment["pretext"]) {
-        pretext.innerHTML = formatSlackText(attachment["pretext"]);
-    } else {
-        pretext.classList.add(R.klass.hidden);
-    }
-
-    //Title
-    titleBlock.target = "_blank";
-    if (attachment["title"]) {
-        titleBlock.innerHTML = formatSlackText(attachment["title"]);
-        if (attachment["title_link"]) {
-            titleBlock.href = attachment["title_link"];
-        }
-        titleBlock.className = R.klass.msg.attachment.title;
-
-    } else {
-        titleBlock.className = R.klass.hidden + " " +R.klass.msg.attachment.title;
-    }
-
-    //Author
-    authorName.target = "_blank";
-    authorBlock.className = R.klass.msg.author;
-    if (attachment["author_name"]) {
-        authorName.innerHTML = formatSlackText(attachment["author_name"]);
-        authorName.href = attachment["author_link"] || "";
-        authorName.className = R.klass.msg.authorname;
-        authorImg.className = R.klass.msg.authorAvatar;
-        if (attachment["author_icon"])
-            authorImg.src = attachment["author_icon"];
-        else
-            authorImg.classList.add(R.klass.hidden);
-    } else {
-        authorBlock.classList.add(R.klass.hidden);
-    }
-
-    //Text
-    textDom.innerHTML = formatSlackText(attachment["text"] || "");
-    textDom.klassName = R.klass.msg.attachment.text;
-
-    // Img (small one)
-    thumbImgDom.className = R.klass.msg.attachment.thumbImg;
-    if (attachment["thumb_url"])
-        thumbImgDom.src = attachment["thumb_url"];
-    else
-        thumbImgDom.classList.add(R.klass.hidden);
-
-    //Img (the big one)
-    imgDom.className = R.klass.msg.attachment.img;
-    if (attachment["image_url"])
-        imgDom.src = attachment["image_url"];
-    else
-        imgDom.classList.add(R.klass.hidden);
-
-    //Footer
-    footerBlock.className = R.klass.msg.attachment.footer;
-    footerText.className = R.klass.msg.attachment.footerText;
-    footerIcon.className = R.klass.msg.attachment.footerIcon;
-    if (attachment["footer"]) {
-        footerText.innerHTML = formatSlackText(attachment["footer"]);
-        if (attachment["footer_icon"])
-            footerIcon.src = attachment["footer_icon"];
-        else
-            footerIcon.classList.add(R.klass.hidden);
-    } else {
-        footerIcon.classList.add(R.klass.hidden);
-        footerText.classList.add(R.klass.hidden);
-    }
-
-    //Ts
-    footerTs.className = R.klass.msg.ts;
-    if (attachment["ts"])
-        footerTs.innerHTML = locale.formatDate(attachment["ts"]);
-    else
-        footerTs.classList.add(R.klass.hidden);
-
-    // TODO Field [ {title, value, short } ]
-    // TODO actions (button stuff)
-
-    authorBlock.appendChild(authorImg);
-    authorBlock.appendChild(authorName);
-    textBlock.appendChild(textDom);
-    textBlock.appendChild(thumbImgDom);
-    footerBlock.appendChild(footerIcon);
-    footerBlock.appendChild(footerText);
-    footerBlock.appendChild(footerTs);
-    attachmentBlock.appendChild(titleBlock);
-    attachmentBlock.appendChild(authorBlock);
-    attachmentBlock.appendChild(textBlock);
-    attachmentBlock.appendChild(imgDom);
-    attachmentBlock.appendChild(footerBlock);
-    rootDom.appendChild(pretext);
-    rootDom.appendChild(attachmentBlock);
-    return rootDom;
-}
-
 /**
  * @param {string} channelId
  * @param {SlackMessage} msg
@@ -971,31 +587,6 @@ function setRoomFromHashBang() {
         selectRoom(user.ims);
 }
 
-/**
- * @param {SlackCommand} cmd
- * @return {Element}
-**/
-function createSlashAutocompleteDom(cmd) {
-    var li = document.createElement("li")
-        ,name = document.createElement("span")
-        ,usage = document.createElement("span")
-        ,desc = document.createElement("span");
-
-    name.textContent = cmd.name;
-    usage.textContent = cmd.usage;
-    desc.textContent = cmd.desc;
-
-    li.appendChild(name);
-    li.appendChild(usage);
-    li.appendChild(desc);
-
-    li.className = R.klass.commands.item;
-    name.className = R.klass.commands.name;
-    usage.className = R.klass.commands.usage;
-    desc.className = R.klass.commands.desc;
-    return li;
-}
-
 document.addEventListener('DOMContentLoaded', function() {
     initLang();
     document.getElementById(R.id.currentRoom.content).addEventListener("click", chatClickDelegate);
@@ -1081,16 +672,17 @@ document.addEventListener('DOMContentLoaded', function() {
             var commands = []
                 ,input = this.value;
             if (this.value[0] === '/') {
-                var endCmd = input.indexOf(' ');
-                endCmd = endCmd === -1 ? input.length: endCmd;
-                var inputCmd = input.substr(0, endCmd);
+                var endCmd = input.indexOf(' ')
+                    ,inputCmd = input.substr(0, endCmd === -1 ? input.length: endCmd);
+
                 for (var i in SLACK.context.commands.data) {
                     var currentCmd = SLACK.context.commands.data[i]
-                    if (currentCmd.name.substr(0, endCmd) === inputCmd)
+                    if ((endCmd !== -1 && currentCmd.name === inputCmd) ||
+                        (endCmd === -1 && currentCmd.name.substr(0, endCmd) === inputCmd))
                         commands.push(currentCmd);
                 }
             }
-            if (commands.length > 5) commands = []; // Do not display to mush at once
+            if (commands.length > 5) commands = []; // TODO Do not display to mush at once
             commands.sort(function(a, b) { return a.name.localeCompare(b.name); });
             var slashDom = document.getElementById(R.id.message.slashComplete)
                 ,slashFrag = document.createDocumentFragment();

+ 6 - 0
cli/workflow.js

@@ -9,6 +9,12 @@ var
      * @type {SlackChan|SlackIms|SlackGroup}
     **/
     ,SELECTED_ROOM = null
+
+    /** @type {SlackMessage|null} */
+    ,REPLYING_TO = null
+
+    /** @type {SlackMessage|null} */
+    ,EDITING = null
 ;
 
 /**

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

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