diff options
-rw-r--r-- | public/join.js | 7 | ||||
-rw-r--r-- | public/style.css | 4 | ||||
-rw-r--r-- | server.js | 49 | ||||
-rw-r--r-- | views/head.pug | 6 |
4 files changed, 42 insertions, 24 deletions
diff --git a/public/join.js b/public/join.js index 72da646..85445dc 100644 --- a/public/join.js +++ b/public/join.js @@ -155,6 +155,9 @@ function update() { if (player) { element.classList.remove("is_invite") switch (game.status) { + case 3: + element.innerHTML = player.name + break case 2: if (player.user_id === user_id) element.innerHTML = play_link(player) @@ -236,8 +239,8 @@ function update() { message.innerHTML = `<a href="/${game.title_id}/play.html?game=${game.game_id}">Observe</a>` } else if (game.status === 2) { message.innerHTML = `<a href="/${game.title_id}/play.html?game=${game.game_id}">Review</a>` - } else { - message.innerHTML = `<a href="/${game.title_id}/play.html?game=${game.game_id}">Enter</a>` + } else if (game.status === 3) { + message.innerHTML = "Archived" } if (game.owner_id === user_id) { diff --git a/public/style.css b/public/style.css index bcac7fe..f3b4493 100644 --- a/public/style.css +++ b/public/style.css @@ -193,6 +193,10 @@ article hr + p { font-style: italic; } .game_item.finished .game_main { background-color: gainsboro } .game_item.finished a:hover { color: mediumblue } +.game_item.archived .game_head { background-color: silver } +.game_item.archived .game_main { background-color: gainsboro } +.game_item.archived a:hover { color: mediumblue } + .game_item.your_turn .game_head { background-color: gold } .game_item.your_turn .game_main { background-color: lightyellow } .game_item.your_turn a:hover { color: #860 } @@ -998,6 +998,11 @@ let RULES = {} let HTML_ABOUT = {} let HTML_CREATE = {} +const STATUS_OPEN = 0 +const STATUS_ACTIVE = 1 +const STATUS_FINISHED = 2 +const STATUS_ARCHIVED = 3 + function load_rules() { const SQL_SELECT_TITLES = SQL("SELECT * FROM titles") for (let title of SQL_SELECT_TITLES.all()) { @@ -1113,10 +1118,10 @@ const SQL_SELECT_PLAYER_ROLE = SQL("SELECT role FROM players WHERE game_id=? AND const SQL_INSERT_PLAYER_ROLE = SQL("INSERT OR IGNORE INTO players (game_id,role,user_id,is_invite) VALUES (?,?,?,?)") const SQL_DELETE_PLAYER_ROLE = SQL("DELETE FROM players WHERE game_id=? AND role=?") -const SQL_SELECT_OPEN_GAMES = SQL("SELECT * FROM games WHERE status=0") -const SQL_COUNT_OPEN_GAMES = SQL("SELECT COUNT(*) FROM games WHERE owner_id=? AND status=0").pluck() +const SQL_SELECT_OPEN_GAMES = SQL(`SELECT * FROM games WHERE status=${STATUS_OPEN}`) +const SQL_COUNT_OPEN_GAMES = SQL(`SELECT COUNT(*) FROM games WHERE owner_id=? AND status=${STATUS_OPEN}`).pluck() -const SQL_SELECT_REMATCH = SQL("SELECT game_id FROM games WHERE status < 3 AND notice=?").pluck() +const SQL_SELECT_REMATCH = SQL(`SELECT game_id FROM games WHERE status = ${STATUS_FINISHED} AND notice=?`).pluck() const SQL_INSERT_REMATCH = SQL(` INSERT INTO games (owner_id, title_id, scenario, options, is_private, is_random, notice) @@ -1132,7 +1137,7 @@ const SQL_INSERT_REMATCH_PLAYERS = SQL("insert into players (game_id, user_id, r const QUERY_LIST_PUBLIC_GAMES = SQL(` SELECT * FROM game_view - WHERE is_private=0 AND status = ? + WHERE is_private=0 AND status=? AND EXISTS ( SELECT 1 FROM players WHERE players.game_id = game_view.game_id AND players.user_id = game_view.owner_id ) ORDER BY mtime DESC, ctime DESC LIMIT ? @@ -1152,7 +1157,7 @@ const QUERY_NEXT_GAME_OF_USER = SQL(` join game_state using(game_id) join players using(game_id) where - status = 1 + status = ${STATUS_ACTIVE} and active in ('All', 'Both', role) and user_id = ? order by mtime @@ -1164,7 +1169,7 @@ const QUERY_LIST_ACTIVE_GAMES_OF_USER = SQL(` where ( owner_id=$user_id or game_id in ( select game_id from players where players.user_id=$user_id ) ) and - ( status < 2 or julianday(mtime) > julianday('now', '-7 days') ) + ( status <= ${STATUS_FINISHED} ) order by status asc, mtime desc `) @@ -1173,7 +1178,7 @@ const QUERY_LIST_FINISHED_GAMES_OF_USER = SQL(` where ( owner_id=$user_id or game_id in ( select game_id from players where players.user_id=$user_id ) ) and - status = 2 + ( status = ${STATUS_FINISHED} or status = ${STATUS_ARCHIVED} ) order by status asc, mtime desc `) @@ -1221,11 +1226,11 @@ function annotate_game(game, user_id, unread) { let p = players[i] let p_is_owner = false - if (game.status === 0 && (game.owner_id === p.user_id)) + if (game.status === STATUS_OPEN && (game.owner_id === p.user_id)) p_is_owner = true let p_is_active = false - if (game.status === 1 && (game.active === p.role || game.active === "Both" || game.active === "All")) + if (game.status === STATUS_ACTIVE && (game.active === p.role || game.active === "Both" || game.active === "All")) p_is_active = true if (p.user_id === user_id) { @@ -1321,8 +1326,8 @@ app.get('/games/finished/:who_name', function (req, res) { }) app.get('/games/public', function (req, res) { - let games0 = QUERY_LIST_PUBLIC_GAMES.all(0, 1000) - let games1 = QUERY_LIST_PUBLIC_GAMES.all(1, 48) + let games0 = QUERY_LIST_PUBLIC_GAMES.all(STATUS_OPEN, 1000) + let games1 = QUERY_LIST_PUBLIC_GAMES.all(STATUS_ACTIVE, 48) if (req.user) { let unread = SQL_SELECT_UNREAD_CHAT_GAMES.all(req.user.user_id) annotate_games(games0, req.user.user_id, unread) @@ -1345,9 +1350,9 @@ function get_title_page(req, res, title_id) { let unread = null if (req.user) unread = SQL_SELECT_UNREAD_CHAT_GAMES.all(req.user.user_id) - let games0 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, 0, 1000) - let games1 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, 1, 1000) - let games2 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, 2, 24) + let games0 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, STATUS_OPEN, 1000) + let games1 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, STATUS_ACTIVE, 1000) + let games2 = QUERY_LIST_GAMES_OF_TITLE.all(title_id, STATUS_FINISHED, 24) annotate_games(games0, req.user ? req.user.user_id : 0, unread) annotate_games(games1, req.user ? req.user.user_id : 0, unread) annotate_games(games2, req.user ? req.user.user_id : 0, unread) @@ -1495,7 +1500,7 @@ app.get('/join/:game_id', must_be_logged_in, function (req, res) { let friends = null if (game.owner_id === req.user.user_id) friends = SQL_SELECT_CONTACT_FRIEND_NAMES.all(req.user.user_id) - let ready = (game.status === 0) && is_game_ready(game.title_id, game.scenario, game.options, players) + let ready = (game.status === STATUS_OPEN) && is_game_ready(game.title_id, game.scenario, game.options, players) game.ctime = human_date(game.ctime) game.mtime = human_date(game.mtime) res.render('join.pug', { @@ -1542,7 +1547,7 @@ app.get('/join-events/:game_id', must_be_logged_in, function (req, res) { function do_join(res, game_id, role, user_id, is_invite) { let game = SQL_SELECT_GAME.get(game_id) let roles = get_game_roles(game.title_id, game.scenario, game.options) - if (game.is_random && game.status === 0) { + if (game.is_random && game.status === STATUS_OPEN) { let m = role.match(/^Random (\d+)$/) if (!m || Number(m[1]) < 1 || Number(m[1]) > roles.length) return res.status(404).send("Invalid role.") @@ -1619,7 +1624,7 @@ app.post('/start/:game_id', must_be_logged_in, function (req, res) { let game = SQL_SELECT_GAME.get(game_id) if (game.owner_id !== req.user.user_id) return res.send("Not authorized to start that game ID.") - if (game.status !== 0) + if (game.status !== STATUS_OPEN) return res.send("The game is already started.") let players = SQL_SELECT_PLAYERS.all(game_id) if (!is_game_ready(game.title_id, game.scenario, game.options, players)) @@ -1670,7 +1675,7 @@ app.get('/api/replay/:game_id', function (req, res) { let game = SQL_SELECT_GAME.get(game_id) if (!game) return res.status(404).send("Invalid game ID.") - if (game.status < 2 && (!req.user || req.user.user_id !== 1)) + if (game.status < STATUS_FINISHED && (!req.user || req.user.user_id !== 1)) return res.status(401).send("Not authorized to debug.") return res.send(SQL_SELECT_REPLAY.get({game_id})) }) @@ -2403,10 +2408,10 @@ const SQL_GAME_STATS = SQL(` count(1) as n from opposed_games - natural join game_state where - status=2 - and title_id != 'pax-pamir' + ( status = ${STATUS_FINISHED} or status = ${STATUS_ARCHIVED} ) + and + ( title_id not in ( 'andean-abyss', 'pax-pamir', 'time-of-crisis' ) ) group by title_id, scenario, @@ -2444,7 +2449,7 @@ const SQL_USER_STATS = SQL(` natural join titles where user_id = ? - and status = 2 + and ( status = ${STATUS_FINISHED} or status = ${STATUS_ARCHIVED} ) and game_id in (select game_id from opposed_games) group by title_name, diff --git a/views/head.pug b/views/head.pug index cf0b268..2322250 100644 --- a/views/head.pug +++ b/views/head.pug @@ -50,6 +50,7 @@ mixin gamelist(list,hide_title=0) else if (item.status === 1 && !item.is_full) className += " replacement" else if (item.status === 1 && item.is_full) className += " active" else if (item.status === 2) className += " finished" + else if (item.status === 3) className += " archived" div(class=className) div.game_head @@ -82,6 +83,8 @@ mixin gamelist(list,hide_title=0) a(class="command" href="/join/"+item.game_id) Review else a(class="command" href=`/${item.title_id}/play.html?game=${item.game_id}&role=Observer`) Review + when 3 + | Archived div.game_main div.game_info @@ -103,6 +106,9 @@ mixin gamelist(list,hide_title=0) when 2 div Finished: #{item.mtime} div Result: !{item.result} + when 3 + div Finished: #{item.mtime} + div Result: !{item.result} unless hide_title a(href=`/${item.title_id}`) img(src=`/${item.title_id}/thumbnail.jpg`) |