List owned rooms on landing
This commit is contained in:
		
							parent
							
								
									0a325e3dce
								
							
						
					
					
						commit
						ca106ebfee
					
				| 
						 | 
				
			
			@ -8,12 +8,10 @@ import typing
 | 
			
		|||
import multiprocessing
 | 
			
		||||
import threading
 | 
			
		||||
import zlib
 | 
			
		||||
import collections
 | 
			
		||||
 | 
			
		||||
from pony.flask import Pony
 | 
			
		||||
from flask import Flask, request, redirect, url_for, render_template, Response, session, abort, flash
 | 
			
		||||
from flask_caching import Cache
 | 
			
		||||
from pony.orm import commit
 | 
			
		||||
 | 
			
		||||
from .models import *
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -129,135 +127,8 @@ def host_room(room: int):
 | 
			
		|||
    return render_template("host_room.html", room=room)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/tracker/<int:room>')
 | 
			
		||||
@cache.memoize(timeout=60)  # update every minute
 | 
			
		||||
def get_tracker(room: int):
 | 
			
		||||
    # This more WIP than the rest
 | 
			
		||||
    import Items
 | 
			
		||||
    def get_id(item_name):
 | 
			
		||||
        return Items.item_table[item_name][3]
 | 
			
		||||
 | 
			
		||||
    room = Room.get(id=room)
 | 
			
		||||
    if not room:
 | 
			
		||||
        abort(404)
 | 
			
		||||
    if room.allow_tracker:
 | 
			
		||||
        multidata = room.seed.multidata
 | 
			
		||||
        locations = {tuple(k): tuple(v) for k, v in multidata['locations']}
 | 
			
		||||
 | 
			
		||||
        links = {"Bow": "Progressive Bow",
 | 
			
		||||
                 "Silver Arrows": "Progressive Bow",
 | 
			
		||||
                 "Progressive Bow (Alt)": "Progressive Bow",
 | 
			
		||||
                 "Bottle (Red Potion)": "Bottle",
 | 
			
		||||
                 "Bottle (Green Potion)": "Bottle",
 | 
			
		||||
                 "Bottle (Blue Potion)": "Bottle",
 | 
			
		||||
                 "Bottle (Fairy)": "Bottle",
 | 
			
		||||
                 "Bottle (Bee)": "Bottle",
 | 
			
		||||
                 "Bottle (Good Bee)": "Bottle",
 | 
			
		||||
                 "Fighter Sword": "Progressive Sword",
 | 
			
		||||
                 "Master Sword": "Progressive Sword",
 | 
			
		||||
                 "Tempered Sword": "Progressive Sword",
 | 
			
		||||
                 "Golden Sword": "Progressive Sword",
 | 
			
		||||
                 "Power Glove": "Progressive Glove",
 | 
			
		||||
                 "Titans Mitts": "Progressive Glove"
 | 
			
		||||
                 }
 | 
			
		||||
 | 
			
		||||
        icons = {
 | 
			
		||||
            "Progressive Sword":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/cc/ALttP_Master_Sword_Sprite.png?version=55869db2a20e157cd3b5c8f556097725",
 | 
			
		||||
            "Pegasus Boots":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png?version=405f42f97240c9dcd2b71ffc4bebc7f9",
 | 
			
		||||
            "Progressive Glove":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/53/ALttP_Titan's_Mitt_Sprite.png?version=6ac54c3016a23b94413784881fcd3c75",
 | 
			
		||||
            "Flippers":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/88/ALttP_Zora's_Flippers_Sprite.png?version=b9d7521bb3a5a4d986879f70a70bc3da",
 | 
			
		||||
            "Moon Pearl":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png?version=d601542d5abcc3e006ee163254bea77e",
 | 
			
		||||
            "Progressive Bow":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=cfb7648b3714cccc80e2b17b2adf00ed",
 | 
			
		||||
            "Blue Boomerang":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c3/ALttP_Boomerang_Sprite.png?version=96127d163759395eb510b81a556d500e",
 | 
			
		||||
            "Red Boomerang":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Magical_Boomerang_Sprite.png?version=47cddce7a07bc3e4c2c10727b491f400",
 | 
			
		||||
            "Hookshot":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png?version=c90bc8e07a52e8090377bd6ef854c18b",
 | 
			
		||||
            "Mushroom":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png?version=1f1acb30d71bd96b60a3491e54bbfe59",
 | 
			
		||||
            "Magic Powder":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Powder_Sprite.png?version=deaf51f8636823558bd6e6307435fb01",
 | 
			
		||||
            "Fire Rod":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png?version=6eabc9f24d25697e2c4cd43ddc8207c0",
 | 
			
		||||
            "Ice Rod":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png?version=1f944148223d91cfc6a615c92286c3bc",
 | 
			
		||||
            "Bombos":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png?version=f4d6aba47fb69375e090178f0fc33b26",
 | 
			
		||||
            "Ether":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png?version=34027651a5565fcc5a83189178ab17b5",
 | 
			
		||||
            "Quake":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png?version=efd64d451b1831bd59f7b7d6b61b5879",
 | 
			
		||||
            "Lamp":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png?version=e76eaa1ec509c9a5efb2916698d5a4ce",
 | 
			
		||||
            "Hammer":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png?version=e0adec227193818dcaedf587eba34500",
 | 
			
		||||
            "Shovel":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png?version=e73d1ce0115c2c70eaca15b014bd6f05",
 | 
			
		||||
            "Flute":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png?version=ec4982b31c56da2c0c010905c5c60390",
 | 
			
		||||
            "Bug Catching Net":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png?version=4d40e0ee015b687ff75b333b968d8be6",
 | 
			
		||||
            "Book of Mudora":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png?version=11e4632bba54f6b9bf921df06ac93744",
 | 
			
		||||
            "Bottle":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png?version=fd98ab04db775270cbe79fce0235777b",
 | 
			
		||||
            "Cane of Somaria":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png?version=8cc1900dfd887890badffc903bb87943",
 | 
			
		||||
            "Cane of Byrna":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png?version=758b607c8cbe2cf1900d42a0b3d0fb54",
 | 
			
		||||
            "Cape":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png?version=6b77f0d609aab0c751307fc124736832",
 | 
			
		||||
            "Magic Mirror":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png?version=e035dbc9cbe2a3bd44aa6d047762b0cc",
 | 
			
		||||
            "Triforce":
 | 
			
		||||
                r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png?version=dc398e1293177581c16303e4f9d12a48"
 | 
			
		||||
        }
 | 
			
		||||
        multi_items = {get_id(name) for name in ("Progressive Sword", "Progressive Bow", "Bottle")}
 | 
			
		||||
        links = {get_id(key): get_id(value) for key, value in links.items()}
 | 
			
		||||
        inventory = {teamnumber: {playernumber: collections.Counter() for playernumber in range(1, len(team) + 1)}
 | 
			
		||||
                     for teamnumber, team in enumerate(multidata["names"])}
 | 
			
		||||
        for (team, player), locations_checked in room.multisave.get("location_checks", {}):
 | 
			
		||||
            for location in locations_checked:
 | 
			
		||||
                item, recipient = locations[location, player]
 | 
			
		||||
                inventory[team][recipient][links.get(item, item)] += 1
 | 
			
		||||
        for (team, player), game_state in room.multisave.get("client_game_state", []):
 | 
			
		||||
            if game_state:
 | 
			
		||||
                inventory[team][player][106] = 1  # Triforce
 | 
			
		||||
        from MultiServer import get_item_name_from_id
 | 
			
		||||
        from Items import lookup_id_to_name
 | 
			
		||||
        player_names = {}
 | 
			
		||||
        for team, names in enumerate(multidata['names']):
 | 
			
		||||
            for player, name in enumerate(names, 1):
 | 
			
		||||
                player_names[(team, player)] = name
 | 
			
		||||
        tracking_names = ["Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer",
 | 
			
		||||
                          "Hookshot", "Magic Mirror", "Flute",
 | 
			
		||||
                          "Pegasus Boots", "Progressive Glove", "Flippers", "Moon Pearl", "Blue Boomerang",
 | 
			
		||||
                          "Red Boomerang", "Bug Catching Net", "Cane of Byrna", "Cape", "Mushroom", "Shovel", "Lamp",
 | 
			
		||||
                          "Magic Powder",
 | 
			
		||||
                          "Cane of Somaria", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake",
 | 
			
		||||
                          "Bottle", "Triforce"]  # TODO make sure this list has what we need and sort it better
 | 
			
		||||
        tracking_ids = []
 | 
			
		||||
 | 
			
		||||
        for item in tracking_names:
 | 
			
		||||
            tracking_ids.append(get_id(item))
 | 
			
		||||
 | 
			
		||||
        return render_template("tracker.html", inventory=inventory, get_item_name_from_id=get_item_name_from_id,
 | 
			
		||||
                               lookup_id_to_name=lookup_id_to_name, player_names=player_names,
 | 
			
		||||
                               tracking_names=tracking_names, tracking_ids=tracking_ids, room=room, icons=icons,
 | 
			
		||||
                               multi_items=multi_items)
 | 
			
		||||
    else:
 | 
			
		||||
        return "Tracker disabled for this room."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from WebHost.customserver import run_server_process
 | 
			
		||||
 | 
			
		||||
