+// User functionality
+// ------------------
+let users = {};
+let nameLookup = {};
+
+async function loadUserDb(region, accountId) {
+ if (!users[region]) users[region] = {};
+ if (users[region][accountId]) return;
+ let adapter = new FileAsync("data/" + region + "/" + accountId + ".json");
+ let db = await low(adapter);
+ await db.defaults({ games: [], gameSummaries: [], account: {} })
+ .write();
+ users[region][accountId] = db;
+}
+
+async function loadUserInfo(region, summonerName) {
+ if (!nameLookup[region]) nameLookup[region] = {};
+ if (nameLookup[region][summonerName]) return;
+ let user = await riotRequest(region, "/lol/summoner/v4/summoners/by-name/" + summonerName, {}, 5);
+ let accountId = user.accountId;
+ await loadUserDb(region, accountId);
+ users[region][accountId].set("account", user);
+ nameLookup[region][summonerName] = accountId;
+}
+
+async function loadGameSummaries(region, accountId) {
+ let totalGames;
+ let bI = 0, eI = 100;
+
+ loop1:
+ do {
+ let matchlist = await riotRequest(region, "/lol/match/v4/matchlists/by-account/" + accountId, { beginIndex: bI, endIndex: eI }, 5);
+ totalGames = matchlist.totalGames;
+ for (m in matchlist.matches) {
+ let match = matchlist.matches[m];
+ if (users[region][accountId].get("gameSummaries").find({ gameId: match.gameId }).value()) {
+ break loop1;
+ }
+ users[region][accountId].get("gameSummaries").push(match).write();
+ }
+ bI = eI;
+ eI += 100;
+ } while (bI <= totalGames);
+ users[region][accountId].write();
+ users[region][accountId].set("gameSummaries",
+ users[region][accountId].get("gameSummaries").sortBy("timestamp").sortedUniqBy((x) => x.gameId).value()).write();
+}
+
+app.get("/lol/matches", async (req, res) => {
+ let region = req.query.region;
+ let summoner = req.query.summoner;
+ console.log("[Info] getting game summaries for " + summoner + " from " + region);
+ try {
+ await loadUserInfo(region, summoner);
+ let accountId = nameLookup[region][summoner];
+ await loadGameSummaries(region, accountId);
+ let matches = users[region][accountId].get("gameSummaries").value();
+ console.log(matches.length);
+ res.send(JSON.stringify(matches));
+ } catch (err) {
+ console.log("[Error] GET /lol/matches: " + err);
+ res.send("error");
+ }
+});
+// ------------------
+
+// Static Data
+// -----------
+let champions;
+let champLookup = {};
+function loadChampions() {
+ request("http://ddragon.leagueoflegends.com/cdn/" + patch + "/data/en_US/champion.json", (err, res, body) => {
+ if (err) console.log("[Error] loadChampions: " + err);
+ champions = JSON.parse(body).data;
+ for (c in champions) {
+ champLookup[champions[c].key] = c;