Add defensive mode, and a leaderboard

This commit is contained in:
csd4ni3l
2025-10-02 22:45:30 +02:00
parent fb9097f42f
commit db22f6b591
6 changed files with 307 additions and 5 deletions

69
app.py
View File

@@ -2,7 +2,7 @@ from flask import Flask, render_template, request, g, redirect, url_for, Respons
from dotenv import load_dotenv
from google.genai import Client, types
from constants import OFFENSIVE_SCENARIO_PROMPT, OFFENSIVE_ANSWER_PROMPT, debt_amount_regex, evaluation_regex, AI_NAME
from constants import OFFENSIVE_SCENARIO_PROMPT, OFFENSIVE_ANSWER_PROMPT, DEFENSIVE_SCENARIO_PROMPT, DEFENSIVE_ANSWER_PROMPT, debt_amount_regex, evaluation_regex, AI_NAME
import os, requests, time, re, sqlite3, flask_login, bcrypt, secrets
@@ -67,9 +67,38 @@ def offensive_mode():
username = flask_login.current_user.id
return render_template("offensive.jinja2", ai_name=AI_NAME, username=username)
@app.route("/defensive")
@flask_login.login_required
def defensive_mode():
username = flask_login.current_user.id
return render_template("defensive.jinja2", ai_name=AI_NAME, username=username)
@app.route("/leaderboard")
@flask_login.login_required
def leaderboard():
return render_template("leaderboard.jinja2")
username = flask_login.current_user.id
leaderboard_type = request.args.get("leaderboard_type", "offended_debt_amount")
cur = get_db().cursor()
if leaderboard_type == "offended_debt_amount":
leaderboard_type = "Offended Debt Amount"
cur.execute("SELECT offended_debt_amount, username FROM Users ORDER BY offended_debt_amount DESC")
elif leaderboard_type == "defended_debt_amount":
leaderboard_type = "Defended Debt Amount"
cur.execute("SELECT defended_debt_amount, username FROM Users ORDER BY defended_debt_amount DESC")
elif leaderboard_type == "offensive_wins":
leaderboard_type = "Offensive Wins"
cur.execute("SELECT offensive_wins, username FROM Users ORDER BY offensive_wins DESC")
elif leaderboard_type == "defensive_wins":
leaderboard_type = "Defensive Wins"
cur.execute("SELECT defensive_wins, username FROM Users ORDER BY defensive_wins DESC")
rows = cur.fetchall()
if not rows:
cur.close()
return render_template("leaderboard.jinja2", username=username, leaderboard_type=leaderboard_type, users=rows)
@app.route("/login", methods=["GET", "POST"])
def login():
@@ -149,6 +178,21 @@ def ai_prompt(prompt):
return response.text.replace("'''", '')
@app.route("/defensive_scenario")
@flask_login.login_required
def defensive_scenario():
text = ""
while not "Debt amount: " in text or not "Scenario: " in text or not re.findall(debt_amount_regex, text):
text = ai_prompt(DEFENSIVE_SCENARIO_PROMPT)
time.sleep(0.5)
return {
"scenario": text.split("Scenario: ")[1].split("\n")[0],
"debt_amount": int(text.split("Debt amount: ")[1].split("$")[0])
}
@app.route("/offensive_scenario")
@flask_login.login_required
def offensive_scenario():
@@ -185,4 +229,25 @@ def offensive_answer():
"final_debt_amount": text.split("Final Debt Amount: ")[1].split("$")[0]
}
@app.route("/defensive_answer", methods=["POST"])
@flask_login.login_required
def defensive_answer():
scenario, user_input = request.json['scenario'], request.json["user_input"]
if not scenario or not user_input:
return "Missing data."
text = ""
while not re.findall(evaluation_regex, text):
text = ai_prompt(DEFENSIVE_ANSWER_PROMPT.format_map({"scenario": scenario, "user_input": user_input, "ai_name": AI_NAME}))
time.sleep(0.5)
return {
"story": text.split("\nEVALUATION")[0],
"convinced": True if "Yes" in text.split("Convinced: ")[1].split("\nFinal")[0] else False,
"final_debt_amount": text.split("Final Debt Amount: ")[1].split("$")[0]
}
app.run(host=os.environ.get("HOST", "0.0.0.0"), port=os.environ.get("PORT", 8080), debug=os.environ.get("DEBUG_MODE", False))