From 1f17aa394ee897577e380146fb86dc35c2da4c19 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 16 May 2021 22:59:45 +0200 Subject: [PATCH] allow uploading of Factorio mods --- Utils.py | 5 +++++ WebHostLib/downloads.py | 7 ++++++- WebHostLib/generate.py | 7 +++---- WebHostLib/templates/macros.html | 3 +++ WebHostLib/upload.py | 6 ++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Utils.py b/Utils.py index adaef75f..b3f43d97 100644 --- a/Utils.py +++ b/Utils.py @@ -392,6 +392,11 @@ class RestrictedUnpickler(pickle.Unpickler): if module == "NetUtils" and name in {"NetworkItem", "ClientStatus", "Hint"}: import NetUtils return getattr(NetUtils, name) + if module == "Options": + import Options + obj = getattr(Options, name) + if issubclass(obj, Options.Option): + return obj # Forbid everything else. raise pickle.UnpicklingError("global '%s.%s' is forbidden" % (module, name)) diff --git a/WebHostLib/downloads.py b/WebHostLib/downloads.py index 3ede991e..3d901bb2 100644 --- a/WebHostLib/downloads.py +++ b/WebHostLib/downloads.py @@ -3,7 +3,7 @@ from pony.orm import select from Patch import update_patch_data from WebHostLib import app, Slot, Room, Seed - +import zipfile @app.route("/dl_patch//") def download_patch(room_id, patch_id): @@ -58,6 +58,11 @@ def download_slot_file(seed_id, player_id: int): if slot_data.game == "Minecraft": fname = f"AP_{app.jinja_env.filters['suuid'](seed_id)}_P{slot_data.player_id}_{slot_data.player_name}.apmc" + elif slot_data.game == "Factorio": + with zipfile.ZipFile(io.BytesIO(slot_data.data)) as zf: + for name in zf.namelist(): + if name.endswith("info.json"): + fname = name.rsplit("/", 1)[0]+".zip" else: return "Game download not supported." return send_file(io.BytesIO(slot_data.data), as_attachment=True, attachment_filename=fname) \ No newline at end of file diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index 718fe3b9..d879555e 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -40,7 +40,7 @@ def generate(race=False): gen = Generation( options=pickle.dumps({name: vars(options) for name, options in gen_options.items()}), # convert to json compatible - meta=pickle.dumps({"race": race}), state=STATE_QUEUED, + meta=json.dumps({"race": race}), state=STATE_QUEUED, owner=session["_id"]) commit() @@ -80,7 +80,6 @@ def gen_game(gen_options, race=False, owner=None, sid=None): erargs.outputname = seedname erargs.outputpath = target.name erargs.teams = 1 - erargs.progression_balancing = {} erargs.create_diff = True name_counter = Counter() @@ -148,10 +147,10 @@ def upload_to_db(folder, owner, sid, race:bool): with db_session: if sid: seed = Seed(multidata=multidata, spoiler=spoiler, slots=slots, owner=owner, - id=sid, meta=json.dumps({"tags": ["generated"]})) + id=sid, meta=json.dumps({"race": race, "tags": ["generated"]})) else: seed = Seed(multidata=multidata, spoiler=spoiler, slots=slots, owner=owner, - meta=json.dumps({"tags": ["generated"]})) + meta=json.dumps({"race": race, "tags": ["generated"]})) for patch in slots: patch.seed = seed if sid: diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html index 553aef8b..1b5146d3 100644 --- a/WebHostLib/templates/macros.html +++ b/WebHostLib/templates/macros.html @@ -13,6 +13,9 @@ {% if patch.game == "Minecraft" %}
  • APMC for player {{ patch.player_id }} - {{ patch.player_name }}
  • + {% elif patch.game == "Factorio" %} +
  • + Mod for player {{ patch.player_id }} - {{ patch.player_name }}
  • {% else %}
  • Patch for player {{ patch.player_id }} - {{ patch.player_name }}
  • diff --git a/WebHostLib/upload.py b/WebHostLib/upload.py index fe37dc71..be0a7deb 100644 --- a/WebHostLib/upload.py +++ b/WebHostLib/upload.py @@ -57,6 +57,12 @@ def uploads(): player_id=metadata["player_id"], game="Minecraft")) + elif file.filename.endswith(".zip"): + # Factorio mods needs a specific name or they do no function + _, seed_name, slot_id, slot_name = file.filename.rsplit("_", 1)[0].split("-") + slots.add(Slot(data=zfile.open(file, "r").read(), player_name=slot_name, + player_id=int(slot_id[1:]), game="Factorio")) + elif file.filename.endswith(".txt"): spoiler = zfile.open(file, "r").read().decode("utf-8-sig") elif file.filename.endswith(".archipelago"):