Browse Source

[add][Refs #1] Display built-in emojis in messages

B Thibault 8 years ago
parent
commit
f7f4493f9f

+ 3 - 0
cli/resources.js

@@ -29,6 +29,9 @@ var R = {
         ,unread: "unread"
         ,unread: "unread"
         ,unreadHi: "unreadHi"
         ,unreadHi: "unreadHi"
         ,replyingTo: "replyingTo"
         ,replyingTo: "replyingTo"
+        ,emoji: {
+            small: "emoji-small"
+        }
         ,chatList: {
         ,chatList: {
             entry: "slack-context-room"
             entry: "slack-context-room"
             ,typeChannel: "slack-channel"
             ,typeChannel: "slack-channel"

+ 22 - 1
cli/ui.js

@@ -201,6 +201,27 @@ function formatDate(ts) {
     return (new Date(ts * 1000)).toLocaleTimeString();
     return (new Date(ts * 1000)).toLocaleTimeString();
 }
 }
 
 
+/**
+ * replace all :emoji: codes with corresponding image
+ * @param {string} inputString
+ * @return {string}
+**/
+function formatEmojis(inputString) {
+    if (!("makeEmoji" in window))
+        return inputString;
+    return inputString.replace(/:(\w+):/g, function(returnFailed, emoji) {
+        var emojiDom = window['makeEmoji'](emoji);
+        console.log(emoji, emojiDom ? "found" : "not found");
+        if (emojiDom) {
+            var domParent = document.createElement("span");
+            domParent.className = R.klass.emoji.small;
+            domParent.appendChild(emojiDom);
+            return domParent.outerHTML;
+        }
+        return returnFailed;
+    });
+}
+
 /**
 /**
  * @param {string} fullText
  * @param {string} fullText
  * @return {string}
  * @return {string}
@@ -209,7 +230,7 @@ function formatSlackText(fullText) {
     var msgContents = fullText.split(/\r?\n/g);
     var msgContents = fullText.split(/\r?\n/g);
 
 
     for (var msgContentIndex=0, nbMsgContents = msgContents.length; msgContentIndex < nbMsgContents; msgContentIndex++) {
     for (var msgContentIndex=0, nbMsgContents = msgContents.length; msgContentIndex < nbMsgContents; msgContentIndex++) {
-        var msgContent = msgContents[msgContentIndex]
+        var msgContent = formatEmojis(msgContents[msgContentIndex])
             ,_msgContent = ""
             ,_msgContent = ""
             ,currentMods = {}
             ,currentMods = {}
             ,quote = false
             ,quote = false

File diff suppressed because it is too large
+ 0 - 0
srv/public/emojione.sprites.css


File diff suppressed because it is too large
+ 4 - 0
srv/public/emojione.sprites.js


BIN
srv/public/emojione.sprites.png


+ 2 - 0
srv/public/index.html

@@ -1,6 +1,7 @@
 <html>
 <html>
     <head>
     <head>
         <link href="style.css" rel="stylesheet"/>
         <link href="style.css" rel="stylesheet"/>
+        <link href="emojione.sprites.css" rel="stylesheet"/>
     </head>
     </head>
     <body>
     <body>
         <aside class="slack-context">
         <aside class="slack-context">
@@ -32,6 +33,7 @@
             <a id="fileUploadCancel" class="button"/>cancel</a>
             <a id="fileUploadCancel" class="button"/>cancel</a>
         </form></div>
         </form></div>
         <div class="error" id="neterror">Cannot connect to chat !</div>
         <div class="error" id="neterror">Cannot connect to chat !</div>
+        <script src="emojione.sprites.js"></script>
         <script src="slack.min.js"></script>
         <script src="slack.min.js"></script>
     </body>
     </body>
 </html>
 </html>

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

@@ -11,22 +11,22 @@ c=document.createElement("div"),d=document.createElement("div"),e=document.creat
 ("#"===a.color[0]?A=a.color[0]:"good"===a.color?A="#2fa44f":"warning"===a.color?A="#de9e31":"danger"===a.color&&(A="#d50200"));c.style.borderColor=A;d.className="slackmsg-attachment-pretext";a.pretext?d.innerHTML=Q(a.pretext):d.classList.add("hidden");e.target="_blank";a.title?(e.innerHTML=Q(a.title),a.title_link&&(e.href=a.title_link),e.className="slackmsg-attachment-title"):e.className="hidden slackmsg-attachment-title";k.target="_blank";f.className="slackmsg-author";a.author_name?(k.innerHTML=
 ("#"===a.color[0]?A=a.color[0]:"good"===a.color?A="#2fa44f":"warning"===a.color?A="#de9e31":"danger"===a.color&&(A="#d50200"));c.style.borderColor=A;d.className="slackmsg-attachment-pretext";a.pretext?d.innerHTML=Q(a.pretext):d.classList.add("hidden");e.target="_blank";a.title?(e.innerHTML=Q(a.title),a.title_link&&(e.href=a.title_link),e.className="slackmsg-attachment-title"):e.className="hidden slackmsg-attachment-title";k.target="_blank";f.className="slackmsg-author";a.author_name?(k.innerHTML=
 Q(a.author_name),k.href=a.author_link||"",k.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");n.innerHTML=Q(a.text||"");n.a="slackmsg-attachment-text";p.className="slackmsg-attachment-thumb";a.thumb_url?p.src=a.thumb_url:p.classList.add("hidden");q.className="slackmsg-attachment-img";a.image_url?q.src=a.image_url:q.classList.add("hidden");r.className="slackmsg-attachment-footer";D.className="slackmsg-attachment-footer-text";
 Q(a.author_name),k.href=a.author_link||"",k.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");n.innerHTML=Q(a.text||"");n.a="slackmsg-attachment-text";p.className="slackmsg-attachment-thumb";a.thumb_url?p.src=a.thumb_url:p.classList.add("hidden");q.className="slackmsg-attachment-img";a.image_url?q.src=a.image_url:q.classList.add("hidden");r.className="slackmsg-attachment-footer";D.className="slackmsg-attachment-footer-text";
 z.className="slackmsg-attachment-footer-icon";a.footer?(D.innerHTML=Q(a.footer),a.footer_icon?z.src=a.footer_icon:z.classList.add("hidden")):(z.classList.add("hidden"),D.classList.add("hidden"));E.className="slackmsg-ts";a.ts?E.innerHTML=P(a.ts):E.classList.add("hidden");f.appendChild(g);f.appendChild(k);J.appendChild(n);J.appendChild(p);r.appendChild(z);r.appendChild(D);r.appendChild(E);c.appendChild(e);c.appendChild(f);c.appendChild(J);c.appendChild(q);c.appendChild(r);b.appendChild(d);b.appendChild(c);
 z.className="slackmsg-attachment-footer-icon";a.footer?(D.innerHTML=Q(a.footer),a.footer_icon?z.src=a.footer_icon:z.classList.add("hidden")):(z.classList.add("hidden"),D.classList.add("hidden"));E.className="slackmsg-ts";a.ts?E.innerHTML=P(a.ts):E.classList.add("hidden");f.appendChild(g);f.appendChild(k);J.appendChild(n);J.appendChild(p);r.appendChild(z);r.appendChild(D);r.appendChild(E);c.appendChild(e);c.appendChild(f);c.appendChild(J);c.appendChild(q);c.appendChild(r);b.appendChild(d);b.appendChild(c);
-b&&m.appendChild(b)});c.appendChild(p);return c}function P(a){"string"!==typeof a&&(a=parseFloat(a));return(new Date(1E3*a)).toLocaleTimeString()}
-function Q(a){a=a.split(/\r?\n/g);for(var b=0,d=a.length;b<d;b++){for(var c=a[b],f="",e={},k=!1,g=0,n=c.length,p=function(a,b,c){for(;a[b];){if(" "!=a[b]&&a[b]!=c&&a[b+1]==c)return!0;b++}return!1},r=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};g<n&&(" "===c[g]||"\t"===c[g]);)g++;"&gt;"===c.substr(g,4)&&(k=!0,g+=4);for(;g<n;g++){var m=c[g];if(!e["slackmsg-style-bold"]&&"*"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-bold"]=
+b&&m.appendChild(b)});c.appendChild(p);return c}function P(a){"string"!==typeof a&&(a=parseFloat(a));return(new Date(1E3*a)).toLocaleTimeString()}function ha(a){return"makeEmoji"in window?a.replace(/:(\w+):/g,function(a,d){var b=window.makeEmoji(d);console.log(d,b?"found":"not found");if(b){var f=document.createElement("span");f.className="emoji-small";f.appendChild(b);return f.outerHTML}return a}):a}
+function Q(a){a=a.split(/\r?\n/g);for(var b=0,d=a.length;b<d;b++){for(var c=ha(a[b]),f="",e={},k=!1,g=0,n=c.length,p=function(a,b,c){for(;a[b];){if(" "!=a[b]&&a[b]!=c&&a[b+1]==c)return!0;b++}return!1},r=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};g<n&&(" "===c[g]||"\t"===c[g]);)g++;"&gt;"===c.substr(g,4)&&(k=!0,g+=4);for(;g<n;g++){var m=c[g];if(!e["slackmsg-style-bold"]&&"*"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-bold"]=
 !0,f+=r(e);else if(!e["slackmsg-style-strike"]&&"~"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-strike"]=!0,f+=r(e);else if(!e["slackmsg-style-code"]&&"`"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-code"]=!0,f+=r(e);else if(!e["slackmsg-style-italic"]&&"_"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-italic"]=!0,f+=r(e);else{var q=!1,f=f+m;do{if(e["slackmsg-style-bold"]&&"*"!==m&&"*"===c[g+1])delete e["slackmsg-style-bold"],
 !0,f+=r(e);else if(!e["slackmsg-style-strike"]&&"~"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-strike"]=!0,f+=r(e);else if(!e["slackmsg-style-code"]&&"`"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-code"]=!0,f+=r(e);else if(!e["slackmsg-style-italic"]&&"_"===m&&c[g+1]&&p(c,g,m))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-italic"]=!0,f+=r(e);else{var q=!1,f=f+m;do{if(e["slackmsg-style-bold"]&&"*"!==m&&"*"===c[g+1])delete e["slackmsg-style-bold"],
 q=!0;else if(e["slackmsg-style-strike"]&&"~"!==m&&"~"===c[g+1])delete e["slackmsg-style-strike"],q=!0;else if(e["slackmsg-style-code"]&&"`"!==m&&"`"===c[g+1])delete e["slackmsg-style-code"],q=!0;else if(e["slackmsg-style-italic"]&&"_"!==m&&"_"===c[g+1])delete e["slackmsg-style-italic"],q=!0;else break;m=c[++g]}while(g<n);q&&(f+="</span>"+r(e))}}e&&(f+="</span>");f=f.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){c=c.split("|");if("@"===b)c[1]?"@"!==c[1][0]&&(c[1]="@"+c[1]):(a=t(H.a,c[0]),
 q=!0;else if(e["slackmsg-style-strike"]&&"~"!==m&&"~"===c[g+1])delete e["slackmsg-style-strike"],q=!0;else if(e["slackmsg-style-code"]&&"`"!==m&&"`"===c[g+1])delete e["slackmsg-style-code"],q=!0;else if(e["slackmsg-style-italic"]&&"_"!==m&&"_"===c[g+1])delete e["slackmsg-style-italic"],q=!0;else break;m=c[++g]}while(g<n);q&&(f+="</span>"+r(e))}}e&&(f+="</span>");f=f.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){c=c.split("|");if("@"===b)c[1]?"@"!==c[1][0]&&(c[1]="@"+c[1]):(a=t(H.a,c[0]),
 c[1]=a?"@"+a.name:C.w),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-user";else if("#"===b)c[1]?"#"!==c[1][0]&&(c[1]="#"+c[1]):(a=w(H.a,c[0]),c[1]=a?"#"+a.name:C.u),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>"});a[b]=k?'<span class="slackmsg-style-quote">'+f+"</span>":f}return a.join("<br/>")}
 c[1]=a?"@"+a.name:C.w),c[0]="#"+c[0],c[2]="slackmsg-link slackmsg-link-user";else if("#"===b)c[1]?"#"!==c[1][0]&&(c[1]="#"+c[1]):(a=w(H.a,c[0]),c[1]=a?"#"+a.name:C.u),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>"});a[b]=k?'<span class="slackmsg-style-quote">'+f+"</span>":f}return a.join("<br/>")}
 function M(a,b,d){"me_message"===b.c?(a=O(a,b,d),a.classList.add("slackmsg-me_message")):a=O(a,b,d);return a}function R(){var a=0,b=0,d="",c;for(c in S)S.hasOwnProperty(c)&&(a+=S[c].l,b+=S[c].i);b?d="(!"+b+") - ":a&&(d="("+a+") - ");d+=H.a.o.name;document.title=d}
 function M(a,b,d){"me_message"===b.c?(a=O(a,b,d),a.classList.add("slackmsg-me_message")):a=O(a,b,d);return a}function R(){var a=0,b=0,d="",c;for(c in S)S.hasOwnProperty(c)&&(a+=S[c].l,b+=S[c].i);b?d="(!"+b+") - ":a&&(d="("+a+") - ");d+=H.a.o.name;document.title=d}
-function ha(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(G+3E4<a){var b=new Notification(C.s);G=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
+function ia(){if("Notification"in window)if("granted"===Notification.permission){var a=Date.now();if(G+3E4<a){var b=new Notification(C.s);G=a;setTimeout(function(){b.close()},5E3)}}else"denied"!==Notification.permission&&Notification.requestPermission()}
 function T(){var a=document.createDocumentFragment(),b=N.id;document.getElementById("chatWindow").textContent="";H.b[b]&&H.b[b].a.forEach(function(c){"message"===c.type&&(c=M(b,c),a.appendChild(c))});var d=document.getElementById("chatWindow");d.appendChild(a);d.scrollTop=d.scrollHeight-d.clientHeight}
 function T(){var a=document.createDocumentFragment(),b=N.id;document.getElementById("chatWindow").textContent="";H.b[b]&&H.b[b].a.forEach(function(c){"message"===c.type&&(c=M(b,c),a.appendChild(c))});var d=document.getElementById("chatWindow");d.appendChild(a);d.scrollTop=d.scrollHeight-d.clientHeight}
-function ia(a){for(var b=a.target;b!==a.currentTarget&&b&&!b.classList.contains("slackmsg-hover");){if(b.classList.contains("slackmsg-hover-reply")){a:{for(b=b||a.target;b!==a.currentTarget&&b;){if(b.classList.contains("slackmsg-item")){a=b.id;break a}b=b.parentElement}a=void 0}if(a){a=parseFloat(a.split("_")[1]);for(var b=H.b[N.id].a,d=0,c=b.length;d<c&&b[d].b<=a;d++)if(b[d].b===a){F!==b[d]&&(F=b[d],L());break}}break}b=b.parentElement}}function U(){document.getElementById("msgInput").focus()}
+function ja(a){for(var b=a.target;b!==a.currentTarget&&b&&!b.classList.contains("slackmsg-hover");){if(b.classList.contains("slackmsg-hover-reply")){a:{for(b=b||a.target;b!==a.currentTarget&&b;){if(b.classList.contains("slackmsg-item")){a=b.id;break a}b=b.parentElement}a=void 0}if(a){a=parseFloat(a.split("_")[1]);for(var b=H.b[N.id].a,d=0,c=b.length;d<c&&b[d].b<=a;d++)if(b[d].b===a){F!==b[d]&&(F=b[d],L());break}}break}b=b.parentElement}}function U(){document.getElementById("msgInput").focus()}
 function I(){var a=document.location.hash.substr(1),b=w(H.a,a),a=t(H.a,a);b&&b!==N?V(b):a&&a.a&&V(a.a)}
 function I(){var a=document.location.hash.substr(1),b=w(H.a,a),a=t(H.a,a);b&&b!==N?V(b):a&&a.a&&V(a.a)}
-document.addEventListener("DOMContentLoaded",function(){fa();document.getElementById("chatWindow").addEventListener("click",ia);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&I()});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),ja(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.addEventListener("DOMContentLoaded",function(){fa();document.getElementById("chatWindow").addEventListener("click",ja);window.addEventListener("hashchange",function(){document.location.hash&&"#"===document.location.hash[0]&&I()});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),ka(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();N&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(N&&a.value){var b=N,d=F,c=new XMLHttpRequest,f="api/msg?room="+b.id+"&text="+encodeURIComponent(a.value);if(d){var e=t(H.a,d.g),k="Message";"C"===b.id[0]?k="Channel message":"D"===b.id[0]?
 document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();N&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(N&&a.value){var b=N,d=F,c=new XMLHttpRequest,f="api/msg?room="+b.id+"&text="+encodeURIComponent(a.value);if(d){var e=t(H.a,d.g),k="Message";"C"===b.id[0]?k="Channel message":"D"===b.id[0]?
-k="Direct message":"G"===b.id[0]&&(k="Group message");f+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:d.a.text||"",author_name:"<@"+e.id+"|"+e.name+">",author_icon:e.b.j,text:d.a.text||"",footer:k,ts:d.b}]))}c.open("POST",f,!0);c.send(null);a.value="";F&&(F=null,L())}U();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=!0;G=0;N&&W();U()});window.hasFocus=!0;X()});var H,S={};function ka(a,b){if(a&&(a!==N||!window.hasFocus)){var d=new RegExp("<@"+H.a.c.id),c=!1,f=!1;S[a.id]||(S[a.id]={i:0,l:0});b.forEach(function(b){"message"===b.type&&b.text&&("D"===a.id[0]||b.text.match(d)?(f|=!S[a.id].i,S[a.id].i++,c=!0):S[a.id].l++)});R();document.getElementById(a.id).classList.add("unread");c&&document.getElementById(a.id).classList.add("unreadHi");f&&!window.hasFocus&&ha()}}
+k="Direct message":"G"===b.id[0]&&(k="Group message");f+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:d.a.text||"",author_name:"<@"+e.id+"|"+e.name+">",author_icon:e.b.j,text:d.a.text||"",footer:k,ts:d.b}]))}c.open("POST",f,!0);c.send(null);a.value="";F&&(F=null,L())}U();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=!0;G=0;N&&W();U()});window.hasFocus=!0;X()});var H,S={};function la(a,b){if(a&&(a!==N||!window.hasFocus)){var d=new RegExp("<@"+H.a.c.id),c=!1,f=!1;S[a.id]||(S[a.id]={i:0,l:0});b.forEach(function(b){"message"===b.type&&b.text&&("D"===a.id[0]||b.text.match(d)?(f|=!S[a.id].i,S[a.id].i++,c=!0):S[a.id].l++)});R();document.getElementById(a.id).classList.add("unread");c&&document.getElementById(a.id).classList.add("unreadHi");f&&!window.hasFocus&&ia()}}
 function W(){var a=N;S[a.id]&&(S[a.id]={i:0,l:0},R());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}H=new function(){this.c=0;this.a=new v;this.b={}};var Y=0,N=null;function Z(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var d=null,c=2===Math.floor(b.status/100);if(c){Y&&(Y=0,K(!0));d=b.response;try{d=JSON.parse(d)}catch(f){d=null}}else Y?(Y+=Math.floor((Y||5)/2),Y=Math.min(60,Y)):(Y=5,K(!1));a(c,d)}else Y&&(Y=0,K(!0)),Z(a)};b.open("GET","api?v="+H.c,!0);b.send(null)}
 function W(){var a=N;S[a.id]&&(S[a.id]={i:0,l:0},R());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}H=new function(){this.c=0;this.a=new v;this.b={}};var Y=0,N=null;function Z(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var d=null,c=2===Math.floor(b.status/100);if(c){Y&&(Y=0,K(!0));d=b.response;try{d=JSON.parse(d)}catch(f){d=null}}else Y?(Y+=Math.floor((Y||5)/2),Y=Math.min(60,Y)):(Y=5,K(!1));a(c,d)}else Y&&(Y=0,K(!0)),Z(a)};b.open("GET","api?v="+H.c,!0);b.send(null)}
-function la(a,b){if(a){if(b){var d=H;b.v&&(d.c=b.v);if(b["static"]){for(var c=d.a,f=b["static"],e=0,k=f.bots.length;e<k;e++)c.g[f.bots[e].id]=new ca(f.bots[e]);e=0;for(k=f.users.length;e<k;e++)c.a[f.users[e].id]=new ba(f.users[e]);e=0;for(k=f.ims.length;e<k;e++){var g=t(c,f.ims[e].user);g&&(g.a=new aa(g,f.ims[e]),c.m[g.a.id]=g.a)}e=0;for(k=f.channels.length;e<k;e++)c.f[f.channels[e].id]=new l(f.channels[e],c);e=0;for(k=f.groups.length;e<k;e++)c.b[f.groups[e].id]=new u(c,f.groups[e]);c.o=new h(f.team);
-c.c=t(c,f.self.id);ga()}if(b.live){for(var n in b.live)(c=d.b[n])?y(c,b.live[n]):d.b[n]=new x(n,250,b.live[n]);for(var p in b.live)ka(w(d.a,p),b.live[p]),N&&b.live[N.id]&&T()}}X()}else setTimeout(X,1E3*Y)}function X(){Z(la)}
+function ma(a,b){if(a){if(b){var d=H;b.v&&(d.c=b.v);if(b["static"]){for(var c=d.a,f=b["static"],e=0,k=f.bots.length;e<k;e++)c.g[f.bots[e].id]=new ca(f.bots[e]);e=0;for(k=f.users.length;e<k;e++)c.a[f.users[e].id]=new ba(f.users[e]);e=0;for(k=f.ims.length;e<k;e++){var g=t(c,f.ims[e].user);g&&(g.a=new aa(g,f.ims[e]),c.m[g.a.id]=g.a)}e=0;for(k=f.channels.length;e<k;e++)c.f[f.channels[e].id]=new l(f.channels[e],c);e=0;for(k=f.groups.length;e<k;e++)c.b[f.groups[e].id]=new u(c,f.groups[e]);c.o=new h(f.team);
+c.c=t(c,f.self.id);ga()}if(b.live){for(var n in b.live)(c=d.b[n])?y(c,b.live[n]):d.b[n]=new x(n,250,b.live[n]);for(var p in b.live)la(w(d.a,p),b.live[p]),N&&b.live[N.id]&&T()}}X()}else setTimeout(X,1E3*Y)}function X(){Z(ma)}
 function V(a){N&&document.getElementById(N.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");N=a;a=N.name||(N.c?N.c.name:void 0);if(!a){a=[];for(var b in N.a)a.push(N.a[b].name);a=a.join(", ")}document.getElementById("currentRoomTitle").textContent=a;T();U();document.getElementById("fileUploadContainer").classList.add("hidden");W();F&&(F=null,L());N.b&&!H.b[N.id]&&(b=new XMLHttpRequest,b.open("GET","api/hist?room="+
 function V(a){N&&document.getElementById(N.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");N=a;a=N.name||(N.c?N.c.name:void 0);if(!a){a=[];for(var b in N.a)a.push(N.a[b].name);a=a.join(", ")}document.getElementById("currentRoomTitle").textContent=a;T();U();document.getElementById("fileUploadContainer").classList.add("hidden");W();F&&(F=null,L());N.b&&!H.b[N.id]&&(b=new XMLHttpRequest,b.open("GET","api/hist?room="+
-N.id,!0),b.send(null))}function ja(a,b,d){var c=N;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?d(null):d(e.statusText))};e.open("POST","api/file?room="+c.id);e.send(f)};
+N.id,!0),b.send(null))}function ka(a,b,d){var c=N;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?d(null):d(e.statusText))};e.open("POST","api/file?room="+c.id);e.send(f)};

+ 3 - 0
srv/public/style.css

@@ -88,3 +88,6 @@ body {
 .file-upload-container input { display: block; }
 .file-upload-container input { display: block; }
 .file-upload-error { margin: 1em 0; padding: 0.5em 1.5em; background: #ffa2a2; }
 .file-upload-error { margin: 1em 0; padding: 0.5em 1.5em; background: #ffa2a2; }
 
 
+.emoji-small { position: relative; display: inline-block; width: 20px; height: 20px; vertical-align: middle; }
+.emoji-small .emoji { transform: scale(0.3); position: absolute; left: -24px; top: -24px; }
+

Some files were not shown because too many files changed in this diff