Much better
This commit is contained in:
parent
36d26f5004
commit
072a72cedd
|
@ -13,6 +13,9 @@ from tron.player import Direction, ConstantPlayer
|
||||||
import ai_manager
|
import ai_manager
|
||||||
from utils import run_battle
|
from utils import run_battle
|
||||||
|
|
||||||
|
import time
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
ASSETS_PATH = "assets/data.json"
|
ASSETS_PATH = "assets/data.json"
|
||||||
LAST_REFRESH_PATH = "assets/refresh.dat"
|
LAST_REFRESH_PATH = "assets/refresh.dat"
|
||||||
|
|
||||||
|
|
46
server.js
46
server.js
|
@ -56,9 +56,7 @@ function runPython() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// parsed.ais.push({
|
|
||||||
|
|
||||||
// });
|
|
||||||
function parse(data) {
|
function parse(data) {
|
||||||
let content = JSON.parse(data);
|
let content = JSON.parse(data);
|
||||||
let parsed = {ais: [], battles: {}};
|
let parsed = {ais: [], battles: {}};
|
||||||
|
@ -118,6 +116,18 @@ function parse(data) {
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readData(req, res, callback) {
|
||||||
|
fs.readFile('pytron_run/assets/data.json', 'utf-8', (err, data) => {
|
||||||
|
if (err != null) {
|
||||||
|
console.log(err);
|
||||||
|
res.render('error', {message: 'It seems like the site is broken :\'('});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let parsed = parse(data);
|
||||||
|
callback(parsed);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function saveArchiveAndRun(req, res) {
|
function saveArchiveAndRun(req, res) {
|
||||||
|
|
||||||
let path = pathtools.join(aisPath, req.body.name);
|
let path = pathtools.join(aisPath, req.body.name);
|
||||||
|
@ -152,11 +162,7 @@ function startServer() {
|
||||||
app.use(fileUpload());
|
app.use(fileUpload());
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
app.get('/', (req, res) => {
|
||||||
fs.readFile('pytron_run/assets/data.json', 'utf-8', (err, data) => {
|
readData(req, res, (parsed) => {
|
||||||
if (err != null) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
let parsed = parse(data);
|
|
||||||
res.render('index', {
|
res.render('index', {
|
||||||
data: parsed,
|
data: parsed,
|
||||||
running: pythonRunning,
|
running: pythonRunning,
|
||||||
|
@ -164,6 +170,32 @@ function startServer() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get('/is-running', (req, res) => {
|
||||||
|
if (pythonRunning) {
|
||||||
|
res.send('yes');
|
||||||
|
} else {
|
||||||
|
res.send('no');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/leaderboard', (req, res) => {
|
||||||
|
readData(req, res, (parsed) => {
|
||||||
|
res.render('leaderboard', {
|
||||||
|
data: parsed,
|
||||||
|
running: pythonRunning,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/battles', (req, res) => {
|
||||||
|
readData(req, res, (parsed) => {
|
||||||
|
res.render('battles', {
|
||||||
|
data: parsed,
|
||||||
|
running: pythonRunning,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.get('/upload', (req, res) => {
|
app.get('/upload', (req, res) => {
|
||||||
res.render('upload', {});
|
res.render('upload', {});
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
function request(url, callback) {
|
||||||
|
let xhr = new XMLHttpRequest();
|
||||||
|
xhr.onreadystatechange = () => {
|
||||||
|
if (xhr.readyState === XMLHttpRequest.DONE) {
|
||||||
|
if (xhr.status === 200) {
|
||||||
|
callback(xhr.responseText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.open('GET', url, true);
|
||||||
|
xhr.send(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshElement(element, url) {
|
||||||
|
request(url, (response) => { element.innerHTML = response });
|
||||||
|
}
|
||||||
|
|
||||||
|
function isRunning(callback) {
|
||||||
|
request('is-running', (response) => {
|
||||||
|
callback(response === 'yes');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function refresh() {
|
||||||
|
refreshElement(document.getElementById('leaderboard'), 'leaderboard');
|
||||||
|
refreshElement(document.getElementById('battles'), 'battles');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function watch() {
|
||||||
|
isRunning((running) => {
|
||||||
|
if (running) {
|
||||||
|
setTimeout(watch, 1000);
|
||||||
|
} else {
|
||||||
|
isCurrentlyRunning = false;
|
||||||
|
refresh();
|
||||||
|
runningElement.style.display = "None";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateDots() {
|
||||||
|
dotsElement.innerHTML += ".";
|
||||||
|
if (dotsElement.innerHTML === "....") {
|
||||||
|
dotsElement.innerHTML = ".";
|
||||||
|
}
|
||||||
|
if (isCurrentlyRunning) {
|
||||||
|
setTimeout(updateDots, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let runningElement = document.getElementById('running');
|
||||||
|
let dotsElement = document.getElementById('dots');
|
||||||
|
let isCurrentlyRunning = runningElement.style.display === '';
|
||||||
|
|
||||||
|
if (isCurrentlyRunning) {
|
||||||
|
watch();
|
||||||
|
updateDots();
|
||||||
|
}
|
|
@ -35,3 +35,4 @@ html(lang='en')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
block extrajs
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
table.table.is-bordered.is-striped.is-narrow.is-hoverable
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
for ai in data.ais
|
||||||
|
th.has-text-centered= ai.name
|
||||||
|
for ai1 in data.ais
|
||||||
|
tr
|
||||||
|
th.has-text-centered= ai1.name
|
||||||
|
for ai2 in data.ais
|
||||||
|
if ai1.name == ai2.name
|
||||||
|
td
|
||||||
|
else if data.battles[ai1.name + "/" + ai2.name] > data.battles[ai2.name + "/" + ai1.name]
|
||||||
|
td.has-text-centered.has-text-success= data.battles[ai1.name + "/" + ai2.name]
|
||||||
|
else if data.battles[ai1.name + "/" + ai2.name] < data.battles[ai2.name + "/" + ai1.name]
|
||||||
|
td.has-text-centered.has-text-danger= data.battles[ai1.name + "/" + ai2.name]
|
||||||
|
else
|
||||||
|
td.has-text-centered= data.battles[ai1.name + "/" + ai2.name]
|
||||||
|
|
||||||
|
.columns.is-centered
|
||||||
|
.column.is-narrow
|
||||||
|
caption
|
||||||
|
strong All battles
|
|
@ -7,64 +7,27 @@ block content
|
||||||
section.section
|
section.section
|
||||||
.container
|
.container
|
||||||
if running
|
if running
|
||||||
.columns.is-centered
|
#running
|
||||||
.column.is-narrow.is-desktop
|
.columns.is-centered
|
||||||
h5.title.is-5 Some battles are running...
|
.column.is-3.is-desktop
|
||||||
|
h5.title.is-5 Some battles are running
|
||||||
|
span#dots ...
|
||||||
|
else
|
||||||
|
#running(style="display:none")
|
||||||
|
.columns.is-centered
|
||||||
|
.column.is-3.is-desktop
|
||||||
|
h5.title.is-5 Some battles are running
|
||||||
|
span#dots ...
|
||||||
.columns.is-centered
|
.columns.is-centered
|
||||||
.column.is-narrow.is-desktop
|
.column.is-narrow.is-desktop
|
||||||
table.table.is-bordered.is-striped.is-hoverable
|
#leaderboard
|
||||||
tr
|
include leaderboard
|
||||||
th.has-text-centered AI
|
|
||||||
th.has-text-centered Victories
|
|
||||||
th.has-text-centered Nulls
|
|
||||||
th.has-text-centered Defeats
|
|
||||||
th.has-text-centered Score
|
|
||||||
for ai in data.sortedAis
|
|
||||||
tr
|
|
||||||
td.has-text-centered
|
|
||||||
if ai.rank === 1
|
|
||||||
span.icon
|
|
||||||
i.fas.fa-trophy(style="color:#FFD700")
|
|
||||||
else if ai.rank === 2
|
|
||||||
span.icon
|
|
||||||
i.fas.fa-trophy(style="color:#C0C0C0")
|
|
||||||
else if ai.rank === 3
|
|
||||||
span.icon
|
|
||||||
i.fas.fa-trophy(style="color:#CD7F32")
|
|
||||||
strong= ai.name
|
|
||||||
td.has-text-centered= ai.victories
|
|
||||||
td.has-text-centered= ai.nulls
|
|
||||||
td.has-text-centered= ai.defeats
|
|
||||||
td.has-text-centered
|
|
||||||
strong= ai.score
|
|
||||||
.columns.is-centered
|
|
||||||
.column.is-narrow
|
|
||||||
caption
|
|
||||||
strong Leaderboard
|
|
||||||
|
|
||||||
.columns.is-centered
|
.columns.is-centered
|
||||||
.column.is-narrow.is-desktop
|
.column.is-narrow.is-desktop
|
||||||
table.table.is-bordered.is-striped.is-narrow.is-hoverable
|
#battles
|
||||||
tr
|
include battles
|
||||||
th
|
|
||||||
for ai in data.ais
|
|
||||||
th.has-text-centered= ai.name
|
|
||||||
for ai1 in data.ais
|
|
||||||
tr
|
|
||||||
th.has-text-centered= ai1.name
|
|
||||||
for ai2 in data.ais
|
|
||||||
if ai1.name == ai2.name
|
|
||||||
td
|
|
||||||
else if data.battles[ai1.name + "/" + ai2.name] > data.battles[ai2.name + "/" + ai1.name]
|
|
||||||
td.has-text-centered.has-text-success= data.battles[ai1.name + "/" + ai2.name]
|
|
||||||
else if data.battles[ai1.name + "/" + ai2.name] < data.battles[ai2.name + "/" + ai1.name]
|
|
||||||
td.has-text-centered.has-text-danger= data.battles[ai1.name + "/" + ai2.name]
|
|
||||||
else
|
|
||||||
td.has-text-centered= data.battles[ai1.name + "/" + ai2.name]
|
|
||||||
.columns.is-centered
|
|
||||||
.column.is-narrow
|
|
||||||
caption
|
|
||||||
strong All battles
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
block extrajs
|
||||||
|
script(src="static/main.js")
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
table.table.is-bordered.is-striped.is-hoverable
|
||||||
|
tr
|
||||||
|
th.has-text-centered AI
|
||||||
|
th.has-text-centered Victories
|
||||||
|
th.has-text-centered Nulls
|
||||||
|
th.has-text-centered Defeats
|
||||||
|
th.has-text-centered Score
|
||||||
|
for ai in data.sortedAis
|
||||||
|
tr
|
||||||
|
td.has-text-centered
|
||||||
|
if ai.rank === 1
|
||||||
|
span.icon
|
||||||
|
i.fas.fa-trophy(style="color:#FFD700")
|
||||||
|
else if ai.rank === 2
|
||||||
|
span.icon
|
||||||
|
i.fas.fa-trophy(style="color:#C0C0C0")
|
||||||
|
else if ai.rank === 3
|
||||||
|
span.icon
|
||||||
|
i.fas.fa-trophy(style="color:#CD7F32")
|
||||||
|
strong= ai.name
|
||||||
|
td.has-text-centered= ai.victories
|
||||||
|
td.has-text-centered= ai.nulls
|
||||||
|
td.has-text-centered= ai.defeats
|
||||||
|
td.has-text-centered
|
||||||
|
strong= ai.score
|
||||||
|
.columns.is-centered
|
||||||
|
.column.is-narrow
|
||||||
|
caption
|
||||||
|
strong Leaderboard
|
||||||
|
|
Loading…
Reference in New Issue