from . import tracker  # to trigger app routing picking up on it
 | 
			
		||||
 | 
			
		||||
@app.route('/', methods=['GET', 'POST'])
 | 
			
		||||
def upload_multidata():
 | 
			
		||||
| 
						 | 
				
			
			@ -282,4 +153,5 @@ def upload_multidata():
 | 
			
		|||
                    return redirect(url_for("view_seed", seed=seed.id))
 | 
			
		||||
            else:
 | 
			
		||||
                flash("Not recognized file format. Awaiting a .multidata file.")
 | 
			
		||||
    return render_template("upload_multidata.html")
 | 
			
		||||
    rooms = select(room for room in Room if room.owner == session["_id"])
 | 
			
		||||
    return render_template("upload_multidata.html", rooms=rooms)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,12 +8,14 @@
 | 
			
		|||
    {% endblock %}
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
{% with messages = get_flashed_messages() %}
 | 
			
		||||
    {% for message in messages %}
 | 
			
		||||
        <div class="alert alert-danger" role="alert">{{ message }}</div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
{% endwith %}
 | 
			
		||||
{% block body %}{% endblock %}
 | 
			
		||||
<div class=".container-fluid">
 | 
			
		||||
    {% with messages = get_flashed_messages() %}
 | 
			
		||||
        {% for message in messages %}
 | 
			
		||||
            <div class="alert alert-danger" role="alert">{{ message }}</div>
 | 
			
		||||
        {% endfor %}
 | 
			
		||||
    {% endwith %}
 | 
			
		||||
    {% block body %}{% endblock %}
 | 
			
		||||
