const fs = require("fs")
const request = require("request-promise-native")
-const sleep = require("util").promisify(setTimeout)
const low = require("lowdb")
const FileAsync = require("lowdb/adapters/FileAsync")
const patch = "8.24.1";
const key = "RGAPI-dce1850a-0954-4b1e-8072-77a26739f076";
-let appRateLimit1;
-let appRateLimit120;
+let appRateLimit1 = 10;
+let appRateLimit120 = 100;
let appRateLimitCount1;
let appRateLimitCount120;
"PBE": "pbe1.api.riotgames.com",
};
-async function riotRequest(region, url, params, retries) {
- if (retries < 1) throw "Error too many tries";
+let requests = [];
+
+async function executeRequest() {
+ if (requests.length > 0) {
+ let req = requests.shift();
+ if (req.retries < 1) req.rej();
+ else {
+ try {
+ console.log("[Info] request: " + req.url);
+ let result = await request({uri: req.url, 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];
+
+ if (typeof result.body == "object") req.res(result.body);
+ else req.res(JSON.parse(result.body));
+ } catch (err) {
+ console.log("[Error] riotRequest: " + err.message);
+ req.retries--;
+ requests.push(req);
+ }
+ }
+ }
+ let delay1 = 1000 / (appRateLimit1 - 1);
+ let delay120 = 120000 / (appRateLimit120 - 1);
+ setTimeout(executeRequest, Math.max(delay1, delay120));
+}
+executeRequest();
+async function riotRequest(region, url, params, retries) {
let req = "https://" + regions[region] + url + "?api_key=" + key;
for (p in params) {
req += "&" + p + "=" + params[p];
}
-
- try {
- console.log("[Info] request: " + req);
- 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));
-
- if (typeof result.body == "object") return result.body;
- return JSON.parse(result.body);
- } catch (err) {
- console.log("[Error] riotRequest: " + err.message);
- return await riotRequest(region, url, params, retries - 1);
- }
+ return new Promise((resolve, reject) => {
+ requests.push({ url: req, retries: 5, res: resolve, rej: reject });
+ });
}
// ----------------
async function loadUserDb(region, accountId) {
if (!users[region]) users[region] = {};
if (users[region][accountId]) return;
- let adapter = new FileAsync(region + "/" + accountId + ".json");
+ let adapter = new FileAsync("data/" + region + "/" + accountId + ".json");
let db = await low(adapter);
await db.defaults({ games: [], gameSummaries: [], account: {} })
.write();