alfieking.dev/src/main.py
2025-06-20 01:45:09 +01:00

80 lines
2.6 KiB
Python

from flask import Flask, request, render_template
from flask_session import Session
from dotenv import load_dotenv
from os import getenv as env
import logging, database, requests
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
load_dotenv()
app = Flask(
__name__,
template_folder=env('TEMPLATE_FOLDER', default='templates'),
static_folder=env('STATIC_FOLDER', default='static'),
)
app.config["SESSION_PERMANENT"] = True
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
db = database.Database(db_name=env('DB_NAME', default='db.sqlite'))
@app.route('/')
def index():
logging.info("Rendering index page")
return render_template('index.html')
@app.route('/snake/submit', methods=['POST'])
def snake_submit():
data = request.json
if not data or 'name' not in data or 'score' not in data:
logging.error("Invalid data received: %s", data)
return {'error': 'Invalid data'}, 400
name = data.get('name', '')
cap = data.get('cap', '')
score = data.get('score', -1)
cap_response = requests.post(
env('CAP_VERIFY_URL', default='https://<instance_url>/<key_id>/siteverify'),
json={
'secret': env('CAP_SECRET', default=''),
'response': cap,
}
)
if cap_response.status_code != 200 or not cap_response.json().get('success', "false") != "true":
logging.error("Captcha verification failed: %s", cap_response.json())
return {'error': 'Captcha verification failed'}, 400
if not isinstance(name, str) or not isinstance(score, int):
logging.error("Invalid data types: name=%s, score=%s", type(name), type(score))
return {'error': 'Invalid data types'}, 400
if not name or score <= 0 or score > 10000:
logging.error("Invalid name or score: name=%s, score=%s", name, score)
return {'error': 'Invalid name or score'}, 400
db.insert_snake(name, score)
logging.info("Snake submitted: name=%s, score=%d", name, score)
return {'success': True, 'message': 'Snake submitted successfully'}, 200
@app.errorhandler(404)
def page_not_found(e):
logging.error("Page not found: %s", request.path)
unformatted_scores = db.get_snake_scores()
scores = [{'position': i + 1, 'name': score[1], 'score': score[2]} for i, score in enumerate(unformatted_scores)]
return render_template('404.html', scores=scores), 404
if __name__ == '__main__':
app.run(
host=env('HOST', default='0.0.0.0'),
port=env('PORT', default=5000),
debug=env('DEBUG', default=False).lower() == 'true'
)