diff --git a/.gitignore b/.gitignore index f8b73e7..e3406be 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ dmypy.json # Cython debug symbols cython_debug/ +.idea/ diff --git a/main.py b/main.py index 68242f1..59f4a57 100644 --- a/main.py +++ b/main.py @@ -1,11 +1,15 @@ import boto3 +# TODO: Next time I work on this, I should make it serverless with API Gateway and a Lambda. +# But, alas, I don't feel like investing much in this since nobody cares about the old version. +# This project will be in KTLO until October 24, 2023 at which point I will shut down the Eln1 stats server. + from flask import Flask, render_template, request from datetime import datetime app = Flask(__name__) -dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb.us-east-1.amazonaws.com") -table = dynamodb.Table('LogSieve') +dynamodb = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-east-1.amazonaws.com") +table = dynamodb.Table('eln1_stats') HTTP_X_REAL_IP = "HTTP_X_REAL_IP" @@ -13,8 +17,8 @@ WHITELISTED = ["date", "ip", "user_agent", "type", "mod_version", "game_lang", " "cable_factor_multiplier", "cable_resistance_multiplier", "explosions_enabled", "replicators_enabled"] -def putModinfo(client_ip, user_agent): - response = table.put_item( +def put_mod_info(client_ip, user_agent): + return table.put_item( Item={ "date": datetime.now().isoformat(), "ip": client_ip, @@ -22,20 +26,19 @@ def putModinfo(client_ip, user_agent): "type": "modinfo" } ) - return response -def putStat(client_ip, user_agent, data): +def put_stat(client_ip, user_agent, data): data["date"] = datetime.now().isoformat() data["ip"] = client_ip data["user_agent"] = user_agent data["type"] = "stats" - # Prevents bad stuff, plus limits record sizes on the DB. - data = {k: v for k, v in data.items() if v not in WHITELISTED or len(v) > 100} - response = table.put_item( + # Prevents bad stuff, plus limits record sizes on the DB. Using 2K since that should be well above necessary, + # but also well below 4K cutoff for using more than 1 RCU/WCU per item. + data = {k: v for k, v in data.items() if v not in WHITELISTED or len(v) > 2000} + return table.put_item( Item=data ) - return response @app.route('/') @@ -46,8 +49,12 @@ def root(): @app.route('/modinfo.json') def modinfo(): client_ip = request.remote_addr + + if HTTP_X_REAL_IP in request.environ: + client_ip = request.environ[HTTP_X_REAL_IP] + user_agent = request.headers.get("User-Agent") - print(putModinfo(client_ip, user_agent)) + print(put_mod_info(client_ip, user_agent)) return render_template("modinfo.json") @@ -75,7 +82,7 @@ def stat(): # Remove fields that are null data = {k: v for k, v in data.items() if v is not None} - print(putStat(client_ip, request.headers.get("User-Agent"), data)) + print(put_stat(client_ip, request.headers.get("User-Agent"), data)) return ""