def do_command_line(self, command_line): # noqa: C901 # pylint: disable=arguments-differ # pylint: disable=too-many-locals,too-many-return-statements,too-many-branches # pylint: disable=too-many-statements # TODO: split into multiple methods to reduce complexity (35) options = command_line.get_options_dict() # Use stdout to output logs, only if no command line argument is # provided argc = len(sys.argv) - 1 if "-d" in sys.argv or "--debug" in sys.argv: argc -= 1 if not argc: # Switch back the log output to stderr (the default in Python) # to avoid messing with any output from command line options. # Use when targetting Python 3.7 minimum # console_handler.setStream(sys.stderr) # Until then... logger.removeHandler(log.console_handler) log.console_handler = logging.StreamHandler(stream=sys.stdout) log.console_handler.setFormatter(log.SIMPLE_FORMATTER) logger.addHandler(log.console_handler) # Set up logger if options.contains("debug"): log.console_handler.setFormatter(log.DEBUG_FORMATTER) logger.setLevel(logging.DEBUG) # Text only commands # Print Lutris version and exit if options.contains("version"): executable_name = os.path.basename(sys.argv[0]) print(executable_name + "-" + settings.VERSION) logger.setLevel(logging.NOTSET) return 0 logger.info("Running Lutris %s", settings.VERSION) migrate() run_all_checks() AsyncCall(init_dxvk_versions, None) # List game if options.contains("list-games"): game_list = pga.get_games() if options.contains("installed"): game_list = [game for game in game_list if game["installed"]] if options.contains("json"): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games if options.contains("list-steam-games"): self.print_steam_list(command_line) return 0 # List Steam folders if options.contains("list-steam-folders"): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context if options.contains("exec"): command = options.lookup_value("exec").get_string() self.execute_command(command) return 0 if options.contains("submit-issue"): IssueReportWindow(application=self) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, "%s is not a valid URI" % url.get_strv()) return 1 game_slug = installer_info["game_slug"] action = installer_info["action"] revision = installer_info["revision"] installer_file = None if options.contains("install"): installer_file = options.lookup_value("install").get_string() if installer_file.startswith(("http:", "https:")): try: request = Request(installer_file).get() except HTTPError: self._print(command_line, "Failed to download %s" % installer_file) return 1 try: headers = dict(request.response_headers) file_name = headers["Content-Disposition"].split("=", 1)[-1] except (KeyError, IndexError): file_name = os.path.basename(installer_file) file_path = os.path.join(tempfile.gettempdir(), file_name) self._print( command_line, "download %s to %s started" % (installer_file, file_path)) with open(file_path, 'wb') as dest_file: dest_file.write(request.content) installer_file = file_path action = "install" else: installer_file = os.path.abspath(installer_file) action = "install" if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: if action == "rungameid": # Force db_game to use game id self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "id") elif action == "rungame": # Force db_game to use game slug self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "slug") elif action == "install": # Installers can use game or installer slugs self.run_in_background = True db_game = pga.get_game_by_field( game_slug, "slug") or pga.get_game_by_field( game_slug, "installer_slug") else: # Dazed and confused, try anything that might works db_game = (pga.get_game_by_field(game_slug, "id") or pga.get_game_by_field(game_slug, "slug") or pga.get_game_by_field(game_slug, "installer_slug")) # Graphical commands self.activate() self.set_tray_icon() if not action: if db_game and db_game["installed"]: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game["name"]) if not dlg.action_confirmed: action = None elif dlg.action == "play": action = "rungame" elif dlg.action == "install": action = "install" elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = "install" if action == "install": self.show_window( InstallerWindow, parent=self.window, game_slug=game_slug, installer_file=installer_file, revision=revision, ) elif action in ("rungame", "rungameid"): if not db_game or not db_game["id"]: logger.warning("No game found in library") if not self.window.is_visible(): self.do_shutdown() return 0 self.launch(Game(db_game["id"])) return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() # Use stdout to output logs, only if no command line argument is # provided argc = len(sys.argv) - 1 if "-d" in sys.argv or "--debug" in sys.argv: argc -= 1 if not argc: # Switch back the log output to stderr (the default in Python) # to avoid messing with any output from command line options. # Use when targetting Python 3.7 minimum # console_handler.setStream(sys.stderr) # Until then... logger.removeHandler(log.console_handler) log.console_handler = logging.StreamHandler(stream=sys.stdout) log.console_handler.setFormatter(log.SIMPLE_FORMATTER) logger.addHandler(log.console_handler) # Set up logger if options.contains("debug"): log.console_handler.setFormatter(log.DEBUG_FORMATTER) logger.setLevel(logging.DEBUG) # Text only commands # Print Lutris version and exit if options.contains("version"): executable_name = os.path.basename(sys.argv[0]) print(executable_name + "-" + settings.VERSION) logger.setLevel(logging.NOTSET) return 0 logger.info("Running Lutris %s", settings.VERSION) migrate() run_all_checks() AsyncCall(init_dxvk_versions) # List game if options.contains("list-games"): game_list = pga.get_games() if options.contains("installed"): game_list = [game for game in game_list if game["installed"]] if options.contains("json"): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games elif options.contains("list-steam-games"): self.print_steam_list(command_line) return 0 # List Steam folders elif options.contains("list-steam-folders"): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context elif options.contains("exec"): command = options.lookup_value("exec").get_string() self.execute_command(command) return 0 elif options.contains("submit-issue"): IssueReportWindow(application=self) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, "%s is not a valid URI" % url.get_strv()) return 1 game_slug = installer_info["game_slug"] action = installer_info["action"] revision = installer_info["revision"] installer_file = None if options.contains("install"): installer_file = options.lookup_value("install").get_string() installer_file = os.path.abspath(installer_file) action = "install" if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: if action == "rungameid": # Force db_game to use game id self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "id") elif action == "rungame": # Force db_game to use game slug self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "slug") elif action == "install": # Installers can use game or installer slugs self.run_in_background = True db_game = pga.get_game_by_field( game_slug, "slug") or pga.get_game_by_field( game_slug, "installer_slug") else: # Dazed and confused, try anything that might works db_game = (pga.get_game_by_field(game_slug, "id") or pga.get_game_by_field(game_slug, "slug") or pga.get_game_by_field(game_slug, "installer_slug")) # Graphical commands self.activate() if not action: if db_game and db_game["installed"]: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game["name"]) if not dlg.action_confirmed: action = None elif dlg.action == "play": action = "rungame" elif dlg.action == "install": action = "install" elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = "install" if action == "install": InstallerWindow( game_slug=game_slug, installer_file=installer_file, revision=revision, parent=self.window, application=self, ) elif action in ("rungame", "rungameid"): if not db_game or not db_game["id"]: logger.warning("No game found in library") if not self.window.is_visible(): self.do_shutdown() return 0 self.launch(Game(db_game["id"])) return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() # Set up logger if options.contains('debug'): logger.setLevel(logging.DEBUG) # Text only commands # Print Lutris version and exit if options.contains('version'): executable_name = os.path.basename(sys.argv[0]) print(executable_name + "-" + VERSION) logger.setLevel(logging.NOTSET) return 0 # List game if options.contains('list-games'): game_list = pga.get_games() if options.contains('installed'): game_list = [game for game in game_list if game['installed']] if options.contains('json'): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games elif options.contains('list-steam-games'): self.print_steam_list(command_line) return 0 # List Steam folders elif options.contains('list-steam-folders'): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context elif options.contains('exec'): command = options.lookup_value('exec').get_string() self.execute_command(command) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, '%s is not a valid URI' % url.get_strv()) return 1 game_slug = installer_info['game_slug'] action = installer_info['action'] revision = installer_info['revision'] installer_file = None if options.contains('install'): installer_file = options.lookup_value('install').get_string() installer_file = os.path.abspath(installer_file) action = 'install' if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 # Graphical commands self.activate() db_game = None if game_slug: if action == 'rungameid': # Force db_game to use game id db_game = pga.get_game_by_field(game_slug, 'id') elif action == 'rungame': # Force db_game to use game slug db_game = pga.get_game_by_field(game_slug, 'slug') elif action == 'install': # Installers can use game or installer slugs db_game = (pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) else: # Dazed and confused, try anything that might works db_game = (pga.get_game_by_field(game_slug, 'id') or pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) if not action: if db_game and db_game['installed']: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game['name']) if not dlg.action_confirmed: action = None if dlg.action == 'play': action = 'rungame' elif dlg.action == 'install': action = 'install' elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = 'install' if action == 'install': self.window.present() self.window.on_install_clicked(game_slug=game_slug, installer_file=installer_file, revision=revision) elif action in ('rungame', 'rungameid'): if not db_game or not db_game['id']: if self.window.is_visible(): logger.info("No game found in library") else: logger.info("No game found in library, shutting down") self.do_shutdown() return 0 logger.info("Launching %s", db_game['name']) # If game is not installed, show the GUI before running. Otherwise leave the GUI closed. if not db_game['installed']: self.window.present() self.window.on_game_run(game_id=db_game['id']) else: self.window.present() return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() if options.contains('debug'): logger.setLevel(logging.DEBUG) if options.contains('list-games'): game_list = pga.get_games() if options.contains('installed'): game_list = [game for game in game_list if game['installed']] if options.contains('json'): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 elif options.contains('list-steam-games'): self.print_steam_list(command_line) return 0 elif options.contains('list-steam-folders'): self.print_steam_folders(command_line) return 0 elif options.contains('exec'): command = options.lookup_value('exec').get_string() self.execute_command(command) return 0 game_slug = '' revision = None uri = options.lookup_value(GLib.OPTION_REMAINING) if uri: uri = uri.get_strv() if uri and len(uri): uri = uri[0] # TODO: Support multiple installer_info = parse_installer_url(uri) if installer_info is False: self._print(command_line, '%s is not a valid URI' % uri) return 1 game_slug = installer_info['game_slug'] revision = installer_info['revision'] if game_slug or options.contains('install'): installer_file = None if options.contains('install'): installer_file = options.lookup_value('install').get_string() if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: db_game = (pga.get_game_by_field(game_slug, 'id') or pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) force_install = options.contains('reinstall') or bool(installer_info.get('revision')) if db_game and db_game['installed'] and not force_install: self._print(command_line, "Launching %s" % db_game['name']) if self.window: self.run_game(db_game['id']) else: lutris_game = Game(db_game['id']) # FIXME: This is awful lutris_game.exit_main_loop = True lutris_game.play() try: GLib.MainLoop().run() except KeyboardInterrupt: lutris_game.stop() else: self._print(command_line, "Installing %s" % game_slug or installer_file) if self.window: self.window.on_install_clicked(game_slug=game_slug, installer_file=installer_file, revision=revision) else: runtime_updater = RuntimeUpdater() runtime_updater.update() # FIXME: This should be a Gtk.Dialog child of LutrisWindow dialog = InstallerDialog(game_slug=game_slug, installer_file=installer_file, revision=revision) self.add_window(dialog) return 0 self.activate() return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() if options.contains('debug'): logger.setLevel(logging.DEBUG) if options.contains('list-games'): game_list = pga.get_games() if options.contains('installed'): game_list = [game for game in game_list if game['installed']] if options.contains('json'): games = [] for game in game_list: games.append({ 'id': game['id'], 'slug': game['slug'], 'name': game['name'], 'runner': game['runner'], 'directory': game['directory'] }) self._print(command_line, json.dumps(games, indent=2)) else: for game in game_list: self._print( command_line, "{:4} | {:<40} | {:<40} | {:<15} | {:<64}".format( game['id'], game['name'][:40], game['slug'][:40], game['runner'] or '-', game['directory'] or '-' ) ) return 0 if options.contains('list-steam-games'): steamapps_paths = get_steamapps_paths() for platform in ('linux', 'windows'): for path in steamapps_paths[platform]: appmanifest_files = get_appmanifests(path) for appmanifest_file in appmanifest_files: appmanifest = AppManifest(os.path.join(path, appmanifest_file)) self._print( command_line, " {:8} | {:<60} | {:10} | {}".format( appmanifest.steamid, appmanifest.name or '-', platform, ", ".join(appmanifest.states) ) ) return 0 if options.contains('list-steam-folders'): steamapps_paths = get_steamapps_paths() for platform in ('linux', 'windows'): for path in steamapps_paths[platform]: self._print(command_line, path) return 0 check_config(force_wipe=False) migrate() game = None game_slug = '' uri = options.lookup_value(GLib.OPTION_REMAINING) if uri: uri = uri.get_strv() if uri and len(uri): uri = uri[0] # TODO: Support multiple if not uri.startswith('lutris:'): self._print(command_line, '%s is not a valid URI' % uri) return 1 game_slug = uri[7:] if game_slug or options.contains('install'): if options.contains('install'): installer_file = options.lookup_value('install').get_string() installer = installer_file else: installer_file = None installer = game_slug if not game_slug and not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: db_game = (pga.get_game_by_field(game_slug, 'id') or pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) if db_game and db_game['installed'] and not options.contains('reinstall'): self._print(command_line, "Launching %s" % db_game['name']) if self.window: self.run_game(db_game['id']) else: lutris_game = Game(db_game['id']) # FIXME: This is awful lutris_game.exit_main_loop = True lutris_game.play() try: GLib.MainLoop().run() except KeyboardInterrupt: lutris_game.stop() return 0 else: self._print(command_line, "Installing %s" % installer) if self.window: self.install_game(installer) else: runtime_updater = RuntimeUpdater() runtime_updater.update() # FIXME: This should be a Gtk.Dialog child of LutrisWindow dialog = InstallerDialog(installer) self.add_window(dialog) return 0 self.activate() return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() # Set up logger if options.contains("debug"): console_handler.setFormatter(DEBUG_FORMATTER) logger.setLevel(logging.DEBUG) # Text only commands # Print Lutris version and exit if options.contains("version"): executable_name = os.path.basename(sys.argv[0]) print(executable_name + "-" + VERSION) logger.setLevel(logging.NOTSET) return 0 # List game if options.contains("list-games"): game_list = pga.get_games() if options.contains("installed"): game_list = [game for game in game_list if game["installed"]] if options.contains("json"): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games elif options.contains("list-steam-games"): self.print_steam_list(command_line) return 0 # List Steam folders elif options.contains("list-steam-folders"): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context elif options.contains("exec"): command = options.lookup_value("exec").get_string() self.execute_command(command) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, "%s is not a valid URI" % url.get_strv()) return 1 game_slug = installer_info["game_slug"] action = installer_info["action"] revision = installer_info["revision"] installer_file = None if options.contains("install"): installer_file = options.lookup_value("install").get_string() installer_file = os.path.abspath(installer_file) action = "install" if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 # Graphical commands self.activate() db_game = None if game_slug: if action == "rungameid": # Force db_game to use game id db_game = pga.get_game_by_field(game_slug, "id") elif action == "rungame": # Force db_game to use game slug db_game = pga.get_game_by_field(game_slug, "slug") elif action == "install": # Installers can use game or installer slugs db_game = pga.get_game_by_field( game_slug, "slug") or pga.get_game_by_field( game_slug, "installer_slug") else: # Dazed and confused, try anything that might works db_game = (pga.get_game_by_field(game_slug, "id") or pga.get_game_by_field(game_slug, "slug") or pga.get_game_by_field(game_slug, "installer_slug")) if not action: if db_game and db_game["installed"]: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game["name"]) if not dlg.action_confirmed: action = None elif dlg.action == "play": action = "rungame" elif dlg.action == "install": action = "install" elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = "install" if action == "install": InstallerWindow( game_slug=game_slug, installer_file=installer_file, revision=revision, parent=self.window, application=self, ) elif action in ("rungame", "rungameid"): if not db_game or not db_game["id"]: logger.warning("No game found in library") return 0 logger.info("Launching %s", db_game["name"]) # If game is not installed, show the GUI before running. Otherwise leave the GUI closed. if not db_game["installed"]: self.window.present() self.launch(db_game["id"]) else: self.window.present() return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() if options.contains('debug'): logger.setLevel(logging.DEBUG) if options.contains('list-games'): game_list = pga.get_games() if options.contains('installed'): game_list = [game for game in game_list if game['installed']] if options.contains('json'): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 elif options.contains('list-steam-games'): self.print_steam_list(command_line) return 0 elif options.contains('list-steam-folders'): self.print_steam_folders(command_line) return 0 elif options.contains('exec'): command = options.lookup_value('exec').get_string() self.execute_command(command) return 0 check_config(force_wipe=False) migrate() game_slug = '' uri = options.lookup_value(GLib.OPTION_REMAINING) if uri: uri = uri.get_strv() if uri and len(uri): uri = uri[0] # TODO: Support multiple if not uri.startswith('lutris:'): self._print(command_line, '%s is not a valid URI' % uri) return 1 game_slug = uri[7:] if game_slug or options.contains('install'): if options.contains('install'): installer_file = options.lookup_value('install').get_string() installer = installer_file else: installer_file = None installer = game_slug if not game_slug and not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: db_game = (pga.get_game_by_field(game_slug, 'id') or pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) if db_game and db_game['installed'] and not options.contains( 'reinstall'): self._print(command_line, "Launching %s" % db_game['name']) if self.window: self.run_game(db_game['id']) else: lutris_game = Game(db_game['id']) # FIXME: This is awful lutris_game.exit_main_loop = True lutris_game.play() try: GLib.MainLoop().run() except KeyboardInterrupt: lutris_game.stop() return 0 else: self._print(command_line, "Installing %s" % installer) if self.window: self.install_game(installer) else: runtime_updater = RuntimeUpdater() runtime_updater.update() # FIXME: This should be a Gtk.Dialog child of LutrisWindow dialog = InstallerDialog(installer) self.add_window(dialog) return 0 self.activate() return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() # Use stdout to output logs, only if no command line argument is # provided argc = len(sys.argv) - 1 if "-d" in sys.argv or "--debug" in sys.argv: argc -= 1 if not argc: # Switch back the log output to stderr (the default in Python) # to avoid messing with any output from command line options. # Use when targetting Python 3.7 minimum # console_handler.setStream(sys.stderr) # Until then... logger.removeHandler(log.console_handler) log.console_handler = logging.StreamHandler(stream=sys.stdout) log.console_handler.setFormatter(log.SIMPLE_FORMATTER) logger.addHandler(log.console_handler) # Set up logger if options.contains("debug"): log.console_handler.setFormatter(log.DEBUG_FORMATTER) logger.setLevel(logging.DEBUG) # Text only commands # Print Lutris version and exit if options.contains("version"): executable_name = os.path.basename(sys.argv[0]) print(executable_name + "-" + settings.VERSION) logger.setLevel(logging.NOTSET) return 0 logger.info("Running Lutris %s", settings.VERSION) migrate() run_all_checks() AsyncCall(init_dxvk_versions) # List game if options.contains("list-games"): game_list = pga.get_games() if options.contains("installed"): game_list = [game for game in game_list if game["installed"]] if options.contains("json"): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games elif options.contains("list-steam-games"): self.print_steam_list(command_line) return 0 # List Steam folders elif options.contains("list-steam-folders"): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context elif options.contains("exec"): command = options.lookup_value("exec").get_string() self.execute_command(command) return 0 elif options.contains("submit-issue"): IssueReportWindow(application=self) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, "%s is not a valid URI" % url.get_strv()) return 1 game_slug = installer_info["game_slug"] action = installer_info["action"] revision = installer_info["revision"] installer_file = None if options.contains("install"): installer_file = options.lookup_value("install").get_string() installer_file = os.path.abspath(installer_file) action = "install" if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 db_game = None if game_slug: if action == "rungameid": # Force db_game to use game id self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "id") elif action == "rungame": # Force db_game to use game slug self.run_in_background = True db_game = pga.get_game_by_field(game_slug, "slug") elif action == "install": # Installers can use game or installer slugs self.run_in_background = True db_game = pga.get_game_by_field( game_slug, "slug" ) or pga.get_game_by_field(game_slug, "installer_slug") else: # Dazed and confused, try anything that might works db_game = ( pga.get_game_by_field(game_slug, "id") or pga.get_game_by_field(game_slug, "slug") or pga.get_game_by_field(game_slug, "installer_slug") ) # Graphical commands self.activate() if not action: if db_game and db_game["installed"]: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game["name"]) if not dlg.action_confirmed: action = None elif dlg.action == "play": action = "rungame" elif dlg.action == "install": action = "install" elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = "install" if action == "install": InstallerWindow( game_slug=game_slug, installer_file=installer_file, revision=revision, parent=self.window, application=self, ) elif action in ("rungame", "rungameid"): if not db_game or not db_game["id"]: logger.warning("No game found in library") if not self.window.is_visible(): self.do_shutdown() return 0 self.launch(Game(db_game["id"])) return 0
def do_command_line(self, command_line): options = command_line.get_options_dict() # Set up logger if options.contains('debug'): logger.setLevel(logging.DEBUG) # Text only commands # List game if options.contains('list-games'): game_list = pga.get_games() if options.contains('installed'): game_list = [game for game in game_list if game['installed']] if options.contains('json'): self.print_game_json(command_line, game_list) else: self.print_game_list(command_line, game_list) return 0 # List Steam games elif options.contains('list-steam-games'): self.print_steam_list(command_line) return 0 # List Steam folders elif options.contains('list-steam-folders'): self.print_steam_folders(command_line) return 0 # Execute command in Lutris context elif options.contains('exec'): command = options.lookup_value('exec').get_string() self.execute_command(command) return 0 try: url = options.lookup_value(GLib.OPTION_REMAINING) installer_info = self.get_lutris_action(url) except ValueError: self._print(command_line, '%s is not a valid URI' % url.get_strv()) return 1 game_slug = installer_info['game_slug'] action = installer_info['action'] revision = installer_info['revision'] installer_file = None if options.contains('install'): installer_file = options.lookup_value('install').get_string() installer_file = os.path.abspath(installer_file) action = 'install' if not os.path.isfile(installer_file): self._print(command_line, "No such file: %s" % installer_file) return 1 # Graphical commands self.activate() db_game = None if game_slug: if action == 'rungameid': # Force db_game to use game id db_game = pga.get_game_by_field(game_slug, 'id') elif action == 'rungame': # Force db_game to use game slug db_game = pga.get_game_by_field(game_slug, 'slug') elif action == 'install': # Installers can use game or installer slugs db_game = (pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) else: # Dazed and confused, try anything that might works db_game = (pga.get_game_by_field(game_slug, 'id') or pga.get_game_by_field(game_slug, 'slug') or pga.get_game_by_field(game_slug, 'installer_slug')) if not action: if db_game and db_game['installed']: # Game found but no action provided, ask what to do dlg = InstallOrPlayDialog(db_game['name']) if not dlg.action_confirmed: action = None if dlg.action == 'play': action = 'rungame' elif dlg.action == 'install': action = 'install' elif game_slug or installer_file: # No game found, default to install if a game_slug or # installer_file is provided action = 'install' if action == 'install': self.window.on_install_clicked(game_slug=game_slug, installer_file=installer_file, revision=revision) elif action in ('rungame', 'rungameid'): if not db_game or not db_game['id']: logger.info("No game found in library, shutting down") self.do_shutdown() return 0 logger.info("Launching %s" % db_game['name']) # If game is installed, run it without showing the GUI # Also set a timer to shut down lutris when game ends if db_game['installed']: self.window.hide() self.window.on_game_run(game_id=db_game['id']) GLib.timeout_add(300, self.refresh_status) # If game is not installed, show the GUI else: self.window.on_game_run(game_id=db_game['id']) return 0