[cli] Add alias management commands

This commit is contained in:
derrod 2021-10-02 22:54:56 +02:00
parent 3f04de448b
commit 0b97cdeeef

View file

@ -1388,6 +1388,74 @@ class LegendaryCLI:
total_size = sum(c.file_size for c in manifest.chunk_data_list.elements) total_size = sum(c.file_size for c in manifest.chunk_data_list.elements)
print(' + Total: {:.02f} GiB (compressed)'.format(total_size / 1024 / 1024 / 1024)) print(' + Total: {:.02f} GiB (compressed)'.format(total_size / 1024 / 1024 / 1024))
def alias(self, args):
if args.action not in ('add', 'rename', 'remove', 'list'):
logger.error(f'Invalid action "{args.action}"!')
return
if args.action == 'add':
alias = args.alias
app_name = args.app_or_alias
game = self.core.get_game(app_name)
if not game:
logger.error(f'Invalid app name: "{app_name}"')
return
self.core.lgd.config.set('Legendary.aliases', alias, app_name)
logger.info(f'Added alias "{alias}" to "{app_name}" (Title: "{game.app_title}")')
elif args.action == 'rename':
old_alias = args.app_or_alias
new_alias = args.alias
app_name = self.core.lgd.config.get('Legendary.aliases', old_alias, fallback=None)
if not app_name:
logger.error(f'Invalid old alias: "{app_name}"')
return
self.core.lgd.config.set('Legendary.aliases', new_alias, app_name)
self.core.lgd.config.remove_option('Legendary.aliases', old_alias)
logger.info(f'Renamed alias "{old_alias}" to "{new_alias}"')
elif args.action == 'remove':
alias = args.app_or_alias
if not self.core.lgd.config.has_option('Legendary.aliases', alias):
logger.error(f'Alias does not exist: "{args.alias}"')
return
self.core.lgd.config.remove_option('Legendary.aliases', alias)
logger.info(f'Removed alias "{alias}"')
elif args.action == 'list':
if args.app_or_alias:
self.core.update_aliases(force=True)
app_name = self._resolve_aliases(args.app_or_alias)
game = self.core.get_game(app_name)
if not game:
logger.error(f'Invalid app name: "{app_name}"')
return
print(f'\nAliases for "{game.app_title}" ({app_name}):')
# Use-defined
if self.core.lgd.config.has_section('Legendary.aliases'):
aliases = [alias for (alias, app_name) in self.core.lgd.config['Legendary.aliases'].items()
if app_name == game.app_name]
if aliases:
print('- User-defined aliases:')
for alias in sorted(aliases):
print(f' + {alias}')
else:
print('- User-defined aliases: (None)')
# Automatically generated
aliases = [alias for (alias, app_name) in self.core.lgd.aliases.items()
if app_name == game.app_name]
if aliases:
print('- Automatic aliases:')
for alias in sorted(aliases):
print(f' + {alias}')
else:
print('- Automatic aliases: (None)')
else:
if not self.core.lgd.config.has_section('Legendary.aliases'):
logger.error('No aliases in config!')
return
print('User-defined aliases:')
for alias, app_name in self.core.lgd.config['Legendary.aliases'].items():
print(f' - {alias} => {app_name}')
def cleanup(self, args): def cleanup(self, args):
before = self.core.lgd.get_dir_size() before = self.core.lgd.get_dir_size()
# delete metadata # delete metadata
@ -1439,8 +1507,9 @@ def main():
import_parser = subparsers.add_parser('import-game', help='Import an already installed game') import_parser = subparsers.add_parser('import-game', help='Import an already installed game')
egl_sync_parser = subparsers.add_parser('egl-sync', help='Setup or run Epic Games Launcher sync') egl_sync_parser = subparsers.add_parser('egl-sync', help='Setup or run Epic Games Launcher sync')
status_parser = subparsers.add_parser('status', help='Show legendary status information') status_parser = subparsers.add_parser('status', help='Show legendary status information')
clean_parser = subparsers.add_parser('cleanup', help='Remove old temporary, metadata, and manifest files')
info_parser = subparsers.add_parser('info', help='Prints info about specified app name or manifest') info_parser = subparsers.add_parser('info', help='Prints info about specified app name or manifest')
alias_parser = subparsers.add_parser('alias', help='Manage aliases')
clean_parser = subparsers.add_parser('cleanup', help='Remove old temporary, metadata, and manifest files')
install_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>') install_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>')
uninstall_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>') uninstall_parser.add_argument('app_name', help='Name of the app', metavar='<App Name>')
@ -1460,6 +1529,14 @@ def main():
info_parser.add_argument('app_name_or_manifest', help='App name or manifest path/URI', info_parser.add_argument('app_name_or_manifest', help='App name or manifest path/URI',
metavar='<App Name/Manifest URI>') metavar='<App Name/Manifest URI>')
alias_parser.add_argument('action', help='Action: Add, rename, remove, or list alias(es)',
metavar='<add|rename|remove|list>')
alias_parser.add_argument('app_or_alias', help='App name when using "add" or "list" action, '
'existing alias when using "rename" or "remove" action',
metavar='App name/Old alias', nargs='?')
alias_parser.add_argument('alias', help='New alias when using "add" action',
metavar='New alias', nargs='?')
auth_parser.add_argument('--import', dest='import_egs_auth', action='store_true', auth_parser.add_argument('--import', dest='import_egs_auth', action='store_true',
help='Import Epic Games Launcher authentication data (logs out of EGL)') help='Import Epic Games Launcher authentication data (logs out of EGL)')
auth_parser.add_argument('--code', dest='auth_code', action='store', metavar='<exchange code>', auth_parser.add_argument('--code', dest='auth_code', action='store', metavar='<exchange code>',
@ -1668,7 +1745,7 @@ def main():
'launch', 'download', 'uninstall', 'install', 'update', 'launch', 'download', 'uninstall', 'install', 'update',
'repair', 'list-saves', 'download-saves', 'sync-saves', 'repair', 'list-saves', 'download-saves', 'sync-saves',
'verify-game', 'import-game', 'egl-sync', 'status', 'verify-game', 'import-game', 'egl-sync', 'status',
'info', 'cleanup'): 'info', 'alias', 'cleanup'):
print(parser.format_help()) print(parser.format_help())
# Print the main help *and* the help for all of the subcommands. Thanks stackoverflow! # Print the main help *and* the help for all of the subcommands. Thanks stackoverflow!
@ -1729,6 +1806,8 @@ def main():
cli.status(args) cli.status(args)
elif args.subparser_name == 'info': elif args.subparser_name == 'info':
cli.info(args) cli.info(args)
elif args.subparser_name == 'alias':
cli.alias(args)
elif args.subparser_name == 'cleanup': elif args.subparser_name == 'cleanup':
cli.cleanup(args) cli.cleanup(args)
except KeyboardInterrupt: except KeyboardInterrupt: