from flask import send_file, Response 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): patch = Slot.get(id=patch_id) if not patch: return "Patch not found" else: import io room = Room.get(id=room_id) last_port = room.last_port patch_data = update_patch_data(patch.data, server=f"{app.config['PATCH_TARGET']}:{last_port}") patch_data = io.BytesIO(patch_data) fname = f"P{patch.player_id}_{patch.player_name}_{app.jinja_env.filters['suuid'](room_id)}.apbp" return send_file(patch_data, as_attachment=True, attachment_filename=fname) @app.route("/dl_spoiler/") def download_spoiler(seed_id): return Response(Seed.get(id=seed_id).spoiler, mimetype="text/plain") @app.route("/dl_raw_patch//") def download_raw_patch(seed_id, player_id: int): seed = Seed.get(id=seed_id) patch = select(patch for patch in seed.slots if patch.player_id == player_id).first() if not patch: return "Patch not found" else: import io patch_data = update_patch_data(patch.data, server="") patch_data = io.BytesIO(patch_data) fname = f"P{patch.player_id}_{patch.player_name}_{app.jinja_env.filters['suuid'](seed_id)}.apbp" return send_file(patch_data, as_attachment=True, attachment_filename=fname) @app.route("/slot_file//") def download_slot_file(seed_id, player_id: int): seed = Seed.get(id=seed_id) slot_data: Slot = select(patch for patch in seed.slots if patch.player_id == player_id).first() if not slot_data: return "Slot Data not found" else: import io 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)