diff --git a/public/language/en-GB/admin/settings/activitypub.json b/public/language/en-GB/admin/settings/activitypub.json index df2f7423af..7933b2024d 100644 --- a/public/language/en-GB/admin/settings/activitypub.json +++ b/public/language/en-GB/admin/settings/activitypub.json @@ -68,5 +68,8 @@ "analytics.intro": "From this page you can view the state of your instance's federation with other servers", "analytics.by-hostname": "Filter by Hostname", "analytics.received": "Received Activities", - "analytics.sent": "Sent Activites" + "analytics.sent": "Sent Activites", + "analytics.term": "Time scale", + "analytics.hourly": "Hourly", + "analytics.daily": "Daily" } \ No newline at end of file diff --git a/public/src/admin/federation/analytics.js b/public/src/admin/federation/analytics.js index dfbd811110..651cd78375 100644 --- a/public/src/admin/federation/analytics.js +++ b/public/src/admin/federation/analytics.js @@ -21,21 +21,40 @@ Chart.register( Filler ); +let charts; +const labels = new Map([ + ['hourly', utils.getHoursArray().map(function (text, idx) { + return idx % 3 ? '' : text; + })], + ['daily', utils.getDaysArray().map(function (text, idx) { + return idx % 3 ? '' : text; + })], +]); + export function init() { - const charts = initializeCharts(); + charts = initializeCharts(); const hostFilterEl = document.getElementById('hostFilter'); + const termEl = document.getElementById('term'); if (hostFilterEl) { - hostFilterEl.addEventListener('change', async function () { - const data = await get(`/api${ajaxify.data.url}?host=${this.value}`); - - ['received', 'sent'].forEach((name) => { - const chart = charts.get(name); - chart.data.datasets[0].data = data[name]; - chart.update(); - }); - }); + hostFilterEl.addEventListener('change', updateCharts); } + if (termEl) { + termEl.addEventListener('change', updateCharts); + } +} + +async function updateCharts() { + const hostFilterEl = document.getElementById('hostFilter'); + const termEl = document.getElementById('term'); + const data = await get(`/api${ajaxify.data.url}?host=${hostFilterEl.value}&term=${termEl.value}`); + + ['received', 'sent'].forEach((name) => { + const chart = charts.get(name); + chart.data.labels = labels.get(termEl.value || 'hourly'); + chart.data.datasets[0].data = data[name]; + chart.update(); + }); } function initializeCharts() { @@ -43,12 +62,6 @@ function initializeCharts() { const sentCanvas = document.getElementById('sent'); // const topicsCanvas = document.getElementById('topics:daily'); // const postsCanvas = document.getElementById('posts:daily'); - const hourlyLabels = utils.getHoursArray().map(function (text, idx) { - return idx % 3 ? '' : text; - }); - // const dailyLabels = utils.getDaysArray().map(function (text, idx) { - // return idx % 3 ? '' : text; - // }); if (utils.isMobile()) { Chart.defaults.plugins.tooltip.enabled = false; @@ -64,7 +77,7 @@ function initializeCharts() { const data = { 'received': { - labels: hourlyLabels, + labels: labels.get('hourly'), datasets: [ { ...commonDataSetOpts, @@ -77,7 +90,7 @@ function initializeCharts() { ], }, 'sent': { - labels: hourlyLabels, + labels: labels.get('hourly'), datasets: [ { ...commonDataSetOpts, diff --git a/src/controllers/admin/federation.js b/src/controllers/admin/federation.js index 8975de5dc8..661d029949 100644 --- a/src/controllers/admin/federation.js +++ b/src/controllers/admin/federation.js @@ -56,14 +56,20 @@ federationController.safety = async function (req, res) { federationController.analytics = async function (req, res) { const instances = await activitypub.instances.list(); - let { host } = req.query; + let { host, term } = req.query; if (!instances.includes(host)) { host = undefined; } + let method = 'getHourlyStatsForSet'; + let count = 24; + if (term === 'daily') { + method = 'getDailyStatsForSet'; + count = 30; + } const set = host ? `activities:byHost:${host}` : 'activities'; const sentSet = host ? `ap.out:byHost:${host}` : 'ap:out'; - const received = await analytics.getHourlyStatsForSet(set, Date.now(), 24); - const sent = await analytics.getHourlyStatsForSet(sentSet, Date.now(), 24); + const received = await analytics[method](set, Date.now(), count); + const sent = await analytics[method](sentSet, Date.now(), count); res.render('admin/federation/analytics', { title: '[[admin/menu:federation/analytics]]', diff --git a/src/views/admin/federation/analytics.tpl b/src/views/admin/federation/analytics.tpl index 77c07215b8..01011731ca 100644 --- a/src/views/admin/federation/analytics.tpl +++ b/src/views/admin/federation/analytics.tpl @@ -6,14 +6,23 @@

[[admin/settings/activitypub:analytics.intro]]

- -
- +
+
+ + +
+
+ + +