from flask import Flask, request, session from html import escape import sqlite3 import time app = Flask(__name__) app.secret_key = "stadion-escape-secret" STYLE = """ Glück Auf Stadion Escape
""" HTML_END = """
""" def get_db(): db = sqlite3.connect("adventure.db") db.row_factory = sqlite3.Row return db 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 = '

Highscore

    ' for eintrag in eintraege: html += "
  1. " + escape(eintrag["name"]) + " - " + str(round(eintrag["dauer"], 1)) + " Sekunden
  2. " html += "
" return 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.commit() db.close() session["spieler_id"] = spieler_id session["spieler_name"] = name return seite_html( "

Eintrittskarte gelöst

" "

Willkommen, " + escape(name) + ". Dein Weg durchs Stadion beginnt.

" 'Zum 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.

" '
' '' '' "" "
" '

Direkt zum Stadiontor

', "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 if r["raetsel_frage"]: if request.method == "POST": antwort = request.form["antwort"].strip().lower() richtige_antwort = r["raetsel_antwort"].strip().lower() 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")) + ".

" ) html += highscore_html(db) db.close() return seite_html(html) return seite_html( '

Leider falsch

' '

Erwin schüttelt den Kopf. Die Botschaft stimmt noch nicht.

' 'Nochmal versuchen' ) html = "

" + escape(r["name"]) + "

" html += "

" + escape(r["beschreibung"]) + "

" html += '
' html += '

' + escape(r["raetsel_frage"]) + "

" if raum_id == "nordkurve": html += ( '
' 'Hinweis' '

Erwins Schild zeigt kein zufälliges Fanplakat, sondern das Vereinsmotto.

' '
' ) html += '' html += '' html += "" html += "
" db.close() return seite_html(html) ausgaenge = db.execute( "SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum=?", (raum_id,), ).fetchall() db.close() html = "

" + escape(r["name"]) + "

" html += "

" + escape(r["beschreibung"]) + "

" for a in ausgaenge: html += '' html += escape(a["richtung"]) html += " " return seite_html(html) if __name__ == "__main__": app.run(host="0.0.0.0", port=9000)