from flask import Flask, render_template, request, redirect, url_for import sqlite3 app = Flask(__name__) DB_PATH = "tarkov.db" def get_db(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn @app.route("/") def index(): conn = get_db() maps = conn.execute(""" SELECT id, name FROM maps ORDER BY name """).fetchall() map_filter = request.args.get("map_id", type=int) key_map_rows = conn.execute(""" SELECT key_id, map_id FROM key_maps """).fetchall() key_maps = {} for row in key_map_rows: key_maps.setdefault(row["key_id"], set()).add(row["map_id"]) key_query = """ SELECT k.id, k.name, k.icon_url, k.grid_image_url, k.wiki_url, r.priority, r.reason, COALESCE(r.used_in_quest, 0) AS used_in_quest FROM keys k """ params = [] if map_filter: key_query += """ JOIN key_maps kmf ON k.id = kmf.key_id AND kmf.map_id = ? """ params.append(map_filter) key_query += """ LEFT JOIN key_ratings r ON k.id = r.key_id ORDER BY CASE WHEN r.priority IS NULL THEN 1 ELSE 0 END, r.priority DESC, k.name """ keys = conn.execute(key_query, params).fetchall() conn.close() key_maps = {k: sorted(v) for k, v in key_maps.items()} return render_template( "index.html", keys=keys, maps=maps, key_maps=key_maps, map_filter=map_filter, ) @app.route("/rate", methods=["POST"]) def rate_key(): key_id = request.form["key_id"] priority = request.form["priority"] reason = request.form.get("reason", "") used_in_quest = 1 if request.form.get("used_in_quest") == "on" else 0 map_filter = request.form.get("map_id") map_ids = [] for value in request.form.getlist("map_ids"): try: map_ids.append(int(value)) except ValueError: continue conn = get_db() conn.execute(""" INSERT INTO key_ratings (key_id, priority, reason, used_in_quest) VALUES (?, ?, ?, ?) ON CONFLICT(key_id) DO UPDATE SET priority = excluded.priority, reason = excluded.reason, used_in_quest = excluded.used_in_quest, updated_at = CURRENT_TIMESTAMP """, (key_id, priority, reason, used_in_quest)) conn.execute("DELETE FROM key_maps WHERE key_id = ?", (key_id,)) if map_ids: conn.executemany( "INSERT OR IGNORE INTO key_maps (key_id, map_id) VALUES (?, ?)", [(key_id, map_id) for map_id in map_ids], ) conn.commit() conn.close() if map_filter: return redirect(url_for("index", map_id=map_filter)) return redirect(url_for("index")) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)