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 @@
+
+