示例#1
0
def get_weights(path):
    try:
        if urllib.parse.urlparse(path).scheme:
            yaml = str(urllib.request.urlopen(path).read(), "utf-8")
        else:
            with open(path, 'rb') as f:
                yaml = str(f.read(), "utf-8")
    except Exception as e:
        raise Exception(f"Failed to read weights ({path})") from e

    return parse_yaml(yaml)
def get_weights(path):
    try:
        if urllib.parse.urlparse(path).scheme:
            yaml = str(urllib.request.urlopen(path).read(), "utf-8")
        else:
            with open(path, 'rb') as f:
                yaml = str(f.read(), "utf-8")
    except Exception as e:
        print('Failed to read weights (%s)' % e)
        return

    return parse_yaml(yaml)
示例#3
0
def roll_yamls(
    options: Dict[str, Union[str, str]]
) -> Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]:
    results = {}
    rolled_results = {}
    for filename, text in options.items():
        try:
            yaml_data = parse_yaml(text)
        except Exception as e:
            results[filename] = f"Failed to parse YAML data in {filename}: {e}"
        else:
            try:
                rolled_results[filename] = roll_settings(yaml_data)
            except Exception as e:
                results[
                    filename] = f"Failed to generate mystery in {filename}: {e}"
            else:
                results[filename] = True
    return results, rolled_results
示例#4
0
def upload_zip_to_db(zfile: zipfile.ZipFile,
                     owner=None,
                     meta={"race": False},
                     sid=None):
    if not owner:
        owner = session["_id"]
    infolist = zfile.infolist()
    slots = set()
    spoiler = ""
    multidata = None
    for file in infolist:
        handler = AutoPatchRegister.get_handler(file.filename)
        if file.filename.endswith(banned_zip_contents):
            return "Uploaded data contained a rom file, which is likely to contain copyrighted material. " \
                   "Your file was deleted."
        elif handler:
            raw = zfile.open(file, "r").read()
            patch = handler(BytesIO(raw))
            patch.read()
            slots.add(
                Slot(data=raw,
                     player_name=patch.player_name,
                     player_id=patch.player,
                     game=patch.game))
        elif file.filename.endswith(tuple(preferred_endings.values())):
            data = zfile.open(file, "r").read()
            yaml_data = parse_yaml(lzma.decompress(data).decode("utf-8-sig"))
            if yaml_data["version"] < 2:
                return "Old format cannot be uploaded (outdated .apbp)"
            metadata = yaml_data["meta"]

            slots.add(
                Slot(data=data,
                     player_name=metadata["player_name"],
                     player_id=metadata["player_id"],
                     game=yaml_data["game"]))

        elif file.filename.endswith(".apmc"):
            data = zfile.open(file, "r").read()
            metadata = json.loads(base64.b64decode(data).decode("utf-8"))
            slots.add(
                Slot(data=data,
                     player_name=metadata["player_name"],
                     player_id=metadata["player_id"],
                     game="Minecraft"))

        elif file.filename.endswith(".apv6"):
            _, seed_name, slot_id, slot_name = file.filename.split(
                '.')[0].split('_', 3)
            slots.add(
                Slot(data=zfile.open(file, "r").read(),
                     player_name=slot_name,
                     player_id=int(slot_id[1:]),
                     game="VVVVVV"))

        elif file.filename.endswith(".apsm64ex"):
            _, seed_name, slot_id, slot_name = file.filename.split(
                '.')[0].split('_', 3)
            slots.add(
                Slot(data=zfile.open(file, "r").read(),
                     player_name=slot_name,
                     player_id=int(slot_id[1:]),
                     game="Super Mario 64"))

        elif file.filename.endswith(".zip"):
            # Factorio mods need a specific name or they do not function
            _, seed_name, slot_id, slot_name = file.filename.rsplit(
                "_", 1)[0].split("-", 3)
            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(".apz5"):
            # .apz5 must be named specifically since they don't contain any metadata
            _, seed_name, slot_id, slot_name = file.filename.split(
                '.')[0].split('_', 3)
            slots.add(
                Slot(data=zfile.open(file, "r").read(),
                     player_name=slot_name,
                     player_id=int(slot_id[1:]),
                     game="Ocarina of Time"))

        elif file.filename.endswith(".txt"):
            spoiler = zfile.open(file, "r").read().decode("utf-8-sig")

        elif file.filename.endswith(".archipelago"):
            try:
                multidata = zfile.open(file).read()
            except:
                flash(
                    "Could not load multidata. File may be corrupted or incompatible."
                )
                multidata = None

    if multidata:
        decompressed_multidata = MultiServer.Context.decompress(multidata)
        if "slot_info" in decompressed_multidata:
            player_names = {slot.player_name for slot in slots}
            leftover_names: typing.Dict[int, NetworkSlot] = {
                slot_id: slot_info
                for slot_id, slot_info in
                decompressed_multidata["slot_info"].items()
                if slot_info.name not in player_names
                and slot_info.type != SlotType.group
            }
            newslots = [(Slot(data=None,
                              player_name=slot_info.name,
                              player_id=slot,
                              game=slot_info.game))
                        for slot, slot_info in leftover_names.items()]
            for slot in newslots:
                slots.add(slot)

            flush()  # commit slots

        seed = Seed(multidata=multidata,
                    spoiler=spoiler,
                    slots=slots,
                    owner=owner,
                    meta=json.dumps(meta),
                    id=sid if sid else uuid.uuid4())
        flush()  # create seed
        for slot in slots:
            slot.seed = seed
        return seed
    else:
        flash("No multidata was found in the zip file, which is required.")