const express = require("express") const fs = require("fs") const request = require("request-promise-native") const app = express() const port = 3000 const sleep = require('util').promisify(setTimeout) const patch = "8.24.1"; const key = "RGAPI-c6cae96a-c4b0-4842-9017-ddd736f3f628"; let appRateLimit1; let appRateLimit120; let appRateLimitCount1; let appRateLimitCount120; let rules = [ ["/lol", "index.html"], ["/lol/script.js", "script.js"], ["/lol/style.css", "style.css"], ]; for (i in rules) { let path = rules[i][0]; let file = rules[i][1]; app.get(path, (req, res) => { res.sendFile(__dirname + "/html/" + file); }); } async function riotRequest(region, url, params, retries) { if (retries < 1) throw "Error too many tries"; let req = "https://" + regions[region] + url + "?api_key=" + key; for (p in params) { req += "&" + p + "=" + params[p]; } try { let result = await request({uri: req, resolveWithFullResponse: true, json: true}); let appRateLimit = result.headers["x-app-rate-limit"]; let appRateLimitCount = result.headers["x-app-rate-limit-count"]; appRateLimit1 = appRateLimit.split(",")[0].split(":")[0]; appRateLimit120 = appRateLimit.split(",")[1].split(":")[0]; appRateLimitCount1 = appRateLimitCount.split(",")[0].split(":")[0]; appRateLimitCount120 = appRateLimitCount.split(",")[1].split(":")[0]; let delay1 = 1000 / (appRateLimit1 - 1); let delay120 = 120000 / (appRateLimit120 - 1); await sleep(Math.max(delay1, delay120)); console.log(Math.max(delay1, delay120)); return result.body; } catch (err) { console.log(err.message); return await riotRequest(region, url, params, retries - 1); } } async function getAllMatches(region, accountId) { let matches = []; let totalGames; let bI = 0, eI = 99; do { let m = await riotRequest(region, "/lol/match/v4/matchlists/by-account/" + accountId, { beginIndex: bI, endIndex: eI }, 5); console.log(m); totalGames = m.totalGames; matches = matches.concat(m.matches); console.log("Added games " + bI + " to " + eI + ", " + matches.length + " of " + totalGames); bI = eI + 1; eI += 100; } while (bI <= totalGames); return matches; } // Static Data // ----------- const regions = { "BR": "br1.api.riotgames.com", "EUNE": "eun1.api.riotgames.com", "EUW": "euw1.api.riotgames.com", "JP": "jp1.api.riotgames.com", "KR": "kr.api.riotgames.com", "LAN": "la1.api.riotgames.com", "LAS": "la2.api.riotgames.com", "NA": "na1.api.riotgames.com", "OCE": "oc1.api.riotgames.com", "TR": "tr1.api.riotgames.com", "RU": "ru.api.riotgames.com", "PBE": "pbe1.api.riotgames.com", }; app.get("/lol/regions", (req, res) => { res.send(JSON.stringify(regions)); }); let champions = null; function getChampions(cb) { request("http://ddragon.leagueoflegends.com/cdn/" + patch + "/data/en_US/champion.json", (err, res, body) => { champions = JSON.parse(body).data; cb(); }); } app.get("/lol/champions", (req, res) => { if (champions == null) getChampions(() => { res.send(JSON.stringify(Object.keys(champions))); }); else res.send(JSON.stringify(Object.keys(champions))); }); let users = {}; if (fs.existsSync("users.js")) { fs.readFile("users.js", (err, data) => { users = JSON.parse(data); }); } app.get("/lol/matches", async (req, res) => { let region = req.query.region; let summoner = req.query.summoner; let regionUrl = regions[region]; try { let data = await riotRequest(region, "/lol/summoner/v4/summoners/by-name/" + summoner, {}, 5); let accountId = data.accountId; if (users[accountId]) { res.send(JSON.stringify(users[accountId])); return; } let matches = await getAllMatches(region, accountId); users[accountId] = matches; fs.writeFile("users.js", JSON.stringify(users), (err) => { console.log("Error writing file: " + err); }); res.send(matches); } catch (err) { console.log(err); } }); // ----------- app.listen(port, () => { console.log("Listening on port %d", port) });