diff --git a/app/__pycache__/app.cpython-313.pyc b/app/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000..d4c8bb2 Binary files /dev/null and b/app/__pycache__/app.cpython-313.pyc differ diff --git a/app/app.py b/app/app.py index f8393bf..841f938 100644 --- a/app/app.py +++ b/app/app.py @@ -1,38 +1,102 @@ import os import sqlite3 -from flask import Flask, request +import time +from flask import Flask, redirect, request, session app = Flask(__name__) +app.secret_key = "escape-room-secret" BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DB_PATH = os.path.join(BASE_DIR, "adventure.db") + def get_db(): db = sqlite3.connect(DB_PATH) db.row_factory = sqlite3.Row return db + +def get_highscores(limit=10): + db = get_db() + rows = db.execute( + """ + SELECT name, fertig_zeit - start_zeit AS dauer + FROM spieler + WHERE fertig_zeit IS NOT NULL + ORDER BY dauer + LIMIT ? + """, + (limit,), + ).fetchall() + db.close() + return rows + + @app.route("/", methods=["GET", "POST"]) @app.route("/app", methods=["GET", "POST"]) @app.route("/app/", methods=["GET", "POST"]) def start(): + if request.method == "POST" and "spielername" in request.form: + name = request.form.get("spielername", "").strip() or "Unbekannt" + db = get_db() + cur = db.execute( + "INSERT INTO spieler (name, start_zeit, fertig_zeit) VALUES (?, ?, NULL)", + (name, time.time()), + ) + db.commit() + db.close() + session["player_id"] = cur.lastrowid + session["player_name"] = name + return redirect("/app/?room=1") + room_id = request.args.get("room", type=int) - if room_id is None: - return '

Verlies

Abenteuer starten' + player_id = session.get("player_id") + + if room_id is None or player_id is None: + html = "

Verlies

" + if player_id is not None: + html += "

Willkommen zurück, " + session.get("player_name", "Spieler") + ".

" + else: + html += "

Bitte gib zuerst deinen Namen ein, bevor du ins Verlies gehst.

" + html += "
" + html += "

Highscores ansehen

" + html += "

Highscores

    " + rows = get_highscores() + if rows: + for row in rows: + html += "
  1. " + row["name"] + ": " + f"{row['dauer']:.2f}" + "s
  2. " + else: + html += "
  3. Noch keine abgeschlossenen Spiele.
  4. " + html += "
" + return html db = get_db() - r = db.execute("SELECT name, beschreibung, raetsel_frage, raetsel_antwort FROM raeume WHERE id = ?", (room_id,)).fetchone() + r = db.execute( + "SELECT name, beschreibung, raetsel_frage, raetsel_antwort FROM raeume WHERE id = ?", + (room_id,), + ).fetchone() ausgaenge = db.execute( "SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum = ?", (room_id,) ).fetchall() db.close() if r is None: - return '

Raum nicht gefunden

' + return "

Raum nicht gefunden

" if r["raetsel_frage"]: if request.method == "POST": if request.form.get("antwort", "").strip() == r["raetsel_antwort"]: - return "

Befreit!

" + db = get_db() + current = db.execute( + "SELECT fertig_zeit FROM spieler WHERE id = ?", (player_id,) + ).fetchone() + if current and current["fertig_zeit"] is None: + db.execute( + "UPDATE spieler SET fertig_zeit = ? WHERE id = ?", + (time.time(), player_id), + ) + db.commit() + db.close() + return "

Geschafft!

Du hast den Schatz gefunden.

Zum Highscore

" return 'Leider falsch. nochmal' html = "

" + r["name"] + "

" @@ -46,6 +110,20 @@ def start(): html += '' + a["richtung"] + '   ' return html + +@app.route("/app/highscore") +def highscore(): + html = "

Highscores

    " + rows = get_highscores() + if rows: + for row in rows: + html += "
  1. " + row["name"] + ": " + f"{row['dauer']:.2f}" + "s
  2. " + else: + html += "
  3. Noch keine abgeschlossenen Spiele.
  4. " + html += "

Zurück zum Spiel

" + return html + + if __name__ == "__main__": port = int(os.environ.get("PORT", "9003")) app.run(host="0.0.0.0", port=port) diff --git a/app/init_db.py b/app/init_db.py index 8530b66..7bd1dc1 100644 --- a/app/init_db.py +++ b/app/init_db.py @@ -5,6 +5,7 @@ db = sqlite3.connect("adventure.db") # Datei wird angelegt, falls nicht da db.executescript(""" DROP TABLE IF EXISTS raeume; DROP TABLE IF EXISTS ausgaenge; +DROP TABLE IF EXISTS spieler; CREATE TABLE raeume ( id INTEGER PRIMARY KEY, @@ -18,6 +19,12 @@ CREATE TABLE ausgaenge ( richtung TEXT, nach_raum INTEGER ); +CREATE TABLE spieler ( + id INTEGER PRIMARY KEY, + name TEXT, + start_zeit REAL, + fertig_zeit REAL +); INSERT INTO raeume (id, name, beschreibung, raetsel_frage, raetsel_antwort) VALUES (1, 'Eingangshalle', 'Eine schwere Tür fällt hinter dir zu. Zwei Gänge führen ins Dunkel.', NULL, NULL),