summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2017-05-12 15:20:14 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2017-05-12 15:20:14 +0200
commite2054f2fe6cd54d505679673cafdd47b43f2f1aa (patch)
tree6807cd60fc76d7da52910a8a570e0054cf9ee99f
parente7a8da644ea58fc5c79e77c40cf3919bc1684e73 (diff)
downloadbridge-e2054f2fe6cd54d505679673cafdd47b43f2f1aa.tar.gz
bridge-e2054f2fe6cd54d505679673cafdd47b43f2f1aa.zip
move api logic to orm
-rw-r--r--server.js116
1 files changed, 34 insertions, 82 deletions
diff --git a/server.js b/server.js
index 4679282..a5d745d 100644
--- a/server.js
+++ b/server.js
@@ -9,10 +9,10 @@ const amqp = require("amqplib"),
request = require("request-promise"),
express = require("express"),
http = require("http"),
- sleep = require("sleep-promise");
+ sleep = require("sleep-promise"),
+ api = require("../orm/api");
-const MADGLORY_TOKEN = process.env.MADGLORY_TOKEN,
- DATABASE_URI = process.env.DATABASE_URI,
+const DATABASE_URI = process.env.DATABASE_URI,
DATABASE_BRAWL_URI = process.env.DATABASE_BRAWL_URI,
DATABASE_TOURNAMENT_URI = process.env.DATABASE_TOURNAMENT_URI,
RABBITMQ_URI = process.env.RABBITMQ_URI || "amqp://localhost",
@@ -31,7 +31,6 @@ const MADGLORY_TOKEN = process.env.MADGLORY_TOKEN,
CRUNCH_QUEUE = process.env.CRUNCH_QUEUE || "crunch",
SAMPLE_QUEUE = process.env.SAMPLE_QUEUE || "sample",
CRUNCH_SHOVEL_SIZE = parseInt(process.env.CRUNCH_SHOVEL_SIZE) || 1000;
-if (MADGLORY_TOKEN == undefined) throw "Need an API token";
const app = express(),
server = http.Server(app),
@@ -126,7 +125,6 @@ async function grabPlayer(name, region, last_match_created_date, id, category) {
};
logger.info("requesting update", { name: name, region: region });
- // TODO make this more dynamic
await ch.sendToQueue(queueForCategory(category),
new Buffer(JSON.stringify(payload)), {
persistent: true,
@@ -159,83 +157,38 @@ async function grabMatches(region, last_match_created_date) {
});
}
-// return the body of an API request and log response times
-async function apiRequest(endpoint, shard, options) {
- let response;
- try {
- // find players by name
- const opts = {
- uri: "https://api.dc01.gamelockerapp.com/shards/" + shard + "/" + endpoint,
- headers: {
- "X-Title-Id": "semc-vainglory",
- "Authorization": MADGLORY_TOKEN
- },
- qs: options,
- json: true,
- gzip: true,
- time: true,
- forever: true,
- strictSSL: true,
- resolveWithFullResponse: true
- };
- logger.info("API request", { uri: opts.uri, qs: opts.qs });
- response = await request(opts);
- return response.body;
- } catch (err) {
- response = err.response;
- if (err.statusCode == 429) {
- logger.warn("rate limited, sleeping");
- await sleep(100); // no return, no break => retry
- } else if (err.statusCode != 404) logger.error(err);
- if (err.statusCode != 429) {
- logger.warn("not found", { region: shard, uri: err.options.uri,
- qs: err.options.qs, error: err.response.body });
- return undefined;
- }
- } finally {
- logger.info("API response",
- { status: response.statusCode, connection_start: response.timings.connect, connection_end: response.timings.end, ratelimit_remaining: parseInt(response.headers["x-ratelimit-remaining"]) });
- }
-}
-
// search for a player name in one region
// request process for lifetime
// return an array (JSONAPI response)
async function searchPlayerInRegion(region, name, id) {
- let response,
- players = [],
- found = false;
- while (true) {
- logger.info("searching", { name: name, id: id, region: region });
- let options = {};
- if (id == undefined) options["filter[playerNames]"] = name
- else options["filter[playerIds]"] = id
+ logger.info("searching", { name: name, id: id, region: region });
+ let options = {};
+ if (id == undefined) options["filter[playerNames]"] = name
+ else options["filter[playerIds]"] = id
- players = await apiRequest("players", region, options);
- if (players != undefined) {
+ // players.length and page length will be 1 in 99.9999% of all cases
+ // - but just in case.
+ const players = await Promise.map(await api.requests("players",
+ region, options, logger),
+ async (player) => {
logger.info("found", { name: name, id: id, region: region });
- found = true;
- break;
- } else {
- logger.warn("not found", { name: name, id: id, region: region });
- return [];
+ // notify web that data is being loaded
+ await ch.publish("amq.topic", "player." + name,
+ new Buffer("search_success"));
+ // send to processor, so the player is in db
+ // no matter whether we find matches or not
+ await ch.sendToQueue(PLAYER_PROCESS_QUEUE,
+ new Buffer(JSON.stringify(player)), {
+ persistent: true, type: "player",
+ headers: { notify: "player." + player.name }
+ });
+ return player;
}
- }
-
- if (!found) return [];
-
- // notify web that data is being loaded
- await ch.publish("amq.topic", "player." + name,
- new Buffer("search_success"));
- // players.length will be 1 in 99.9% of all cases
- // - but this will cover the 0.01% too
- //
- // send to processor, so the player is in db
- // no matter whether we find matches or not
- await ch.sendToQueue(PLAYER_PROCESS_QUEUE, new Buffer(JSON.stringify(players.data)),
- { persistent: true, type: "player" });
+ );
+ if (players.length == 0)
+ logger.warn("not found", { name: name, id: id, region: region });
- return players.data;
+ return players;
}
// search for player name on all shards
@@ -245,13 +198,12 @@ async function searchPlayer(name) {
let found = false;
logger.info("searching", { name: name });
await Promise.map(REGIONS, async (region) => {
- let players = await searchPlayerInRegion(region, name, undefined);
- if (players.length > 0)
- found = true;
+ const players = await searchPlayerInRegion(region, name, undefined);
+ if (players.length > 0) found = true;
// request grab jobs
await Promise.map(players, (p) =>
- grabPlayer(p.attributes.name, p.attributes.shardId,
+ grabPlayer(p.name, p.shardId,
defaultGrabstartForCategory("regular"), p.id, "regular"));
});
// notify web
@@ -315,8 +267,8 @@ async function updatePlayer(player, category) {
// search happened by ID, so we get only 1 player back
// but player.name != players[0].attributes.name
// (with a name change)
- await Promise.map(players, (p) =>
- grabPlayer(p.attributes.name, p.attributes.shardId,
+ await Promise.map(players, async (p) =>
+ await grabPlayer(p.name, p.shardId,
grabstart, p.id, category));
}
@@ -544,6 +496,6 @@ app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
-process.on("unhandledRejection", function(reason, promise) {
- logger.error(reason);
+process.on("unhandledRejection", err => {
+ logger.error("Uncaught Promise Error:", err.stack);
});