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

93 lines
1.9 KiB

/* Copies old threads to the archive board.
* Run this in parallel with the main server.
*/
var config = require('../config'),
db = require('../db'),
winston = require('winston');
// Load hooks
require('../imager');
require('../server/amusement');
var yaku;
function connect() {
var r;
if (!yaku) {
yaku = new db.Yakusoku('archive', db.UPKEEP_IDENT);
r = yaku.connect();
r.on('error', function (err) {
winston.error(err);
process.exit(1);
});
}
else
r = yaku.connect();
return r;
}
function at_next_minute(func) {
var now = Date.now();
var inFive = new Date(now + 5000);
var nextMinute = inFive.getTime();
var ms = inFive.getMilliseconds(), s = inFive.getSeconds();
if (ms > 0) {
nextMinute += 1000 - ms;
s++;
}
if (s > 0 && s < 60)
nextMinute += (60 - s) * 1000;
var delay = nextMinute - now;
return setTimeout(func, delay);
}
var CLEANING_LIMIT = 10; // per minute
function clean_up() {
var r = connect();
var expiryKey = db.expiry_queue_key();
var now = Math.floor(Date.now() / 1000);
r.zrangebyscore(expiryKey, 1, now, 'limit', 0, CLEANING_LIMIT,
function (err, expired) {
if (err) {
winston.error(err);
return;
}
expired.forEach(function (entry) {
var m = entry.match(/^(\d+):/);
if (!m)
return;
var op = parseInt(m[1], 10);
if (!op)
return;
yaku.archive_thread(op, function (err) {
if (err)
return winston.error(err);
r.zrem(expiryKey, entry, function (err, n) {
if (err)
return winston.error(err)
winston.info("Archived thread #" + op);
if (n != 1)
winston.warn("Not archived?");
});
});
});
});
at_next_minute(clean_up);
}
if (require.main === module) process.nextTick(function () {
connect();
var args = process.argv;
if (args.length == 3) {
yaku.archive_thread(parseInt(args[2], 10), function (err) {
if (err)
throw err;
process.exit(0);
});
}
at_next_minute(clean_up);
});