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:////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' )