2021-02-01 15:13:11 +00:00
|
|
|
import importlib
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import traceback
|
2021-10-14 15:18:47 +00:00
|
|
|
from typing import Dict, Union, List, Set
|
2021-02-01 15:13:11 +00:00
|
|
|
|
2021-10-14 15:29:45 +00:00
|
|
|
from core.elements import Command, Option, Schedule, RegexCommand, StartUp, PrivateAssets
|
2021-08-07 07:56:48 +00:00
|
|
|
from core.logger import Logger
|
2021-02-03 14:43:24 +00:00
|
|
|
|
2021-07-10 17:05:07 +00:00
|
|
|
load_dir_path = os.path.abspath('./modules/')
|
|
|
|
|
2021-02-03 14:43:24 +00:00
|
|
|
|
2021-07-07 16:00:24 +00:00
|
|
|
def load_modules():
|
2021-10-14 15:18:47 +00:00
|
|
|
err_prompt = []
|
2021-07-07 16:00:24 +00:00
|
|
|
fun_file = None
|
|
|
|
dir_list = os.listdir(load_dir_path)
|
|
|
|
for file_name in dir_list:
|
|
|
|
try:
|
2021-04-07 15:18:41 +00:00
|
|
|
file_path = f'{load_dir_path}/{file_name}'
|
2021-07-10 17:05:07 +00:00
|
|
|
fun_file = None
|
2021-04-07 15:18:41 +00:00
|
|
|
if os.path.isdir(file_path):
|
2021-04-08 11:57:14 +00:00
|
|
|
if file_name != '__pycache__':
|
2021-04-07 15:18:41 +00:00
|
|
|
fun_file = file_name
|
2021-07-06 18:00:26 +00:00
|
|
|
if fun_file is not None:
|
2021-07-07 16:00:24 +00:00
|
|
|
Logger.info(f'Loading modules.{fun_file}...')
|
2021-07-06 18:00:26 +00:00
|
|
|
modules = 'modules.' + fun_file
|
|
|
|
importlib.import_module(modules)
|
2021-07-07 16:00:24 +00:00
|
|
|
Logger.info(f'Succeeded loaded modules.{fun_file}!')
|
|
|
|
except:
|
|
|
|
tb = traceback.format_exc()
|
2021-07-10 17:05:07 +00:00
|
|
|
Logger.info(f'Failed to load modules.{fun_file}: \n{tb}')
|
2021-07-07 16:00:24 +00:00
|
|
|
err_prompt.append(str(tb))
|
2021-10-14 15:18:47 +00:00
|
|
|
loadercache = os.path.abspath(PrivateAssets.path + '/.cache_loader')
|
|
|
|
openloadercache = open(loadercache, 'w')
|
|
|
|
if err_prompt:
|
|
|
|
err_prompt = re.sub(' File "<frozen importlib.*?>", .*?\n', '', '\n'.join(err_prompt))
|
|
|
|
openloadercache.write('加载模块中发生了以下错误,对应模块未加载:\n' + err_prompt)
|
|
|
|
else:
|
|
|
|
openloadercache.write('所有模块已正确加载。')
|
|
|
|
openloadercache.close()
|
2021-07-07 16:00:24 +00:00
|
|
|
|
2021-08-07 07:56:48 +00:00
|
|
|
|
2021-07-09 09:35:23 +00:00
|
|
|
class ModulesManager:
|
|
|
|
_modules_list = set()
|
2021-07-07 16:00:24 +00:00
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def add_module(module: [Command, Option, Schedule, RegexCommand, StartUp]):
|
2021-07-11 14:20:24 +00:00
|
|
|
ModulesManager._modules_list.add(module)
|
2021-07-07 16:00:24 +00:00
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_modules_list() -> Set[Union[Command, RegexCommand, Schedule, StartUp, Option]]:
|
2021-07-09 09:35:23 +00:00
|
|
|
return ModulesManager._modules_list
|
2021-02-01 15:13:11 +00:00
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_modules_list_as_dict() -> Dict[str, Union[Command, RegexCommand, Schedule, StartUp, Option]]:
|
2021-09-10 18:05:27 +00:00
|
|
|
d = {}
|
|
|
|
modules = []
|
|
|
|
recommend_modules = []
|
|
|
|
for alias in ModulesManager.return_modules_alias_map():
|
|
|
|
modules.append(alias)
|
|
|
|
for x in ModulesManager._modules_list:
|
|
|
|
prefix = x.bind_prefix
|
|
|
|
if prefix in d:
|
|
|
|
raise ValueError(f'Duplicate bind prefix "{prefix}"')
|
|
|
|
d.update({prefix: x})
|
|
|
|
modules.append(prefix)
|
|
|
|
recommend = x.recommend_modules
|
|
|
|
if isinstance(recommend, str):
|
|
|
|
recommend_modules.append(recommend)
|
|
|
|
if isinstance(recommend, (list, tuple)):
|
|
|
|
for y in recommend:
|
|
|
|
recommend_modules.append(y)
|
|
|
|
for rm in recommend_modules:
|
|
|
|
if rm not in modules:
|
|
|
|
raise ValueError(f'Invalid recommend module "{rm}"')
|
|
|
|
return d
|
2021-07-08 15:51:58 +00:00
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_modules_alias_map() -> Dict[str, str]:
|
2021-10-12 15:02:36 +00:00
|
|
|
"""
|
|
|
|
返回每个别名映射到的模块
|
|
|
|
"""
|
2021-07-08 15:51:58 +00:00
|
|
|
alias_map = {}
|
2021-07-09 09:35:23 +00:00
|
|
|
for x in ModulesManager._modules_list:
|
2021-07-08 15:51:58 +00:00
|
|
|
if isinstance(x.alias, str):
|
|
|
|
alias_map.update({x.alias: x.bind_prefix})
|
2021-10-15 17:36:22 +00:00
|
|
|
if isinstance(x.alias, dict):
|
|
|
|
x.alias = [x.alias]
|
2021-07-31 12:54:01 +00:00
|
|
|
if isinstance(x.alias, (tuple, list)):
|
2021-07-08 15:51:58 +00:00
|
|
|
for y in x.alias:
|
2021-10-15 17:36:22 +00:00
|
|
|
if isinstance(y, dict):
|
|
|
|
for z in y:
|
|
|
|
alias_map.update({z: y[z]})
|
|
|
|
elif isinstance(y, str):
|
|
|
|
alias_map.update({y: x.bind_prefix})
|
|
|
|
else:
|
|
|
|
raise ValueError(f'Unknown alias elements type: {y}')
|
2021-07-08 15:51:58 +00:00
|
|
|
return alias_map
|
|
|
|
|
2021-10-12 15:02:36 +00:00
|
|
|
@staticmethod
|
2021-10-15 17:36:22 +00:00
|
|
|
def return_module_alias(module_name) -> Dict[str, list]:
|
2021-10-12 15:02:36 +00:00
|
|
|
"""
|
2021-10-15 17:36:22 +00:00
|
|
|
返回此模块的别名列表
|
2021-10-12 15:02:36 +00:00
|
|
|
"""
|
|
|
|
alias_list = {}
|
2021-10-15 17:36:22 +00:00
|
|
|
module = ModulesManager.return_modules_list_as_dict()[module_name]
|
|
|
|
if module.alias is None:
|
|
|
|
return alias_list
|
|
|
|
for x in module.alias:
|
|
|
|
if module.bind_prefix not in alias_list:
|
|
|
|
alias_list.update({module.bind_prefix: []})
|
|
|
|
if isinstance(x, str):
|
|
|
|
alias_list[module.bind_prefix].append(x)
|
|
|
|
if isinstance(x, dict):
|
|
|
|
x = [x]
|
|
|
|
if isinstance(x, (tuple, list)):
|
|
|
|
for y in x:
|
|
|
|
if isinstance(y, str):
|
|
|
|
alias_list[module.bind_prefix].append(x)
|
|
|
|
if isinstance(y, dict):
|
|
|
|
for z in y:
|
|
|
|
if z not in alias_list:
|
|
|
|
alias_list.update({z: []})
|
|
|
|
alias_list[z].append(y[z])
|
2021-10-12 15:02:36 +00:00
|
|
|
return alias_list
|
|
|
|
|
2021-09-19 12:52:42 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_modules_developers_map() -> Dict[str, list]:
|
2021-09-19 12:52:42 +00:00
|
|
|
d = {}
|
|
|
|
for x in ModulesManager._modules_list:
|
|
|
|
if x.developers is not None:
|
2021-10-14 15:18:47 +00:00
|
|
|
if isinstance(x.developers, str):
|
|
|
|
d.update({x.bind_prefix: [x.developers]})
|
|
|
|
elif isinstance(x.developers, (tuple, list)):
|
|
|
|
d.update({x.bind_prefix: x.developers})
|
2021-09-19 12:52:42 +00:00
|
|
|
return d
|
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_regex_modules() -> Dict[str, RegexCommand]:
|
2021-07-26 14:33:49 +00:00
|
|
|
d = {}
|
|
|
|
for x in ModulesManager._modules_list:
|
2021-10-13 15:22:11 +00:00
|
|
|
if isinstance(x, RegexCommand):
|
2021-07-26 14:33:49 +00:00
|
|
|
d.update({x.bind_prefix: x})
|
|
|
|
return d
|
|
|
|
|
2021-08-30 18:53:39 +00:00
|
|
|
@staticmethod
|
2021-10-14 15:18:47 +00:00
|
|
|
def return_schedule_function_list() -> List[Schedule]:
|
2021-08-30 18:53:39 +00:00
|
|
|
l = []
|
|
|
|
for x in ModulesManager._modules_list:
|
|
|
|
if isinstance(x, Schedule):
|
|
|
|
l.append(x)
|
2021-10-14 15:18:47 +00:00
|
|
|
return l
|