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
 |