From 402c4492003fd62717e75a2152e0a8bac4b5daae Mon Sep 17 00:00:00 2001 From: Ultrablob Date: Wed, 22 Jan 2025 11:11:36 -0500 Subject: [PATCH] initial commit --- Dockerfile | 9 ++++++++ main.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 ++++ 3 files changed, 72 insertions(+) create mode 100644 Dockerfile create mode 100644 main.py create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1b94ef2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM python:alpine3.11 + +COPY requirements.txt . + +RUN pip install -r requirements.txt + +COPY . . + +CMD ["python", "./main.py"] \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..7b56c39 --- /dev/null +++ b/main.py @@ -0,0 +1,59 @@ +import datetime +from json import dumps, loads +from flask import Flask, request +import redis +import base64 +import re +import requests + +app = Flask(__name__) +DEV = False +DB_KEY = "scores" if not DEV else "scores_dev" +WEBHOOK_URL = "https://discord.com/api/webhooks/1233484325962518709/yUxyEYZzfxOvOhd3G892pSd4XHbwdj96UnLmL9oJXeimc7sqMfUPkGhs0VA-k34o-56J" + +db = redis.Redis(host='redis', + port=50658, + decode_responses=True, + ssl=True, + username="default", + password="default") #! probably fine? + +def seconds2mmss(total_seconds: float): + seconds: float = total_seconds % 60 + minutes: int = int(total_seconds / 60.0) % 60 + return "%02d:%05.2f" % (minutes, seconds) + +@app.route("/leaderboard", methods=["POST"]) +def submit_score(): + data = request.args.get('score') + print(data) + if not data.startswith("EGH"): + return "Decryption Failure!", 403 + + score = base64.urlsafe_b64decode(data[3:].split("eHa")[0]).decode() + uname = base64.urlsafe_b64decode(data.split("eHa")[1].split("lAx")[0]).decode() + wave = base64.urlsafe_b64decode(data.split("eHa")[1].split("lAx")[1]).decode() + + if not re.match("^[A-Z]{3}$", uname): + return "Invalid username", 405 + db.zadd(DB_KEY, {(uname + "|" + score + "|" + wave): int(wave) * 1e12 - float(score)}) + + scores = [x.split("|") for x in db.zrevrange(DB_KEY, start=0, end=50)] + + position = db.zrevrank(DB_KEY, uname + "|" + score + "|" + wave) + 1 + print(position) + if position == 1: + print("WR ALERT!!!!") + if DEV: + return + requests.post(WEBHOOK_URL, json={"content": f":warning: <@&1234952370387943517> WR ALERT :warning:\n`{uname.upper()}` set a new WR by reaching wave {wave} in `{seconds2mmss(float(score))}`"}) + + if position > 50: + position /= db.zcount(DB_KEY, "-inf", "inf") + + print(scores) + + return dumps({ + "scores": scores, + "position": position + }) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7d7c90f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +flask +dotenv +redis +requests \ No newline at end of file