Răsfoiți Sursa

[Fix #15] very naive, print number of "unread" messages in title. Do not mind has_read attribute, so already read messages from history are considered as "unread"

B Thibault 8 ani în urmă
părinte
comite
b1a63d8ab1
3 a modificat fișierele cu 39 adăugiri și 13 ștergeri
  1. 6 0
      cli/data.js
  2. 22 2
      cli/ui.js
  3. 11 11
      srv/public/slack.min.js

+ 6 - 0
cli/data.js

@@ -4,6 +4,12 @@ var
      * @type SlackWrapper
     **/
     SLACK
+
+    /**
+     * @type {Object.<string, number>} number of unread per chan
+    **/
+    ,UNREAD_CHANS = {};
+
 ;
 
 /**

+ 22 - 2
cli/ui.js

@@ -1,4 +1,3 @@
-
 /**
  * @param {SlackChan|SlackGroup} chan
  * @return {Element}
@@ -75,6 +74,11 @@ function onRoomSelected() {
     roomLi.classList.remove(R.klass.unreadHi);
     document.getElementById(R.id.currentRoom.title).textContent = name;
     onRoomUpdated();
+
+    if (UNREAD_CHANS[SELECTED_ROOM.id]) {
+        UNREAD_CHANS[SELECTED_ROOM.id] = 0;
+        updateTitle();
+    }
 }
 
 function createMessageDom(channelId, msg) {
@@ -113,12 +117,28 @@ function createMessageDom(channelId, msg) {
     return dom;
 }
 
+function updateTitle() {
+    var hasUnread = 0;
+
+    for (var i in UNREAD_CHANS) {
+        if (UNREAD_CHANS.hasOwnProperty(i)) {
+            hasUnread += UNREAD_CHANS[i];
+        }
+    }
+    document.title = (hasUnread ? ("(" +hasUnread +")") : "") +" - gate";
+}
+
 /**
  * @param {SlackChan|SlackGroup|SlackIms} chan
  * @param {Array.<*>} msg
 **/
 function onMsgReceived(chan, msg) {
-    chan && document.getElementById(chan.id).classList.add(R.klass.unread);
+    if (chan) {
+        document.getElementById(chan.id).classList.add(R.klass.unread);
+        var count = UNREAD_CHANS[chan.id] || 0;
+        UNREAD_CHANS[chan.id] = count + msg.length;
+        updateTitle();
+    }
 }
 
 function onRoomUpdated() {

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

@@ -1,13 +1,13 @@
-function g(b,a){this.id=b.id;this.name=b.name;this.b=parseFloat(b.last_read);this.a={};if(b.members)for(var c=0,e=b.members.length;c<e;c++){var f=h(a,b.members[c]);this.a[f.id]=f;f.c[this.id]=this}}function n(b,a){var c=[];this.id=a.id;this.a={};for(var e=0,f=a.members.length;e<f;e++){var d=h(b,a.members[e]);this.a[a.members[e]]=d;d.c[this.id]=this;c.push(d.name)}this.name=c.join(", ");this.b=parseFloat(a.last_read)}function q(b,a){this.id=a.id;this.f=b;this.b=parseFloat(a.last_read)}
-function t(b){this.id=b.id;this.name=b.name;this.status=b.status;this.b={w:b.profile.image_24,A:b.profile.image_32,j:b.profile.image_48,m:b.profile.image_72,u:b.profile.image_192,C:b.profile.image_512};this.c={};this.a=null}function u(b){this.id=b.id;this.name=b.name;this.b={B:b.icons.image_36,j:b.icons.image_48,m:b.icons.image_72};this.c={};this.a=null}function v(){this.c={};this.b={};this.f={};this.a={};this.h=null;this.i={}}function h(b,a){return b.a[a]||b.i[a]||null}
+function g(b,a){this.id=b.id;this.name=b.name;this.b=parseFloat(b.last_read);this.a={};if(b.members)for(var c=0,e=b.members.length;c<e;c++){var f=h(a,b.members[c]);this.a[f.id]=f;f.c[this.id]=this}}function p(b,a){var c=[];this.id=a.id;this.a={};for(var e=0,f=a.members.length;e<f;e++){var d=h(b,a.members[e]);this.a[a.members[e]]=d;d.c[this.id]=this;c.push(d.name)}this.name=c.join(", ");this.b=parseFloat(a.last_read)}function q(b,a){this.id=a.id;this.f=b;this.b=parseFloat(a.last_read)}
+function r(b){this.id=b.id;this.name=b.name;this.status=b.status;this.b={w:b.profile.image_24,A:b.profile.image_32,j:b.profile.image_48,m:b.profile.image_72,u:b.profile.image_192,C:b.profile.image_512};this.c={};this.a=null}function u(b){this.id=b.id;this.name=b.name;this.b={B:b.icons.image_36,j:b.icons.image_48,m:b.icons.image_72};this.c={};this.a=null}function v(){this.c={};this.b={};this.f={};this.a={};this.h=null;this.i={}}function h(b,a){return b.a[a]||b.i[a]||null}
 "undefined"!==typeof module&&(module.l.o=v);function w(b){this.g=parseFloat(b.ts);this.raw=b}function x(b,a,c){this.id="string"===typeof b?b:b.id;this.a=[];this.b=a;c&&y(this,c)}function y(b,a){a.forEach(function(b){this.push(b)}.bind(b))}x.prototype.push=function(b){for(var a=parseFloat(b.ts),c=0,e=this.a.length;c<e;c++)if(this.a[c].g===a)return!1;for(this.a.push(new w(b));this.a.length>this.b;)this.a.shift()};"undefined"!==typeof module&&(module.l.s=x);function z(){var b=document.createDocumentFragment(),a=A.a.h?Object.keys(A.a.h.c):[];a.sort(function(b,a){return b[0]!==a[0]?b[0]-a[0]:(A.a.c[b]||A.a.b[b]).name.localeCompare((A.a.c[a]||A.a.b[a]).name)});a.forEach(function(a){a=A.a.c[a]||A.a.b[a];var c=document.createElement("li");c.id=a.id;"D"===a.id[0]?c.className="slack-context-room slack-ims":"G"===a.id[0]?c.className="slack-context-room slack-group":"C"===a.id[0]&&(c.className="slack-context-room slack-channel");c.textContent=a.name;c&&b.appendChild(c)});
 a=A.a.a?Object.keys(A.a.a):[];a.sort(function(b,a){return A.a.a[b].name.localeCompare(A.a.a[a].name)});a.forEach(function(a){a=A.a.a[a].a;var c=document.createElement("li");c.id=a.id;c.className="slack-context-room";c.textContent=a.f.name;c&&b.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(b)}
-function B(b,a){var c=document.createElement("div"),e=document.createElement("div"),f=document.createElement("div"),d=document.createElement("div"),l=document.createElement("img"),m=document.createElement("span"),k=document.createElement("ul"),p=document.createElement("li"),r=a.raw.user?A.a.a[a.raw.user]:A.a.i[a.raw.bot_id];c.id=b+"_"+a.g;c.className="slackmsg-item";e.className="slackmsg-ts";f.className="slackmsg-msg";d.className="slackmsg-author";l.className="slackmsg-author-img";m.className="slackmsg-author-name";
-k.className="slackmsg-hover";p.className="slackmsg-hover-reply";e.textContent=(new Date(1E3*a.g)).toLocaleTimeString();f.textContent=a.raw.text;m.textContent=r?r.name:a.raw.username||"?";l.src=r?r.b.j:"";d.appendChild(l);d.appendChild(m);k.appendChild(p);c.appendChild(d);c.appendChild(f);c.appendChild(e);c.appendChild(k);return c}
-function C(){var b=document.createDocumentFragment(),a=D.id;document.getElementById("chatWindow").textContent="";A.b[a]&&A.b[a].a.forEach(function(c){b.appendChild(B(a,c))});var c=document.getElementById("chatWindow");c.appendChild(b);c.scrollTop=c.scrollHeight-c.clientHeight}
-function E(b){for(;b.target!==b.currentTarget&&b.target;){if(b.target.classList.contains("slack-context-room")){if((b=A.a.c[b.target.id]||A.a.f[b.target.id]||A.a.b[b.target.id])&&b!==D){D&&document.getElementById(D.id).classList.remove("selected");document.getElementById(b.id).classList.add("selected");document.body.classList.remove("no-room-selected");D=b;b=void 0;var a=D.name||(D.f?D.f.name:void 0);if(!a){a=[];for(b in D.a)a.push(D.a[b].name);a=a.join(", ")}b=document.getElementById(D.id);b.classList.remove("unread");
-b.classList.remove("unreadHi");document.getElementById("currentRoomTitle").textContent=a;C();D.b&&!A.b[D.id]&&(b=new XMLHttpRequest,b.open("GET","api/hist?room="+D.id,!0),b.send(null))}break}b.target=b.target.parentElement}}
-function F(b){for(var a=b.target;a!==b.currentTarget&&a&&!a.classList.contains("slackmsg-hover");){if(a.classList.contains("slackmsg-hover-reply")){a:{for(a=a||b.target;a!==b.currentTarget&&a;){if(a.classList.contains("slackmsg-item")){b=a.id;break a}a=a.parentElement}b=void 0}if(b){b=parseFloat(b.split("_")[1]);for(var a=A.b[D.id].a,c=0,e=a.length;c<e&&a[c].g<=b;c++)if(a[c].g===b){console.log("Replying to ",a[c]);break}}break}a=a.parentElement}}
-document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",E);document.getElementById("chatWindow").addEventListener("click",F);document.getElementById("msgForm").addEventListener("submit",function(b){b.preventDefault();b=document.getElementById("msgInput");if(D&&b.value){var a=new XMLHttpRequest;a.open("POST","api/msg?room="+D.id+"&text="+encodeURIComponent(b.value),!0);a.send(null);b.value=""}return!1});G()});var A;A=new function(){this.f=0;this.a=new v;this.b={}};var H=5,D=null;function I(b){var a=new XMLHttpRequest;a.timeout=6E4;a.onreadystatechange=function(){if(4===a.readyState)if(a.status){var c=null,e=2===Math.floor(a.status/100);if(e){H=5;c=a.response;try{c=JSON.parse(c)}catch(f){c=null}}else H+=Math.floor(H/2),H=Math.min(60,H);b(e,c)}else I(b),H=5};a.open("GET","api?v="+A.f,!0);a.send(null)}
-function J(b,a){if(b){if(a){var c=A;a.v&&(c.f=a.v);if(a["static"]){for(var e=c.a,f=a["static"],d=0,l=f.bots.length;d<l;d++)e.i[f.bots[d].id]=new u(f.bots[d]);d=0;for(l=f.users.length;d<l;d++)e.a[f.users[d].id]=new t(f.users[d]);d=0;for(l=f.ims.length;d<l;d++){var m=h(e,f.ims[d].user);m&&(m.a=new q(m,f.ims[d]),e.f[m.a.id]=m.a)}d=0;for(l=f.channels.length;d<l;d++)e.c[f.channels[d].id]=new g(f.channels[d],e);d=0;for(l=f.groups.length;d<l;d++)e.b[f.groups[d].id]=new n(e,f.groups[d]);e.h=h(e,f.self.id);
-z()}if(a.live){for(var k in a.live)(e=c.b[k])?y(e,a.live[k]):c.b[k]=new x(k,500,a.live[k]);for(var p in a.live)D&&a.live[D.id]?C():(k=c.a,(k=k.c[p]||k.f[p]||k.b[p]||null)&&document.getElementById(k.id).classList.add("unread"))}}G()}else setTimeout(G,1E3*H)}function G(){I(J)};
+function B(b,a){var c=document.createElement("div"),e=document.createElement("div"),f=document.createElement("div"),d=document.createElement("div"),l=document.createElement("img"),m=document.createElement("span"),k=document.createElement("ul"),n=document.createElement("li"),t=a.raw.user?A.a.a[a.raw.user]:A.a.i[a.raw.bot_id];c.id=b+"_"+a.g;c.className="slackmsg-item";e.className="slackmsg-ts";f.className="slackmsg-msg";d.className="slackmsg-author";l.className="slackmsg-author-img";m.className="slackmsg-author-name";
+k.className="slackmsg-hover";n.className="slackmsg-hover-reply";e.textContent=(new Date(1E3*a.g)).toLocaleTimeString();f.textContent=a.raw.text;m.textContent=t?t.name:a.raw.username||"?";l.src=t?t.b.j:"";d.appendChild(l);d.appendChild(m);k.appendChild(n);c.appendChild(d);c.appendChild(f);c.appendChild(e);c.appendChild(k);return c}function C(){var b=0,a;for(a in D)D.hasOwnProperty(a)&&(b+=D[a]);document.title=(b?"("+b+")":"")+" - gate"}
+function E(){var b=document.createDocumentFragment(),a=F.id;document.getElementById("chatWindow").textContent="";A.b[a]&&A.b[a].a.forEach(function(c){b.appendChild(B(a,c))});var c=document.getElementById("chatWindow");c.appendChild(b);c.scrollTop=c.scrollHeight-c.clientHeight}
+function G(b){for(;b.target!==b.currentTarget&&b.target;){if(b.target.classList.contains("slack-context-room")){if((b=A.a.c[b.target.id]||A.a.f[b.target.id]||A.a.b[b.target.id])&&b!==F){F&&document.getElementById(F.id).classList.remove("selected");document.getElementById(b.id).classList.add("selected");document.body.classList.remove("no-room-selected");F=b;b=void 0;var a=F.name||(F.f?F.f.name:void 0);if(!a){a=[];for(b in F.a)a.push(F.a[b].name);a=a.join(", ")}b=document.getElementById(F.id);b.classList.remove("unread");
+b.classList.remove("unreadHi");document.getElementById("currentRoomTitle").textContent=a;E();D[F.id]&&(D[F.id]=0,C());F.b&&!A.b[F.id]&&(b=new XMLHttpRequest,b.open("GET","api/hist?room="+F.id,!0),b.send(null))}break}b.target=b.target.parentElement}}
+function H(b){for(var a=b.target;a!==b.currentTarget&&a&&!a.classList.contains("slackmsg-hover");){if(a.classList.contains("slackmsg-hover-reply")){a:{for(a=a||b.target;a!==b.currentTarget&&a;){if(a.classList.contains("slackmsg-item")){b=a.id;break a}a=a.parentElement}b=void 0}if(b){b=parseFloat(b.split("_")[1]);for(var a=A.b[F.id].a,c=0,e=a.length;c<e&&a[c].g<=b;c++)if(a[c].g===b){console.log("Replying to ",a[c]);break}}break}a=a.parentElement}}
+document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",G);document.getElementById("chatWindow").addEventListener("click",H);document.getElementById("msgForm").addEventListener("submit",function(b){b.preventDefault();b=document.getElementById("msgInput");if(F&&b.value){var a=new XMLHttpRequest;a.open("POST","api/msg?room="+F.id+"&text="+encodeURIComponent(b.value),!0);a.send(null);b.value=""}return!1});I()});var A,D={};A=new function(){this.f=0;this.a=new v;this.b={}};var J=5,F=null;function K(b){var a=new XMLHttpRequest;a.timeout=6E4;a.onreadystatechange=function(){if(4===a.readyState)if(a.status){var c=null,e=2===Math.floor(a.status/100);if(e){J=5;c=a.response;try{c=JSON.parse(c)}catch(f){c=null}}else J+=Math.floor(J/2),J=Math.min(60,J);b(e,c)}else K(b),J=5};a.open("GET","api?v="+A.f,!0);a.send(null)}
+function L(b,a){if(b){if(a){var c=A;a.v&&(c.f=a.v);if(a["static"]){for(var e=c.a,f=a["static"],d=0,l=f.bots.length;d<l;d++)e.i[f.bots[d].id]=new u(f.bots[d]);d=0;for(l=f.users.length;d<l;d++)e.a[f.users[d].id]=new r(f.users[d]);d=0;for(l=f.ims.length;d<l;d++){var m=h(e,f.ims[d].user);m&&(m.a=new q(m,f.ims[d]),e.f[m.a.id]=m.a)}d=0;for(l=f.channels.length;d<l;d++)e.c[f.channels[d].id]=new g(f.channels[d],e);d=0;for(l=f.groups.length;d<l;d++)e.b[f.groups[d].id]=new p(e,f.groups[d]);e.h=h(e,f.self.id);
+z()}if(a.live){for(var k in a.live)(e=c.b[k])?y(e,a.live[k]):c.b[k]=new x(k,500,a.live[k]);for(var n in a.live)F&&a.live[F.id]?E():(k=c.a,k=k.c[n]||k.f[n]||k.b[n]||null,e=a.live[n],k&&(document.getElementById(k.id).classList.add("unread"),D[k.id]=(D[k.id]||0)+e.length,C()))}}I()}else setTimeout(I,1E3*J)}function I(){K(L)};