from flask import Flask, request, session, redirect import html import sqlite3 from pathlib import Path app = Flask(__name__) app.secret_key = "hier-eigenen-geheimen-text" # für session nötig DB_PATH = Path(__file__).with_name("adventure.db") def get_db(): db = sqlite3.connect(DB_PATH) db.row_factory = sqlite3.Row return db BASE_CSS = """... (unverändert, deine bestehende CSS bleibt) ...""" BASE_JS = """... (unverändert) ...""" def render_page(title, body_html): return f""" {html.escape(title)}
{body_html}
""" @app.route("/", methods=["GET", "POST"]) @app.route("/app", methods=["GET", "POST"]) @app.route("/app/", methods=["GET", "POST"]) def start(): if request.method == "POST": name = request.form.get("name", "").strip() if name != "": session["spieler"] = name db = get_db() db.execute( "INSERT OR IGNORE INTO spielstand (spieler, raum_id) VALUES (?, 1)", (name,) ) db.commit() db.close() return redirect("/app/raum/1") db = get_db() anzahl = db.execute("SELECT COUNT(*) AS n FROM spielstand").fetchone() weiterspielen_html = "" if "spieler" in session: s = db.execute( "SELECT raum_id FROM spielstand WHERE spieler=?", (session["spieler"],) ).fetchone() if s: weiterspielen_html = f"""

Willkommen zurück, {html.escape(session['spieler'])}!

Weiterspielen Neues Abenteuer

""" db.close() body = f"""

Verlassenes Raumschiff

Du bist der einzige Überlebende an Bord. Erkunde das Schiff und aktiviere das Notsignal.

{weiterspielen_html}

{anzahl['n']} Abenteurer waren schon hier.

""" return render_page("Verlassenes Raumschiff", body) @app.route("/raum/", methods=["GET", "POST"]) @app.route("/app/raum/", methods=["GET", "POST"]) def raum(id): db = get_db() # Spielstand fortschreiben, sobald jemand angemeldet ist 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 not r: db.close() return render_page( "Raum nicht gefunden", '

Raum nicht gefunden

Der angeforderte Raum existiert nicht.

' '' ) unterwegs_html = "" if "spieler" in session: unterwegs_html = f'

Unterwegs als: {html.escape(session["spieler"])}

' if r["raetsel_frage"]: if request.method == "POST": if request.form.get("antwort", "").strip() == r["raetsel_antwort"]: db.close() return render_page( "Notsignal aktiviert", '

Notsignal erfolgreich aktiviert

Rettung ist unterwegs.

' '' ) db.close() return render_page( "Falscher Code", '

Falscher Code

Der KI-Kern reagiert nicht.

' '' ) db.close() body = f"""

{html.escape(r['name'])}

{html.escape(r['beschreibung'])}

{unterwegs_html}
""" return render_page(html.escape(r["name"]), body) ausgaenge = db.execute( "SELECT richtung, nach_raum FROM ausgaenge WHERE von_raum=?", (id,) ).fetchall() db.close() body = f"""

{html.escape(r['name'])}

{html.escape(r['beschreibung'])}

{unterwegs_html} " return render_page(html.escape(r["name"]), body) @app.route("/reset") @app.route("/app/reset") def reset(): session.pop("spieler", None) # Session vergessen (DB bleibt!) return redirect("/app/") if __name__ == "__main__": app.run(host="0.0.0.0", port=9004)