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

@ -9,8 +9,6 @@ from flask import Flask, request, redirect, url_for, render_template, Response,
from flask_caching import Cache from flask_caching import Cache
from flask_compress import Compress from flask_compress import Compress
from worlds.AutoWorld import AutoWorldRegister from worlds.AutoWorld import AutoWorldRegister
from MultiServer import Context
from NetUtils import SlotType
from .models import * from .models import *
@ -180,11 +178,7 @@ def host_room(room: UUID):
with db_session: with db_session:
room.last_activity = datetime.utcnow() # will trigger a spinup, if it's not already running room.last_activity = datetime.utcnow() # will trigger a spinup, if it's not already running
multidata = Context.decompress(room.seed.multidata) return render_template("hostRoom.html", room=room)
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)
@app.route('/favicon.ico') @app.route('/favicon.ico')

View File

@ -22,7 +22,7 @@
{% if room.last_port %} {% if room.last_port %}
You can connect to this room by using '/connect {{ config['PATCH_TARGET'] }}:{{ room.last_port }}' You can connect to this room by using '/connect {{ config['PATCH_TARGET'] }}:{{ room.last_port }}'
in the <a href="{{ url_for("tutorial_landing")}}">client</a>.<br>{% endif %} in the <a href="{{ url_for("tutorial_landing")}}">client</a>.<br>{% endif %}
{{ macros.list_patches_room(room, groups) }} {{ macros.list_patches_room(room) }}
{% if room.owner == session["_id"] %} {% if room.owner == session["_id"] %}
<form method=post> <form method=post>
<div class="form-group"> <div class="form-group">

View File

@ -6,7 +6,7 @@
{{ caller() }} {{ caller() }}
</ul> </ul>
{%- endmacro %} {%- endmacro %}
{% macro list_patches_room(room, groups) %} {% macro list_patches_room(room) %}
{% if room.seed.slots %} {% if room.seed.slots %}
<table> <table>
<thead> <thead>
@ -19,7 +19,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% 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") %}
<tr> <tr>
<td>{{ patch.player_id }}</td> <td>{{ patch.player_id }}</td>
<td>{{ patch.player_name }}</td> <td>{{ patch.player_name }}</td>

View File

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