</div>
 | 
			
		||||
<footer class="page-footer" style="position: fixed; left: 0; bottom: 0; width: 100%; text-align: center">
 | 
			
		||||
    <div class="container">
 | 
			
		||||
        <span class="text-muted">This site uses a cookie to track your session in order to give you ownership over uploaded files and created instances.</span>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,4 +8,17 @@
 | 
			
		|||
        <input type=file name=file>
 | 
			
		||||
        <input type=submit value=Upload>
 | 
			
		||||
    </form>
 | 
			
		||||
    <br>
 | 
			
		||||
    {% if rooms %}
 | 
			
		||||
        <h1>Your Rooms:</h1>
 | 
			
		||||
        <ul class="list-group">
 | 
			
		||||
            {% for room in rooms %}
 | 
			
		||||
                <li class="list-group-item"><a href="{{ url_for("host_room", room=room.id) }}">Room #{{ room.id }}</a>
 | 
			
		||||
                    based on <a href="{{ url_for("view_seed", seed=room.seed.id) }}">Seed #{{ room.seed.id }}</a></li>
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </ul>
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <h3>No rooms owned by you were found. Upload a Multiworld to get started.</h3>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,142 @@
 | 
			
		|||
import collections
 | 
			
		||||
 | 
			
		||||
from flask import render_template
 | 
			
		||||
from werkzeug.exceptions import abort
 | 
			
		||||
 | 
			
		||||
from WebHost import app, cache, Room
 | 
			
		||||
 | 
			
		||||
import Items
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_id(item_name):
 | 
			
		||||
    return Items.item_table[item_name][3]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
