80 lines
2.6 KiB
Python
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'
|
|
) |