snake
This commit is contained in:
+80
@@ -0,0 +1,80 @@
|
||||
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'
|
||||
)
|
||||
Reference in New Issue
Block a user