diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2017-04-29 22:41:35 +0200 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2017-04-29 22:41:35 +0200 |
| commit | 9a328db2b102e7235ef6d3337d39d67f4e81dc76 (patch) | |
| tree | a34a4f8a62c050c101af0d46e58419c60dfeba3e | |
| parent | 95a64ae924ef6506dba3760ed7a334e568e96681 (diff) | |
| download | bridge-9a328db2b102e7235ef6d3337d39d67f4e81dc76.tar.gz bridge-9a328db2b102e7235ef6d3337d39d67f4e81dc76.zip | |
make tournament & brawl API dynamic
| -rw-r--r-- | index.html | 13 | ||||
| -rw-r--r-- | server.js | 83 |
2 files changed, 57 insertions, 39 deletions
@@ -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) => { @@ -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 |
