Yeet expo page

Fix score uploading
This commit is contained in:
Michał Gdula 2023-06-21 00:50:36 +03:00
parent 85a329ad6d
commit a93a8cf04d
40 changed files with 109 additions and 1247 deletions

View file

@ -7,7 +7,7 @@ from werkzeug.exceptions import HTTPException
from server.extensions import db, migrate, cache, assets, login_manager
from server.models import Users
from server.config import MIGRATION_DIR, INSTANCE_DIR
from server import views, auth, api
from server import views, auth, api, filters
app = Flask(__name__, instance_path=INSTANCE_DIR)
@ -39,6 +39,7 @@ cache.init_app(app)
app.register_blueprint(views.blueprint)
app.register_blueprint(auth.blueprint)
app.register_blueprint(api.blueprint)
app.register_blueprint(filters.blueprint)
@login_manager.user_loader

View file

@ -43,39 +43,34 @@ def tokens():
@blueprint.route("/post", methods=["POST"])
def post():
form = request.form
error = []
session_key = request.form.get("session", None)
version = request.form.get("version", "alpha")
difficulty = request.form.get("difficulty", 0)
score = request.form.get("score", 0)
if not form:
error.append("No form data provided!")
if not form["session"]:
error.append("No session key provided!")
if not form["version"]:
error.append("No version provided!")
if error:
return jsonify(error), 400
if not session_key:
return "No session key provided!"
if not score:
return "Score is not valid!"
try:
int(form["score"])
int(form["difficulty"])
float(score)
int(difficulty)
except TypeError:
error.append("Invalid score and difficulty must be valid numbers!")
return "Invalid score and difficulty must be valid numbers!"
if int(form["difficulty"]) not in GAME_DIFFICULTIES:
error.append("Invalid difficulty!")
if int(difficulty) not in GAME_DIFFICULTIES:
return "Invalid difficulty!"
session_data = Sessions.query.filter_by(auth_key=form["session"]).first()
session_data = Sessions.query.filter_by(auth_key=session_key).first()
if not session_data:
error.append("Authentication failed!")
if error:
return jsonify(error), 400
return "Authentication failed!"
score = Scores(
score=int(form["score"]),
difficulty=int(form["difficulty"]),
version=form["version"],
score=float(score),
difficulty=int(difficulty),
version=version,
user_id=session_data.user_id,
)

View file

@ -82,7 +82,7 @@ def login():
if error:
for err in error:
flash(err, "error")
return redirect(url_for("auth.account"))
return redirect(url_for("views.account"))
login_user(user, remember=True)
flash("Successfully logged in!", "success")

13
TFR/server/filters.py Normal file
View file

@ -0,0 +1,13 @@
import datetime
from flask import Blueprint
blueprint = Blueprint('filters', __name__, template_folder='templates')
@blueprint.app_template_filter()
def format_result(dttm):
dttm = str(dttm).split('.')
time = datetime.timedelta(seconds=int(dttm[0]))
microtime = dttm[1][:3]
return f'{time}:{microtime}'

View file