icons = {
 | 
			
		||||
    "Progressive Sword":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/cc/ALttP_Master_Sword_Sprite.png?version=55869db2a20e157cd3b5c8f556097725",
 | 
			
		||||
    "Pegasus Boots":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ed/ALttP_Pegasus_Shoes_Sprite.png?version=405f42f97240c9dcd2b71ffc4bebc7f9",
 | 
			
		||||
    "Progressive Glove":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/53/ALttP_Titan's_Mitt_Sprite.png?version=6ac54c3016a23b94413784881fcd3c75",
 | 
			
		||||
    "Flippers":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/88/ALttP_Zora's_Flippers_Sprite.png?version=b9d7521bb3a5a4d986879f70a70bc3da",
 | 
			
		||||
    "Moon Pearl":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Moon_Pearl_Sprite.png?version=d601542d5abcc3e006ee163254bea77e",
 | 
			
		||||
    "Progressive Bow":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Bow_%26_Arrows_Sprite.png?version=cfb7648b3714cccc80e2b17b2adf00ed",
 | 
			
		||||
    "Blue Boomerang":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c3/ALttP_Boomerang_Sprite.png?version=96127d163759395eb510b81a556d500e",
 | 
			
		||||
    "Red Boomerang":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/b9/ALttP_Magical_Boomerang_Sprite.png?version=47cddce7a07bc3e4c2c10727b491f400",
 | 
			
		||||
    "Hookshot":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/24/Hookshot.png?version=c90bc8e07a52e8090377bd6ef854c18b",
 | 
			
		||||
    "Mushroom":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/35/ALttP_Mushroom_Sprite.png?version=1f1acb30d71bd96b60a3491e54bbfe59",
 | 
			
		||||
    "Magic Powder":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Powder_Sprite.png?version=deaf51f8636823558bd6e6307435fb01",
 | 
			
		||||
    "Fire Rod":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d6/FireRod.png?version=6eabc9f24d25697e2c4cd43ddc8207c0",
 | 
			
		||||
    "Ice Rod":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d7/ALttP_Ice_Rod_Sprite.png?version=1f944148223d91cfc6a615c92286c3bc",
 | 
			
		||||
    "Bombos":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/8/8c/ALttP_Bombos_Medallion_Sprite.png?version=f4d6aba47fb69375e090178f0fc33b26",
 | 
			
		||||
    "Ether":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/3/3c/Ether.png?version=34027651a5565fcc5a83189178ab17b5",
 | 
			
		||||
    "Quake":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/56/ALttP_Quake_Medallion_Sprite.png?version=efd64d451b1831bd59f7b7d6b61b5879",
 | 
			
		||||
    "Lamp":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/6/63/ALttP_Lantern_Sprite.png?version=e76eaa1ec509c9a5efb2916698d5a4ce",
 | 
			
		||||
    "Hammer":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/d1/ALttP_Hammer_Sprite.png?version=e0adec227193818dcaedf587eba34500",
 | 
			
		||||
    "Shovel":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/c/c4/ALttP_Shovel_Sprite.png?version=e73d1ce0115c2c70eaca15b014bd6f05",
 | 
			
		||||
    "Flute":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/d/db/Flute.png?version=ec4982b31c56da2c0c010905c5c60390",
 | 
			
		||||
    "Bug Catching Net":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/5/54/Bug-CatchingNet.png?version=4d40e0ee015b687ff75b333b968d8be6",
 | 
			
		||||
    "Book of Mudora":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/2/22/ALttP_Book_of_Mudora_Sprite.png?version=11e4632bba54f6b9bf921df06ac93744",
 | 
			
		||||
    "Bottle":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/ef/ALttP_Magic_Bottle_Sprite.png?version=fd98ab04db775270cbe79fce0235777b",
 | 
			
		||||
    "Cane of Somaria":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e1/ALttP_Cane_of_Somaria_Sprite.png?version=8cc1900dfd887890badffc903bb87943",
 | 
			
		||||
    "Cane of Byrna":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/b/bc/ALttP_Cane_of_Byrna_Sprite.png?version=758b607c8cbe2cf1900d42a0b3d0fb54",
 | 
			
		||||
    "Cape":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/1/1c/ALttP_Magic_Cape_Sprite.png?version=6b77f0d609aab0c751307fc124736832",
 | 
			
		||||
    "Magic Mirror":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/e/e5/ALttP_Magic_Mirror_Sprite.png?version=e035dbc9cbe2a3bd44aa6d047762b0cc",
 | 
			
		||||
    "Triforce":
 | 
			
		||||
        r"https://gamepedia.cursecdn.com/zelda_gamepedia_en/4/4e/TriforceALttPTitle.png?version=dc398e1293177581c16303e4f9d12a48"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
links = {"Bow": "Progressive Bow",
 | 
			
		||||
         "Silver Arrows": "Progressive Bow",
 | 
			
		||||
         "Progressive Bow (Alt)": "Progressive Bow",
 | 
			
		||||
         "Bottle (Red Potion)": "Bottle",
 | 
			
		||||
         "Bottle (Green Potion)": "Bottle",
 | 
			
		||||
         "Bottle (Blue Potion)": "Bottle",
 | 
			
		||||
         "Bottle (Fairy)": "Bottle",
 | 
			
		||||
         "Bottle (Bee)": "Bottle",
 | 
			
		||||
         "Bottle (Good Bee)": "Bottle",
 | 
			
		||||
         "Fighter Sword": "Progressive Sword",
 | 
			
		||||
         "Master Sword": "Progressive Sword",
 | 
			
		||||
         "Tempered Sword": "Progressive Sword",
 | 
			
		||||
         "Golden Sword": "Progressive Sword",
 | 
			
		||||
         "Power Glove": "Progressive Glove",
 | 
			
		||||
         "Titans Mitts": "Progressive Glove"
 | 
			
		||||
         }
 | 
			
		||||
multi_items = {get_id(name) for name in ("Progressive Sword", "Progressive Bow", "Bottle")}
 | 
			
		||||
links = {get_id(key): get_id(value) for key, value in links.items()}
 | 
			
		||||
 | 
			
		||||
tracking_names = ["Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer",
 | 
			
		||||
                  "Hookshot", "Magic Mirror", "Flute",
 | 
			
		||||
                  "Pegasus Boots", "Progressive Glove", "Flippers", "Moon Pearl", "Blue Boomerang",
 | 
			
		||||
                  "Red Boomerang", "Bug Catching Net", "Cape", "Shovel", "Lamp",
 | 
			
		||||
                  "Mushroom", "Magic Powder",
 | 
			
		||||
                  "Cane of Somaria", "Cane of Byrna", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake",
 | 
			
		||||
                  "Bottle", "Triforce"]  # TODO make sure this list has what we need and sort it better
 | 
			
		||||
 | 
			
		||||
tracking_ids = []
 | 
			
		||||
 | 
			
		||||
for item in tracking_names:
 | 
			
		||||
    tracking_ids.append(get_id(item))
 | 
			
		||||
 | 
			
		||||
from MultiServer import get_item_name_from_id
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/tracker/<int:room>')
 | 
			
		||||
@cache.memoize(timeout=60)  # update every minute
 | 
			
		||||
def get_tracker(room: int):
 | 
			
		||||
    # This more WIP than the rest
 | 
			
		||||
 | 
			
		||||
    room = Room.get(id=room)
 | 
			
		||||
    if not room:
 | 
			
		||||
        abort(404)
 | 
			
		||||
    if room.allow_tracker:
 | 
			
		||||
        multidata = room.seed.multidata
 | 
			
		||||
        locations = {tuple(k): tuple(v) for k, v in multidata['locations']}
 | 
			
		||||
 | 
			
		||||
        inventory = {teamnumber: {playernumber: collections.Counter() for playernumber in range(1, len(team) + 1)}
 | 
			
		||||
                     for teamnumber, team in enumerate(multidata["names"])}
 | 
			
		||||
 | 
			
		||||
        for (team, player), locations_checked in room.multisave.get("location_checks", {}):
 | 
			
		||||
            for location in locations_checked:
 | 
			
		||||
                item, recipient = locations[location, player]
 | 
			
		||||
                inventory[team][recipient][links.get(item, item)] += 1
 | 
			
		||||
        for (team, player), game_state in room.multisave.get("client_game_state", []):
 | 
			
		||||
            if game_state:
 | 
			
		||||
                inventory[team][player][106] = 1  # Triforce
 | 
			
		||||
 | 
			
		||||
        player_names = {}
 | 
			
		||||
        for team, names in enumerate(multidata['names']):
 | 
			
		||||
            for player, name in enumerate(names, 1):
 | 
			
		||||
                player_names[(team, player)] = name
 | 
			
		||||
 | 
			
		||||
        return render_template("tracker.html", inventory=inventory, get_item_name_from_id=get_item_name_from_id,
 | 
			
		||||
                               lookup_id_to_name=Items.lookup_id_to_name, player_names=player_names,
 | 
			
		||||
                               tracking_names=tracking_names, tracking_ids=tracking_ids, room=room, icons=icons,
 | 
			
		||||
                               multi_items=multi_items)
 | 
			
		||||
    else:
 | 
			
		||||
        return "Tracker disabled for this room."
 | 
			
		||||
		Loading…
	
		Reference in New Issue