Webhost: support groups without loading multidata on every /room request
This commit is contained in:
parent
7708d3d157
commit
f38f9a47da
|
@ -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')
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue