43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
| 
 | |
| from __future__ import annotations
 | |
| import abc
 | |
| from typing import TYPE_CHECKING, ClassVar, Dict, Tuple, Any, Optional
 | |
| 
 | |
| if TYPE_CHECKING:
 | |
|     from SNIClient import SNIContext
 | |
| 
 | |
| 
 | |
| class AutoSNIClientRegister(abc.ABCMeta):
 | |
|     game_handlers: ClassVar[Dict[str, SNIClient]] = {}
 | |
| 
 | |
|     def __new__(cls, name: str, bases: Tuple[type, ...], dct: Dict[str, Any]) -> AutoSNIClientRegister:
 | |
|         # construct class
 | |
|         new_class = super().__new__(cls, name, bases, dct)
 | |
|         if "game" in dct:
 | |
|             AutoSNIClientRegister.game_handlers[dct["game"]] = new_class()
 | |
|         return new_class
 | |
| 
 | |
|     @staticmethod
 | |
|     async def get_handler(ctx: SNIContext) -> Optional[SNIClient]:
 | |
|         for _game, handler in AutoSNIClientRegister.game_handlers.items():
 | |
|             if await handler.validate_rom(ctx):
 | |
|                 return handler
 | |
|         return None
 | |
| 
 | |
| 
 | |
| class SNIClient(abc.ABC, metaclass=AutoSNIClientRegister):
 | |
| 
 | |
|     @abc.abstractmethod
 | |
|     async def validate_rom(self, ctx: SNIContext) -> bool:
 | |
|         """ TODO: interface documentation here """
 | |
|         ...
 | |
| 
 | |
|     @abc.abstractmethod
 | |
|     async def game_watcher(self, ctx: SNIContext) -> None:
 | |
|         """ TODO: interface documentation here """
 | |
|         ...
 | |
| 
 | |
|     async def deathlink_kill_player(self, ctx: SNIContext) -> None:
 | |
|         """ override this with implementation to kill player """
 | |
|         pass
 |