Update map override

This commit is contained in:
oldnapalm
2023-12-12 09:02:00 -03:00
parent 6654c73a42
commit d58df275dd
2 changed files with 32 additions and 61 deletions
+21 -43
View File
@@ -14,8 +14,6 @@ import itertools
import socketserver import socketserver
from urllib3 import PoolManager from urllib3 import PoolManager
from http.server import SimpleHTTPRequestHandler from http.server import SimpleHTTPRequestHandler
from http.cookies import SimpleCookie
from collections import deque
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from Crypto.Cipher import AES from Crypto.Cipher import AES
@@ -76,9 +74,6 @@ else:
pass pass
discord = DummyDiscord() discord = DummyDiscord()
MAP_OVERRIDE = deque(maxlen=16)
CLIMB_OVERRIDE = deque(maxlen=16)
bot_update_freq = 3 bot_update_freq = 3
pacer_update_freq = 1 pacer_update_freq = 1
simulated_latency = 300 #makes bots animation smoother than using current time simulated_latency = 300 #makes bots animation smoother than using current time
@@ -93,6 +88,8 @@ global_bots = {}
global_news = {} #player id to dictionary of peer_player_id->worldTime global_news = {} #player id to dictionary of peer_player_id->worldTime
global_relay = {} global_relay = {}
global_clients = {} global_clients = {}
map_override = {}
climb_override = {}
def sigint_handler(num, frame): def sigint_handler(num, frame):
httpd.shutdown() httpd.shutdown()
@@ -113,45 +110,26 @@ class CDNHandler(SimpleHTTPRequestHandler):
return fullpath return fullpath
def do_GET(self): def do_GET(self):
path_end = self.path.split('/')[-1] # Check if client requested the map be overridden
if path_end == 'map_override': if self.path == '/gameassets/MapSchedule_v2.xml' and self.client_address[0] in map_override:
cookies_string = self.headers.get('Cookie') self.send_response(200)
cookies = SimpleCookie() self.send_header('Content-type', 'text/xml')
cookies.load(cookies_string)
# We have no identifying information when Zwift makes MapSchedule request except for the client's IP.
if 'selected_map' in cookies:
MAP_OVERRIDE.append((self.client_address[0], cookies['selected_map'].value))
if 'selected_climb' in cookies:
CLIMB_OVERRIDE.append((self.client_address[0], cookies['selected_climb'].value))
self.send_response(302)
self.send_header('Cookie', cookies_string)
self.send_header('Location', 'https://secure.zwift.com/ride')
self.end_headers() self.end_headers()
start = datetime.today() - timedelta(days=1)
output = '<MapSchedule><appointments><appointment map="%s" start="%s"/></appointments><VERSION>1</VERSION></MapSchedule>' % (map_override[self.client_address[0]], start.strftime("%Y-%m-%dT00:01-04"))
self.wfile.write(output.encode())
del map_override[self.client_address[0]]
return return
if self.path == '/gameassets/MapSchedule_v2.xml': if self.path == '/gameassets/PortalRoadSchedule_v1.xml' and self.client_address[0] in climb_override:
# Check if client requested the map be overridden self.send_response(200)
for override in MAP_OVERRIDE: self.send_header('Content-type', 'text/xml')
if override[0] == self.client_address[0]: self.end_headers()
self.send_response(200) start = datetime.today() - timedelta(days=1)
self.send_header('Content-type', 'text/xml') output = '<PortalRoads><PortalRoadSchedule><appointments><appointment road="%s" portal="0" start="%s"/></appointments><VERSION>1</VERSION></PortalRoadSchedule></PortalRoads>' % (climb_override[self.client_address[0]], start.strftime("%Y-%m-%dT00:01-04"))
self.end_headers() self.wfile.write(output.encode())
start = datetime.today() - timedelta(days=1) del climb_override[self.client_address[0]]
output = '<MapSchedule><appointments><appointment map="%s" start="%s"/></appointments><VERSION>1</VERSION></MapSchedule>' % (override[1], start.strftime("%Y-%m-%dT00:01-04")) return
self.wfile.write(output.encode()) if CDN_PROXY and self.path.startswith('/gameassets/') and not self.path.endswith('_ver_cur.xml') and not ('User-Agent' in self.headers and 'python-urllib3' in self.headers['User-Agent']):
MAP_OVERRIDE.remove(override)
return
if self.path == '/gameassets/PortalRoadSchedule_v1.xml':
for override in CLIMB_OVERRIDE:
if override[0] == self.client_address[0]:
self.send_response(200)
self.send_header('Content-type', 'text/xml')
self.end_headers()
start = datetime.today() - timedelta(days=1)
output = '<PortalRoads><PortalRoadSchedule><appointments><appointment road="%s" portal="0" start="%s"/></appointments><VERSION>1</VERSION></PortalRoadSchedule></PortalRoads>' % (override[1], start.strftime("%Y-%m-%dT00:01-04"))
self.wfile.write(output.encode())
CLIMB_OVERRIDE.remove(override)
return
if CDN_PROXY and self.path.startswith('/gameassets/') and not path_end.endswith('_ver_cur.xml') and not ('User-Agent' in self.headers and 'python-urllib3' in self.headers['User-Agent']):
try: try:
self.send_response(200) self.send_response(200)
self.end_headers() self.end_headers()
@@ -865,4 +843,4 @@ if os.path.exists(FAKE_DNS_FILE) and os.path.exists(SERVER_IP_FILE):
dns = threading.Thread(target=fake_dns, args=(server_ip,)) dns = threading.Thread(target=fake_dns, args=(server_ip,))
dns.start() dns.start()
zo.run_standalone(online, global_relay, global_pace_partners, global_bots, global_ghosts, ghosts_enabled, save_ghost, regroup_ghosts, player_update_queue, discord) zo.run_standalone(online, global_relay, global_pace_partners, global_bots, global_ghosts, ghosts_enabled, save_ghost, regroup_ghosts, player_update_queue, map_override, climb_override, discord)
+11 -18
View File
@@ -139,12 +139,6 @@ app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024
db = SQLAlchemy() db = SQLAlchemy()
db.init_app(app) db.init_app(app)
online = {}
global_pace_partners = {}
global_bots = {}
global_ghosts = {}
ghosts_enabled = {}
player_update_queue = {}
zc_connect_queue = {} zc_connect_queue = {}
player_partial_profiles = {} player_partial_profiles = {}
restarting = False restarting = False
@@ -3781,21 +3775,16 @@ def start_zwift():
AnonUser.enable_ghosts = 'enableghosts' in request.form.keys() AnonUser.enable_ghosts = 'enableghosts' in request.form.keys()
save_option(AnonUser.enable_ghosts, ENABLEGHOSTS_FILE) save_option(AnonUser.enable_ghosts, ENABLEGHOSTS_FILE)
selected_map = request.form['map'] selected_map = request.form['map']
if selected_map != 'CALENDAR':
# We have no identifying information when Zwift makes MapSchedule request except for the client's IP.
map_override[request.remote_addr] = selected_map
selected_climb = request.form['climb'] selected_climb = request.form['climb']
if selected_map == 'CALENDAR' and selected_climb == 'CALENDAR': if selected_climb != 'CALENDAR':
return redirect("/ride", 302) climb_override[request.remote_addr] = selected_climb
else: return redirect("/ride", 302)
response = make_response(redirect("http://cdn.zwift.com/map_override", 302))
if selected_map != 'CALENDAR':
response.set_cookie('selected_map', selected_map, domain=".zwift.com")
if selected_climb != 'CALENDAR':
response.set_cookie('selected_climb', selected_climb, domain=".zwift.com")
if MULTIPLAYER:
response.set_cookie('remember_token', request.cookies['remember_token'], domain=".zwift.com")
return response
def run_standalone(passed_online, passed_global_relay, passed_global_pace_partners, passed_global_bots, passed_global_ghosts, passed_ghosts_enabled, passed_save_ghost, passed_regroup_ghosts, passed_player_update_queue, passed_discord): def run_standalone(passed_online, passed_global_relay, passed_global_pace_partners, passed_global_bots, passed_global_ghosts, passed_ghosts_enabled, passed_save_ghost, passed_regroup_ghosts, passed_player_update_queue, passed_map_override, passed_climb_override, passed_discord):
global online global online
global global_relay global global_relay
global global_pace_partners global global_pace_partners
@@ -3805,6 +3794,8 @@ def run_standalone(passed_online, passed_global_relay, passed_global_pace_partne
global save_ghost global save_ghost
global regroup_ghosts global regroup_ghosts
global player_update_queue global player_update_queue
global map_override
global climb_override
global discord global discord
global login_manager global login_manager
online = passed_online online = passed_online
@@ -3816,6 +3807,8 @@ def run_standalone(passed_online, passed_global_relay, passed_global_pace_partne
save_ghost = passed_save_ghost save_ghost = passed_save_ghost
regroup_ghosts = passed_regroup_ghosts regroup_ghosts = passed_regroup_ghosts
player_update_queue = passed_player_update_queue player_update_queue = passed_player_update_queue
map_override = passed_map_override
climb_override = passed_climb_override
discord = passed_discord discord = passed_discord
login_manager = LoginManager() login_manager = LoginManager()
login_manager.login_view = 'login' login_manager.login_view = 'login'