From f38f9a47da5900a25a252f330cd240b91db786bc Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Wed, 23 Feb 2022 19:16:45 +0100 Subject: [PATCH] Webhost: support groups without loading multidata on every /room request --- WebHostLib/__init__.py | 8 +------- WebHostLib/templates/hostRoom.html | 2 +- WebHostLib/templates/macros.html | 4 ++-- WebHostLib/upload.py | 24 ++++++++++++++---------- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py index ba12b125..6d31ac15 100644 --- a/WebHostLib/__init__.py +++ b/WebHostLib/__init__.py @@ -9,8 +9,6 @@ from flask import Flask, request, redirect, url_for, render_template, Response, from flask_caching import Cache from flask_compress import Compress from worlds.AutoWorld import AutoWorldRegister -from MultiServer import Context -from NetUtils import SlotType from .models import * @@ -180,11 +178,7 @@ def host_room(room: UUID): with db_session: room.last_activity = datetime.utcnow() # will trigger a spinup, if it's not already running - multidata = Context.decompress(room.seed.multidata) - groups = {slot: slot_info.group_members for slot, slot_info in multidata.get("slot_info", {}).items() - if slot_info.type == SlotType.group} - - return render_template("hostRoom.html", room=room, groups=groups) + return render_template("hostRoom.html", room=room) @app.route('/favicon.ico') diff --git a/WebHostLib/templates/hostRoom.html b/WebHostLib/templates/hostRoom.html index 2b9a7bde..281811e8 100644 --- a/WebHostLib/templates/hostRoom.html +++ b/WebHostLib/templates/hostRoom.html @@ -22,7 +22,7 @@ {% if room.last_port %} You can connect to this room by using '/connect {{ config['PATCH_TARGET'] }}:{{ room.last_port }}' in the client.
{% endif %} - {{ macros.list_patches_room(room, groups) }} + {{ macros.list_patches_room(room) }} {% if room.owner == session["_id"] %}
diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html index cd33783e..549d3ace 100644 --- a/WebHostLib/templates/macros.html +++ b/WebHostLib/templates/macros.html @@ -6,7 +6,7 @@ {{ caller() }} {%- endmacro %} -{% macro list_patches_room(room, groups) %} +{% macro list_patches_room(room) %} {% if room.seed.slots %} @@ -19,7 +19,7 @@ - {% for patch in room.seed.slots|list|sort(attribute="player_id") if patch.player_id not in groups %} + {% for patch in room.seed.slots|list|sort(attribute="player_id") %} diff --git a/WebHostLib/upload.py b/WebHostLib/upload.py index d444b080..1245fb31 100644 --- a/WebHostLib/upload.py +++ b/WebHostLib/upload.py @@ -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
{{ patch.player_id }} {{ patch.player_name }}