You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/analytics.js

67 lines
1.4 KiB
JavaScript

'use strict';
var cronJob = require('cron').CronJob,
db = require('./database');
(function(Analytics) {
var pageViews = 0;
var uniqueIPCount = 0;
var uniquevisitors = 0;
new cronJob('*/10 * * * *', function() {
Analytics.writeData();
}, null, true);
Analytics.pageView = function(ip) {
++pageViews;
if (ip) {
db.sortedSetScore('ip:recent', ip, function(err, score) {
if (err) {
return;
}
if (!score) {
++uniqueIPCount;
}
var today = new Date();
today.setHours(today.getHours(), 0, 0, 0);
if (!score || score < today.getTime()) {
++uniquevisitors;
db.sortedSetAdd('ip:recent', Date.now(), ip);
}
});
}
};
Analytics.writeData = function() {
var today;
if (pageViews > 0 || uniquevisitors > 0) {
today = new Date();
today.setHours(today.getHours(), 0, 0, 0);
}
if (pageViews > 0) {
db.sortedSetIncrBy('analytics:pageviews', pageViews, today.getTime());
var month = new Date();
month.setMonth(month.getMonth(), 1);
month.setHours(0, 0, 0, 0);
db.sortedSetIncrBy('analytics:pageviews:month', pageViews, month.getTime());
pageViews = 0;
}
if (uniquevisitors > 0) {
db.sortedSetIncrBy('analytics:uniquevisitors', uniquevisitors, today.getTime());
uniquevisitors = 0;
}
if (uniqueIPCount > 0) {
db.incrObjectFieldBy('global', 'uniqueIPCount', uniqueIPCount);
uniqueIPCount = 0;
}
};
}(exports));