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
|