From 2990cdc4aaed9b0516f163d374048bd589fd9561 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Tue, 28 Jul 2020 09:39:15 +0800 Subject: [PATCH] feat: add chat api Signed-off-by: MiaoWoo --- packages/api/src/chat.ts | 19 +++++++ packages/api/src/event.ts | 104 +++++++++++++++++++------------------- packages/api/src/index.ts | 2 + 3 files changed, 73 insertions(+), 52 deletions(-) create mode 100644 packages/api/src/chat.ts diff --git a/packages/api/src/chat.ts b/packages/api/src/chat.ts new file mode 100644 index 00000000..b35a3c9b --- /dev/null +++ b/packages/api/src/chat.ts @@ -0,0 +1,19 @@ +export namespace chat { + export abstract class Chat { + sendMessage(sender: any, message: string) { + throw new Error("Method not implemented.") + } + sendActionBar(sender: any, message: string) { + throw new Error("Method not implemented.") + } + clearActionBar(sender: any) { + this.sendActionBar(sender, '') + } + sendTitle(sender: any, title: string, subtitle: string = '', fadeIn: number = 1, time: number = 5, fadeOut: number = 1) { + throw new Error("Method not implemented.") + } + clearTitle(sender: any) { + this.sendTitle(sender, '', '', 0, 0, 0) + } + } +} diff --git a/packages/api/src/event.ts b/packages/api/src/event.ts index 54af5f06..bbf5506e 100644 --- a/packages/api/src/event.ts +++ b/packages/api/src/event.ts @@ -4,7 +4,7 @@ import i18n from '@ccms/i18n' import { injectable, unmanaged } from '@ccms/container' -const Thread = Java.type('java.lang.Thread'); +const Thread = Java.type('java.lang.Thread') export namespace event { /** @@ -30,7 +30,7 @@ export namespace event { protected baseEventDir = ''; constructor(@unmanaged() baseEventDir: string) { - this.baseEventDir = baseEventDir; + this.baseEventDir = baseEventDir } /** @@ -39,74 +39,74 @@ export namespace event { * org.spongepowered.api.event.game.GameRegistryEvent.Register => gameregistryevent$register */ mapEventName() { - if (this.baseEventDir === "") { throw new Error(i18n.translate('ms.api.event.empty.event.dir')); } - let count = 0; - let jar = this.getJarFile(this.baseEventDir); - let entries = jar.entries(); + if (this.baseEventDir === "") { throw new Error(i18n.translate('ms.api.event.empty.event.dir')) } + let count = 0 + let jar = this.getJarFile(this.baseEventDir) + let entries = jar.entries() while (entries.hasMoreElements()) { - let entry = entries.nextElement(); - let name = entry.name; + let entry = entries.nextElement() + let name = entry.name if (name.startsWith(this.baseEventDir) && name.endsWith(".class")) { // replace name to qualifiedName - let qualifiedName = name.replaceAll('/', '.'); + let qualifiedName = name.replaceAll('/', '.') try { - let clazz = base.getClass(qualifiedName.substring(0, qualifiedName.length - 6)); + let clazz = base.getClass(qualifiedName.substring(0, qualifiedName.length - 6)) if (this.isValidEvent(clazz)) { - let simpleName = this.class2Name(clazz).toLowerCase(); - console.trace(i18n.translate("ms.api.event.mapping", { canonicalName: clazz.canonicalName, simpleName })); - this.mapEvent[simpleName] = clazz; - count++; + let simpleName = this.class2Name(clazz).toLowerCase() + console.trace(i18n.translate("ms.api.event.mapping", { canonicalName: clazz.canonicalName, simpleName })) + this.mapEvent[simpleName] = clazz + count++ } } catch (ex) { //ignore already loaded class } } } - return count; + return count } getJarFile(resource: string, loader?: any) { - let dirs = (loader || Thread.currentThread().getContextClassLoader()).getResources(resource); + let dirs = (loader || Thread.currentThread().getContextClassLoader()).getResources(resource) if (dirs.hasMoreElements()) { - let url = dirs.nextElement(); - if (url.protocol === "jar") { return url.openConnection().jarFile; } + let url = dirs.nextElement() + if (url.protocol === "jar") { return url.openConnection().jarFile } } throw new Error(i18n.translate("ms.api.event.resource.not.found", { resource })) } class2Name(clazz: any) { - return clazz.simpleName; + return clazz.simpleName } name2Class(name: any, event: string) { - let eventCls = this.mapEvent[event.toLowerCase()] || this.mapEvent[event.toLowerCase() + 'event']; + let eventCls = this.mapEvent[event.toLowerCase()] || this.mapEvent[event.toLowerCase() + 'event'] if (!eventCls) { try { - eventCls = base.getClass(eventCls); - this.mapEvent[event] = eventCls; + eventCls = base.getClass(eventCls) + this.mapEvent[event] = eventCls } catch (ex) { console.i18n("ms.api.event.not.found", { name, event }) - return; + return } } - return eventCls; + return eventCls } execute(name, exec, eventCls) { return (...args: any[]) => { try { - let event = args[args.length - 1]; + let event = args[args.length - 1] if (eventCls.isAssignableFrom(event.getClass())) { let time = Date.now() - exec(event); - let cost = Date.now() - time; + exec(event) + let cost = Date.now() - time if (cost > 20) { console.i18n("ms.api.event.execute.slow", { name, event: this.class2Name(eventCls), cost }) } } } catch (ex) { console.i18n("ms.api.event.execute.error", { name, event: this.class2Name(eventCls), ex }) - console.ex(ex); + console.ex(ex) } } } @@ -120,34 +120,34 @@ export namespace event { * @param ignoreCancel */ listen(plugin: any, event: string, exec: (event: any) => void, priority: EventPriority = EventPriority.NORMAL, ignoreCancel = false) { - if (!plugin || !plugin.description || !plugin.description.name) throw new TypeError(i18n.translate("ms.api.event.listen.plugin.name.empty")); - var name = plugin.description.name; - var eventCls = this.name2Class(name, event); - if (!eventCls) { return; } + if (!plugin || !plugin.description || !plugin.description.name) throw new TypeError(i18n.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; + ignoreCancel = priority + priority = EventPriority.NORMAL } - priority = priority || EventPriority.NORMAL; - ignoreCancel = ignoreCancel || false; + priority = priority || EventPriority.NORMAL + ignoreCancel = ignoreCancel || false // noinspection JSUnusedGlobalSymbols - var listener = this.register(eventCls, this.execute(name, exec, eventCls), priority, ignoreCancel); - var listenerMap = this.listenerMap; + var listener = this.register(eventCls, this.execute(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] = []; + if (!listenerMap[name]) listenerMap[name] = [] var offExec = () => { - this.unregister(eventCls, listener); - console.debug(i18n.translate("ms.api.event.unregister", { name, event: this.class2Name(eventCls) })); - }; + this.unregister(eventCls, listener) + console.debug(i18n.translate("ms.api.event.unregister", { name, event: this.class2Name(eventCls), exec: exec.name || '[anonymous]' })) + } var off = { event: eventCls, listener: listener, off: offExec - }; - listenerMap[name].push(off); + } + listenerMap[name].push(off) // noinspection JSUnresolvedVariable - console.debug(i18n.translate("ms.api.event.register", { name, event: this.class2Name(eventCls) })); - return off; + console.debug(i18n.translate("ms.api.event.register", { name, event: this.class2Name(eventCls), exec: exec.name || '[anonymous]' })) + return off } /** @@ -155,10 +155,10 @@ export namespace event { * @param plugin 插件 */ disable(plugin: any) { - var eventCache = this.listenerMap[plugin.description.name]; + var eventCache = this.listenerMap[plugin.description.name] if (eventCache) { - eventCache.forEach(t => t.off()); - delete this.listenerMap[plugin.description.name]; + eventCache.forEach(t => t.off()) + delete this.listenerMap[plugin.description.name] } } @@ -166,7 +166,7 @@ export namespace event { * 判断 * @param clazz 事件类 */ - abstract isValidEvent(clazz: any): boolean; + abstract isValidEvent(clazz: any): boolean /** * 注册事件 * @param eventCls 事件类 @@ -174,12 +174,12 @@ export namespace event { * @param priority 优先级 * @param ignoreCancel 是否忽略已取消的事件 */ - abstract register(eventCls: any, exec: Function, priority: any, ignoreCancel: boolean): any; + abstract register(eventCls: any, exec: Function, priority: any, ignoreCancel: boolean): any /** * 取消监听事件 * @param event 事件 * @param listener 监听器 */ - abstract unregister(event: any, listener: any): void; + abstract unregister(event: any, listener: any): void } } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 2876b9be..7af3f6f8 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,4 +1,6 @@ import "@ccms/nashorn" + +export * from './chat' export * from './task' export * from './event' export * from './console'