diff --git a/public/language/en-GB/admin/general/dashboard.json b/public/language/en-GB/admin/general/dashboard.json index 282b7409e8..cfec2cd754 100644 --- a/public/language/en-GB/admin/general/dashboard.json +++ b/public/language/en-GB/admin/general/dashboard.json @@ -65,6 +65,9 @@ "high-presence-topics": "High Presence Topics", "graphs.page-views": "Page Views", + "graphs.page-views-registered": "Page Views Registered", + "graphs.page-views-guest": "Page Views Guest", + "graphs.page-views-bot": "Page Views Bot", "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users", diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 207676e430..fd7a128954 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -145,6 +145,9 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator', 'benchpress' var t = translator.Translator.create(); Promise.all([ t.translateKey('admin/general/dashboard:graphs.page-views', []), + t.translateKey('admin/general/dashboard:graphs.page-views-registered', []), + t.translateKey('admin/general/dashboard:graphs.page-views-guest', []), + t.translateKey('admin/general/dashboard:graphs.page-views-bot', []), t.translateKey('admin/general/dashboard:graphs.unique-visitors', []), t.translateKey('admin/general/dashboard:graphs.registered-users', []), t.translateKey('admin/general/dashboard:graphs.anonymous-users', []), @@ -169,6 +172,36 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator', 'benchpress' }, { label: translations[1], + backgroundColor: 'rgba(220,110,110,0.2)', + borderColor: 'rgba(220,110,110,1)', + pointBackgroundColor: 'rgba(220,110,110,1)', + pointHoverBackgroundColor: '#fff', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(220,220,220,1)', + data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }, + { + label: translations[2], + backgroundColor: 'rgba(220,220,220,0.2)', + borderColor: 'rgba(220,220,220,1)', + pointBackgroundColor: 'rgba(220,220,220,1)', + pointHoverBackgroundColor: '#fff', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(220,220,220,1)', + data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }, + { + label: translations[3], + backgroundColor: 'rgba(220,220,220,0.2)', + borderColor: 'rgba(220,220,220,1)', + pointBackgroundColor: 'rgba(220,220,220,1)', + pointHoverBackgroundColor: '#fff', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(220,220,220,1)', + data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }, + { + label: translations[4], backgroundColor: 'rgba(151,187,205,0.2)', borderColor: 'rgba(151,187,205,1)', pointBackgroundColor: 'rgba(151,187,205,1)', @@ -215,7 +248,7 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator', 'benchpress' position: 'right', scaleLabel: { display: true, - labelString: translations[1], + labelString: translations[4], }, }], }, @@ -415,7 +448,10 @@ define('admin/general/dashboard', ['semver', 'Chart', 'translator', 'benchpress' } graphs.traffic.data.datasets[0].data = data.pageviews; - graphs.traffic.data.datasets[1].data = data.uniqueVisitors; + graphs.traffic.data.datasets[1].data = data.pageviewsRegistered; + graphs.traffic.data.datasets[2].data = data.pageViewsGuest; + graphs.traffic.data.datasets[3].data = data.pageViewsBot; + graphs.traffic.data.datasets[4].data = data.uniqueVisitors; graphs.traffic.data.labels = graphs.traffic.data.xLabels; graphs.traffic.update(); diff --git a/src/analytics.js b/src/analytics.js index 1c7479e6c2..e25c948bf9 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -14,6 +14,9 @@ var Analytics = module.exports; var counters = {}; var pageViews = 0; +var pageViewsRegistered = 0; +var pageViewsGuest = 0; +var pageViewsBot = 0; var uniqueIPCount = 0; var uniquevisitors = 0; @@ -51,6 +54,14 @@ Analytics.increment = function (keys, callback) { Analytics.pageView = function (payload) { pageViews += 1; + if (payload.uid > 0) { + pageViewsRegistered += 1; + } else if (payload.uid < 0) { + pageViewsBot += 1; + } else { + pageViewsGuest += 1; + } + if (payload.ip) { // Retrieve hash or calculate if not present let hash = ipCache.get(payload.ip + nconf.get('secret')); @@ -92,6 +103,24 @@ Analytics.writeData = function (callback) { pageViews = 0; } + if (pageViewsRegistered > 0) { + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:registered', pageViewsRegistered, today.getTime())); + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:month:registered', pageViewsRegistered, month.getTime())); + pageViewsRegistered = 0; + } + + if (pageViewsGuest > 0) { + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:guest', pageViewsGuest, today.getTime())); + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:month:guest', pageViewsGuest, month.getTime())); + pageViewsGuest = 0; + } + + if (pageViewsBot > 0) { + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:bot', pageViewsBot, today.getTime())); + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:pageviews:month:bot', pageViewsBot, month.getTime())); + pageViewsBot = 0; + } + if (uniquevisitors > 0) { dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:uniquevisitors', uniquevisitors, today.getTime())); uniquevisitors = 0; diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index c13132c973..bb9fe37202 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -291,22 +291,23 @@ SocketAdmin.analytics.get = function (socket, data, callback) { data.amount = 24; } } - + const getStats = data.units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet; if (data.graph === 'traffic') { async.parallel({ uniqueVisitors: function (next) { - if (data.units === 'days') { - analytics.getDailyStatsForSet('analytics:uniquevisitors', data.until || Date.now(), data.amount, next); - } else { - analytics.getHourlyStatsForSet('analytics:uniquevisitors', data.until || Date.now(), data.amount, next); - } + getStats('analytics:uniquevisitors', data.until || Date.now(), data.amount, next); }, pageviews: function (next) { - if (data.units === 'days') { - analytics.getDailyStatsForSet('analytics:pageviews', data.until || Date.now(), data.amount, next); - } else { - analytics.getHourlyStatsForSet('analytics:pageviews', data.until || Date.now(), data.amount, next); - } + getStats('analytics:pageviews', data.until || Date.now(), data.amount, next); + }, + pageViewsRegistered: function (next) { + getStats('analytics:pageviews:registered', data.until || Date.now(), data.amount, next); + }, + pageViewsGuest: function (next) { + getStats('analytics:pageviews:guest', data.until || Date.now(), data.amount, next); + }, + pageViewsBot: function (next) { + getStats('analytics:pageviews:bot', data.until || Date.now(), data.amount, next); }, summary: function (next) { analytics.getSummary(next);