refactor (module): improve the implementation of base classes

This commit is contained in:
InfinityPacer
2024-09-26 19:44:35 +08:00
parent ddfcdf9ce2
commit 5efcd6e6be
12 changed files with 186 additions and 194 deletions

View File

@@ -1,7 +1,7 @@
from abc import abstractmethod, ABCMeta
from typing import Tuple, Union, Dict, Any, Optional
from typing import Dict, Any, Optional, Generic, Tuple, Union, TypeVar
from app.schemas import Notification, MessageChannel, NotificationConf, MediaServerConf
from app.schemas import Notification, MessageChannel, NotificationConf, MediaServerConf, DownloaderConf
class _ModuleBase(metaclass=ABCMeta):
@@ -49,35 +49,46 @@ class _ModuleBase(metaclass=ABCMeta):
pass
class _MessageBase:
# 定义一个泛型 T用于表示具体的配置类型
TConf = TypeVar("TConf")
class ConfManagerBase(Generic[TConf]):
"""
消息基类
通用管理基类,支持配置管理和实例管理
"""
_channel: MessageChannel = None
_configs: Dict[str, NotificationConf] = {}
_clients: Dict[str, Any] = {}
_configs: Dict[str, TConf] = {}
_instances: Dict[str, Any] = {}
def get_client(self, name: str) -> Optional[Any]:
def get_instance(self, name: str) -> Optional[Any]:
"""
获取客户端
获取实例 (如服务/客户端)
"""
if not name:
return None
return self._clients.get(name)
return self._instances.get(name)
def get_config(self, name: str, ctype: str = None) -> Optional[NotificationConf]:
def get_config(self, name: str, ctype: str = None) -> Optional[TConf]:
"""
获取配置
获取配置,支持类型过滤
"""
if not name:
return None
conf = self._configs.get(name)
if not ctype:
return conf
return conf if conf.type == ctype else None
return conf if getattr(conf, "type", None) == ctype else None
def checkMessage(self, message: Notification, source: str = None) -> bool:
class _MessageBase(ConfManagerBase[NotificationConf]):
"""
消息基类,继承了通用的配置和实例管理功能,指定配置类型为 NotificationConf
"""
_channel: MessageChannel = None
def check_message(self, message: Notification, source: str = None) -> bool:
"""
检查消息渠道及消息类型,如不符合则不处理
"""
@@ -97,45 +108,25 @@ class _MessageBase:
return True
class _DownloaderBase:
class _DownloaderBase(ConfManagerBase[DownloaderConf]):
"""
下载器基类
"""
_servers: Dict[str, Any] = {}
_default_server: Any = None
_default_server_name: str = None
def get_server(self, name: str = None) -> Optional[Any]:
def get_instance(self, name: str = None) -> Optional[Any]:
"""
获取服务器name为空返回默认服务器
获取实例name为空时,返回默认实例
"""
if name:
return self._servers.get(name)
return self.get_instance(name)
return self._default_server
class _MediaServerBase:
class _MediaServerBase(ConfManagerBase[MediaServerConf]):
"""
媒体服务器基类
"""
_servers: Dict[str, Any] = {}
_configs: Dict[str, MediaServerConf] = {}
def get_server(self, name: str) -> Optional[Any]:
"""
获取Plex服务器
"""
return self._servers.get(name)
def get_config(self, name: str, mtype: str = None) -> Optional[MediaServerConf]:
"""
获取配置
"""
if not name:
return None
conf = self._configs.get(name)
if not mtype:
return conf
return conf if conf.type == mtype else None
pass