Webhost: support groups without loading multidata on every /room request

This commit is contained in:
Fabian Dill
2022-02-23 19:16:45 +01:00
parent 7708d3d157
commit f38f9a47da
4 changed files with 18 additions and 20 deletions

View File

@@ -1,3 +1,4 @@
import typing
import zipfile
import lzma
import json
@@ -9,9 +10,9 @@ from flask import request, flash, redirect, url_for, session, render_template
from pony.orm import flush, select
from WebHostLib import app, Seed, Room, Slot
from Utils import parse_yaml, VersionException
from Utils import parse_yaml, VersionException, __version__
from Patch import preferred_endings
from Utils import __version__
from NetUtils import NetworkSlot, SlotType
banned_zip_contents = (".sfc",)
@@ -69,15 +70,18 @@ def upload_zip_to_db(zfile: zipfile.ZipFile, owner=None, meta={"race": False}, s
if multidata:
decompressed_multidata = MultiServer.Context.decompress(multidata)
player_names = {slot.player_name for slot in slots}
leftover_names = [(name, index) for index, name in
enumerate((name for name in decompressed_multidata["names"][0]), start=1)]
newslots = [(Slot(data=None, player_name=name, player_id=slot, game=decompressed_multidata["games"][slot]))
for name, slot in leftover_names if name not in player_names]
for slot in newslots:
slots.add(slot)
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
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