From 05980fe33ca523d0cf064bbe0b06f6a6a503f917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Mon, 29 Jan 2018 13:57:54 +0100 Subject: [PATCH] Fix for offline-listeners overflooding total viewers --- server/handlers/frontpage.js | 2 +- server/handlers/functions.js | 11 ++++++++--- server/handlers/io.js | 17 +++++++++++------ server/handlers/list.js | 2 +- server/index.js | 2 +- server/public/assets/js/listeners.js | 24 ++++++++++++------------ server/routing/api.js | 2 +- 7 files changed, 35 insertions(+), 25 deletions(-) diff --git a/server/handlers/frontpage.js b/server/handlers/frontpage.js index e2707f5a..174a343b 100644 --- a/server/handlers/frontpage.js +++ b/server/handlers/frontpage.js @@ -5,7 +5,7 @@ function frontpage_lists(msg, socket) { db.collection("frontpage_lists").find({frontpage:true}, function(err, docs){ db.collection("connected_users").find({"_id": "total_users"}, function(err, tot){ - socket.compress(true).emit("playlists", {channels: docs, viewers: tot[0].total_users}); + socket.compress(true).emit("playlists", {channels: docs, viewers: tot[0].total_users.length}); }); }); } diff --git a/server/handlers/functions.js b/server/handlers/functions.js index da5b19ee..d9c4839a 100644 --- a/server/handlers/functions.js +++ b/server/handlers/functions.js @@ -41,15 +41,20 @@ function check_inlist(coll, guid, socket, offline) socket.broadcast.to(coll).emit('chat', {from: docs[0].name, msg: " joined"}); } }); - db.collection("connected_users").update({"_id": "total_users"}, {$inc: {total_users: 1}}, function(err, docs){}); + db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + coll}}, function(err, docs){}); }); }); } }); } else { - db.collection("connected_users").update({"_id": coll}, {$addToSet: {users: guid}}, function(err, docs){}); - db.collection("connected_users").update({"_id": "total_users"}, {$inc: {total_users: 1}}, function(err, docs) {}); + if(offline) { + db.collection("connected_users").update({"_id": "offline_users"}, {$addToSet: {users: guid}}, function(err, docs){}); + } else { + db.collection("connected_users").update({"_id": coll}, {$addToSet: {users: guid}}, function(err, docs){}); + } + // + db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + coll}}, function(err, docs) {}); } } diff --git a/server/handlers/io.js b/server/handlers/io.js index db128148..efeed95f 100644 --- a/server/handlers/io.js +++ b/server/handlers/io.js @@ -34,7 +34,7 @@ module.exports = function() { }); } - db.collection("connected_users").update({"_id": "total_users"}, {$inc: {total_users: 1}}, {upsert: true}, function(err, docs){}); + db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + channel}}, {upsert: true}, function(err, docs){}); }); socket.on('chromecast', function(msg) { @@ -76,9 +76,9 @@ module.exports = function() { db.collection("connected_users").find({"_id": "offline_users"}, function(err, off) { db.collection("connected_users").find({"_id": {$ne: "total_users"}, "_id": {$ne: "offline_users"}}, function(err, users_list) { if(tot.length > 0 && off.length == 0) { - socket.emit("spread_listeners", {offline: 0, total: tot[0].total_users, online_users: users_list}); + socket.emit("spread_listeners", {offline: 0, total: tot[0].total_users.length, online_users: users_list}); } else if(tot.length > 0 && off.length > 0){ - socket.emit("spread_listeners", {offline: off[0].users.length, total: tot[0].total_users, online_users: users_list}); + socket.emit("spread_listeners", {offline: off[0].users.length, total: tot[0].total_users.length, online_users: users_list}); } }); }); @@ -117,6 +117,7 @@ module.exports = function() { offline = true; if(channel != "") coll = channel; if(coll !== undefined) { + db.collection("connected_users").findAndModify({ query: {"_id": coll}, update: {$pull: {users: guid}}, @@ -129,10 +130,10 @@ module.exports = function() { } io.to(coll).emit("viewers", num); db.collection("frontpage_lists").update({"_id": coll, "viewers": {$gt: 0}}, {$inc: {viewers: -1}}, function(err, docs) { }); - db.collection("connected_users").update({"_id": "total_users", total_users: {$gt: 0}}, {$inc: {total_users: -1}}, function(err, docs){ + db.collection("connected_users").update({"_id": "total_users"}, {$pull: {total_users: guid + coll}}, function(err, docs){ db.collection("connected_users").update({"_id": "offline_users"}, {$addToSet: {users: guid}}, function(err, docs) { if(docs.nModified == 1) { - db.collection("connected_users").update({"_id": "total_users"}, {$inc: {total_users: 1}}, function(err, docs) {}); + db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + coll}}, function(err, docs) {}); } }); }); @@ -146,7 +147,7 @@ module.exports = function() { offline = false; db.collection("connected_users").update({"_id": "offline_users"}, {$pull: {users: guid}}, function(err, docs) { if(docs.n && docs.n == 1) { - db.collection("connected_users").update({"_id": "total_users", "total_users": {$gt: 0}}, {$inc: {total_users: -1}}, function(err, docs){}); + db.collection("connected_users").update({"_id": "total_users"}, {$addToSet: {total_users: guid + channel}}, function(err, docs){}); } Functions.check_inlist(coll, guid, socket, offline); }); @@ -194,6 +195,10 @@ module.exports = function() { } catch(e) { return; } + + if(msg.hasOwnProperty("offline") && msg.offline) { + offline = true; + } List.list(msg, guid, coll, offline, socket); Functions.get_short_id(socket); }); diff --git a/server/handlers/list.js b/server/handlers/list.js index b7c8c3f3..1154bebc 100644 --- a/server/handlers/list.js +++ b/server/handlers/list.js @@ -500,7 +500,7 @@ function left_channel(coll, guid, short_id, in_list, socket, change) io.to(coll).emit("viewers", new_doc[0].users.length); socket.leave(coll); }); - db.collection("connected_users").update({"_id": "total_users", total_users: {$gt: 0}}, {$inc: {total_users: -1}}, function(err, updated){}); + db.collection("connected_users").update({"_id": "total_users"}, {$pull: {total_users: guid + coll}}, function(err, updated){}); if(!change) { Functions.remove_name_from_db(guid, name); diff --git a/server/index.js b/server/index.js index 13bbb942..7fbd4c26 100755 --- a/server/index.js +++ b/server/index.js @@ -145,5 +145,5 @@ db.collection("unique_ids").update({"_id": "unique_ids"}, {$set: {unique_ids: [] db.collection("user_names").remove({"guid": {$exists: true}}, {multi: true, upsert: true}, function(err, docs){}); db.collection("user_names").update({"_id": "all_names"}, {$set: {names: []}}, {multi: true, upsert: true}, function(err, docs){}); db.collection("connected_users").update({users: {$exists: true}}, {$set: {users: []}}, {multi: true, upsert: true}, function(err, docs){}); -db.collection("connected_users").update({"_id": "total_users"}, {$set: {total_users: 0}}, {multi: true, upsert: true}, function(err, docs) {}); +db.collection("connected_users").update({"_id": "total_users"}, {$set: {total_users: []}}, {multi: true, upsert: true}, function(err, docs) {}); db.collection("frontpage_lists").update({viewers: {$ne: 0}}, {$set: {"viewers": 0}}, {multi: true, upsert: true}, function(err, docs) {}); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 5ea8b577..a38cdf98 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -153,20 +153,20 @@ $().ready(function(){ socket.on("connect", function(){ if(connect_error){ connect_error = false; + if(offline) { + socket.emit("offline", {status: true, channel: chan != undefined ? chan.toLowerCase() : ""}); + } + if(chan != undefined && (Crypt.get_pass(chan.toLowerCase()) !== undefined && Crypt.get_pass(chan.toLowerCase()) !== "")){ + socket.emit("password", {password: Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), channel: chan.toLowerCase()}); + } + if(chan != undefined && conf_arr.name !== undefined && conf_arr.name !== "" && conf_arr.chat_pass !== undefined && conf_arr.chat_pass !== ""){ + setTimeout(function() { + Chat.namechange(conf_arr.name + " " + conf_arr.chat_pass, true); + }, 100); //to take height for delay on establishing connection + } $(".connect_error").fadeOut(function(){ $(".connect_error").remove(); Materialize.toast("Connected!", 2000, "green lighten"); - if(offline) { - socket.emit("offline", {status: true, channel: chan != undefined ? chan.toLowerCase() : ""}); - } - if(chan != undefined && (Crypt.get_pass(chan.toLowerCase()) !== undefined && Crypt.get_pass(chan.toLowerCase()) !== "")){ - socket.emit("password", {password: Crypt.crypt_pass(Crypt.get_pass(chan.toLowerCase())), channel: chan.toLowerCase()}); - } - if(chan != undefined && conf_arr.name !== undefined && conf_arr.name !== "" && conf_arr.chat_pass !== undefined && conf_arr.chat_pass !== ""){ - setTimeout(function() { - Chat.namechange(conf_arr.name + " " + conf_arr.chat_pass, true); - }, 100); //to take height for delay on establishing connection - } }); } @@ -746,7 +746,7 @@ function get_list_listener(){ socket.on("get_list", function(){ var add = ""; if(private_channel) add = Crypt.getCookie("_uI") + "_"; - socket.emit("list", {version: parseInt(localStorage.getItem("VERSION")), channel: add + chan.toLowerCase(), pass: embed ? '' : Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()))}); + socket.emit("list", { offline: offline, version: parseInt(localStorage.getItem("VERSION")), channel: add + chan.toLowerCase(), pass: embed ? '' : Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()))}); }); } diff --git a/server/routing/api.js b/server/routing/api.js index f8a8dd80..a8014be0 100644 --- a/server/routing/api.js +++ b/server/routing/api.js @@ -10,7 +10,7 @@ router.route('/api/frontpages').get(function(req, res) { db.collection("frontpage_lists").find({frontpage: true, count: {$gt: 0}}, function(err, docs) { db.collection("connected_users").find({"_id": "total_users"}, function(err, tot) { res.setHeader('Content-Type', 'application/json'); - res.send(JSON.stringify({channels: docs, viewers: tot[0].total_users})); + res.send(JSON.stringify({channels: docs, viewers: tot[0].total_users.length})); }); }); });