Update server
This commit is contained in:
parent
b3f3417335
commit
94d9500598
|
@ -1,4 +0,0 @@
|
||||||
from os.path import dirname, basename, isfile
|
|
||||||
import glob
|
|
||||||
modules = glob.glob(dirname(__file__)+"/*/ai.py")
|
|
||||||
__all__ = ['.'.join(f.split('.')[:-1]) for f in modules if isfile(f)]
|
|
|
@ -1,11 +0,0 @@
|
||||||
"""An AI to try things"""
|
|
||||||
|
|
||||||
from tron.player import Player, Direction
|
|
||||||
|
|
||||||
class Ai(Player):
|
|
||||||
"""" A basic AI"""
|
|
||||||
def __init__(self):
|
|
||||||
super(Ai, self).__init__()
|
|
||||||
|
|
||||||
def action(self, map, id):
|
|
||||||
return Direction.RIGHT
|
|
19
server.js
19
server.js
|
@ -127,6 +127,21 @@ function startServer() {
|
||||||
});
|
});
|
||||||
|
|
||||||
app.post('/upload-target', (req, res) => {
|
app.post('/upload-target', (req, res) => {
|
||||||
|
|
||||||
|
if (!req.body.name) {
|
||||||
|
res.render('error', {message: "You have to enter a name in the form"});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.body.name.indexOf('.') !== -1) {
|
||||||
|
res.render('error', {message: "The name of your AI can't contain dots"});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!req.files.archive) {
|
||||||
|
res.render('error', {message: "You have to send a ZIP archive"});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let path = pathtools.join(aisPath, req.body.name)
|
let path = pathtools.join(aisPath, req.body.name)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -158,6 +173,8 @@ function startServer() {
|
||||||
req.files.archive.mv(zipfile, (err) => {
|
req.files.archive.mv(zipfile, (err) => {
|
||||||
if (err != null) {
|
if (err != null) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
|
res.render('error', {message: 'Unable to save the ZIP archive to the server'});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
fs.createReadStream(zipfile)
|
fs.createReadStream(zipfile)
|
||||||
.pipe(unzip.Extract({path}))
|
.pipe(unzip.Extract({path}))
|
||||||
|
@ -170,7 +187,7 @@ function startServer() {
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.on('error', () => {
|
.on('error', () => {
|
||||||
res.send('an error occured while extracting the archive')
|
res.render('error', {message: 'Failed to unzip the archive'});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
extends base
|
||||||
|
|
||||||
|
block content
|
||||||
|
section.section
|
||||||
|
.container
|
||||||
|
.message.is-danger
|
||||||
|
.message-header An error occured
|
||||||
|
.message-body= message
|
|
@ -1,14 +1,42 @@
|
||||||
extends base
|
extends base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
section.section
|
section.section
|
||||||
.container
|
.container
|
||||||
.columns.is-centered
|
.columns.is-centered
|
||||||
.column.is-narrow.is-desktop
|
.column.is-6.is-desktop
|
||||||
form(action="upload-target", method="POST", encType="multipart/form-data")
|
form(action="upload-target", method="POST", encType="multipart/form-data")
|
||||||
.field
|
.field
|
||||||
label.label Name
|
label.label Name
|
||||||
|
p.content.has-text-justified
|
||||||
|
| This name will be the name you will see on
|
||||||
|
| the leaderboard. It also corresponds to the
|
||||||
|
| name of the module your AI will be on the
|
||||||
|
| server.
|
||||||
|
p.content.has-text-justified
|
||||||
|
| You can use an already exisiting name to
|
||||||
|
| replace it with a new version of your AI.
|
||||||
|
p.content.has-text-justified
|
||||||
|
| You could also erase other people's AI, but
|
||||||
|
| please, don't do it, because I would be sad
|
||||||
|
| 😢
|
||||||
input.input(type="text", name="name", placeholder="Name of your AI")
|
input.input(type="text", name="name", placeholder="Name of your AI")
|
||||||
.field
|
.field
|
||||||
|
label.label Archive
|
||||||
|
p.content.has-text-justified
|
||||||
|
| The archive to upload needs to contain a file
|
||||||
|
| named <code>ai.py</code> which must contain a
|
||||||
|
| class named <code>Ai</code> which must contain
|
||||||
|
| a constructor that takes no arguments (other
|
||||||
|
| than self or optional arguments).
|
||||||
|
p.content.has-text-justified
|
||||||
|
| It may also contain more files, such as
|
||||||
|
| binary files with neural network weights, or
|
||||||
|
| such as other python modules.
|
||||||
|
p.content.has-text-justified
|
||||||
|
| Please note that this archive must not
|
||||||
|
| contain a directory, it must only contain the
|
||||||
|
| files.
|
||||||
.file.has-name
|
.file.has-name
|
||||||
label.file-label
|
label.file-label
|
||||||
input.file-input(type="file", name="archive")
|
input.file-input(type="file", name="archive")
|
||||||
|
@ -17,6 +45,6 @@ block content
|
||||||
i.fas.fa-upload
|
i.fas.fa-upload
|
||||||
span.file-label Choose a file…
|
span.file-label Choose a file…
|
||||||
span.file-name
|
span.file-name
|
||||||
.control
|
.field
|
||||||
button.button.is-link Submit
|
input.button.is-link(type="submit", value="Submit")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue