From 974834ff11b5420920cb9727a201878dc748ee4f Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Sun, 18 Jul 2021 16:22:56 +0200 Subject: Improve stats page. --- server.js | 46 +++++++++++++++++++++++++++------------------- views/stats.ejs | 55 ++++++++++++++++++++++++++++--------------------------- 2 files changed, 55 insertions(+), 46 deletions(-) diff --git a/server.js b/server.js index 264ef6e..4b909b8 100644 --- a/server.js +++ b/server.js @@ -542,20 +542,6 @@ app.post('/change_mail', must_be_logged_in, function (req, res) { * GAME LOBBY */ -let RULES = {}; -for (let title_id of db.prepare("SELECT * FROM titles").pluck().all()) { - if (fs.existsSync(__dirname + "/public/" + title_id + "/rules.js")) { - console.log("Loading rules for " + title_id); - try { - RULES[title_id] = require("./public/" + title_id + "/rules.js"); - } catch (err) { - console.log(err); - } - } else { - console.log("Cannot find rules for " + title_id); - } -} - const QUERY_LIST_GAMES_OF_TITLE = db.prepare(` SELECT *, EXISTS ( @@ -640,6 +626,22 @@ const QUERY_REMATCH_CREATE = db.prepare(` ) `); +let RULES = {}; +let ROLES = {}; +for (let title_id of db.prepare("SELECT * FROM titles").pluck().all()) { + if (fs.existsSync(__dirname + "/public/" + title_id + "/rules.js")) { + console.log("Loading rules for " + title_id); + try { + RULES[title_id] = require("./public/" + title_id + "/rules.js"); + ROLES[title_id] = QUERY_ROLES.all(title_id); + } catch (err) { + console.log(err); + } + } else { + console.log("Cannot find rules for " + title_id); + } +} + app.get('/', function (req, res) { res.render('index.ejs', { user: req.user, message: req.flash('message') }); }); @@ -1389,18 +1391,24 @@ io.on('connection', (socket) => { // EXTRAS +const QUERY_TITLES = db.prepare("SELECT * FROM titles ORDER BY title_name"); const QUERY_STATS = db.prepare(` - SELECT title_name, scenario, result, count(*) AS count - FROM games - JOIN titles ON games.title_id=titles.title_id - WHERE status=2 AND private=0 + SELECT title_id, scenario, result, count(*) AS count + FROM game_view + WHERE status=2 AND is_solo=0 GROUP BY title_name, scenario, result `); app.get('/stats', function (req, res) { LOG(req, "GET /stats"); let stats = QUERY_STATS.all(); - res.render('stats.ejs', { user: req.user, message: req.flash('message'), stats: stats }); + let titles = Object.fromEntries(QUERY_TITLES.all().map(t => [t.title_id, t.title_name])); + res.render('stats.ejs', { + user: req.user, + message: req.flash('message'), + stats: stats, + title_role_map: ROLES, title_name_map: titles, title_rule_map: RULES + }); }); app.get('/users', function (req, res) { diff --git a/views/stats.ejs b/views/stats.ejs index db497e8..64a6303 100644 --- a/views/stats.ejs +++ b/views/stats.ejs @@ -2,35 +2,36 @@ <% - let total = {}; - let results = {}; - for (let { title_name, scenario, result, count } of stats) { - if (total[title_name] == undefined) - total[title_name] = {}; - if (total[title_name][scenario] == undefined) - total[title_name][scenario] = 0; - total[title_name][scenario] += count; - if (results[title_name] == undefined) - results[title_name] = []; - if (!results[title_name].includes(result)) - results[title_name].push(result); + function total(t, s) { + return stats + .filter(entry => entry.title_id === t && entry.scenario === s) + .reduce((acc, entry) => acc + entry.count, 0); } - let last_title = null; - let last_scenario = null; - for (let { title_name, scenario, result, count } of stats) { - if (title_name != last_title) { - if (last_title != null) { - %><% + function result(t, s, r) { + let info = stats.find(entry => { + return entry.title_id === t && + entry.scenario === s && + entry.result === r}); + return info ? info.count : 0; + } + for (let title_id in title_name_map) { + let scenarios = title_rule_map[title_id].scenarios; + let roles = title_role_map[title_id].concat(['Draw']); + %><% } %>
<%= title_name_map[title_id] %><% + roles.forEach(role => { + %><%= role %><% + }); + scenarios.forEach(scenario => { + let t = total(title_id, scenario); + if (t > 0) { + %>
<%= scenario %> (<%= t %>)<% + roles.forEach(role => { + let r = result(title_id, scenario, role); + %><%= Math.round(r * 100 / t) %>%<% + }); } - %>
<%= title_name %><% - results[title_name].forEach(item => { %><%= item %><% }); - } - if (scenario != last_scenario) { - %>
<%= scenario %> (<%= total[title_name][scenario] %>)<% - } - %><%= Math.round(count * 100 / total[title_name][scenario]) %>%<% - last_title = title_name; - last_scenario = scenario; + }); + %>
-- cgit v1.2.3