-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmovejsons.js
104 lines (94 loc) · 3.43 KB
/
movejsons.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
scan the directory configured in cfg.json as "loader.jsondir" and move all *.json[.gz] files
based on their GAME_TIMESTAMP into subdirectories named YYYY-MM/DD/
*/
'use strict';
var
fs = require('graceful-fs'),
log4js = require('log4js'),
zlib = require('zlib'),
Q = require('q');
var LOGLEVEL = log4js.levels.INFO;
var __dirname; // current working directory (defined by node.js)
var _logger; // log4js logger
var _config; // config data from cfg.json file
var _progress = 0; // counter for already moved files
var _dirCache = {}; // dirname -> true, if a directory was already created
main();
function main() {
var data = fs.readFileSync(__dirname + '/cfg.json');
_config = JSON.parse(data);
Q.longStackSupport = false;
_logger = log4js.getLogger("loader");
_logger.setLevel(LOGLEVEL);
return Q
.nfcall(fs.readdir, _config.loader.jsondir)
.then(function (files) {
_logger.info("Processing " + files.length + " files");
setInterval(function () { _logger.info(_progress + " files processed"); }, 10000);
var tasks = files.map(function (file) {
return function () { return processFile(_config.loader.jsondir, file); }
});
return tasks.reduce(Q.when, Q(undefined));
})
.then(function () { _logger.info("completed"); process.exit(); })
.done();
}
function processFile(dir, file) {
var defer = Q.defer();
if (!file.match(/.json(.gz)?$/))
return file;
var isGzip = file.slice(-3) == ".gz";
//_logger.debug("Moving " + file);
Q
.nfcall(fs.readFile, dir + file)
.then(function (data) { return isGzip ? Q.nfcall(zlib.gunzip, data) : data; })
.then(function (json) {
++_progress;
var game = JSON.parse(json);
if (!game.PUBLIC_ID || !game.GAME_TIMESTAMP) {
_logger.warn(file + ": no PUBLIC_ID or GAME_TIMESTAMP in json data. File was ignored.");
defer.resolve(file);
return file;
}
processGame(dir, file, game)
.then(defer.resolve(file));
})
.catch(function (err) { _logger.error(file + ": " + err); defer.resolve(file); })
//.finally(function() { _logger.debug("finished " + file); })
;
return defer.promise;
}
function processGame(dir, file, game) {
// JSONs loaded from match profiles contain "mm/dd/yyyy h:MM a" format, live tracker contains unixtime int data
var GAME_TIMESTAMP = game.GAME_TIMESTAMP; // can be either a number, an Object-number, a string, ...
if (GAME_TIMESTAMP.indexOf("/") >= 0) {
GAME_TIMESTAMP = new Date(GAME_TIMESTAMP).getTime() / 1000;
}
var date = new Date(GAME_TIMESTAMP * 1000);
if (date.getFullYear() == NaN)
return Q(function () { _logger.warn(file + ": can't parse GAME_TIMESTAMP value " + game.GAME_TIMESTAMP); });
var dirName1 = dir + date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).slice(-2);
var dirName2 = dirName1 + "/" + ("0" + date.getDate()).slice(-2);
return createDir(dirName1)
.then(createDir(dirName2))
.then(function () {
return Q.nfcall(fs.rename, dir + file, dirName2 + "/" + file);
})
.fail(function (err) { _logger.error("Can't move " + file + ": " + err); });
}
function createDir(dir) {
if (_dirCache[dir])
return Q(dir);
var defer = Q.defer();
// fs.mkdir returns an error when the directory already exists
fs.mkdir(dir, function (err) {
if (err && err.code != "EEXIST")
defer.reject(err);
else {
_dirCache[dir] = true;
defer.resolve(dir);
}
});
return defer.promise;
}