1
0
Эх сурвалжийг харах

[add][Refs #15] Identify unread channels
[quickfix] removed verbose logs

B Thibault 8 жил өмнө
parent
commit
8d374f52d5

+ 5 - 2
cli/data.js

@@ -35,8 +35,11 @@ SlackWrapper.prototype.update = function(data) {
             else
                 history.pushAll(data["live"][i]);
         }
-        if (SELECTED_ROOM && data["live"][SELECTED_ROOM.id]) {
-            onRoomUpdated();
+        for (var roomId in data["live"]) {
+            if (SELECTED_ROOM && data["live"][SELECTED_ROOM.id])
+                onRoomUpdated();
+            else
+                onMsgReceived(this.context.getChannel(roomId), data["live"][roomId]);
         }
     }
 };

+ 2 - 0
cli/resources.js

@@ -14,6 +14,8 @@ var R = {
     ,klass: {
         selected: "selected"
         ,noRoomSelected: "no-room-selected"
+        ,unread: "unread"
+        ,unreadHi: "unreadHi"
         ,chatList: {
             entry: "slack-context-room"
             ,typeChannel: "slack-channel"

+ 12 - 1
cli/ui.js

@@ -70,6 +70,9 @@ function onRoomSelected() {
         }
         name = members.join(", ");
     }
+    var roomLi = document.getElementById(SELECTED_ROOM.id);
+    roomLi.classList.remove(R.klass.unread);
+    roomLi.classList.remove(R.klass.unreadHi);
     document.getElementById(R.id.currentRoom.title).textContent = name;
     onRoomUpdated();
 }
@@ -110,6 +113,14 @@ function createMessageDom(channelId, msg) {
     return dom;
 }
 
+/**
+ * @param {SlackChan|SlackGroup|SlackIms} chan
+ * @param {Array.<*>} msg
+**/
+function onMsgReceived(chan, msg) {
+    chan && document.getElementById(chan.id).classList.add(R.klass.unread);
+}
+
 function onRoomUpdated() {
     var chatFrag = document.createDocumentFragment()
         ,currentRoomId = SELECTED_ROOM.id;
@@ -122,7 +133,7 @@ function onRoomUpdated() {
     var content = document.getElementById(R.id.currentRoom.content);
     content.appendChild(chatFrag);
     //TODO scroll lock
-    console.log(content.scrollTop = content.scrollHeight -content.clientHeight);
+    content.scrollTop = content.scrollHeight -content.clientHeight;
 }
 
 function onChanClick(e) {

+ 12 - 12
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.f[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.f[this.id]=this;c.push(d.name)}this.name=c.join(", ");this.b=parseFloat(a.last_read)}function p(b,a){this.id=a.id;this.c=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.f={};this.a=null}function t(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.f={};this.a=null}function u(){this.f={};this.b={};this.i={};this.a={};this.c=null;this.h={}}function h(b,a){return b.a[a]||b.h[a]||null}
-"undefined"!==typeof module&&(module.l.o=u);function v(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 v(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.c?Object.keys(A.a.c.f):[];a.sort(function(b,a){return b[0]!==a[0]?b[0]-a[0]:(A.a.f[b]||A.a.b[b]).name.localeCompare((A.a.f[a]||A.a.b[a]).name)});a.forEach(function(a){a=A.a.f[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(a,b){return A.a.a[a].name.localeCompare(A.a.a[b].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.c.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"),k=document.createElement("img"),l=document.createElement("span"),m=document.createElement("ul"),w=document.createElement("li"),q=a.raw.user?A.a.a[a.raw.user]:A.a.h[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";k.className="slackmsg-author-img";l.className="slackmsg-author-name";
-m.className="slackmsg-hover";w.className="slackmsg-hover-reply";e.textContent=(new Date(1E3*a.g)).toLocaleTimeString();f.textContent=a.raw.text;l.textContent=q?q.name:a.raw.username||"?";k.src=q?q.b.j:"";d.appendChild(k);d.appendChild(l);m.appendChild(w);c.appendChild(d);c.appendChild(f);c.appendChild(e);c.appendChild(m);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);console.log(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.f[b.target.id]||A.a.i[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.c?D.c.name:void 0);if(!a){a=[];for(b in D.a)a.push(D.a[b].name);a=a.join(", ")}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 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}
+"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.c=0;this.a=new u;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.c,!0);a.send(null)}
-function J(b,a){if(b){if(a){var c=A;a.v&&(c.c=a.v);if(a["static"]){for(var e=c.a,f=a["static"],d=0,k=f.bots.length;d<k;d++)e.h[f.bots[d].id]=new t(f.bots[d]);d=0;for(k=f.users.length;d<k;d++)e.a[f.users[d].id]=new r(f.users[d]);d=0;for(k=f.ims.length;d<k;d++){var l=h(e,f.ims[d].user);l&&(l.a=new p(l,f.ims[d]),e.i[l.a.id]=l.a)}d=0;for(k=f.channels.length;d<k;d++)e.f[f.channels[d].id]=new g(f.channels[d],e);d=0;for(k=f.groups.length;d<k;d++)e.b[f.groups[d].id]=new n(e,f.groups[d]);e.c=h(e,f.self.id);
-z()}if(a.live){for(var m in a.live)(e=c.b[m])?y(e,a.live[m]):c.b[m]=new x(m,500,a.live[m]);D&&a.live[D.id]&&C()}}G()}else setTimeout(G,1E3*H)}function G(){I(J)};
+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)};

+ 1 - 0
srv/public/style.css

@@ -33,6 +33,7 @@ body {
 .slack-chat-title { display: inline-block; height: 1.75em; font-size: 1.75em; font-style: italic; }
 .slack-chat-control { display: inline-block; width: 100%; height: 2em; padding: 1.5em 0; }
 .slack-chat-control * { display: inline-block; height: 100%; }
+.slack-context-room.unread { font-weight: bold; }
 .slack-context-room.slack-channel + .slack-context-room:not(.slack-channel), .slack-context-room.slack-group + .slack-context-room:not(.slack-group) { margin-top: 1em; border-top: 1px solid grey; }
 .slackmsg-item { position: relative; background: #eee; }
 .slackmsg-item:not(:first-child) { margin-top: 15px; }

+ 1 - 4
srv/src/slack.js

@@ -207,10 +207,7 @@ Slack.prototype.sendMsg = function(channel, text) {
         +"?token=" +this.token
         +"&channel=" +channel.id
         +"&text=" +text.join("\n")
-        +"&as_user=true"
-    ,(status, msg) => {
-        console.log(status, msg);
-    });
+        +"&as_user=true");
 };
 
 Slack.prototype.fetchHistory = function(targetId) {