diff --git a/public/language/en-GB/admin/manage/ip-blacklist.json b/public/language/en-GB/admin/manage/ip-blacklist.json index 5106434351..cd79294266 100644 --- a/public/language/en-GB/admin/manage/ip-blacklist.json +++ b/public/language/en-GB/admin/manage/ip-blacklist.json @@ -11,5 +11,8 @@ "validate.x-valid": "%1 out of %2 rule(s) valid.", "validate.x-invalid": "The following %1 rules are invalid:", - "alerts.applied-success": "Blacklist Applied" + "alerts.applied-success": "Blacklist Applied", + + "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", + "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day" } \ No newline at end of file diff --git a/public/src/admin/manage/ip-blacklist.js b/public/src/admin/manage/ip-blacklist.js index 0b565325d7..4b5b37ce11 100644 --- a/public/src/admin/manage/ip-blacklist.js +++ b/public/src/admin/manage/ip-blacklist.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/manage/ip-blacklist', [], function () { +define('admin/manage/ip-blacklist', ['Chart'], function (Chart) { var Blacklist = {}; Blacklist.init = function () { @@ -37,6 +37,100 @@ define('admin/manage/ip-blacklist', [], function () { }); }); }); + + Blacklist.setupAnalytics(); + }; + + Blacklist.setupAnalytics = function () { + var hourlyCanvas = document.getElementById('blacklist:hourly'); + var dailyCanvas = document.getElementById('blacklist:daily'); + var hourlyLabels = utils.getHoursArray().map(function (text, idx) { + return idx % 3 ? '' : text; + }); + var dailyLabels = utils.getDaysArray().map(function (text, idx) { + return idx % 3 ? '' : text; + }); + + // Only 7 days displayed in this chart + dailyLabels.length = 7; + + if (utils.isMobile()) { + Chart.defaults.global.tooltips.enabled = false; + } + + var data = { + 'blacklist:hourly': { + labels: hourlyLabels, + datasets: [ + { + label: '', + backgroundColor: 'rgba(186,139,175,0.2)', + borderColor: 'rgba(186,139,175,1)', + pointBackgroundColor: 'rgba(186,139,175,1)', + pointHoverBackgroundColor: '#fff', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(186,139,175,1)', + data: ajaxify.data.analytics.hourly, + }, + ], + }, + 'blacklist:daily': { + labels: dailyLabels, + datasets: [ + { + label: '', + backgroundColor: 'rgba(151,187,205,0.2)', + borderColor: 'rgba(151,187,205,1)', + pointBackgroundColor: 'rgba(151,187,205,1)', + pointHoverBackgroundColor: '#fff', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(151,187,205,1)', + data: ajaxify.data.analytics.daily, + }, + ], + }, + }; + + hourlyCanvas.width = $(hourlyCanvas).parent().width(); + dailyCanvas.width = $(dailyCanvas).parent().width(); + + new Chart(hourlyCanvas.getContext('2d'), { + type: 'line', + data: data['blacklist:hourly'], + options: { + responsive: true, + animation: false, + legend: { + display: false, + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true, + }, + }], + }, + }, + }); + + new Chart(dailyCanvas.getContext('2d'), { + type: 'line', + data: data['blacklist:daily'], + options: { + responsive: true, + animation: false, + legend: { + display: false, + }, + scales: { + yAxes: [{ + ticks: { + beginAtZero: true, + }, + }], + }, + }, + }); }; return Blacklist; diff --git a/src/analytics.js b/src/analytics.js index 711eadc865..b4922cf184 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -211,3 +211,9 @@ Analytics.getErrorAnalytics = function (callback) { }, callback); }; +Analytics.getBlacklistAnalytics = function (callback) { + async.parallel({ + daily: async.apply(Analytics.getDailyStatsForSet, 'analytics:blacklist', Date.now(), 7), + hourly: async.apply(Analytics.getHourlyStatsForSet, 'analytics:blacklist', Date.now(), 24), + }, callback); +}; diff --git a/src/controllers/admin/blacklist.js b/src/controllers/admin/blacklist.js index fb92f377b5..a5f8136463 100644 --- a/src/controllers/admin/blacklist.js +++ b/src/controllers/admin/blacklist.js @@ -2,19 +2,22 @@ var async = require('async'); var meta = require('../../meta'); +var analytics = require('../../analytics'); var blacklistController = module.exports; blacklistController.get = function (req, res, next) { - async.waterfall([ - function (next) { - meta.blacklist.get(next); - }, - function (rules) { - res.render('admin/manage/ip-blacklist', { - rules: rules, - title: '[[pages:ip-blacklist]]', - }); - }, - ], next); + // Analytics.getBlacklistAnalytics + async.parallel({ + rules: async.apply(meta.blacklist.get), + analytics: async.apply(analytics.getBlacklistAnalytics), + }, function (err, data) { + if (err) { + return next(err); + } + + res.render('admin/manage/ip-blacklist', Object.assign(data, { + title: '[[pages:ip-blacklist]]', + })); + }); }; diff --git a/src/views/admin/manage/ip-blacklist.tpl b/src/views/admin/manage/ip-blacklist.tpl index 8ec7e72733..e2378e5e5c 100644 --- a/src/views/admin/manage/ip-blacklist.tpl +++ b/src/views/admin/manage/ip-blacklist.tpl @@ -7,6 +7,25 @@ [[admin/manage/ip-blacklist:description]]
+