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

130 lines
4.1 KiB
Python
Raw Normal View History

2021-02-01 15:13:11 +00:00
import importlib
import os
import re
import traceback
2021-08-30 18:53:39 +00:00
from core.elements import Command, Option, Schedule
2021-08-07 07:56:48 +00:00
from core.logger import Logger
2021-02-01 15:13:11 +00:00
2021-04-28 12:21:33 +00:00
err_prompt = []
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():
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-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
def add_module(module: [Command, Option, Schedule]):
ModulesManager._modules_list.add(module)
2021-07-07 16:00:24 +00:00
2021-08-30 18:53:39 +00:00
@staticmethod
def return_modules_list():
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
def return_modules_list_as_dict():
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
def return_modules_alias_map():
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})
if isinstance(x.alias, (tuple, list)):
2021-07-08 15:51:58 +00:00
for y in x.alias:
alias_map.update({y: x.bind_prefix})
2021-07-26 12:43:51 +00:00
if isinstance(x.alias, dict):
alias_map.update(x.alias)
2021-07-08 15:51:58 +00:00
return alias_map
2021-09-19 12:52:42 +00:00
@staticmethod
def return_modules_developers_map():
d = {}
for x in ModulesManager._modules_list:
if x.developers is not None:
d.update({x.bind_prefix: x.developers})
return d
2021-08-30 18:53:39 +00:00
@staticmethod
def return_regex_modules():
2021-07-26 14:33:49 +00:00
d = {}
for x in ModulesManager._modules_list:
2021-08-30 18:53:39 +00:00
if isinstance(x, Command) and x.is_regex_function:
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
def return_modules_help():
2021-07-28 18:51:24 +00:00
d = {}
for x in ModulesManager._modules_list:
if x.help_doc is not None:
d.update({x.bind_prefix: x.help_doc})
return d
2021-08-30 18:53:39 +00:00
@staticmethod
def return_schedule_function_list():
l = []
for x in ModulesManager._modules_list:
if isinstance(x, Schedule):
l.append(x)
return l
2021-07-08 15:51:58 +00:00
load_modules()
2021-07-09 09:35:23 +00:00
Modules = ModulesManager.return_modules_list_as_dict()
ModulesAliases = ModulesManager.return_modules_alias_map()
2021-07-26 14:33:49 +00:00
ModulesRegex = ModulesManager.return_regex_modules()
2021-07-28 18:51:24 +00:00
ModulesHelp = ModulesManager.return_modules_help()
2021-02-01 15:13:11 +00:00
2021-04-28 12:21:33 +00:00
loadercache = os.path.abspath('.cache_loader')
openloadercache = open(loadercache, 'w')
if err_prompt:
2021-05-27 15:13:40 +00:00
err_prompt = re.sub(' File "<frozen importlib.*?>", .*?\n', '', '\n'.join(err_prompt))
openloadercache.write('加载模块中发生了以下错误,对应模块未加载:\n' + err_prompt)
2021-04-28 12:21:33 +00:00
else:
openloadercache.write('所有模块已正确加载。')
2021-08-07 07:56:48 +00:00
openloadercache.close()