def getXauth(self): if self.lastXAuth is None or (datetime.datetime.now() - self.lastXAuth).total_seconds() > 3600: try: gxAuth = None while gxAuth is None: try: gxAuth = AstroAPI.generate_XAUTH( self.settings.ServerGuid) except: time.sleep(10) self.launcher.headers['X-Authorization'] = gxAuth self.lastXAuth = datetime.datetime.now() except: self.lastXAuth += datetime.timedelta(seconds=20)
def start_server(self, firstLaunch=False): """ Starts the Dedicated Server process and waits for it to be registered """ if firstLaunch: atexit.register(self.DedicatedServer.kill_server, reason="Launcher shutting down", save=True) else: self.check_for_update(serverStart=True) self.DedicatedServer = AstroDedicatedServer(self.astroPath, self) self.DedicatedServer.status = "starting" self.DedicatedServer.busy = False self.headers['X-Authorization'] = AstroAPI.generate_XAUTH( self.DedicatedServer.settings.ServerGuid) oldLobbyIDs = self.DedicatedServer.deregister_all_server() AstroLogging.logPrint("Starting Server process...") if self.launcherConfig.EnableAutoRestart: AstroLogging.logPrint( f"Next restart is at {self.DedicatedServer.nextRestartTime}") # time.sleep(5) startTime = time.time() self.DedicatedServer.start() self.DaemonProcess = AstroDaemon.launch( executable=self.isExecutable, consolePID=self.DedicatedServer.process.pid) # Wait for server to finish registering... while not self.DedicatedServer.registered: try: serverData = (AstroAPI.get_server( self.DedicatedServer.ipPortCombo, self.headers)) serverData = serverData['data']['Games'] lobbyIDs = [x['LobbyID'] for x in serverData] if len(set(lobbyIDs) - set(oldLobbyIDs)) == 0: time.sleep(self.launcherConfig.PlayfabAPIFrequency) else: now = time.time() if now - startTime > 15: self.DedicatedServer.registered = True del oldLobbyIDs self.DedicatedServer.LobbyID = serverData[0]['LobbyID'] if self.DedicatedServer.process.poll() is not None: AstroLogging.logPrint( "Server was forcefully closed before registration. Exiting...." ) return False except KeyboardInterrupt: self.DedicatedServer.kill_server("Launcher shutting down") except: AstroLogging.logPrint( "Failed to check server. Probably hit rate limit. Backing off and trying again..." ) self.launcherConfig.PlayfabAPIFrequency += 1 time.sleep(self.launcherConfig.PlayfabAPIFrequency) doneTime = time.time() elapsed = doneTime - startTime AstroLogging.logPrint( f"Server ready! Took {round(elapsed,2)} seconds to register." ) # {self.DedicatedServer.LobbyID} self.DedicatedServer.status = "ready" self.DedicatedServer.server_loop()
def start_server(self, firstLaunch=False): """ Starts the Dedicated Server process and waits for it to be registered """ if firstLaunch: atexit.register(self.DedicatedServer.kill_server, reason="Launcher shutting down via exit", save=True) signal.signal(signal.SIGINT, self.signal_handler) else: self.check_for_update(serverStart=True) self.DedicatedServer = AstroDedicatedServer(self.astroPath, self) self.DedicatedServer.status = "starting" self.DedicatedServer.busy = False gxAuth = None while gxAuth is None: try: gxAuth = AstroAPI.generate_XAUTH( self.DedicatedServer.settings.ServerGuid) except: AstroLogging.logPrint( "Unable to generate XAuth token... Are you connected to the internet?", msgType="warning") time.sleep(5) self.headers['X-Authorization'] = gxAuth oldLobbyIDs = self.DedicatedServer.deregister_all_server() AstroLogging.logPrint("Starting Server process...") if self.launcherConfig.EnableAutoRestart: AstroLogging.logPrint( f"Next restart is at {self.DedicatedServer.nextRestartTime}") # time.sleep(5) startTime = time.time() try: self.DedicatedServer.start() except: AstroLogging.logPrint("Unable to launch AstroServer.exe", "critical") return False reachableProcess = None pcounter = 40 while not reachableProcess: try: reachableProcess = not bool( self.DedicatedServer.process.poll()) pcounter -= 1 time.sleep(0.25) except: pcounter -= 2 time.sleep(0.5) if pcounter <= 0: AstroLogging.logPrint( "Unable to start Server Process after 10 seconds!", "critical") return False AstroLogging.logPrint("Server started! Getting ready....", ovrDWHL=True) try: self.DaemonProcess = AstroDaemon.launch( executable=self.isExecutable, consolePID=self.DedicatedServer.process.pid) except: AstroLogging.logPrint("Unable to start watcher daemon", "warning") return False # Wait for server to finish registering... serverData = None oPFF = self.launcherConfig.PlayfabAPIFrequency while not self.DedicatedServer.registered: AstroLogging.logPrint("Waiting for server to register...", "debug") try: serverData = (AstroAPI.get_server( self.DedicatedServer.ipPortCombo, self.headers)) serverData = serverData['data']['Games'] lobbyIDs = [x['LobbyID'] for x in serverData] if len(set(lobbyIDs) - set(oldLobbyIDs)) == 0: time.sleep(self.launcherConfig.PlayfabAPIFrequency) else: now = time.time() if now - startTime > 15: serverData = serverData[0] self.DedicatedServer.registered = True oldLobbyIDs = None self.DedicatedServer.LobbyID = serverData['LobbyID'] if self.DedicatedServer.process.poll() is not None: AstroLogging.logPrint( "Server was forcefully closed before registration. Exiting...." ) return False except KeyboardInterrupt: self.DedicatedServer.kill_server( "Launcher shutting down via KeyboardInterrupt") except: AstroLogging.logPrint( "Failed to check server. Probably hit rate limit. Backing off and trying again..." ) if self.launcherConfig.PlayfabAPIFrequency < 30: self.launcherConfig.PlayfabAPIFrequency += 1 time.sleep(self.launcherConfig.PlayfabAPIFrequency) self.launcherConfig.PlayfabAPIFrequency = oPFF self.DedicatedServer.serverData = serverData doneTime = time.time() elapsed = doneTime - startTime AstroLogging.logPrint( f"Server ready! Took {round(elapsed,2)} seconds to register.", ovrDWHL=True) # {self.DedicatedServer.LobbyID} self.DedicatedServer.status = "ready" self.DedicatedServer.server_loop()
def __init__(self, astroPath, launcherINI="Launcher.ini", disable_auto_update=None): # check if path specified if astroPath is not None: if os.path.exists(os.path.join(astroPath, "AstroServer.exe")): self.astroPath = astroPath else: print("Specified path does not contain the server executable") time.sleep(5) # check if executable in current directory elif os.path.exists(os.path.join(os.getcwd(), "AstroServer.exe")): self.astroPath = os.getcwd() # fallback to automatic detection (experimental, do NOT rely on it) else: try: autoPath = AstroAPI.getInstallPath() if os.path.exists(os.path.join(autoPath, "AstroServer.exe")): self.astroPath = autoPath except: AstroLogging.logPrint("Unable to find AstroServer.exe!", "critical") return AstroLogging.setup_logging(self.astroPath) self.launcherINI = launcherINI self.launcherConfig = self.LauncherConfig() self.launcherPath = os.getcwd() self.refresh_launcher_config() if disable_auto_update is not None: self.launcherConfig.DisableAutoUpdate = disable_auto_update self.version = "v1.4.6" self.latestURL = "https://github.com/ricky-davis/AstroLauncher/releases/latest" self.isExecutable = os.path.samefile(sys.executable, sys.argv[0]) self.headers = AstroAPI.base_headers self.DaemonProcess = None self.saveObserver = None self.backupObserver = None self.DSServerStats = None self.DedicatedServer = AstroDedicatedServer(self.astroPath, self) AstroLogging.logPrint( f"AstroLauncher - Unofficial Dedicated Server Launcher {self.version}" ) AstroLogging.logPrint( "If you encounter any bugs please open a new issue at:") AstroLogging.logPrint( "https://github.com/ricky-davis/AstroLauncher/issues") AstroLogging.logPrint( "To safely stop the launcher and server press CTRL+C") self.check_for_update() AstroLogging.logPrint("Starting a new session") if not self.launcherConfig.DisableNetworkCheck: AstroLogging.logPrint("Checking the network configuration..") self.check_network_config() self.headers['X-Authorization'] = AstroAPI.generate_XAUTH( self.DedicatedServer.settings.ServerGuid) self.save_reporting() if not self.launcherConfig.DisableBackupRetention: self.backup_retention() AstroLogging.logPrint("Backup retention started") # setup queue for data exchange if not self.launcherConfig.DisableWebServer: # start http server self.webServer = self.start_WebServer() AstroLogging.logPrint( f"HTTP Server started at 127.0.0.1:{self.launcherConfig.WebServerPort}" ) atexit.register(self.DedicatedServer.kill_server, reason="Launcher shutting down", save=True) self.start_server()