rangliste auf der startseite
This commit is contained in:
parent
175c57b19c
commit
0a7686ef2f
1 changed files with 50 additions and 108 deletions
158
app/app.py
158
app/app.py
|
|
@ -1,5 +1,6 @@
|
||||||
from flask import Flask, request, session, redirect
|
from flask import Flask, request, session, redirect
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.secret_key = "sneaky-snakes-snacken-snacks"
|
app.secret_key = "sneaky-snakes-snacken-snacks"
|
||||||
|
|
@ -46,7 +47,7 @@ def layout(content):
|
||||||
}}
|
}}
|
||||||
|
|
||||||
.card {{
|
.card {{
|
||||||
width: min(720px, 100%);
|
width: min(840px, 100%);
|
||||||
background: var(--card);
|
background: var(--card);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 22px;
|
border-radius: 22px;
|
||||||
|
|
@ -120,6 +121,21 @@ def layout(content):
|
||||||
.exits {{
|
.exits {{
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
.highscore {{
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
padding-top: 1rem;
|
||||||
|
border-top: 1px solid rgba(148, 163, 184, 0.15);
|
||||||
|
}}
|
||||||
|
|
||||||
|
ol {{
|
||||||
|
margin: 0.5rem 0 0;
|
||||||
|
padding-left: 1.3rem;
|
||||||
|
}}
|
||||||
|
|
||||||
|
li {{
|
||||||
|
margin: 0.35rem 0;
|
||||||
|
}}
|
||||||
</style>
|
</style>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
{content}
|
{content}
|
||||||
|
|
@ -127,119 +143,45 @@ def layout(content):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_columns():
|
||||||
|
db = get_db()
|
||||||
|
db.execute("""
|
||||||
|
CREATE TABLE IF NOT EXISTS highscore (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
spieler TEXT NOT NULL,
|
||||||
|
sekunden REAL NOT NULL,
|
||||||
|
gewonnen_am TEXT NOT NULL
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
try:
|
||||||
|
db.execute("ALTER TABLE spielstand ADD COLUMN startzeit TEXT")
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
db.execute("ALTER TABLE spielstand ADD COLUMN fertig INTEGER DEFAULT 0")
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
pass
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
|
ensure_columns()
|
||||||
|
|
||||||
|
|
||||||
@app.route("/", methods=["GET", "POST"])
|
@app.route("/", methods=["GET", "POST"])
|
||||||
def start():
|
def start():
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
name = request.form["name"].strip()
|
name = request.form["name"].strip()
|
||||||
if name != "":
|
if name != "":
|
||||||
session["spieler"] = name
|
session["spieler"] = name
|
||||||
|
session["startzeit"] = datetime.utcnow().isoformat()
|
||||||
|
|
||||||
db = get_db()
|
db = get_db()
|
||||||
db.execute(
|
row = db.execute(
|
||||||
"INSERT OR IGNORE INTO spielstand (spieler, raum_id) VALUES (?, 1)",
|
"SELECT spieler FROM spielstand WHERE spieler=?",
|
||||||
(name,)
|
(name,)
|
||||||
)
|
).fetchone()
|
||||||
db.commit()
|
|
||||||
db.close()
|
|
||||||
return redirect("/app/raum/1")
|
|
||||||
|
|
||||||
db = get_db()
|
if row:
|
||||||
anzahl = db.execute("SELECT COUNT(*) AS n FROM spielstand").fetchone()["n"]
|
db.execute(
|
||||||
|
"UPDATE
|
||||||
html = "<h1>Verlies</h1>"
|
|
||||||
html += f"<p class='muted'>{anzahl} Abenteurer waren schon hier.</p>"
|
|
||||||
|
|
||||||
if "spieler" in session:
|
|
||||||
s = db.execute(
|
|
||||||
"SELECT raum_id FROM spielstand WHERE spieler=?",
|
|
||||||
(session["spieler"],)
|
|
||||||
).fetchone()
|
|
||||||
if s:
|
|
||||||
html += f"<p>Willkommen zurück, <strong>{session['spieler']}</strong>!</p>"
|
|
||||||
html += f'<a href="/app/raum/{s["raum_id"]}">Weiterspielen</a>'
|
|
||||||
html += '<a class="secondary" href="/app/reset">Neues Abenteuer</a>'
|
|
||||||
|
|
||||||
db.close()
|
|
||||||
|
|
||||||
html += """
|
|
||||||
<form method="post">
|
|
||||||
<label for="name">Dein Name:</label><br>
|
|
||||||
<input id="name" name="name" placeholder="Zum Beispiel Mara">
|
|
||||||
<br>
|
|
||||||
<button type="submit">Abenteuer starten</button>
|
|
||||||
</form>
|
|
||||||
"""
|
|
||||||
return layout(html)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/raum/<int:id>", methods=["GET", "POST"])
|
|
||||||
def raum(id):
|
|
||||||
db = get_db()
|
|
||||||
|
|
||||||
if "spieler" in session:
|
|
||||||
db.execute(
|
|
||||||
"UPDATE spielstand SET raum_id=? WHERE spieler=?",
|
|
||||||
(id, session["spieler"])
|
|
||||||
)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
r = db.execute("SELECT * FROM raeume WHERE id=?", (id,)).fetchone()
|
|
||||||
|
|
||||||
if r["raetsel_frage"]:
|
|
||||||
if request.method == "POST":
|
|
||||||
if request.form["antwort"].strip() == r["raetsel_antwort"]:
|
|
||||||
db.close()
|
|
||||||
return layout("""
|
|
||||||
<h1>Du findest einen geilen Schatz</h1>
|
|
||||||
<p>Herzlichen Glückwunsch. Du hast das Verlies überlebt.</p>
|
|
||||||
<a href="/app/">Zurück zum Anfang</a>
|
|
||||||
""")
|
|
||||||
db.close()
|
|
||||||
return layout(f"""
|
|
||||||
<h1>Leider falsch</h1>
|
|
||||||
<p>Die Antwort war nicht richtig.</p>
|
|
||||||
<a href="/app/raum/{id}">Nochmal</a>
|
|
||||||
""")
|
|
||||||
|
|
||||||
db.close()
|
|
||||||
return layout(f"""
|
|
||||||
<h1>{r["name"]}</h1>
|
|
||||||
<p>{r["beschreibung"]}</p>
|
|
||||||
<form method="post">
|
|
||||||
<label for="antwort">{r["raetsel_frage"]}</label><br>
|
|
||||||
<input id="antwort" name="antwort" placeholder="Antwort eingeben">
|
|
||||||
<br>
|
|
||||||
<button type="submit">OK</button>
|
|
||||||
</form>
|
|
||||||
""")
|
|
||||||
|
|
||||||
ausgaenge = db.execute(
|
|
||||||
"SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum=?",
|
|
||||||
(id,)
|
|
||||||
).fetchall()
|
|
||||||
db.close()
|
|
||||||
|
|
||||||
exits_html = ""
|
|
||||||
for a in ausgaenge:
|
|
||||||
exits_html += f'<a href="/app/raum/{a["nach_raum"]}">{a["richtung"]}</a>'
|
|
||||||
|
|
||||||
spieler_html = ""
|
|
||||||
if "spieler" in session:
|
|
||||||
spieler_html = f'<p class="muted">Unterwegs als: {session["spieler"]}</p>'
|
|
||||||
|
|
||||||
html = f"""
|
|
||||||
<h1>{r["name"]}</h1>
|
|
||||||
<p>{r["beschreibung"]}</p>
|
|
||||||
{spieler_html}
|
|
||||||
<div class="exits">{exits_html}</div>
|
|
||||||
"""
|
|
||||||
return layout(html)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/reset")
|
|
||||||
def reset():
|
|
||||||
session.pop("spieler", None)
|
|
||||||
return redirect("/app/")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
app.run(host="0.0.0.0", port=9008)
|
|
||||||
Loading…
Reference in a new issue