UNPKG

@ccms/api

Version:

MiaoScript api package

207 lines 8.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.event = void 0; var tslib_1 = require("tslib"); /** * MiaoScript Event处理类 */ var i18n_1 = require("@ccms/i18n"); var container_1 = require("@ccms/container"); var Thread = Java.type('java.lang.Thread'); var event; (function (event_1) { /** * 事件监听优先级 */ var EventPriority; (function (EventPriority) { EventPriority["LOWEST"] = "LOWEST"; EventPriority["LOW"] = "LOW"; EventPriority["NORMAL"] = "NORMAL"; EventPriority["HIGH"] = "HIGH"; EventPriority["HIGHEST"] = "HIGHEST"; EventPriority["MONITOR"] = "MONITOR"; })(EventPriority = event_1.EventPriority || (event_1.EventPriority = {})); var Event = /** @class */ (function () { function Event(baseEventDir) { // export EventPriority to blockly this.EventPriority = EventPriority; this.mapEvent = []; this.listenerMap = []; this.cacheSlowEventKey = {}; this.baseEventDir = ''; this.baseEventDir = baseEventDir; } /** * abstract event map function * ig: org.bukkit.event.player.PlayerLoginEvent => playerloginevent * org.spongepowered.api.event.game.GameRegistryEvent.Register => gameregistryevent$register */ Event.prototype.mapEventName = function () { if (this.baseEventDir === "") { throw new Error(i18n_1.default.translate('ms.api.event.empty.event.dir')); } var count = 0; var jar = this.getJarFile(this.baseEventDir); var entries = jar.entries(); while (entries.hasMoreElements()) { var entry = entries.nextElement(); var name = entry.name; if (name.startsWith(this.baseEventDir) && name.endsWith(".class")) { // replace name to qualifiedName var qualifiedName = name.replaceAll('/', '.'); try { var clazz = base.getClass(qualifiedName.substring(0, qualifiedName.length - 6)); if (this.isValidEvent(clazz)) { var simpleName = this.class2Name(clazz).toLowerCase(); console.trace(i18n_1.default.translate("ms.api.event.mapping", { canonicalName: clazz.canonicalName, simpleName: simpleName })); this.mapEvent[simpleName] = clazz; count++; } } catch (ex) { //ignore already loaded class } } } return count; }; Event.prototype.getJarFile = function (resource, loader) { var dirs = (loader || Thread.currentThread().getContextClassLoader()).getResources(resource); if (dirs.hasMoreElements()) { var url = dirs.nextElement(); if (url.protocol === "jar") { return url.openConnection().jarFile; } } throw new Error(i18n_1.default.translate("ms.api.event.resource.not.found", { resource: resource })); }; Event.prototype.class2Name = function (clazz) { return clazz.simpleName; }; Event.prototype.name2Class = function (name, event) { var eventCls = this.mapEvent[event.toLowerCase()] || this.mapEvent[event.toLowerCase() + 'event']; if (!eventCls) { try { eventCls = base.getClass(event); this.mapEvent[event] = eventCls; } catch (ex) { console.i18n("ms.api.event.not.found", { name: name, event: event }); return; } } return eventCls; }; /** * 创建命令执行器 * @param name 插件名称 * @param exec 执行方法 * @param eventCls 事件类 * @returns */ Event.prototype.createExecute = function (name, exec, eventCls) { var _this = this; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var event = args[args.length - 1]; try { if (!eventCls.isAssignableFrom(event.getClass())) { return; } var time = Date.now(); exec(event); var cost = Date.now() - time; if (cost > global.ScriptSlowExecuteTime && !event.async) { var eventKey = "".concat(name, "-").concat(_this.class2Name(eventCls)); if (!_this.cacheSlowEventKey[eventKey]) { return _this.cacheSlowEventKey[eventKey] = cost; } console.i18n("ms.api.event.execute.slow", { name: name, event: _this.class2Name(eventCls), cost: cost }); } } catch (ex) { console.i18n("ms.api.event.execute.error", { name: name, event: _this.class2Name(eventCls), ex: ex }); console.ex(ex); } }; }; /** * 添加事件监听 * @param plugin {any} 插件 * @param event {string} 事件名称 * @param exec {function} 事件执行器 * @param priority {string} [LOWEST,LOW,NORMAL,HIGH,HIGHEST,MONITOR] 优先级 * @param ignoreCancel 是否忽略已取消事件 */ Event.prototype.listen = function (plugin, event, exec, priority, ignoreCancel) { var _this = this; if (priority === void 0) { priority = EventPriority.NORMAL; } if (ignoreCancel === void 0) { ignoreCancel = false; } if (!plugin || !plugin.description || !plugin.description.name) throw new TypeError(i18n_1.default.translate("ms.api.event.listen.plugin.name.empty")); var name = plugin.description.name; var eventCls = this.name2Class(name, event); if (!eventCls) { return; } if (typeof priority === 'boolean') { ignoreCancel = priority; priority = EventPriority.NORMAL; } priority = priority || EventPriority.NORMAL; ignoreCancel = ignoreCancel || false; // @ts-ignore var executor = exec.name || exec.executor || '[anonymous]'; // noinspection JSUnusedGlobalSymbols var listener = this.register(eventCls, this.createExecute(name, exec, eventCls), priority, ignoreCancel); var listenerMap = this.listenerMap; // add to cache Be used for close plugin to close event if (!listenerMap[name]) listenerMap[name] = []; var off = function () { if (off['offed']) return; off['offed'] = true; _this.unregister(eventCls, listener); console.debug(i18n_1.default.translate("ms.api.event.unregister", { name: name, event: _this.class2Name(eventCls), exec: executor })); }; listenerMap[name].push(off); // noinspection JSUnresolvedVariable console.debug(i18n_1.default.translate("ms.api.event.register", { name: name, event: this.class2Name(eventCls), exec: executor, priority: priority, ignore: ignoreCancel })); return off; }; /** * 关闭插件监听任务 * @param plugin 插件 */ Event.prototype.disable = function (plugin) { var eventCache = this.listenerMap[plugin.description.name]; if (eventCache) { eventCache.forEach(function (off) { return off(); }); delete this.listenerMap[plugin.description.name]; } }; Event = tslib_1.__decorate([ (0, container_1.injectable)(), tslib_1.__param(0, (0, container_1.unmanaged)()), tslib_1.__metadata("design:paramtypes", [String]) ], Event); return Event; }()); event_1.Event = Event; })(event = exports.event || (exports.event = {})); //# sourceMappingURL=event.js.map