kokkoro
Version:
とある咕咕の QQ 机器人框架
81 lines (80 loc) • 2.24 kB
JavaScript
import { join, resolve } from 'node:path';
import { mkdir, readFile, readdir } from 'node:fs/promises';
import { mountPlugin } from '@kokkoro/core';
import { getConfig } from './config.js';
const { plugins_dir = 'plugins' } = await getConfig();
const plugins_path = resolve(plugins_dir);
const modules_path = resolve('node_modules');
/**
* 判断是否是合法的插件目录
*
* @param dir - 目录实例对象
* @returns 是否是插件目录
*/
function isPluginFolder(dir) {
return dir.isDirectory() || dir.isSymbolicLink();
}
/**
* 检索可用插件信息
*
* @returns 插件信息列表
*/
async function retrievalPlugins() {
const pluginDirs = [];
const moduleDirs = [];
const dirs = [];
try {
const dirs = await readdir(plugins_path, { withFileTypes: true });
pluginDirs.push(...dirs);
}
catch (error) {
await mkdir(plugins_path);
}
for (const dir of pluginDirs) {
const is_plugin_folder = isPluginFolder(dir);
if (!is_plugin_folder) {
continue;
}
try {
dirs.push(dir);
}
catch { }
}
try {
const dirs = await readdir(modules_path, { withFileTypes: true });
moduleDirs.push(...dirs);
}
catch (err) {
await mkdir(modules_path);
}
for (const dir of moduleDirs) {
const is_plugin_folder = isPluginFolder(dir);
if (is_plugin_folder && dir.name.startsWith('kokkoro-plugin-')) {
try {
dirs.push(dir);
}
catch { }
}
}
return dirs;
}
/**
* 挂载所有插件
*/
export async function mountPlugins() {
const dirs = await retrievalPlugins();
for (let i = 0; i < dirs.length; i++) {
const { name, path } = dirs[i];
const is_local = path === plugins_path;
const module = join(path, name);
const pkg = join(module, 'package.json');
const text = await readFile(pkg, 'utf-8');
const { main } = JSON.parse(text);
if (is_local) {
await mountPlugin(`./${plugins_dir}/${name}/${main}`);
}
else {
await mountPlugin(`./node_modules/${name}/${main}`);
}
}
}