From 7f09944bf51531e7f340ee735ae166942d13b19e Mon Sep 17 00:00:00 2001 From: Madeline McWhorter Date: Wed, 10 Jun 2026 21:05:51 -0500 Subject: [PATCH] initial commit: --- api.py | 9 ++++++++ app.py | 46 +++++++++++++++++++++++++++++++++++++++++ auth.py | 15 ++++++++++++++ cdn.py | 17 +++++++++++++++ db/images/person.png | Bin 0 -> 1357 bytes db/spaces/DormRoom.scn | Bin 0 -> 4151 bytes nameserver.py | 9 ++++++++ 7 files changed, 96 insertions(+) create mode 100644 api.py create mode 100644 app.py create mode 100644 auth.py create mode 100644 cdn.py create mode 100644 db/images/person.png create mode 100644 db/spaces/DormRoom.scn create mode 100644 nameserver.py diff --git a/api.py b/api.py new file mode 100644 index 0000000..4ce4d23 --- /dev/null +++ b/api.py @@ -0,0 +1,9 @@ +from flask import Flask + +app = Flask("RecForever.API") + +@app.route("/api") +def apiRoot(): + pass + +app.run(port=9902) \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..908f5db --- /dev/null +++ b/app.py @@ -0,0 +1,46 @@ +import subprocess +import atexit +import sys +import time + +trackedProcesses : list = [] + +def cleanup(): + print("\n[MainServer] Cleaning up server processes") + for proc in trackedProcesses: + if proc.poll() is None: + print(f"[MainServer] Terming server subroutine {proc.pid}") + proc.terminate() + + time.sleep(0.5) + + for proc in trackedProcesses: + if proc.poll() is None: + print(f"[MainServer] Forcekilling leftover process {proc.pid}") + proc.kill() + +atexit.register(cleanup) + +def main(): + try: + ns = subprocess.Popen([sys.executable, 'nameserver.py']) + trackedProcesses.append(ns) + api =subprocess.Popen([sys.executable, 'api.py']) + trackedProcesses.append(api) + auth =subprocess.Popen([sys.executable, 'auth.py']) + trackedProcesses.append(auth) + cdn =subprocess.Popen([sys.executable, 'cdn.py']) + trackedProcesses.append(cdn) + + while True: + # make it run forever without doing anything (it should still output the individual servers outputs) + pass + + + except KeyboardInterrupt: + print("\n[MainServer] Server closing!") + finally: + sys.exit(0) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/auth.py b/auth.py new file mode 100644 index 0000000..707cfcb --- /dev/null +++ b/auth.py @@ -0,0 +1,15 @@ +from flask import Flask, request, jsonify +players = { + "Dev": "Dev123" +} +app = Flask("RecForever.Auth") +@app.route("/login/byuid", methods=['POST']) +def login(): + data = request.get_json() + username = data.get('username') + password = data.get('password') + if players[username] == password: + return jsonify({"status": "ok"}), 200 + else: + return jsonify({"status": "forbidden"}), 403 +app.run(port=9904) \ No newline at end of file diff --git a/cdn.py b/cdn.py new file mode 100644 index 0000000..fce12a9 --- /dev/null +++ b/cdn.py @@ -0,0 +1,17 @@ +import http.server +import socketserver +import functools + +port = 9903 +db = "db" + +Handler = functools.partial( + http.server.SimpleHTTPRequestHandler, + directory=db +) + +with socketserver.TCPServer(("", port), Handler) as httpd: + try: + httpd.serve_forever() + except KeyboardInterrupt: + httpd.server_close() diff --git a/db/images/person.png b/db/images/person.png new file mode 100644 index 0000000000000000000000000000000000000000..3527fd5bcd8ca395ca47a55da08c6f991085c96c GIT binary patch literal 1357 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