def parse_component_arg(parser, storage: Storage, component: str): """Wrapper around parse_storage_component() to parse CLI arguments into patch elements""" try: component = parse_storage_component(storage, component) except ValueError: parser.error(f"invalid component: {component}") if component is None: parser.error(f"component not found: {component}") if isinstance(component, Patch): return list(component.elements) else: return [component]
def command_hashes_guess(parser, args): all_methods = [ ("grep", "search for hashes in WAD files"), ("numbers", "substitute numbers in basenames"), ("basenames", "substitute basenames"), ("words", "substitute known words in basenames"), ("ext", "substitute extensions"), ("regionlang", "substitute region and lang (LCU only)"), ("plugin", "substitute plugin name (LCU only)"), ("skin-num", "substitute skinNN numbers (game only)"), ("character", "substitute character name (game only)"), ("prefixes", "check basename prefixes (game only)"), ] all_method_names = [name for name, _ in all_methods] if args.list_methods: name_width = max(len(name) for name in all_method_names) for name, desc in all_methods: print(f" {name:{name_width}} {desc}") return elif not args.wad: parser.error( "neither \"wad\" nor \"--list-methods\" argument was found") if not args.methods: method_names = [ name for name in all_method_names if name not in ("basenames", "words") ] else: method_names = [s.strip() for s in args.methods.split(',')] for name in method_names: if name not in all_method_names: parser.error(f"unknown guessing method: {name}") # collect WAD paths wads = [] for path_or_component in args.wad: try: component = parse_storage_component(args.storage, path_or_component) except ValueError: wads.append(Wad(path_or_component)) continue if component is None: continue if isinstance(component, Patch): elements = component.elements else: elements = [component.elements] for elem in elements: wads.extend( Wad(p) for p in elem.fspaths() if p.endswith('.wad') or p.endswith('.wad.client')) # guess LCU hashes guesser = LcuHashGuesser.from_wads(wads) if guesser.unknown: nunknown = len(guesser.unknown) if "grep" in method_names: for wad in guesser.wads: wad.guess_extensions() guesser.grep_wad(wad) if "numbers" in method_names: guesser.substitute_numbers() if "basenames" in method_names: guesser.substitute_basenames() if "words" in method_names: guesser.substitute_basename_words() if "ext" in method_names: guesser.substitute_extensions() if "regionlang" in method_names: guesser.substitute_region_lang() if "plugin" in method_names: guesser.substitute_plugin() nfound = nunknown - len(guesser.unknown) if nfound: print(f"found LCU hashes: {nfound}") if not args.dry_run: guesser.save() # guess game hashes guesser = GameHashGuesser.from_wads(wads) if guesser.unknown: nunknown = len(guesser.unknown) if "grep" in method_names: for wad in guesser.wads: wad.guess_extensions() guesser.grep_wad(wad) if "numbers" in method_names: guesser.substitute_numbers() if "basenames" in method_names: guesser.substitute_basenames() if "words" in method_names: guesser.substitute_basename_words() if "ext" in method_names: guesser.substitute_extensions() if "skin-num" in method_names: guesser.substitute_skin_numbers() if "character" in method_names: guesser.substitute_character() if "prefixes" in method_names: guesser.check_basename_prefixes() nfound = nunknown - len(guesser.unknown) if nfound: print(f"found game hashes: {nfound}") if not args.dry_run: guesser.save()