♻ 重写模块管理器

This commit is contained in:
洛水居室 2022-08-11 21:18:12 +08:00
parent 7adf404600
commit 4d1a5b17b9
No known key found for this signature in database
GPG Key ID: C9DE87DA724B88FC
10 changed files with 105 additions and 125 deletions

View File

@ -5,4 +5,4 @@ from sqlmodel import SQLModel, Field
class Admin(SQLModel, table=True): class Admin(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True) id: Optional[int] = Field(default=None, primary_key=True)
user_id: int = Field() user_id: int = Field()

View File

@ -38,7 +38,7 @@ def main() -> None:
# 传入服务并启动 # 传入服务并启动
Log.info("正在启动服务") Log.info("正在启动服务")
services = ServicesManager(mysql, redis, browser) services = ServicesManager(mysql, redis, browser)
services.refresh_list("./core/*") services.refresh_list("core/*")
services.import_module() services.import_module()
services.add_service() services.add_service()

View File

@ -1,6 +1,7 @@
import imghdr import imghdr
import os
from enum import Enum from enum import Enum
from typing import Union from typing import Union, Optional
from models.baseobject import BaseObject from models.baseobject import BaseObject
@ -64,3 +65,29 @@ class GameItem(BaseObject):
__slots__ = ("name", "type", "value", "item_id") __slots__ = ("name", "type", "value", "item_id")
class ModuleInfo:
def __init__(self, file_name: Optional[str] = None, plugin_name: Optional[str] = None,
relative_path: Optional[str] = None):
self.relative_path = relative_path
self.module_name = plugin_name
self.file_name = file_name
if file_name is None:
if relative_path is None:
raise ValueError("file_name 和 relative_path 都不能为空")
self.file_name = os.path.basename(relative_path)
if plugin_name is None:
self.module_name, _ = os.path.splitext(self.file_name)
@property
def package_path(self) -> str:
if self.relative_path is None:
return ""
if os.path.isdir(self.relative_path):
return self.relative_path.replace(os.sep, ".")
root, _ = os.path.splitext(self.relative_path)
return root.replace(os.sep, ".")
def __str__(self):
return self.module_name

View File

@ -7,9 +7,9 @@ import genshin
import httpx import httpx
from genshin import Client, types from genshin import Client, types
from httpx import UnsupportedProtocol from httpx import UnsupportedProtocol
from service.cookies.services import CookiesService
from service.user.services import UserService
from core.cookies.services import CookiesService
from core.user.services import UserService
from logger import Log from logger import Log
from models.base import RegionEnum from models.base import RegionEnum

View File

@ -1,12 +1,9 @@
import os from typing import List
from glob import glob
from importlib import import_module
from os import path
from typing import List, Union
from telegram.ext import Application from telegram.ext import Application
from logger import Log from logger import Log
from utils.manager import ModulesManager
JobsClass: List[object] = [] JobsClass: List[object] = []
@ -23,43 +20,12 @@ def listener_jobs_class():
return decorator return decorator
class JobsManager: class JobsManager(ModulesManager):
def __init__(self): def __init__(self):
super().__init__()
self.job_list: List[str] = [] # 用于存储文件名称 self.job_list: List[str] = [] # 用于存储文件名称
self.exclude_list: List[str] = [] self.exclude_list: List[str] = []
self.manager_name = "定时任务管理器"
def refresh_list(self, plugin_paths):
self.job_list.clear()
plugin_paths = glob(plugin_paths)
for plugin_path in plugin_paths:
if plugin_path.startswith('__'):
continue
module_name = path.basename(path.normpath(plugin_path))
root, ext = os.path.splitext(module_name)
if ext == ".py":
self.job_list.append(root)
def add_exclude(self, exclude: Union[str, List[str]]):
if isinstance(exclude, str):
self.exclude_list.append(exclude)
elif isinstance(exclude, list):
self.exclude_list.extend(exclude)
else:
raise TypeError
def import_module(self):
for job_name in self.job_list:
if job_name not in self.exclude_list:
try:
import_module(f"jobs.{job_name}")
except ImportError as exc:
Log.warning(f"Job模块 {job_name} 导入失败", exc)
except ImportWarning as exc:
Log.warning(f"Job模块 {job_name} 加载成功但有警告", exc)
except BaseException as exc:
Log.warning(f"Job模块 {job_name} 加载失败", exc)
else:
Log.debug(f"Job模块 {job_name} 加载成功")
@staticmethod @staticmethod
def add_handler(application: Application): def add_handler(application: Application):

View File

@ -8,7 +8,7 @@ def register_job(application: Application):
Log.info("正在加载Job管理器") Log.info("正在加载Job管理器")
jobs_manager = JobsManager() jobs_manager = JobsManager()
jobs_manager.refresh_list("./jobs/*") jobs_manager.refresh_list("jobs/*")
# 忽略内置模块 # 忽略内置模块
jobs_manager.add_exclude(["base"]) jobs_manager.add_exclude(["base"])

55
utils/manager.py Normal file
View File

