diff options
-rw-r--r-- | public/docs/tournaments.html | 2 | ||||
-rw-r--r-- | server.js | 66 | ||||
-rw-r--r-- | views/tm_seed.pug | 4 |
3 files changed, 48 insertions, 24 deletions
diff --git a/public/docs/tournaments.html b/public/docs/tournaments.html index 6122194..e8f08f8 100644 --- a/public/docs/tournaments.html +++ b/public/docs/tournaments.html @@ -52,7 +52,7 @@ score is used to break ties. <p> Some tournaments may have multiple levels. If you win a tournament at one -level, you will automatically be queued for the next level up. +level, you may play in the next level (once for each victory). <hr> @@ -234,6 +234,8 @@ app.locals.human_date = human_date app.locals.format_options = format_options app.locals.format_minutes = format_minutes +app.locals.may_join_seed_level = may_join_seed_level + app.set("x-powered-by", false) app.set("etag", false) app.set("view engine", "pug") @@ -2864,6 +2866,33 @@ const TM_MAY_JOIN_SEED = SQL(` where seed_id=? `).pluck() +const TM_MAY_JOIN_SEED_LEVEL = SQL(` + with + win_cte as ( + select + count(1) as n_win + from + tm_winners + join tm_pools using(pool_id) + where + level = @level - 1 and user_id = @user_id and seed_id = @seed_id + ), + play_cte as ( + select + count(distinct pool_id) as n_play + from + tm_rounds + join tm_pools using(pool_id) + join players using(game_id) + where + level = @level and user_id = @user_id and seed_id = @seed_id + ) + select + coalesce(n_win, 0) > coalesce(n_play, 0) as may_join + from + win_cte, play_cte +`).pluck() + function is_banned_from_tournaments(user_id) { return TM_SELECT_BANNED.get(user_id) } @@ -2876,6 +2905,14 @@ function may_join_seed(seed_id) { return TM_MAY_JOIN_SEED.get(seed_id) } +function may_join_seed_level(user_id, seed_id, level) { + if (level === 1) + return true + if (level >= 2) + return TM_MAY_JOIN_SEED_LEVEL.get({ level, user_id, seed_id }) + return false +} + const TM_SEED_LIST_ALL = SQL(` select tm_seeds.*, @@ -3006,7 +3043,6 @@ const TM_SELECT_GAMES = SQL(` game_id `) -const TM_SELECT_WINNERS = SQL("select user_id from tm_winners where pool_id = ?").pluck() const TM_SELECT_PLAYERS_IN_POOL = SQL(` select user_view.* @@ -3135,10 +3171,9 @@ const TM_FIND_NEXT_GAME_TO_START = SQL(` const TM_SELECT_ENDED_POOLS = SQL(` select - pool_id, seed_id, level, pool_name, level_count + pool_id, pool_name from tm_pools - join tm_seeds using(seed_id) join tm_rounds using(pool_id) join games using(game_id) where @@ -3216,8 +3251,9 @@ app.get("/tm/pool/:pool_name", function (req, res) { res.render("tm_pool.pug", { user: req.user, seed, pool, roles, players, games, games_by_round }) }) -app.post("/api/tm/register/:seed_id", must_be_logged_in, function (req, res) { +app.post("/api/tm/register/:seed_id/:level", must_be_logged_in, function (req, res) { let seed_id = req.params.seed_id | 0 + let level = req.params.level | 0 let user_id = req.user.user_id if (is_banned_from_tournaments(req.user.user_id)) return res.status(401).send("You may not join any tournaments.") @@ -3225,7 +3261,9 @@ app.post("/api/tm/register/:seed_id", must_be_logged_in, function (req, res) { return res.status(401).send("You may not join any tournaments right now.") if (!may_join_seed(seed_id)) return res.status(401).send("This tournament is closed.") - TM_INSERT_QUEUE.run(user_id, seed_id, 1) + if (!may_join_seed_level(req.user.user_id, seed_id, level)) + return res.status(401).send("You may not join this tournament.") + TM_INSERT_QUEUE.run(user_id, seed_id, level) return res.redirect(req.headers.referer) }) @@ -3527,25 +3565,11 @@ function start_tournament_seed(seed_id, level) { } function tm_reap_pools() { - // reap pools that are finished (and promote winners) // reap pools that are finished (and notify players) let ended = TM_SELECT_ENDED_POOLS.all() for (let item of ended) { - console.log("TM POOL - END", item.pool_name) - - SQL_BEGIN.run() - try { - TM_UPDATE_POOL_FINISHED.run(item.pool_id) - if (item.level < item.level_count) { - let winners = TM_SELECT_WINNERS.all(item.pool_id) - for (let user_id of winners) - TM_INSERT_QUEUE.run(user_id, item.seed_id, item.level + 1) - } - SQL_COMMIT.run() - } finally { - if (db.inTransaction) - SQL_ROLLBACK.run() - } + console.log("TM POOL FINISHED", item.pool_name) + TM_UPDATE_POOL_FINISHED.run(item.pool_id) let players = TM_SELECT_PLAYERS_IN_POOL.all(item.pool_id) for (let user of players) diff --git a/views/tm_seed.pug b/views/tm_seed.pug index 9902f4f..ea31a41 100644 --- a/views/tm_seed.pug +++ b/views/tm_seed.pug @@ -70,8 +70,8 @@ html form(method="post" action="/api/tm/withdraw/" + seed.seed_id + "/" + (ix+1)) button(disabled) Register button(type="submit") Withdraw - else if ix === 0 && may_register - form(method="post" action="/api/tm/register/" + seed.seed_id) + else if may_register && may_join_seed_level(user.user_id, seed.seed_id, ix+1) + form(method="post" action="/api/tm/register/" + seed.seed_id + "/" + (ix+1)) button(type="submit") Register button(disabled) Withdraw else |