X-Git-Url: https://gitweb.ps.run/lolstats/blobdiff_plain/6925fed704a39c55e4af58074e6f616519bd94c5..f90d1d07b1f0042f66d924596ec6e2370ad97b2c:/index.js diff --git a/index.js b/index.js index 3cc465e..e9cc8c5 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,16 @@ const express = require("express") -const JavaScriptObfuscator = require("javascript-obfuscator"); 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"], @@ -10,36 +18,121 @@ let rules = [ ["/lol/style.css", "style.css"], ]; -let obfuscateJs = false; - -function obfuscate(data) { - let obfResult = JavaScriptObfuscator.obfuscate( - String(data), - { - compact: true, - identifierNamesGenerator: "mangled", - } - ); - - return obfResult.getObfuscatedCode(); -} - for (i in rules) { let path = rules[i][0]; let file = rules[i][1]; app.get(path, (req, res) => { - if (file.endsWith(".js") && obfuscateJs) { - fs.readFile("html/" + file, (err, data) => { - if (err) throw err; - - let obf = obfuscate(data); - res.send(obf); - }); - } else { - res.sendFile(__dirname + "/html/" + file); - } + 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)