from flask import Flask, redirect, request, session
from html import escape
from pathlib import Path
import re
import sqlite3
import time
app = Flask(__name__)
app.secret_key = "stadion-escape-secret"
DB_PATH = Path(__file__).with_name("adventure.db")
STYLE = """
Glück Auf Stadion Escape
"""
HTML_END = """
"""
def get_db():
db = sqlite3.connect(DB_PATH)
db.row_factory = sqlite3.Row
return db
def normalisiere_antwort(text):
text = text.strip().lower()
text = re.sub(r"[^a-z0-9äöüß]+", " ", text)
return " ".join(text.split())
def seite_html(inhalt, klasse="puzzle"):
return STYLE + '' + inhalt + "" + HTML_END
def highscore_html(db):
eintraege = db.execute(
"""
SELECT name, fertig_zeit - start_zeit AS dauer
FROM spieler
WHERE fertig_zeit IS NOT NULL
ORDER BY dauer
LIMIT 10
"""
).fetchall()
if not eintraege:
return ""
html = '
"
return html
@app.route("/highscore")
@app.route("/app/highscore")
def highscore():
db = get_db()
html = highscore_html(db)
db.close()
if not html:
html = (
"
Highscore
"
"
Noch keine fertigen Stadionrunden. Starte ein Abenteuer, dann taucht deine Zeit hier auf.
"
)
html += 'Zurück zum Start'
return seite_html(html)
@app.route("/", methods=["GET", "POST"])
@app.route("/app/", methods=["GET", "POST"])
def start():
if request.method == "POST":
name = request.form["name"].strip()
if not name:
name = "Unbekannter Fan"
db = get_db()
cursor = db.execute(
"INSERT INTO spieler (name, start_zeit, fertig_zeit) VALUES (?, ?, NULL)",
(name, time.time()),
)
spieler_id = cursor.lastrowid
db.execute(
"INSERT OR REPLACE INTO spielstand (spieler, raum_id) VALUES (?, ?)",
(name, "stadiontor"),
)
db.commit()
db.close()
session["spieler_id"] = spieler_id
session["spieler_name"] = name
session["spieler"] = name
return redirect("/app/raum/stadiontor")
return seite_html(
'
Escape Room im Stadiongang
'
"
Glück Auf im Stadion
"
"
Trage deinen Namen auf der Eintrittskarte ein. Ab dann läuft deine Zeit.
',
"scene",
)
@app.route("/raum/", methods=["GET", "POST"])
@app.route("/app/raum/", methods=["GET", "POST"])
def raum(raum_id):
db = get_db()
r = db.execute("SELECT * FROM raeume WHERE id=?", (raum_id,)).fetchone()
if r is None:
db.close()
return seite_html(
'
Raum nicht gefunden
Zurück zum Start'
), 404
spieler_name = session.get("spieler") or session.get("spieler_name")
if spieler_name:
db.execute(
"INSERT OR REPLACE INTO spielstand (spieler, raum_id) VALUES (?, ?)",
(spieler_name, raum_id),
)
db.commit()
if r["raetsel_frage"]:
if request.method == "POST":
antwort = normalisiere_antwort(request.form["antwort"])
richtige_antwort = normalisiere_antwort(r["raetsel_antwort"])
db.close()
if antwort == richtige_antwort:
db = get_db()
spieler_id = session.get("spieler_id")
if spieler_id:
db.execute(
"UPDATE spieler SET fertig_zeit=? WHERE id=? AND fertig_zeit IS NULL",
(time.time(), spieler_id),
)
db.commit()
html = (
"
Geschafft!
"
"
Die Nordkurve feiert mit dir, "
+ escape(session.get("spieler_name", "Fan"))
+ ".