First version of web help
This commit is contained in:
parent
5f5192b704
commit
bdcaf6bda5
@ -28,7 +28,7 @@ tr = {
|
|||||||
},
|
},
|
||||||
"list_modules": {
|
"list_modules": {
|
||||||
"title": "Liste des modules",
|
"title": "Liste des modules",
|
||||||
},
|
},
|
||||||
"load": {
|
"load": {
|
||||||
},
|
},
|
||||||
"unload": {
|
"unload": {
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
"level": "INFO",
|
"level": "INFO",
|
||||||
"formatter": "simple",
|
"formatter": "simple",
|
||||||
"filename": "info.log",
|
"filename": "info.log",
|
||||||
"maxBytes": 10485760,
|
"maxBytes": 1048576,
|
||||||
"backupCount": 20,
|
"backupCount": 20,
|
||||||
"encoding": "utf8"
|
"encoding": "utf8"
|
||||||
},
|
},
|
||||||
@ -27,7 +27,7 @@
|
|||||||
"level": "ERROR",
|
"level": "ERROR",
|
||||||
"formatter": "simple",
|
"formatter": "simple",
|
||||||
"filename": "errors.log",
|
"filename": "errors.log",
|
||||||
"maxBytes": 10485760,
|
"maxBytes": 1048576,
|
||||||
"backupCount": 20,
|
"backupCount": 20,
|
||||||
"encoding": "utf8"
|
"encoding": "utf8"
|
||||||
},
|
},
|
||||||
|
1
main.py
1
main.py
@ -73,7 +73,6 @@ setup_logging()
|
|||||||
eventloop = asyncio.get_event_loop()
|
eventloop = asyncio.get_event_loop()
|
||||||
|
|
||||||
foBot = FoBot(db_connection=db_connection)
|
foBot = FoBot(db_connection=db_connection)
|
||||||
|
|
||||||
foWeb = FoWeb(bot=None, db=db_connection)
|
foWeb = FoWeb(bot=None, db=db_connection)
|
||||||
|
|
||||||
bot_app = foBot.start(os.environ['FOBOT_DISCORD_TOKEN'], max_messages=100000000)
|
bot_app = foBot.start(os.environ['FOBOT_DISCORD_TOKEN'], max_messages=100000000)
|
||||||
|
@ -11,7 +11,7 @@ import tornado.web
|
|||||||
|
|
||||||
def maybe_create_tables(db):
|
def maybe_create_tables(db):
|
||||||
with db.cursor() as cur:
|
with db.cursor() as cur:
|
||||||
#cur.execute("DROP TABLE users ")
|
# cur.execute("DROP TABLE users ")
|
||||||
cur.execute("CREATE TABLE IF NOT EXISTS users ("
|
cur.execute("CREATE TABLE IF NOT EXISTS users ("
|
||||||
" id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,"
|
" id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,"
|
||||||
" email VARCHAR(100) NOT NULL UNIQUE,"
|
" email VARCHAR(100) NOT NULL UNIQUE,"
|
||||||
@ -146,7 +146,6 @@ class AuthLoginHandler(BaseHandler):
|
|||||||
try:
|
try:
|
||||||
user = self.queryone("SELECT * FROM users WHERE email = %s",
|
user = self.queryone("SELECT * FROM users WHERE email = %s",
|
||||||
self.get_argument("email"))
|
self.get_argument("email"))
|
||||||
print(user)
|
|
||||||
except NoResultError:
|
except NoResultError:
|
||||||
get_arg = self.get_argument
|
get_arg = self.get_argument
|
||||||
self.render("auth/login.html", error="Email not found or bad password", get_arg=get_arg)
|
self.render("auth/login.html", error="Email not found or bad password", get_arg=get_arg)
|
||||||
@ -171,18 +170,21 @@ class AuthLogoutHandler(BaseHandler):
|
|||||||
class AuthCreateHandler(BaseHandler):
|
class AuthCreateHandler(BaseHandler):
|
||||||
async def get(self):
|
async def get(self):
|
||||||
get_arg = self.get_argument
|
get_arg = self.get_argument
|
||||||
self.render("auth/create_user.html", get_arg=get_arg)
|
self.render("auth/create_user.html", error=None, get_arg=get_arg)
|
||||||
|
|
||||||
async def post(self):
|
async def post(self):
|
||||||
hashed_password = await tornado.ioloop.IOLoop.current().run_in_executor(
|
hashed_password = await tornado.ioloop.IOLoop.current().run_in_executor(
|
||||||
None, bcrypt.hashpw, tornado.escape.utf8(self.get_argument("password")),
|
None, bcrypt.hashpw, tornado.escape.utf8(self.get_argument("password")),
|
||||||
bcrypt.gensalt()
|
bcrypt.gensalt()
|
||||||
)
|
)
|
||||||
self.execute("INSERT INTO users (email, name, hashed_password) VALUES (%s, %s, %s)",
|
try:
|
||||||
self.get_argument("email"), self.get_argument("name"),
|
get_arg = self.get_argument
|
||||||
tornado.escape.to_unicode(hashed_password))
|
self.execute("INSERT INTO users (email, name, hashed_password) VALUES (%s, %s, %s)",
|
||||||
users = self.queryone("SELECT * FROM users WHERE email = %s", self.get_argument("email"))
|
self.get_argument("email"), self.get_argument("name"),
|
||||||
print(users)
|
tornado.escape.to_unicode(hashed_password))
|
||||||
|
users = self.queryone("SELECT * FROM users WHERE email = %s", self.get_argument("email"))
|
||||||
|
except:
|
||||||
|
self.render("auth/create_user.html", error="Email already exists.", get_arg=get_arg)
|
||||||
self.set_secure_cookie("blogdemo_user", str(users.id))
|
self.set_secure_cookie("blogdemo_user", str(users.id))
|
||||||
self.redirect(self.get_argument("next", "/"))
|
self.redirect(self.get_argument("next", "/"))
|
||||||
|
|
||||||
@ -193,7 +195,7 @@ class BlogHomeHandler(BaseHandler):
|
|||||||
if not entries:
|
if not entries:
|
||||||
self.redirect("/blog/compose")
|
self.redirect("/blog/compose")
|
||||||
return
|
return
|
||||||
self.render("blog\\index.html", entries=entries)
|
self.render("blog/index.html", entries=entries)
|
||||||
|
|
||||||
|
|
||||||
class BlogPostHandler(BaseHandler):
|
class BlogPostHandler(BaseHandler):
|
||||||
@ -202,7 +204,7 @@ class BlogPostHandler(BaseHandler):
|
|||||||
if not entry:
|
if not entry:
|
||||||
raise tornado.web.HTTPError(404)
|
raise tornado.web.HTTPError(404)
|
||||||
|
|
||||||
self.render("blog\\entry.html", entry=entry)
|
self.render("blog/entry.html", entry=entry)
|
||||||
|
|
||||||
|
|
||||||
class BotConnectHandler(BaseHandler):
|
class BotConnectHandler(BaseHandler):
|
||||||
@ -213,9 +215,14 @@ class BotConfigureHandler(BaseHandler):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class BotHelpHandler(BaseHandler):
|
||||||
|
async def get(self):
|
||||||
|
self.render("bot/help.html")
|
||||||
|
|
||||||
|
|
||||||
class BlogEntryModule(tornado.web.UIModule):
|
class BlogEntryModule(tornado.web.UIModule):
|
||||||
def render(self, entry):
|
def render(self, entry):
|
||||||
return self.render_string("blog\\modules\\entry.html", entry=entry)
|
return self.render_string("blog/modules/entry.html", entry=entry)
|
||||||
|
|
||||||
|
|
||||||
class FoWeb(tornado.web.Application):
|
class FoWeb(tornado.web.Application):
|
||||||
@ -231,7 +238,8 @@ class FoWeb(tornado.web.Application):
|
|||||||
(r"/blog", BlogHomeHandler),
|
(r"/blog", BlogHomeHandler),
|
||||||
(r"/blog/entry/([^/]+)", BlogPostHandler),
|
(r"/blog/entry/([^/]+)", BlogPostHandler),
|
||||||
(r"/bot/connect", BotConnectHandler),
|
(r"/bot/connect", BotConnectHandler),
|
||||||
(r"/bot/configure", BotConfigureHandler)
|
(r"/bot/configure", BotConfigureHandler),
|
||||||
|
(r"/bot/help", BotHelpHandler)
|
||||||
]
|
]
|
||||||
settings = dict(
|
settings = dict(
|
||||||
website_title=u"FoBot",
|
website_title=u"FoBot",
|
||||||
|
@ -1,137 +1,136 @@
|
|||||||
body {
|
body {
|
||||||
background: white;
|
background: white;
|
||||||
color: black;
|
color: black;
|
||||||
margin: 15px;
|
margin: 15px;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
body,
|
body,
|
||||||
input,
|
input,
|
||||||
textarea {
|
textarea {
|
||||||
font-family: Georgia, serif;
|
font-family: Georgia, serif;
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
td {
|
td {
|
||||||
border: 0;
|
border: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1,
|
h1,
|
||||||
h2,
|
h2,
|
||||||
h3,
|
h3,
|
||||||
h4 {
|
h4 {
|
||||||
font-family: "Helvetica Nue", Helvetica, Arial, sans-serif;
|
font-family: "Helvetica Nue", Helvetica, Arial, sans-serif;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 20pt;
|
font-size: 20pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre,
|
pre,
|
||||||
code {
|
code {
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
color: #060;
|
color: #060;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
margin-left: 1em;
|
margin-left: 1em;
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
border-left: 1px solid silver;
|
border-left: 1px solid silver;
|
||||||
line-height: 14pt;
|
line-height: 14pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
a,
|
a,
|
||||||
a code {
|
a code {
|
||||||
color: #00c;
|
color: #060;
|
||||||
}
|
}
|
||||||
|
|
||||||
#body {
|
#body {
|
||||||
max-width: 800px;
|
margin: auto;
|
||||||
margin: auto;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#header {
|
#header {
|
||||||
background-color: #3b5998;
|
background-color: #359;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
#header,
|
#header,
|
||||||
#header a {
|
#header a {
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
#header h1 a {
|
#header h1 a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#footer,
|
#footer,
|
||||||
#content {
|
#content {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#footer {
|
#footer {
|
||||||
margin-top: 3em;
|
margin-top: 3em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry h1 a {
|
.entry h1 a {
|
||||||
color: black;
|
color: black;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry {
|
.entry {
|
||||||
margin-bottom: 2em;
|
margin-bottom: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry .date {
|
.entry .date {
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry p {
|
.entry p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.entry .body {
|
.entry .body {
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
line-height: 16pt;
|
line-height: 16pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose td {
|
.compose td {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
padding-bottom: 5px;
|
padding-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose td.field {
|
.compose td.field {
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose .title,
|
.compose .title,
|
||||||
.compose .submit {
|
.compose .submit {
|
||||||
font-family: "Helvetica Nue", Helvetica, Arial, sans-serif;
|
font-family: "Helvetica Nue", Helvetica, Arial, sans-serif;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose .title {
|
.compose .title {
|
||||||
font-size: 20pt;
|
font-size: 20pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose .title,
|
.compose .title,
|
||||||
.compose .markdown {
|
.compose .markdown {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compose .markdown {
|
.compose .markdown {
|
||||||
height: 500px;
|
height: 500px;
|
||||||
line-height: 16pt;
|
line-height: 16pt;
|
||||||
}
|
}
|
74
web/static/documentation.css
Normal file
74
web/static/documentation.css
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
.documentation {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary {
|
||||||
|
margin:0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0.25em solid #3b5998;
|
||||||
|
position: fixed;
|
||||||
|
overflow: auto;
|
||||||
|
width: 25%;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary h2 {
|
||||||
|
background-color: #3b5998;
|
||||||
|
padding: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary ul {
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary ul li {
|
||||||
|
display: block;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary ul li ul {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary ul li:hover ul {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary a {
|
||||||
|
background-color: #5889ef;
|
||||||
|
color: black;
|
||||||
|
display: block;
|
||||||
|
padding: 0.3em;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary a:hover {
|
||||||
|
background-color: #496ebc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .summary a:active {
|
||||||
|
background-color: #4CAF50; /* Add a green color to the "active/current" link */
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .content {
|
||||||
|
margin-left: 28%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .content h2 {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .content h3 {
|
||||||
|
padding: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .content h4 {
|
||||||
|
padding: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.documentation .content ul {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
@ -1,11 +1,14 @@
|
|||||||
{% extends "../base.html" %}
|
{% extends "../base.html" %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<form action="/auth/create" method="POST">
|
{% if error %}
|
||||||
Email: <input name="email" type="text" required><br>
|
<span style="color: red">Error: {{ error }}</span><p>
|
||||||
Name: <input name="name" type="text" required><br>
|
{% end %}
|
||||||
Password: <input name="password" type="password" required><br>
|
<form action="/auth/create" method="POST">
|
||||||
{% module xsrf_form_html() %}
|
Email: <input name="email" type="text" required><br>
|
||||||
<input type="submit">
|
Name: <input name="name" type="text" required><br>
|
||||||
</form>
|
Password: <input name="password" type="password" required><br>
|
||||||
|
{% module xsrf_form_html() %}
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
{% end %}
|
{% end %}
|
108
web/templates/bot/help.html
Normal file
108
web/templates/bot/help.html
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
{% extends "../base.html" %}
|
||||||
|
|
||||||
|
{% block head %}
|
||||||
|
<link rel="stylesheet" href="{{ static_url("documentation.css") }}" type="text/css">
|
||||||
|
{% end %}
|
||||||
|
|
||||||
|
{% block title %} {{ escape(handler.settings["website_title"]) }} - Help{% end %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="documentation">
|
||||||
|
<div class="summary">
|
||||||
|
<h2>Summary</h2>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="#module_modules">Module (<code>modules</code>)</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#">Liste des modules</a></li>
|
||||||
|
<li><a href="#">Charger un module</a></li>
|
||||||
|
<li><a href="#">Décharger un module</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#module_help">Help (<code>help</code>)</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#">Aide générale</a></li>
|
||||||
|
<li><a href="#">Aide d'un module précit</a></li>
|
||||||
|
<li><a href="#">Aide d'une commande précise</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="">Cofiguration (<code>config</code>)</a></li>
|
||||||
|
<li><a href="">Deeptown (<code>deeptown</code>)</a></li>
|
||||||
|
<li><a href="">Survey (<code>survey</code>)</a></li>
|
||||||
|
<li><a href="">Pi (<code>pi</code>)</a></li>
|
||||||
|
<li><a href="">Github (<code>github</code>)</a></li>
|
||||||
|
<li><a href="">Direct access to database (<code>directAccessDB</code>)</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<h2 id="module_modules">Modules (<code>modules</code>)</h2>
|
||||||
|
<div>
|
||||||
|
<h3>Liste des modules (<code>list_modules</code>)</h3>
|
||||||
|
<div>
|
||||||
|
<p>Commande permettant de lister les modules disponibles. (réservé aux administrateurs)</p>
|
||||||
|
<div>
|
||||||
|
<h4>Exemples:</h4>
|
||||||
|
<ul>
|
||||||
|
<li><code>list_modules</code>: retourne la liste des modules disponibles</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h3>Charger un module (<code>load</code>)</h3>
|
||||||
|
<div>
|
||||||
|
<p>Commande permettant de charger des modules. (réservé aux administrateurs)</p>
|
||||||
|
<div>
|
||||||
|
<h4>Exemples:</h4>
|
||||||
|
<ul>
|
||||||
|
<li><code>load help</code>: charge le module <code>help</code></li>
|
||||||
|
<li><code>load help module1 module2 ...</code>: charger les modules <code>help</code>,
|
||||||
|
<code>module1</code>,
|
||||||
|
<code>module2</code>,
|
||||||
|
...
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h3>Décharger un module (<code>unload</code>)</h3>
|
||||||
|
<div>
|
||||||
|
<p>Commande permettant de décharger des modules. (réservé aux administrateurs)</p>
|
||||||
|
<div>
|
||||||
|
<h4>Exemples:</h4>
|
||||||
|
<ul>
|
||||||
|
<li><code>unload module</code>: décharge le module <code>module</code></li>
|
||||||
|
<li><code>unload module1 module2 module3 ...</code>: décharge les modules <code>module1</code>,
|
||||||
|
<code>module2</code>,
|
||||||
|
<code>module3</code>, ...
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h2 id="module_help">Help (<code>help</code>)</h2>
|
||||||
|
<div>
|
||||||
|
<h3>Aide générale</h3>
|
||||||
|
<div>
|
||||||
|
<p>Commande permettant de lister les différentes commandes actives sur le bot.</p>
|
||||||
|
<div>
|
||||||
|
<h4>Exemples:</h4>
|
||||||
|
<ul>
|
||||||
|
<li><code>help</code>: Afficher la liste des commandes</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h3>Aide d'un module précit</h3>
|
||||||
|
<div>
|
||||||
|
<p>Commande permmetant d'afficher la description de toutes les commandes d'un module.</p>
|
||||||
|
<div>
|
||||||
|
<h4>Exemples:</h4>
|
||||||
|
<ul>
|
||||||
|
<li><code>help modules</code>: Affiche la description de toutes les commandes du module
|
||||||
|
<code>modules</code>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% end %}
|
Loading…
Reference in New Issue
Block a user