7
7
from flask import render_template
8
8
from werkzeug .exceptions import abort
9
9
10
- from MultiServer import Context
10
+ from MultiServer import Context , get_saving_second
11
11
from NetUtils import SlotType
12
12
from Utils import restricted_loads
13
13
from worlds import lookup_any_item_id_to_name , lookup_any_location_id_to_name
@@ -280,16 +280,25 @@ def get_static_room_data(room: Room):
280
280
player_location_to_area = {playernumber : get_location_table (multidata ["checks_in_area" ][playernumber ])
281
281
for playernumber in range (1 , len (names [0 ]) + 1 )
282
282
if playernumber not in groups }
283
-
283
+ saving_second = get_saving_second ( multidata [ "seed_name" ])
284
284
result = locations , names , use_door_tracker , player_checks_in_area , player_location_to_area , \
285
- multidata ["precollected_items" ], multidata ["games" ], multidata ["slot_data" ], groups
285
+ multidata ["precollected_items" ], multidata ["games" ], multidata ["slot_data" ], groups , saving_second
286
286
_multidata_cache [room .seed .id ] = result
287
287
return result
288
288
289
289
290
290
@app .route ('/tracker/<suuid:tracker>/<int:tracked_team>/<int:tracked_player>' )
291
- @cache .memoize (timeout = 60 ) # multisave is currently created at most every minute
292
- def getPlayerTracker (tracker : UUID , tracked_team : int , tracked_player : int , want_generic : bool = False ):
291
+ def get_player_tracker (tracker : UUID , tracked_team : int , tracked_player : int , want_generic : bool = False ):
292
+ key = f"{ tracker } _{ tracked_team } _{ tracked_player } _{ want_generic } "
293
+ tracker_page = cache .get (key )
294
+ if tracker_page :
295
+ return tracker_page
296
+ timeout , tracker_page = _get_player_tracker (tracker , tracked_team , tracked_player , want_generic )
297
+ cache .set (key , tracker_page , timeout )
298
+ return tracker_page
299
+
300
+
301
+ def _get_player_tracker (tracker : UUID , tracked_team : int , tracked_player : int , want_generic : bool ):
293
302
# Team and player must be positive and greater than zero
294
303
if tracked_team < 0 or tracked_player < 1 :
295
304
abort (404 )
@@ -300,7 +309,7 @@ def getPlayerTracker(tracker: UUID, tracked_team: int, tracked_player: int, want
300
309
301
310
# Collect seed information and pare it down to a single player
302
311
locations , names , use_door_tracker , seed_checks_in_area , player_location_to_area , \
303
- precollected_items , games , slot_data , groups = get_static_room_data (room )
312
+ precollected_items , games , slot_data , groups , saving_second = get_static_room_data (room )
304
313
player_name = names [tracked_team ][tracked_player - 1 ]
305
314
location_to_area = player_location_to_area [tracked_player ]
306
315
inventory = collections .Counter ()
@@ -338,21 +347,24 @@ def getPlayerTracker(tracker: UUID, tracked_team: int, tracked_player: int, want
338
347
checks_done ["Total" ] += 1
339
348
specific_tracker = game_specific_trackers .get (games [tracked_player ], None )
340
349
if specific_tracker and not want_generic :
341
- return specific_tracker (multisave , room , locations , inventory , tracked_team , tracked_player , player_name ,
342
- seed_checks_in_area , checks_done , slot_data [tracked_player ])
350
+ tracker = specific_tracker (multisave , room , locations , inventory , tracked_team , tracked_player , player_name ,
351
+ seed_checks_in_area , checks_done , slot_data [tracked_player ], saving_second )
343
352
else :
344
- return __renderGenericTracker (multisave , room , locations , inventory , tracked_team , tracked_player , player_name ,
345
- seed_checks_in_area , checks_done )
353
+ tracker = __renderGenericTracker (multisave , room , locations , inventory , tracked_team , tracked_player , player_name ,
354
+ seed_checks_in_area , checks_done , saving_second )
355
+
356
+ return (saving_second - datetime .datetime .now ().second ) % 60 or 60 , tracker
346
357
347
358
348
359
@app .route ('/generic_tracker/<suuid:tracker>/<int:tracked_team>/<int:tracked_player>' )
349
360
def get_generic_tracker (tracker : UUID , tracked_team : int , tracked_player : int ):
350
- return getPlayerTracker (tracker , tracked_team , tracked_player , True )
361
+ return get_player_tracker (tracker , tracked_team , tracked_player , True )
351
362
352
363
353
364
def __renderAlttpTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
354
365
inventory : Counter , team : int , player : int , player_name : str ,
355
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ) -> str :
366
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ,
367
+ saving_second : int ) -> str :
356
368
357
369
# Note the presence of the triforce item
358
370
game_state = multisave .get ("client_game_state" , {}).get ((team , player ), 0 )
@@ -414,7 +426,8 @@ def __renderAlttpTracker(multisave: Dict[str, Any], room: Room, locations: Dict[
414
426
415
427
def __renderMinecraftTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
416
428
inventory : Counter , team : int , player : int , playerName : str ,
417
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ) -> str :
429
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ,
430
+ saving_second : int ) -> str :
418
431
419
432
icons = {
420
433
"Wooden Pickaxe" : "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d2/Wooden_Pickaxe_JE3_BE3.png" ,
@@ -516,14 +529,15 @@ def __renderMinecraftTracker(multisave: Dict[str, Any], room: Room, locations: D
516
529
inventory = inventory , icons = icons ,
517
530
acquired_items = {lookup_any_item_id_to_name [id ] for id in inventory if
518
531
id in lookup_any_item_id_to_name },
519
- player = player , team = team , room = room , player_name = playerName ,
532
+ player = player , team = team , room = room , player_name = playerName , saving_second = saving_second ,
520
533
checks_done = checks_done , checks_in_area = checks_in_area , location_info = location_info ,
521
534
** display_data )
522
535
523
536
524
537
def __renderOoTTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
525
538
inventory : Counter , team : int , player : int , playerName : str ,
526
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ) -> str :
539
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ,
540
+ saving_second : int ) -> str :
527
541
528
542
icons = {
529
543
"Fairy Ocarina" : "https://static.wikia.nocookie.net/zelda_gamepedia_en/images/9/97/OoT_Fairy_Ocarina_Icon.png" ,
@@ -725,7 +739,8 @@ def lookup_and_trim(id, area):
725
739
726
740
def __renderTimespinnerTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
727
741
inventory : Counter , team : int , player : int , playerName : str ,
728
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict [str , Any ]) -> str :
742
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ],
743
+ slot_data : Dict [str , Any ], saving_second : int ) -> str :
729
744
730
745
icons = {
731
746
"Timespinner Wheel" : "https://timespinnerwiki.com/mediawiki/images/7/76/Timespinner_Wheel.png" ,
@@ -831,7 +846,8 @@ def __renderTimespinnerTracker(multisave: Dict[str, Any], room: Room, locations:
831
846
832
847
def __renderSuperMetroidTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
833
848
inventory : Counter , team : int , player : int , playerName : str ,
834
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ) -> str :
849
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ,
850
+ saving_second : int ) -> str :
835
851
836
852
icons = {
837
853
"Energy Tank" : "https://randommetroidsolver.pythonanywhere.com/solver/static/images/tracker/inventory/ETank.png" ,
@@ -930,8 +946,9 @@ def __renderSuperMetroidTracker(multisave: Dict[str, Any], room: Room, locations
930
946
** display_data )
931
947
932
948
def __renderSC2WoLTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
933
- inventory : Counter , team : int , player : int , playerName : str ,
934
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ], slot_data : Dict ) -> str :
949
+ inventory : Counter , team : int , player : int , playerName : str ,
950
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ],
951
+ slot_data : Dict , saving_second : int ) -> str :
935
952
936
953
SC2WOL_LOC_ID_OFFSET = 1000
937
954
SC2WOL_ITEM_ID_OFFSET = 1000
@@ -1173,37 +1190,40 @@ def __renderSC2WoLTracker(multisave: Dict[str, Any], room: Room, locations: Dict
1173
1190
checks_done = checks_done , checks_in_area = checks_in_area , location_info = location_info ,
1174
1191
** display_data )
1175
1192
1193
+
1176
1194
def __renderGenericTracker (multisave : Dict [str , Any ], room : Room , locations : Dict [int , Dict [int , Tuple [int , int , int ]]],
1177
1195
inventory : Counter , team : int , player : int , playerName : str ,
1178
- seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ]) -> str :
1196
+ seed_checks_in_area : Dict [int , Dict [str , int ]], checks_done : Dict [str , int ],
1197
+ saving_second : int ) -> str :
1179
1198
1180
1199
checked_locations = multisave .get ("location_checks" , {}).get ((team , player ), set ())
1181
1200
player_received_items = {}
1182
1201
if multisave .get ('version' , 0 ) > 0 :
1183
- # add numbering to all items but starter_inventory
1184
1202
ordered_items = multisave .get ('received_items' , {}).get ((team , player , True ), [])
1185
1203
else :
1186
1204
ordered_items = multisave .get ('received_items' , {}).get ((team , player ), [])
1187
1205
1206
+ # add numbering to all items but starter_inventory
1188
1207
for order_index , networkItem in enumerate (ordered_items , start = 1 ):
1189
1208
player_received_items [networkItem .item ] = order_index
1190
1209
1191
1210
return render_template ("genericTracker.html" ,
1192
- inventory = inventory ,
1193
- player = player , team = team , room = room , player_name = playerName ,
1194
- checked_locations = checked_locations ,
1195
- not_checked_locations = set (locations [player ]) - checked_locations ,
1196
- received_items = player_received_items )
1211
+ inventory = inventory ,
1212
+ player = player , team = team , room = room , player_name = playerName ,
1213
+ checked_locations = checked_locations ,
1214
+ not_checked_locations = set (locations [player ]) - checked_locations ,
1215
+ received_items = player_received_items ,
1216
+ saving_second = saving_second )
1197
1217
1198
1218
1199
1219
@app .route ('/tracker/<suuid:tracker>' )
1200
- @cache .memoize (timeout = 60 ) # multisave is currently created at most every minute
1220
+ @cache .memoize (timeout = 1 ) # multisave is currently created at most every minute
1201
1221
def getTracker (tracker : UUID ):
1202
1222
room : Room = Room .get (tracker = tracker )
1203
1223
if not room :
1204
1224
abort (404 )
1205
1225
locations , names , use_door_tracker , seed_checks_in_area , player_location_to_area , \
1206
- precollected_items , games , slot_data , groups = get_static_room_data (room )
1226
+ precollected_items , games , slot_data , groups , saving_second = get_static_room_data (room )
1207
1227
1208
1228
inventory = {teamnumber : {playernumber : collections .Counter () for playernumber in range (1 , len (team ) + 1 ) if playernumber not in groups }
1209
1229
for teamnumber , team in enumerate (names )}
0 commit comments