Factorio: fix website multitracker (#2126)
Co-authored-by: Remy Jette <remy@remyjette.com>
This commit is contained in:
parent
f6dafa2b56
commit
29f8053d6e
|
@ -27,14 +27,14 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block custom_table_row scoped %}
|
{% block custom_table_row scoped %}
|
||||||
{% if games[player] == "Factorio" %}
|
{% if games[player] == "Factorio" %}
|
||||||
{% set player_inventory = inventory[team][player] %}
|
{% set player_inventory = named_inventory[team][player] %}
|
||||||
{% set prog_science = player_inventory[custom_items["progressive-science-pack"]] %}
|
{% set prog_science = player_inventory["progressive-science-pack"] %}
|
||||||
<td class="center-column">{% if player_inventory[custom_items["logistic-science-pack"]] or prog_science %}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["logistic-science-pack"] or prog_science %}✔{% endif %}</td>
|
||||||
<td class="center-column">{% if player_inventory[custom_items["military-science-pack"]] or prog_science > 1%}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["military-science-pack"] or prog_science > 1%}✔{% endif %}</td>
|
||||||
<td class="center-column">{% if player_inventory[custom_items["chemical-science-pack"]] or prog_science > 2%}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["chemical-science-pack"] or prog_science > 2%}✔{% endif %}</td>
|
||||||
<td class="center-column">{% if player_inventory[custom_items["production-science-pack"]] or prog_science > 3%}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["production-science-pack"] or prog_science > 3%}✔{% endif %}</td>
|
||||||
<td class="center-column">{% if player_inventory[custom_items["utility-science-pack"]] or prog_science > 4%}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["utility-science-pack"] or prog_science > 4%}✔{% endif %}</td>
|
||||||
<td class="center-column">{% if player_inventory[custom_items["space-science-pack"]] or prog_science > 5%}✔{% endif %}</td>
|
<td class="center-column">{% if player_inventory["space-science-pack"] or prog_science > 5%}✔{% endif %}</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td class="center-column">❌</td>
|
<td class="center-column">❌</td>
|
||||||
<td class="center-column">❌</td>
|
<td class="center-column">❌</td>
|
||||||
|
|
|
@ -11,7 +11,7 @@ from werkzeug.exceptions import abort
|
||||||
from MultiServer import Context, get_saving_second
|
from MultiServer import Context, get_saving_second
|
||||||
from NetUtils import SlotType, NetworkSlot
|
from NetUtils import SlotType, NetworkSlot
|
||||||
from Utils import restricted_loads
|
from Utils import restricted_loads
|
||||||
from worlds import lookup_any_item_id_to_name, lookup_any_location_id_to_name, network_data_package
|
from worlds import lookup_any_item_id_to_name, lookup_any_location_id_to_name, network_data_package, games
|
||||||
from worlds.alttp import Items
|
from worlds.alttp import Items
|
||||||
from . import app, cache
|
from . import app, cache
|
||||||
from .models import GameDataPackage, Room
|
from .models import GameDataPackage, Room
|
||||||
|
@ -1423,9 +1423,12 @@ def _get_multiworld_tracker_data(tracker: UUID) -> typing.Optional[typing.Dict[s
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _get_inventory_data(data: typing.Dict[str, typing.Any]) -> typing.Dict[int, typing.Dict[int, int]]:
|
def _get_inventory_data(data: typing.Dict[str, typing.Any]) \
|
||||||
inventory = {teamnumber: {playernumber: collections.Counter() for playernumber in team_data}
|
-> typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]]:
|
||||||
for teamnumber, team_data in data["checks_done"].items()}
|
inventory: typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]] = {
|
||||||
|
teamnumber: {playernumber: collections.Counter() for playernumber in team_data}
|
||||||
|
for teamnumber, team_data in data["checks_done"].items()
|
||||||
|
}
|
||||||
|
|
||||||
groups = data["groups"]
|
groups = data["groups"]
|
||||||
|
|
||||||
|
@ -1444,6 +1447,17 @@ def _get_inventory_data(data: typing.Dict[str, typing.Any]) -> typing.Dict[int,
|
||||||
return inventory
|
return inventory
|
||||||
|
|
||||||
|
|
||||||
|
def _get_named_inventory(inventory: typing.Dict[int, int], custom_items: typing.Dict[int, str] = None) \
|
||||||
|
-> typing.Dict[str, int]:
|
||||||
|
"""slow"""
|
||||||
|
if custom_items:
|
||||||
|
mapping = collections.ChainMap(custom_items, lookup_any_item_id_to_name)
|
||||||
|
else:
|
||||||
|
mapping = lookup_any_item_id_to_name
|
||||||
|
|
||||||
|
return collections.Counter({mapping.get(item_id, None): count for item_id, count in inventory.items()})
|
||||||
|
|
||||||
|
|
||||||
@app.route('/tracker/<suuid:tracker>')
|
@app.route('/tracker/<suuid:tracker>')
|
||||||
@cache.memoize(timeout=60) # multisave is currently created at most every minute
|
@cache.memoize(timeout=60) # multisave is currently created at most every minute
|
||||||
def get_multiworld_tracker(tracker: UUID):
|
def get_multiworld_tracker(tracker: UUID):
|
||||||
|
@ -1455,18 +1469,22 @@ def get_multiworld_tracker(tracker: UUID):
|
||||||
|
|
||||||
return render_template("multiTracker.html", **data)
|
return render_template("multiTracker.html", **data)
|
||||||
|
|
||||||
|
if "Factorio" in games:
|
||||||
|
@app.route('/tracker/<suuid:tracker>/Factorio')
|
||||||
|
@cache.memoize(timeout=60) # multisave is currently created at most every minute
|
||||||
|
def get_Factorio_multiworld_tracker(tracker: UUID):
|
||||||
|
data = _get_multiworld_tracker_data(tracker)
|
||||||
|
if not data:
|
||||||
|
abort(404)
|
||||||
|
|
||||||
@app.route('/tracker/<suuid:tracker>/Factorio')
|
data["inventory"] = _get_inventory_data(data)
|
||||||
@cache.memoize(timeout=60) # multisave is currently created at most every minute
|
data["named_inventory"] = {team_id : {
|
||||||
def get_Factorio_multiworld_tracker(tracker: UUID):
|
player_id: _get_named_inventory(inventory, data["custom_items"])
|
||||||
data = _get_multiworld_tracker_data(tracker)
|
for player_id, inventory in team_inventory.items()
|
||||||
if not data:
|
} for team_id, team_inventory in data["inventory"].items()}
|
||||||
abort(404)
|
data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio")
|
||||||
|
|
||||||
data["inventory"] = _get_inventory_data(data)
|
return render_template("multiFactorioTracker.html", **data)
|
||||||
data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio")
|
|
||||||
|
|
||||||
return render_template("multiFactorioTracker.html", **data)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/tracker/<suuid:tracker>/A Link to the Past')
|
@app.route('/tracker/<suuid:tracker>/A Link to the Past')
|
||||||
|
@ -1596,5 +1614,7 @@ game_specific_trackers: typing.Dict[str, typing.Callable] = {
|
||||||
|
|
||||||
multi_trackers: typing.Dict[str, typing.Callable] = {
|
multi_trackers: typing.Dict[str, typing.Callable] = {
|
||||||
"A Link to the Past": get_LttP_multiworld_tracker,
|
"A Link to the Past": get_LttP_multiworld_tracker,
|
||||||
"Factorio": get_Factorio_multiworld_tracker,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if "Factorio" in games:
|
||||||
|
multi_trackers["Factorio"] = get_Factorio_multiworld_tracker
|
||||||
|
|
Loading…
Reference in New Issue