]> gitweb.ps.run Git - lolstats/blobdiff - index.js
users.hs koxnon
[lolstats] / index.js
index 2f251888db954f41339028a879d4af6714205d04..e9cc8c5a6c648f1b779b1188c82e5b666f19d3bf 100644 (file)
--- a/index.js
+++ b/index.js
 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 = [
-  ["/", "index.html"],
-  ["/script.js", "script.js"],
-  ["/style.css", "style.css"],
+  ["/lol", "index.html"],
+  ["/lol/script.js", "script.js"],
+  ["/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)