summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--public/join.js7
-rw-r--r--public/style.css4
-rw-r--r--server.js49
-rw-r--r--views/head.pug6
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 }
diff --git a/server.js b/server.js
index 31a7def..12ec18f 100644
--- a/server.js
+++ b/server.js
@@ -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`)