@ccms/api
Version:
MiaoScript api package
207 lines • 8.82 kB
JavaScript
;
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