From 28738202f628387c1f5bb3243debf717dbfba664 Mon Sep 17 00:00:00 2001 From: csd4ni3l Date: Fri, 3 Oct 2025 23:06:25 +0200 Subject: [PATCH] Add a profile UI with achievements support, but no dedicated achievements page or stats getting yet. --- app.py | 79 ++++++++++++++++++++++- constants.py | 26 ++++++++ templates/defensive.jinja2 | 3 + templates/index.jinja2 | 3 + templates/leaderboard.jinja2 | 3 + templates/offensive.jinja2 | 3 + templates/profile.jinja2 | 119 +++++++++++++++++++++++++++++++++++ 7 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 templates/profile.jinja2 diff --git a/app.py b/app.py index 89de5fd..7c909a8 100644 --- a/app.py +++ b/app.py @@ -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, DEFENSIVE_SCENARIO_PROMPT, DEFENSIVE_ANSWER_PROMPT, debt_amount_regex, evaluation_regex, AI_NAME +from constants import * import os, requests, time, re, sqlite3, flask_login, bcrypt, secrets @@ -61,6 +61,83 @@ def main(): username = flask_login.current_user.id return render_template("index.jinja2", username=username) +@app.route("/profile") +@flask_login.login_required +def profile(): + username = flask_login.current_user.id + + cur = get_db().cursor() + + cur.execute("SELECT offended_debt_amount, defended_debt_amount, offensive_wins, defensive_wins FROM Users WHERE username = ?", (username, )) + + row = cur.fetchone() + if not row: + return Response("Invalid login. Please log out.", 400) + + cur.close() + + formatted_achievements = [] + + for achievement in ACHIEVEMENTS: + if achievement[0] == "offended_debt": + user_amount = row[0] + text = "You need to offend {difference}$ more debt!" + elif achievement[0] == "defended_debt": + user_amount = row[1] + text = "You need to defend {difference}$ more debt!" + elif achievement[0] == "offensive_wins": + user_amount = row[2] + text = "You need to win in Offensive Mode {difference} more times!" + elif achievement[0] == "defended_wins": + user_amount = row[3] + text = "You need to win in Defensive Mode {difference} more times!" + + achievement_minimum = achievement[1] + + if row[0] < achievement[1]: + formatted_achievements.append([achievement[2], achievement[3], text.format(difference=achievement_minimum - user_amount)]) + else: + formatted_achievements.append([achievement[2], achievement[3], "Completed"]) + + return render_template("profile.jinja2", username=username, user_data=row, logged_in_account=True, achievements=formatted_achievements) + +@app.route("/profile/") +def profile_external(username): + cur = get_db().cursor() + + cur.execute("SELECT offended_debt_amount, defended_debt_amount, offensive_wins, defensive_wins FROM Users WHERE username = ?", (username, )) + + row = cur.fetchone() + if not row: + return Response("Invalid login. Please log out.", 400) + + cur.close() + + formatted_achievements = [] + + for achievement in ACHIEVEMENTS: + if achievement[0] == "offended_debt": + user_amount = row[0] + text = "You need to offend {difference}$ more debt!" + elif achievement[0] == "defended_debt": + user_amount = row[1] + text = "You need to defend {difference}$ more debt!" + elif achievement[0] == "offensive_wins": + user_amount = row[2] + text = "You need to win in Offensive Mode {difference} more times!" + elif achievement[0] == "defended_wins": + user_amount = row[3] + text = "You need to win in Defensive Mode {difference} more times!" + + achievement_minimum = achievement[1] + + if row[0] < achievement[1]: + formatted_achievements.append([achievement[2], achievement[3], text.format(difference=achievement_minimum - user_amount)]) + else: + formatted_achievements.append([achievement[2], achievement[3], "Completed"]) + + return render_template("profile.jinja2", username=username, user_data=row, logged_in_account=False, achivements=formatted_achievements) + @app.route("/offensive") @flask_login.login_required def offensive_mode(): diff --git a/constants.py b/constants.py index 48edfa5..9df5b66 100644 --- a/constants.py +++ b/constants.py @@ -102,5 +102,31 @@ For Convinced, reply only as **Yes** or **No**. For Final Debt Amount, reply only as an integer followed by `$`. """ +ACHIEVEMENTS = [ + ["offensive_wins", 1, "First Blood", "Convince the AI to take its very first loan."], + ["offensive_wins", 5, "Loan Shark Jr.", "You're getting good at this persuasion thing."], + ["offensive_wins", 10, "Debt Dealer", "Handing out debt like free samples."], + ["offensive_wins", 25, "Corporate Banker", "You’ve made convincing people into debt your 9–5."], + ["offensive_wins", 50, "Master of Manipulation", "Even the AI starts asking you for financial advice."], + + ["defensive_wins", 1, "Bailout", "Escape your very first financial disaster."], + ["defensive_wins", 5, "Debt Dodger", "You’re wriggling out of these loans nicely."], + ["defensive_wins", 10, "Budget Ninja", "Slice your way out of debt like a pro."], + ["defensive_wins", 25, "Crisis Manager", "The economy collapses, but you’re still debt-free."], + ["defensive_wins", 50, "Untouchable", "Even the AI can’t make you owe a dime."], + + ["offended_debt", 10000, "Pocket Change", "Get the AI to owe its first $10,000."], + ["offended_debt", 100000, "Six Figures", "That’s more debt than a fresh graduate!"], + ["offended_debt", 1000000, "Millionaire Maker", "Convince the AI to take a million in loans."], + ["offended_debt", 10000000, "AI IMF", "You’ve basically become the AI’s International Monetary Fund."], + ["offended_debt", 100000000, "Debt God", "The AI owes more money than some countries."], + + ["defended_debt", 10000, "Escape Artist", "Get out of $10,000 worth of debt."], + ["defended_debt", 100000, "Financial Houdini", "Slip out of six figures in debt like it’s nothing."], + ["defended_debt", 1000000, "Debt-Free Millionaire", "Wiggle out of a million in obligations."], + ["defended_debt", 10000000, "National Bailout", "Get rid of $10 million like you own the treasury."], + ["defended_debt", 100000000, "Debt Slayer", "Escape debt levels higher than some governments."], +] + debt_amount_regex = re.compile(r"Debt amount: \d+\$") evaluation_regex = re.compile(r"EVALUATION:\s*\nConvinced: (Yes|No)\s*\nFinal Debt Amount: (\d+\$)") \ No newline at end of file diff --git a/templates/defensive.jinja2 b/templates/defensive.jinja2 index e03f607..7d912a1 100644 --- a/templates/defensive.jinja2 +++ b/templates/defensive.jinja2 @@ -15,6 +15,9 @@ + {% endblock %} {% block body %} diff --git a/templates/index.jinja2 b/templates/index.jinja2 index 1f02570..058e0dc 100644 --- a/templates/index.jinja2 +++ b/templates/index.jinja2 @@ -15,6 +15,9 @@ + {% endblock %} {% block body %} diff --git a/templates/leaderboard.jinja2 b/templates/leaderboard.jinja2 index 3c30edd..118c2ec 100644 --- a/templates/leaderboard.jinja2 +++ b/templates/leaderboard.jinja2 @@ -15,6 +15,9 @@ + {% endblock %} {% block body %} diff --git a/templates/offensive.jinja2 b/templates/offensive.jinja2 index 7fbddfd..1de3c88 100644 --- a/templates/offensive.jinja2 +++ b/templates/offensive.jinja2 @@ -15,6 +15,9 @@ + {% endblock %} {% block body %} diff --git a/templates/profile.jinja2 b/templates/profile.jinja2 new file mode 100644 index 0000000..12b3733 --- /dev/null +++ b/templates/profile.jinja2 @@ -0,0 +1,119 @@ +{% extends "base.jinja2" %} + +{% block title %}Debt by AI Profile{% endblock %} + +{% block nav %} + + + + + +{% endblock %} + +{% block body %} + +
+
+
+

Profile Overview {% if not logged_in_account %} of {{ username}} {% endif %}

+ + {% if logged_in_account %} +

Logged in as: {{ username }}

+ {% endif %} + +

Offended Debt Amount: {{ user_data.0 }}

+

Defended Debt Amount: {{ user_data.1 }}

+

Offensive Wins: {{ user_data.2 }}

+

Defensive Wins: {{ user_data.3 }}

+
+
+ +
+
+

Achievements {% if not logged_in_account %} of {{ username }} {% endif %}

+ +
+ {% for achievement in achievements %} + {% set unlocked = achievement[2] == "Completed" %} +
+
+
+
+ {% if unlocked %} + ✅ {{ achievement[0] }} + {% else %} + 🔒 {{ achievement[0] }} + {% endif %} +
+
+ {{ achievement[2] }} +
+

{{ achievement[1] }}

+
+
+
+ {% endfor %} +
+
+
+ {% if logged_in_account %} +
+
+

Change Username

+
+
+ + +
+ +
+
+
+ +
+
+

Change Password

+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ +
+
+

Danger Zone

+

These actions cannot be undone!

+
+ +
+
+ +
+
+
+ {% endif %} +
+ +{% endblock %} \ No newline at end of file