| 
									
										
										
										
											2023-03-20 21:24:47 +01:00
										 |  |  | from enum import Enum, auto | 
					
						
							|  |  |  | from typing import Optional, Callable, List, Iterable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from Utils import local_path, is_windows | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Type(Enum): | 
					
						
							|  |  |  |     TOOL = auto() | 
					
						
							|  |  |  |     FUNC = auto()  # not a real component | 
					
						
							|  |  |  |     CLIENT = auto() | 
					
						
							|  |  |  |     ADJUSTER = auto() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Component: | 
					
						
							|  |  |  |     display_name: str | 
					
						
							|  |  |  |     type: Optional[Type] | 
					
						
							|  |  |  |     script_name: Optional[str] | 
					
						
							|  |  |  |     frozen_name: Optional[str] | 
					
						
							|  |  |  |     icon: str  # just the name, no suffix | 
					
						
							|  |  |  |     cli: bool | 
					
						
							|  |  |  |     func: Optional[Callable] | 
					
						
							|  |  |  |     file_identifier: Optional[Callable[[str], bool]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, display_name: str, script_name: Optional[str] = None, frozen_name: Optional[str] = None, | 
					
						
							|  |  |  |                  cli: bool = False, icon: str = 'icon', component_type: Type = None, func: Optional[Callable] = None, | 
					
						
							|  |  |  |                  file_identifier: Optional[Callable[[str], bool]] = None): | 
					
						
							|  |  |  |         self.display_name = display_name | 
					
						
							|  |  |  |         self.script_name = script_name | 
					
						
							|  |  |  |         self.frozen_name = frozen_name or f'Archipelago{script_name}' if script_name else None | 
					
						
							|  |  |  |         self.icon = icon | 
					
						
							|  |  |  |         self.cli = cli | 
					
						
							|  |  |  |         self.type = component_type or \ | 
					
						
							|  |  |  |             None if not display_name else \ | 
					
						
							|  |  |  |             Type.FUNC if func else \ | 
					
						
							|  |  |  |             Type.CLIENT if 'Client' in display_name else \ | 
					
						
							|  |  |  |             Type.ADJUSTER if 'Adjuster' in display_name else Type.TOOL | 
					
						
							|  |  |  |         self.func = func | 
					
						
							|  |  |  |         self.file_identifier = file_identifier | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handles_file(self, path: str): | 
					
						
							|  |  |  |         return self.file_identifier(path) if self.file_identifier else False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return f"{self.__class__.__name__}({self.display_name})" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SuffixIdentifier: | 
					
						
							|  |  |  |     suffixes: Iterable[str] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, *args: str): | 
					
						
							|  |  |  |         self.suffixes = args | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __call__(self, path: str): | 
					
						
							|  |  |  |         if isinstance(path, str): | 
					
						
							|  |  |  |             for suffix in self.suffixes: | 
					
						
							|  |  |  |                 if path.endswith(suffix): | 
					
						
							|  |  |  |                     return True | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | components: List[Component] = [ | 
					
						
							|  |  |  |     # Launcher | 
					
						
							|  |  |  |     Component('', 'Launcher'), | 
					
						
							|  |  |  |     # Core | 
					
						
							|  |  |  |     Component('Host', 'MultiServer', 'ArchipelagoServer', cli=True, | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.archipelago', '.zip')), | 
					
						
							|  |  |  |     Component('Generate', 'Generate', cli=True), | 
					
						
							|  |  |  |     Component('Text Client', 'CommonClient', 'ArchipelagoTextClient'), | 
					
						
							|  |  |  |     # SNI | 
					
						
							|  |  |  |     Component('SNI Client', 'SNIClient', | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3', | 
					
						
							|  |  |  |                                                '.apsmw', '.apl2ac')), | 
					
						
							|  |  |  |     Component('Links Awakening DX Client', 'LinksAwakeningClient', | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.apladx')), | 
					
						
							|  |  |  |     Component('LttP Adjuster', 'LttPAdjuster'), | 
					
						
							|  |  |  |     # Minecraft | 
					
						
							|  |  |  |     Component('Minecraft Client', 'MinecraftClient', icon='mcicon', cli=True, | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.apmc')), | 
					
						
							|  |  |  |     # Ocarina of Time | 
					
						
							|  |  |  |     Component('OoT Client', 'OoTClient', | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.apz5')), | 
					
						
							|  |  |  |     Component('OoT Adjuster', 'OoTAdjuster'), | 
					
						
							|  |  |  |     # FF1 | 
					
						
							|  |  |  |     Component('FF1 Client', 'FF1Client'), | 
					
						
							|  |  |  |     # Pokémon | 
					
						
							|  |  |  |     Component('Pokemon Client', 'PokemonClient', file_identifier=SuffixIdentifier('.apred', '.apblue')), | 
					
						
							|  |  |  |     # TLoZ | 
					
						
							|  |  |  |     Component('Zelda 1 Client', 'Zelda1Client'), | 
					
						
							|  |  |  |     # ChecksFinder | 
					
						
							|  |  |  |     Component('ChecksFinder Client', 'ChecksFinderClient'), | 
					
						
							|  |  |  |     # Starcraft 2 | 
					
						
							|  |  |  |     Component('Starcraft 2 Client', 'Starcraft2Client'), | 
					
						
							|  |  |  |     # Wargroove | 
					
						
							|  |  |  |     Component('Wargroove Client', 'WargrooveClient'), | 
					
						
							|  |  |  |     # Zillion | 
					
						
							|  |  |  |     Component('Zillion Client', 'ZillionClient', | 
					
						
							|  |  |  |               file_identifier=SuffixIdentifier('.apzl')), | 
					
						
							| 
									
										
										
										
											2023-04-26 07:43:23 -04:00
										 |  |  |     # Kingdom Hearts 2 | 
					
						
							| 
									
										
										
										
											2023-03-20 21:24:47 +01:00
										 |  |  |     Component('KH2 Client', "KH2Client"), | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | icon_paths = { | 
					
						
							| 
									
										
										
										
											2023-04-30 18:10:58 +02:00
										 |  |  |     'icon': local_path('data', 'icon.png'), | 
					
						
							|  |  |  |     'mcicon': local_path('data', 'mcicon.png'), | 
					
						
							| 
									
										
										
										
											2023-04-17 02:35:54 +02:00
										 |  |  |     'discord': local_path('data', 'discord-mark-blue.png'), | 
					
						
							| 
									
										
										
										
											2023-03-20 21:24:47 +01:00
										 |  |  | } |