@ -16,9 +16,11 @@ class Scores(db.Model):
"""
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
score = db.Column(db.Float, nullable=False)
difficulty = db.Column(db.Integer, nullable=False)
scored_at = db.Column(
db.DateTime,
nullable=False,
@ -31,7 +33,6 @@ class Scores(db.Model):
)
version = db.Column(db.String, default=GAME_VERSION)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
class Sessions(db.Model):
@ -41,9 +42,11 @@ class Sessions(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
auth_key = db.Column(db.String, nullable=False, unique=True)
ip_address = db.Column(db.String)
device_type = db.Column(db.String)
created_at = db.Column(
db.DateTime,
nullable=False,
@ -56,14 +59,14 @@ class Sessions(db.Model):
)
class Reset(db.Model):
class PasswordReset(db.Model):
"""
Password reset table
"""
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
reset_key = db.Column(db.String, nullable=False, unique=True)
created_at = db.Column(
@ -73,6 +76,36 @@ class Reset(db.Model):
)
class Permissions(db.Model):
"""
Permissions table
"""
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
user_ban = db.Column(db.Boolean, default=False)
user_warn = db.Column(db.Boolean, default=False)
score_removal = db.Column(db.Boolean, default=False)
score_edit = db.Column(db.Boolean, default=False)
admin_panel = db.Column(db.Boolean, default=False)
admin_promote = db.Column(db.Boolean, default=False)
admin_demote = db.Column(db.Boolean, default=False)
class ProfileTags(db.Model):
"""
Profile Tags table
"""
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id", use_alter=True))
tag = db.Column(db.String, nullable=False)
class Users(db.Model, UserMixin):
"""
User table
@ -93,6 +126,8 @@ class Users(db.Model, UserMixin):
scores = db.relationship("Scores", backref=db.backref("users", lazy=True))
tokens = db.relationship("Sessions", backref=db.backref("users", lazy=True))
reset = db.relationship("PasswordReset", backref=db.backref("users", lazy=True))
tags = db.relationship("ProfileTags", backref=db.backref("users", lazy=True))
def get_id(self):
return str(self.alt_id)

View file

@ -1,5 +1,8 @@
{% extends "base.html" %}
{% block content %}
<h2>What is The Front Rooms?</h2>
<h2>Project Redacted</h2>
<p>The Front Rooms is a game based on The Backrooms Genre of games.</p>
<h2>Is my data secured?</h2>
<p>Yes, all passwords and emails are hashed and salted, and at no point stored in plain text.</p>
{% endblock %}

View file

@ -6,12 +6,12 @@
<form action="{{ url_for('auth.login') }}" method="POST">
<span class="text-input">
<label for="login-username">Username</label>
<input type="text" name="username" placeholder="Jerry" id="login-username" required>
<input type="text" name="username" id="login-username" required>
</span>
<span class="text-input">
<label for="login-password">Password</label>
<input type="password" name="password" placeholder="password123" id="login-password" required>
<input type="password" name="password" id="login-password" required>
</span>
<button type="submit" class="button primary">Login</button>
@ -24,17 +24,17 @@
<form action="{{ url_for('auth.register') }}" method="POST">
<span class="text-input">
<label for="register-username">Username</label>
<input type="text" name="username" placeholder="Jerry" id="register-username" required>
<input type="text" name="username" id="register-username" required>
</span>
<span class="text-input">
<label for="register-email">Username</label>
<input type="text" name="email" placeholder="jerry@example.com" id="register-email" required>
<label for="register-email">Email</label>
<input type="text" name="email" id="register-email" required>
</span>
<span class="text-input">
<label for="register-password">Password</label>
<input type="password" name="password" placeholder="password123" id="register-password" required>
<input type="password" name="password" id="register-password" required>
</span>
<button type="submit" class="button primary">Register</button>

View file

@ -12,10 +12,12 @@
</select>
<select name="ver" class="button">
<option value="alpha" {% if ver=="alpha" %}selected{% endif %}>Alpha</option>
<option value="beta" {% if ver=="beta" %}selected{% endif %}>Beta</option>
<option value="1.0" {% if ver=="1.0" %}selected{% endif %}>1.0</option>
<option value="1.1" {% if ver=="1.1" %}selected{% endif %}>1.1</option>
{% for game_version in config["GAME_VERSIONS"] %}
<option
value="{{ game_version }}"
{% if ver==game_version %}selected{% endif %}
>{{ game_version }}</option>
{% endfor %}
</select>
<span class="text-input">
@ -56,7 +58,7 @@
<td>{{ score.users.username }}</td>
{% endif %}
<td>{{ score.score }}</td>
<td>{{ score.score | format_result }}</td>
<td>{{ score.scored_at.strftime('%Y-%m-%d') }}</td>
<!-- <td>{{ score.version }}</td> -->
</tr>