forked from odota/core
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscanner.js
More file actions
208 lines (205 loc) · 6.42 KB
/
scanner.js
File metadata and controls
208 lines (205 loc) · 6.42 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
var utility = require('./utility');
var config = require('./config');
var getData = utility.getData;
var db = require('./db');
var redis = require('./redis');
var queue = require('./queue');
var addToQueue = queue.addToQueue;
var mQueue = queue.getQueue('mmr');
var logger = utility.logger;
var generateJob = utility.generateJob;
var async = require('async');
var insertMatch = require('./queries').insertMatch;
var queries = require('./queries');
var buildSets = require('./buildSets');
var constants = require('./constants');
var trackedPlayers;
var userPlayers;
// Used to create endpoint for monitoring
var express = require('express');
var moment = require('moment');
var app = express();
var port = config.PORT || config.SCANNER_PORT;
var startedAt = moment();
app.route("/").get(function(req, res)
{
redis.get("match_seq_num", function(err, result)
{
res.json(
{
started_at: startedAt.format(),
started_ago: startedAt.fromNow(),
match_seq_num: result || "NOT FOUND"
});
});
});
var server = app.listen(port, function()
{
var host = server.address().address;
console.log('[SCANNER] listening at http://%s:%s', host, port);
});
buildSets(db, redis, function(err)
{
if (err)
{
throw err;
}
start();
});
function start()
{
if (config.START_SEQ_NUM === "REDIS")
{
redis.get("match_seq_num", function(err, result)
{
if (err || !result)
{
console.log('failed to get match_seq_num from redis, retrying');
return setTimeout(start, 10000);
}
result = Number(result);
scanApi(result);
});
}
else if (config.START_SEQ_NUM)
{
scanApi(config.START_SEQ_NUM);
}
else
{
var container = generateJob("api_history",
{});
getData(container.url, function(err, data)
{
if (err)
{
console.log("failed to get sequence number from webapi");
return start();
}
scanApi(data.result.matches[0].match_seq_num);
});
}
}
function scanApi(seq_num)
{
var container = generateJob("api_sequence",
{
start_at_match_seq_num: seq_num
});
queries.getSets(redis, function(err, result)
{
if (err)
{
console.log("failed to getSets from redis");
return scanApi(seq_num);
}
//set local vars
trackedPlayers = result.trackedPlayers;
userPlayers = result.userPlayers;
getData(
{
url: container.url,
delay: Number(config.SCANNER_DELAY),
proxyAffinityRange: 4
}, function(err, data)
{
if (err)
{
return scanApi(seq_num);
}
var resp = data.result && data.result.matches ? data.result.matches : [];
var next_seq_num = seq_num;
if (resp.length)
{
next_seq_num = resp[resp.length - 1].match_seq_num + 1;
}
logger.info("[API] seq_num:%s, matches:%s", seq_num, resp.length);
async.each(resp, function(match, cb)
{
if (config.ENABLE_PRO_PARSING && match.leagueid)
{
//parse tournament games
match.parse_status = 0;
}
else if (match.players.some(function(p)
{
return (p.account_id in trackedPlayers);
}))
{
//queued
match.parse_status = 0;
}
else if (match.players.some(function(p)
{
return (config.ENABLE_INSERT_ALL_MATCHES || p.account_id in userPlayers);
}))
{
//skipped
match.parse_status = 3;
}
async.each(match.players, function(p, cb)
{
async.parallel(
{
"decideMmr": function(cb)
{
if (match.lobby_type === 7 && p.account_id !== constants.anonymous_account_id && (p.account_id in userPlayers || (config.ENABLE_RANDOM_MMR_UPDATE && match.match_id % 10 === 0)))
{
//could possibly pick up MMR change for matches we don't add, this is probably ok
addToQueue(mQueue,
{
match_id: match.match_id,
account_id: p.account_id
},
{
attempts: 1
}, cb);
}
else
{
cb();
}
}
}, cb);
}, function(err)
{
if (match.parse_status === 0 || match.parse_status === 3)
{
insertMatch(db, redis, match,
{
type: "api",
origin: "scanner",
}, close);
}
else
{
close(err);
}
function close(err)
{
if (err)
{
console.error("failed to insert match from scanApi %s", match.match_id);
console.error(err);
}
return cb(err);
}
});
}, function(err)
{
if (err)
{
//something bad happened, retry this page
console.error(err);
return scanApi(seq_num);
}
else
{
redis.set("match_seq_num", next_seq_num);
//completed inserting matches on this page
return scanApi(next_seq_num);
}
});
});
});
}