UNPKG

mm_os

Version:

这是超级美眉服务端框架,用于快速构建应用程序。

259 lines (242 loc) 5.58 kB
const compressing = require('compressing'); const Index = require('mm_machine').Index; const Drive = require('./drive'); /** * Plugin插件类 * @extends {Index} * @class */ class Plugin extends Index { /** * 构造函数 * @param {Object} scope 作用域 * @param {String} title 标题 * @constructor */ constructor(scope, title) { super(scope, __dirname); this.Drive = Drive; this.type = "plugin"; this.title = title; // 默认启用热更新 this.mode = 3; } } /** * 聊天(通过聊天的方式驱动插件, 用于机器人开发) * @param {String} from_user 发送消息人 * @param {String} to_user 接收消息人 * @param {String} content 内容 * @param {String} group 群组 如果是个人,群组为空 * @param {Number} type 群类型, 1永久会话/群、2临时会话/群 * @param {String} msg_type 消息类型, event事件型、message消息型。默认消息型 * @param {Object} 数据管理器 * @return {String} 回复内容 */ Plugin.prototype.chat = async function(from_user, to_user, group, content, type, msg_type, db) { var ret = ""; var lt = this.list; for (var i = 0, o; o = lt[i++];) { if (o.config.state === 1) { ret = await o.chat(from_user, to_user, group, content, type, msg_type, db); if (ret) { break; } } } return ret; }; /** * 初始化插件 * @param {Object} option 配置参数 * @return {String} 执行结果 */ Plugin.prototype.init = function(option) { var ret = ""; var lt = this.list; for (var i = 0, o; o = lt[i++];) { ret = o.exec('init', option); } return ret; }; /** * 加载插件 * @param {String} path 检索路径 * @param {Boolean} accurate 是否精确路径 */ Plugin.prototype.update_config_all = async function(path, accurate) { var dir_plugin; if (accurate) { dir_plugin = path; } else { if (!path) { path = '/app/' + this.scope; } dir_plugin = path + "/plugin/"; } if (dir_plugin.hasDir()) { var list_scope = $.dir.get(dir_plugin); // 遍历目录路径 for (var i = 0, o; o = list_scope[i++];) { var file = './plugin.json'.fullname(o); if (file.hasFile()) { await this.load_file(file, true); } } } }; /** * 压缩插件 * @param {Object} name 插件名称 * @returns {Boolean} 返回压缩路径 */ Plugin.prototype.zip = async function(name) { var plus = this.get(name); if (plus) { return await plus.zip(); } return null; } /** * 解压插件 * @param {Object} file 插件压缩文件 * @returns {Boolean} 返回解压结果 */ Plugin.prototype.unzip = async function(file) { var name = file.basename().left("."); var dir = `/cache/plugin/${name}`.fullname(); dir.addDir(); var ret; try { await compressing.zip.uncompress(file, dir); ret = { file, dir }; } catch (err) { $.log.error("插件解压失败!", err); } return ret; } /** * 卸载插件 * @param {String} name 插件名称 * @returns {String} 返回卸载路径 */ Plugin.prototype.uninstall = async function(name) { var plus = this.get(name); if (plus) { await plus.exec('uninstall'); var obj = this.del(name, true); if (obj) { var file = obj.filename; // 删除目录 file.dirname().delDir(); return file } } return null; } /** * 复制目录 * @param {String} dir_src 原路径 * @param {String} dir 新路径 * @returns {Object} 返回复制结果 */ Plugin.prototype.copy_dir = function(dir_src, dir) { return new Promise((resolve, reject) => { $.dir.copy(dir_src, dir, () => { resolve({ dir_src, dir }); }); }); } /** * 安装插件 * @param {String} file 插件压缩文件 * @returns {Object} 返回解压结果 */ Plugin.prototype.install = async function(file) { var ret = await this.unzip(file); if (ret) { var dirs = $.dir.get(ret.dir); if (dirs.length) { var dir_src = dirs[0]; var file = "./plugin.json".fullname(dir_src); var config = file.loadJson(); if (config) { var app = config.app || 'sys'; var name = config.name; if (name) { var dir = `/app/${app}/plugin/${name}`; await this.copy_dir(dir_src, dir); var cs = $.pool.plugin[app]; if (cs) { await cs.update(`/app/${app}/`.fullname()); await cs.exec(name, 'install'); setTimeout(() => { ret.dir.delDir(); }, 3000) } return { app, name, dir_src, dir } } } } } } // /** // * 更新插件 // * @param {String} name 插件名称 // * @returns {Object} 返回更新结果 // */ // Plugin.prototype.update = async function(name) { // var plus = this.get(name); // if (plus) { // var cg = plus.config; // // 先将配置缓存 // var file = `/cache/config/${cg.app}_${cg.name}.json`; // file.saveJson(cg); // var dir = plus.filename.dirname(); // // 判断是否存在git仓库 // if (cg.git) { // if (dir.hasDir('.git')) { // // "git fetch"; // // "git reset --hard origin/master" // } // } // } else { // ret = $.ret.error("更新失败!原因:插件不存在"); // } // } module.exports = Plugin; /** * 创建全局管理器 */ if (!$.pool.plugin) { $.pool.plugin = {}; } function plugin_admin(scope, title) { if (!scope) { scope = $.val.scope + ''; } var obj = $.pool.plugin[scope]; if (!obj) { $.pool.plugin[scope] = new Plugin(scope, title); obj = $.pool.plugin[scope]; } return obj; } /** * plugin管理器, 用于管理插件 * @param {string} scope 作用域 * @param {string} title 标题 * @return {Object} 返回一个缓存类 */ $.plugin_admin = plugin_admin;