支持nest方式插件加载

This commit is contained in:
Wuyi无疑 2023-03-01 22:42:46 +08:00
parent b27cf3561b
commit ff57f10498

View File

@ -39,22 +39,15 @@ class GsServer:
if plugin.is_dir(): if plugin.is_dir():
plugin_path = plugin / '__init__.py' plugin_path = plugin / '__init__.py'
plugins_path = plugin / '__full__.py' plugins_path = plugin / '__full__.py'
nest_path = plugin / '__nest__.py'
# 如果文件夹内有__full_.py则视为插件包合集 # 如果文件夹内有__full_.py则视为插件包合集
sys.path.append(str(plugin_path.parents)) sys.path.append(str(plugin_path.parents))
if plugins_path.exists(): if plugins_path.exists():
importlib.import_module( self.load_dir_plugins(plugin)
f'plugins.{plugin.name}.__full__' elif nest_path.exists():
) path = nest_path.parent / plugin.name
for sub_plugin in plugin.iterdir(): if path.exists():
if sub_plugin.is_dir(): self.load_dir_plugins(path, True)
plugin_path = sub_plugin / '__init__.py'
if plugin_path.exists():
sys.path.append(str(plugin_path.parents))
_p = (
f'plugins.{plugin.name}.'
f'{sub_plugin.name}'
)
importlib.import_module(f'{_p}.__init__')
# 如果文件夹内有__init_.py则视为单个插件包 # 如果文件夹内有__init_.py则视为单个插件包
elif plugin_path.exists(): elif plugin_path.exists():
importlib.import_module( importlib.import_module(
@ -63,9 +56,23 @@ class GsServer:
# 如果发现单文件,则视为单文件插件 # 如果发现单文件,则视为单文件插件
if plugin.suffix == '.py': if plugin.suffix == '.py':
importlib.import_module(f'plugins.{plugin.name[:-3]}') importlib.import_module(f'plugins.{plugin.name[:-3]}')
except: # noqa except Exception as e: # noqa
logger.exception(e)
logger.warning(f'插件{plugin.name}加载失败') logger.warning(f'插件{plugin.name}加载失败')
def load_dir_plugins(self, plugin: Path, nest: bool = False):
for sub_plugin in plugin.iterdir():
if sub_plugin.is_dir():
plugin_path = sub_plugin / '__init__.py'
if plugin_path.exists():
sys.path.append(str(plugin_path.parents))
name = plugin.name
if nest:
_p = f'plugins.{name}.{name}.{sub_plugin.name}'
else:
_p = f'plugins.{name}.{sub_plugin.name}'
importlib.import_module(f'{_p}.__init__')
async def connect(self, websocket: WebSocket, bot_id: str) -> _Bot: async def connect(self, websocket: WebSocket, bot_id: str) -> _Bot:
await websocket.accept() await websocket.accept()
self.active_ws[bot_id] = websocket self.active_ws[bot_id] = websocket