From b34ec8d73275926c315450032430a53e46b375ab Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 29 Sep 2014 02:00:35 -0400 Subject: [PATCH] user presence pie chart --- public/src/forum/admin/general/dashboard.js | 44 ++++++++++++++++++++- src/socket.io/meta.js | 26 +++++++++--- src/views/admin/general/dashboard.tpl | 9 +++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/public/src/forum/admin/general/dashboard.js b/public/src/forum/admin/general/dashboard.js index 116ba696ab..19aa25c918 100644 --- a/public/src/forum/admin/general/dashboard.js +++ b/public/src/forum/admin/general/dashboard.js @@ -124,13 +124,18 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { '
Connections
' + ''; + var idle = data.socketCount - data.users.home + data.users.topics + data.users.category; + updateRegisteredGraph(data.onlineRegisteredCount, data.onlineGuestCount); + updatePresenceGraph(data.users.home, data.users.topics, data.users.category, idle); $('#active-users').html(html); }; var graphs = { - traffic: null + traffic: null, + registered: null, + presence: null }; function getHoursArray() { @@ -148,8 +153,10 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { function setupGraphs() { var trafficCanvas = document.getElementById('analytics-traffic'), registeredCanvas = document.getElementById('analytics-registered'), + presenceCanvas = document.getElementById('analytics-presence'), trafficCtx = trafficCanvas.getContext('2d'), registeredCtx = registeredCanvas.getContext('2d'), + presenceCtx = presenceCanvas.getContext('2d'), trafficLabels = getHoursArray(); var data = { @@ -198,6 +205,33 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { responsive: true }); + graphs.presence = new Chart(presenceCtx).Doughnut([{ + value: 1, + color:"#F7464A", + highlight: "#FF5A5E", + label: "On homepage" + }, + { + value: 1, + color: "#46BFBD", + highlight: "#5AD3D1", + label: "Reading posts" + }, + { + value: 1, + color: "#FDB45C", + highlight: "#FFC870", + label: "Browsing topics" + }, + { + value: 1, + color: "#949FB1", + highlight: "#A8B3C5", + label: "Idle" + }], { + responsive: true + }); + setInterval(updateTrafficGraph, 15000); updateTrafficGraph(); } @@ -222,5 +256,13 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { graphs.registered.update(); } + function updatePresenceGraph(homepage, posts, topics, idle) { + graphs.presence.segments[0].value = homepage; + graphs.presence.segments[1].value = posts; + graphs.presence.segments[2].value = topics; + graphs.presence.segments[3].value = idle; + graphs.presence.update(); + } + return Admin; }); diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index 5fc901d12b..f01b362c3c 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -83,11 +83,27 @@ SocketMeta.rooms.enter = function(socket, data, callback) { }; SocketMeta.rooms.getAll = function(socket, data, callback) { - var userData = { - onlineGuestCount: websockets.getOnlineAnonCount(), - onlineRegisteredCount: websockets.getOnlineUserCount(), - socketCount: websockets.getSocketCount() - }; + var rooms = websockets.server.sockets.manager.rooms, + userData = { + onlineGuestCount: websockets.getOnlineAnonCount(), + onlineRegisteredCount: websockets.getOnlineUserCount(), + socketCount: websockets.getSocketCount(), + users: { + home: rooms['/home'] ? rooms['/home'].length : 0, + topics: 0, + category: 0 + } + }; + + for (var room in rooms) { + if (rooms.hasOwnProperty(room)) { + if (room.match(/^\/topic/)) { + userData.users.topics += rooms[room].length + } else if (room.match(/^\/category/)) { + userData.users.category += rooms[room].length + } + } + } callback(null, userData); }; diff --git a/src/views/admin/general/dashboard.tpl b/src/views/admin/general/dashboard.tpl index c925955920..6085586642 100644 --- a/src/views/admin/general/dashboard.tpl +++ b/src/views/admin/general/dashboard.tpl @@ -66,6 +66,15 @@ +
+
User Presence
+
+
+ +
+
+
+
{stats.name}