allow uploading of Factorio mods
This commit is contained in:
		
							parent
							
								
									a1d7bc558c
								
							
						
					
					
						commit
						1f17aa394e
					
				
							
								
								
									
										5
									
								
								Utils.py
								
								
								
								
							
							
						
						
									
										5
									
								
								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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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/<suuid:room_id>/<int:patch_id>")
 | 
			
		||||
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)
 | 
			
		||||
| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,9 @@
 | 
			
		|||
                {% if patch.game == "Minecraft" %}
 | 
			
		||||
                <li><a href="{{ url_for("download_slot_file", seed_id=room.seed.id, player_id=patch.player_id) }}">
 | 
			
		||||
                    APMC for player {{ patch.player_id }} - {{ patch.player_name }}</a></li>
 | 
			
		||||
                {% elif patch.game == "Factorio" %}
 | 
			
		||||
                <li><a href="{{ url_for("download_slot_file", seed_id=room.seed.id, player_id=patch.player_id) }}">
 | 
			
		||||
                    Mod for player {{ patch.player_id }} - {{ patch.player_name }}</a></li>
 | 
			
		||||
                {% else %}
 | 
			
		||||
                <li><a href="{{ url_for("download_patch", patch_id=patch.id, room_id=room.id) }}">
 | 
			
		||||
                    Patch for player {{ patch.player_id }} - {{ patch.player_name }}</a></li>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue