Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/core/loader/__init__.py

147 lines
5.5 KiB
Python
Raw Normal View History

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
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}'
fun_file = None
2021-04-07 15:18:41 +00:00
if os.path.isdir(file_path):
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()
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:
2021-10-24 10:55:45 +00:00
modules: Dict[str, Union[Command, Option, Schedule, RegexCommand, StartUp]] = {}
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-10-24 10:55:45 +00:00
if module.bind_prefix not in ModulesManager.modules:
ModulesManager.modules.update({module.bind_prefix: module})
else:
raise ValueError(f'Duplicate bind prefix "{module.bind_prefix}"')
2021-07-07 16:00:24 +00:00
2021-08-30 18:53:39 +00:00
@staticmethod
2021-10-24 10:55:45 +00:00
def bind_to_module(bind_prefix: str, meta):
if bind_prefix in ModulesManager.modules:
ModulesManager.modules[bind_prefix].match_list.add(meta)
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-10-24 10:55:45 +00:00
return ModulesManager.modules
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-10-24 10:55:45 +00:00
modules = ModulesManager.return_modules_list_as_dict()
for m in modules:
module = modules[m]
if isinstance(module.alias, str):
alias_map.update({module.alias: module.bind_prefix})
if isinstance(module.alias, dict):
module.alias = [module.alias]
if isinstance(module.alias, (tuple, list)):
for y in module.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):
2021-10-24 10:55:45 +00:00
alias_map.update({y: module.bind_prefix})
2021-10-15 17:36:22 +00:00
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
2021-10-24 10:55:45 +00:00
if isinstance(module.alias, str):
alias_list.update({module.bind_prefix: [module.alias]})
if isinstance(module.alias, (list, tuple)):
for x in module.alias:
if module.bind_prefix not in alias_list:
alias_list.update({module.bind_prefix: []})
if isinstance(x, dict):
x = [x]
if isinstance(x, (tuple, list)):
for y in x:
if isinstance(y, str):
2021-11-08 16:09:06 +00:00
alias_list[module.bind_prefix].append(y)
2021-10-24 10:55:45 +00:00
if isinstance(y, dict):
for z in y:
2021-11-08 16:09:06 +00:00
if y[z] not in alias_list:
alias_list.update({y[z]: []})
alias_list[y[z]].append(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 = {}
2021-10-24 10:55:45 +00:00
modules = ModulesManager.return_modules_list_as_dict()
for m in modules:
module = modules[m]
if module.developers is not None:
if isinstance(module.developers, str):
d.update({module.bind_prefix: [module.developers]})
elif isinstance(module.developers, (tuple, list)):
d.update({module.bind_prefix: module.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 = {}
2021-10-24 10:55:45 +00:00
modules = ModulesManager.return_modules_list_as_dict()
for m in modules:
module = modules[m]
if isinstance(module, RegexCommand):
d.update({module.bind_prefix: module})
2021-07-26 14:33:49 +00:00
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 = []
2021-10-24 10:55:45 +00:00
modules = ModulesManager.return_modules_list_as_dict()
for m in modules:
module = modules[m]
if isinstance(m, Schedule):
l.append(m)
return l