summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2017-04-29 22:41:35 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2017-04-29 22:41:35 +0200
commit9a328db2b102e7235ef6d3337d39d67f4e81dc76 (patch)
treea34a4f8a62c050c101af0d46e58419c60dfeba3e
parent95a64ae924ef6506dba3760ed7a334e568e96681 (diff)
downloadbridge-9a328db2b102e7235ef6d3337d39d67f4e81dc76.tar.gz
bridge-9a328db2b102e7235ef6d3337d39d67f4e81dc76.zip
make tournament & brawl API dynamic
-rw-r--r--index.html13
-rw-r--r--server.js83
2 files changed, 57 insertions, 39 deletions
diff --git a/index.html b/index.html
index fbbc5b0..c0716b8 100644
--- a/index.html
+++ b/index.html
@@ -11,6 +11,8 @@
<label for="update-force">Force refresh</label>
<input type="checkbox" id="update-brawl">
<label for="update-brawl">Get Brawls</label>
+ <input type="checkbox" id="update-tournament">
+ <label for="update-tournament">Get Privates (Tournaments)</label>
<input type="submit" value="Update">
</form>
</p>
@@ -105,15 +107,18 @@
e.preventDefault();
const ign = $("#update-name").val(),
force = $("#update-force").is(":checked"),
- brawls = $("#update-brawl").is(":checked");
+ brawls = $("#update-brawl").is(":checked"),
+ tournament = $("#update-tournament").is(":checked");
if (force) {
$.post("/api/player/" + ign + "/search");
} else {
- if (!brawls)
- $.post("/api/player/" + ign + "/update");
+ if (brawls)
+ $.post("/api/player/" + ign + "/update/brawl");
+ else if (tournament)
+ $.post("/api/player/" + ign + "/update/tournament");
else
- $.post("/api/player/" + ign + "/update-brawl");
+ $.post("/api/player/" + ign + "/update");
}
});
$("#update-region-form").submit((e) => {
diff --git a/server.js b/server.js
index e93e405..8363351 100644
--- a/server.js
+++ b/server.js
@@ -75,29 +75,52 @@ if (LOGGLY_TOKEN)
server.listen(8880);
app.use(express.static("assets"));
+// convenience mapping
+// `category`: "regular", "brawl", "tournament"
+// TODO refactor this
+function gameModesForCategory(category) {
+ switch (category) {
+ case "regular": return "casual,ranked";
+ case "brawl": return "casual_aral,blitz_pvp_ranked";
+ case "tournament": return "private,private_party_draft_match";
+ default: logger.error("unsupported game mode category",
+ { category: category });
+ }
+}
+
+// convenience function to sort into the right grab queue
+function queueForCategory(category) {
+ switch (category) {
+ case "regular": return "grab";
+ case "brawl": return "grab_brawl";
+ case "tournament": return "grab_tournament";
+ default: logger.error("unsupported game mode category",
+ { category: category });
+ }
+}
+
// request grab jobs for a player's matches
-async function grabPlayer(name, region, last_match_created_date, id, gameModes) {
+async function grabPlayer(name, region, last_match_created_date, id, category) {
last_match_created_date = last_match_created_date || new Date(0);
// add 1s, because createdAt-start <= x <= createdAt-end
// so without the +1s, we'd always get the last_match_created_date match back
last_match_created_date.setSeconds(last_match_created_date.getSeconds() + 1);
- const modes = (gameModes == "brawl") ? "blitz_pvp_ranked,casual_aral" : "casual,ranked",
- payload = {
+ const payload = {
"region": region,
"params": {
"filter[playerIds]": id,
"filter[createdAt-start]": last_match_created_date.toISOString(),
- "filter[gameMode]": modes,
+ "filter[gameMode]": gameModesForCategory(category),
"sort": "-createdAt"
}
};
logger.info("requesting update", { name: name, region: region });
// TODO make this more dynamic
- const queue = (gameModes == "brawl") ? "grab_brawl" : "grab";
- await ch.sendToQueue(queue, new Buffer(JSON.stringify(payload)), {
+ await ch.sendToQueue(queueForCategory(category),
+ new Buffer(JSON.stringify(payload)), {
persistent: true,
type: "matches",
headers: { notify: "player." + name }
@@ -231,25 +254,27 @@ async function searchPlayer(name) {
}
// return the fitting db connection based on game mode
-// gameModes is an enum (brawl, regular, tournament)
-function databaseForMode(gameModes) {
- if (gameModes == "brawl")
+// `category` is an enum (brawl, regular, tournament)
+function databaseForCategory(category) {
+ if (category == "brawl")
return modelBrawl;
- if (gameModes == "tournament")
+ if (category == "tournament")
return modelTournament;
- return model;
+ if (category == "regular")
+ return model;
+ logger.error("unsupported category", { category: category });
}
// update a player from API based on db record
// & grab player
-async function updatePlayer(player, gameModes) {
+async function updatePlayer(player, category) {
// set last_update and request an update job
// if last_update is null, we need that player's full history
let grabstart;
if (player.get("last_update") == null) grabstart = undefined;
else {
- const last_match = await databaseForMode(gameModes).Participant.findOne({
- where: { player_api_id: player.get("api_id"), },
+ const last_match = await databaseForCategory(category).Participant.findOne({
+ where: { player_api_id: player.get("api_id") },
attributes: ["created_at"],
order: [ [seq.col("created_at"), "DESC"] ]
});
@@ -267,13 +292,13 @@ async function updatePlayer(player, gameModes) {
// (with a name change)
await Promise.map(players, (p) =>
grabPlayer(p.attributes.name, p.attributes.shardId,
- grabstart, p.id, gameModes));
+ grabstart, p.id, category));
}
// update a region from API based on db records
-async function updateRegion(region, gameModes) {
+async function updateRegion(region, category) {
let grabstart;
- const last_match = await databaseForMode(gameModes).Participant.findOne({
+ const last_match = await databaseForCategory(category).Participant.findOne({
attributes: ["created_at"],
order: [ [seq.col("created_at"), "DESC"] ]
});
@@ -403,31 +428,19 @@ app.post("/api/player/:name/search", async (req, res) => {
});
// update a known user
// flow:
-// * get from db
+// * get from db (depending on category, either regular, brawl or tourn)
// * update lifetime from `/players` via id, catch IGN changes
// * update from `/matches`
-app.post("/api/player/:name/update", async (req, res) => {
- let player = await model.Player.findOne({ where: { name: req.params.name } });
- if (player == undefined) {
- logger.warn("player not found in db, searching instead", { name: req.params.name });
- searchPlayer(req.params.name); // fire away
- res.sendStatus(204);
- return;
- }
- logger.info("player in db, updating", { name: req.params.name });
- updatePlayer(player, "regular"); // fire away
- res.sendStatus(204);
-});
-// get brawls for a known user
-app.post("/api/player/:name/update-brawl", async (req, res) => {
- let player = await model.Player.findOne({ where: { name: req.params.name } });
+app.post("/api/player/:name/update/:category*?", async (req, res) => {
+ const name = req.params.name, category = req.params.category || "regular",
+ player = await model.Player.findOne({ where: { name: req.params.name } });
if (player == undefined) {
logger.error("player not found in db", { name: req.params.name });
res.sendStatus(404);
return;
}
- logger.info("player in db, updating brawls", { name: req.params.name });
- updatePlayer(player, "brawl"); // fire away
+ logger.info("player in db, updating", { name: name, category: category });
+ updatePlayer(player, category); // fire away
res.sendStatus(204);
});
// crunch a known user