@ -0,0 +1,55 @@
import os
from glob import glob
from importlib import import_module
from os import path
from typing import List, Union
from logger import Log
from models.base import ModuleInfo
class ModulesManager:
def __init__(self):
self.manager_name: str = "模块管理器"
self.modules_list: List[ModuleInfo] = [] # 用于存储文件名称
self.exclude_list: List[str] = []
def clear(self):
self.modules_list.clear()
def refresh_list(self, pathname: str):
path_list = glob(pathname)
for temp_path in path_list:
if temp_path.startswith('__'):
continue
if os.path.isdir(temp_path):
self.modules_list.append(ModuleInfo(relative_path=temp_path))
else:
module_name = path.basename(path.normpath(temp_path))
root, ext = os.path.splitext(module_name)
if ext == ".py":
self.modules_list.append(ModuleInfo(relative_path=temp_path))
def add_exclude(self, exclude: Union[str, List[str]]):
if isinstance(exclude, str):
self.exclude_list.append(exclude)
elif isinstance(exclude, list):
self.exclude_list.extend(exclude)
else:
raise TypeError
def import_module(self):
module_name_list: List[str] = []
for module_info in self.modules_list:
if module_info.module_name not in self.exclude_list:
try:
import_module(f"{module_info.package_path}")
except ImportError as exc:
Log.warning(f"{self.manager_name}加载 {module_info} 失败", exc)
except ImportWarning as exc:
Log.warning(f"{self.manager_name}加载 {module_info} 成功但有警告", exc)
except BaseException as exc:
Log.warning(f"{self.manager_name}加载 {module_info} 失败", exc)
else:
module_name_list.append(module_info.module_name)
Log.info(self.manager_name + "加载模块: " + ", ".join(module_name_list))

View File

@ -1,12 +1,9 @@
import os from typing import List
from glob import glob
from importlib import import_module
from os import path
from typing import List, Union
from telegram.ext import Application from telegram.ext import Application
from logger import Log from logger import Log
from utils.manager import ModulesManager
PluginsClass: List[object] = [] PluginsClass: List[object] = []
@ -23,46 +20,11 @@ def listener_plugins_class():
return decorator return decorator
class PluginsManager: class PluginsManager(ModulesManager):
def __init__(self): def __init__(self):
self.plugin_list: List[str] = [] # 用于存储文件名称 super().__init__()
self.exclude_list: List[str] = [] self.manager_name = "插件管理器"
def refresh_list(self, plugin_paths):
plugin_paths = glob(plugin_paths)
for plugin_path in plugin_paths:
if plugin_path.startswith('__'):
continue
if os.path.isdir(plugin_path):
plugin_path = os.path.basename(plugin_path)
self.plugin_list.append(plugin_path)
continue
module_name = path.basename(path.normpath(plugin_path))
root, ext = os.path.splitext(module_name)
if ext == ".py":
self.plugin_list.append(root)
def add_exclude(self, exclude: Union[str, List[str]]):
if isinstance(exclude, str):
self.exclude_list.append(exclude)
elif isinstance(exclude, list):
self.exclude_list.extend(exclude)
else:
raise TypeError
def import_module(self):
for plugin_name in self.plugin_list:
if plugin_name not in self.exclude_list:
try:
import_module(f"plugins.{plugin_name}")
except ImportError as exc:
Log.warning(f"插件 {plugin_name} 导入失败", exc)
except ImportWarning as exc:
Log.warning(f"插件 {plugin_name} 加载成功但有警告", exc)
except BaseException as exc:
Log.warning(f"插件 {plugin_name} 加载失败", exc)
else:
Log.debug(f"插件 {plugin_name} 加载成功")
@staticmethod @staticmethod
def add_handler(application: Application): def add_handler(application: Application):

View File

@ -33,7 +33,7 @@ def register_plugin_handlers(application: Application):
Log.info("正在加载插件管理器") Log.info("正在加载插件管理器")
plugins_manager = PluginsManager() plugins_manager = PluginsManager()
plugins_manager.refresh_list("./plugins/genshin/*") plugins_manager.refresh_list("plugins/genshin/*")
# 忽略内置模块 # 忽略内置模块
# plugins_manager.add_exclude(["start", "auth", "inline", "errorhandler"]) # plugins_manager.add_exclude(["start", "auth", "inline", "errorhandler"])

View File

@ -1,12 +1,10 @@
import inspect import inspect
import os from typing import List, Dict
from glob import glob
from importlib import import_module
from typing import List, Union, Dict
from logger import Log from logger import Log
from models.types import Func from models.types import Func
from utils.aiobrowser import AioBrowser from utils.aiobrowser import AioBrowser
from utils.manager import ModulesManager
from utils.mysql import MySQL from utils.mysql import MySQL
from utils.redisdb import RedisDB from utils.redisdb import RedisDB
@ -26,43 +24,15 @@ def listener_service():
return decorator return decorator
class ServicesManager: class ServicesManager(ModulesManager):
def __init__(self, mysql: MySQL, redis: RedisDB, browser: AioBrowser): def __init__(self, mysql: MySQL, redis: RedisDB, browser: AioBrowser):
super().__init__()
self.browser = browser self.browser = browser
self.redis = redis self.redis = redis
self.mysql = mysql self.mysql = mysql
self.services_list: List[str] = [] self.services_list: List[str] = []
self.exclude_list: List[str] = [] self.exclude_list: List[str] = []
self.manager_name = "核心服务管理器"
def refresh_list(self, app_paths):
self.services_list.clear()
app_paths = glob(app_paths)
for app_path in app_paths:
if os.path.isdir(app_path):
app_path = os.path.basename(app_path)
self.services_list.append(app_path)
def add_exclude(self, exclude: Union[str, List[str]]):
if isinstance(exclude, str):
self.exclude_list.append(exclude)
elif isinstance(exclude, list):
self.exclude_list.extend(exclude)
else:
raise TypeError
def import_module(self):
for services_name in self.services_list:
if services_name not in self.exclude_list:
try:
import_module(f"apps.{services_name}")
except ImportError as exc:
Log.warning(f"Service模块 {services_name} 导入失败", exc)
except ImportWarning as exc:
Log.warning(f"Service模块 {services_name} 加载成功但有警告", exc)
except Exception as exc:
Log.warning(f"Service模块 {services_name} 加载失败", exc)
else:
Log.debug(f"Service模块 {services_name} 加载成功")
def add_service(self): def add_service(self):
for func in ServicesFunctions: for func in ServicesFunctions: