From b211cd8fff64f4abbc9c9832106411fa8c63fa8d Mon Sep 17 00:00:00 2001 From: Shigma <1700011071@pku.edu.cn> Date: Fri, 23 Apr 2021 17:58:56 +0800 Subject: [PATCH] feat(webui): support webui without database, fix #234 --- packages/koishi-core/src/context.ts | 17 ++++++++----- packages/plugin-teach/client/teach.vue | 2 +- .../client/components/numeric.vue | 9 +++---- packages/plugin-webui/client/main.ts | 6 +++-- packages/plugin-webui/client/views/bots.vue | 4 ++-- .../plugin-webui/client/views/home/home.vue | 24 +++++++++++-------- packages/plugin-webui/src/data.ts | 2 +- packages/plugin-webui/src/server.ts | 10 ++++++-- packages/plugin-webui/src/stats.ts | 11 ++++++--- 9 files changed, 54 insertions(+), 31 deletions(-) diff --git a/packages/koishi-core/src/context.ts b/packages/koishi-core/src/context.ts index 9d94390fef..3fea0e003b 100644 --- a/packages/koishi-core/src/context.ts +++ b/packages/koishi-core/src/context.ts @@ -317,19 +317,21 @@ export class Context { } } - on(name: K, listener: EventMap[K], prepend = false) { + on(name: K, listener: EventMap[K], prepend?: boolean): () => boolean + on(name: string & EventName, listener: Disposable, prepend = false) { const method = prepend ? 'unshift' : 'push' - // handle plugin-related events - const _listener = listener as Disposable + // handle special events if (name === 'connect' && this.app.status === App.Status.open) { - return _listener(), () => false + return listener(), () => false } else if (name === 'before-disconnect') { - this.state.disposables[method](_listener) - return () => remove(this.state.disposables, _listener) + this.state.disposables[method](listener) + return () => remove(this.state.disposables, listener) } else if (name === 'before-connect') { // before-connect is side effect this.addSideEffect() + } else if (typeof name === 'string' && name.startsWith('delegate/')) { + if (this[name.slice(9)]) return listener(), () => false } const hooks = this.app._hooks[name] ||= [] @@ -513,6 +515,7 @@ export class Context { return value }, set(value) { + if (!this.app[privateKey]) this.emit('delegate/' + key) defineProperty(this.app, privateKey, value) }, }) @@ -544,6 +547,8 @@ export interface EventMap extends SessionEventMap { [Context.middleware]: Middleware // Koishi events + 'delegate/assets'(): void + 'delegate/database'(): void 'appellation'(name: string, session: Session): string 'before-parse'(content: string, session: Session): Argv 'parse'(argv: Argv, session: Session): string diff --git a/packages/plugin-teach/client/teach.vue b/packages/plugin-teach/client/teach.vue index 8825b33abe..b5f5f7cb1c 100644 --- a/packages/plugin-teach/client/teach.vue +++ b/packages/plugin-teach/client/teach.vue @@ -2,7 +2,7 @@
{{ meta.questions }} {{ meta.dialogues }} - +
diff --git a/packages/plugin-webui/client/components/numeric.vue b/packages/plugin-webui/client/components/numeric.vue index 389edc9f6e..f5a2fa24a8 100644 --- a/packages/plugin-webui/client/components/numeric.vue +++ b/packages/plugin-webui/client/components/numeric.vue @@ -17,17 +17,18 @@ const props = defineProps<{ icon: string type?: 'size' value?: number + fallback?: string }>() const text = computed(() => { - if (!props.value) return '暂无数据' + if (!props.value) return props.fallback if (props.type === 'size') { if (props.value >= (1 << 20) * 1000) { - return +(props.value / (1 << 30)).toFixed(1) + ' GB' + return (props.value / (1 << 30)).toFixed(1) + ' GB' } else if (props.value >= (1 << 10) * 1000) { - return +(props.value / (1 << 20)).toFixed(1) + ' MB' + return (props.value / (1 << 20)).toFixed(1) + ' MB' } else { - return +(props.value / (1 << 10)).toFixed(1) + ' KB' + return (props.value / (1 << 10)).toFixed(1) + ' KB' } } }) diff --git a/packages/plugin-webui/client/main.ts b/packages/plugin-webui/client/main.ts index 9f4da23515..2d4a8b0940 100644 --- a/packages/plugin-webui/client/main.ts +++ b/packages/plugin-webui/client/main.ts @@ -26,17 +26,19 @@ self['KoishiClient'] = client const app = Vue.createApp(App) +const statsPrerequisite: 'stats'[] = KOISHI_CONFIG.database ? ['stats'] : [] + router.addRoute({ path: '/', name: '仪表盘', - meta: { icon: 'tachometer-alt', require: ['stats', 'meta', 'profile', 'registry'] }, + meta: { icon: 'tachometer-alt', require: [...statsPrerequisite, 'meta', 'profile', 'registry'] }, component: () => import('./views/home/home.vue'), }) router.addRoute({ path: '/bots', name: '机器人', - meta: { icon: 'robot', require: ['stats', 'profile'] }, + meta: { icon: 'robot', require: [...statsPrerequisite, 'profile'] }, component: () => import('./views/bots.vue'), }) diff --git a/packages/plugin-webui/client/views/bots.vue b/packages/plugin-webui/client/views/bots.vue index fc9b420330..0cded4ce2f 100644 --- a/packages/plugin-webui/client/views/bots.vue +++ b/packages/plugin-webui/client/views/bots.vue @@ -6,14 +6,14 @@ 用户名 运行状态 当前消息频率 - 近期消息频率 + 近期消息频率 {{ platform }} {{ username }} {{ codes[code] }} 发送 {{ currentRate[0] }}/min,接收 {{ currentRate[1] }}/min - 发送 {{ stats.botSend[`${platform}:${selfId}`] || 0 }}/d,接收 {{ stats.botReceive[`${platform}:${selfId}`] || 0 }}/d + 发送 {{ stats.botSend[`${platform}:${selfId}`] || 0 }}/d,接收 {{ stats.botReceive[`${platform}:${selfId}`] || 0 }}/d

暂无数据。

diff --git a/packages/plugin-webui/client/views/home/home.vue b/packages/plugin-webui/client/views/home/home.vue index fda3059560..e559edb5e2 100644 --- a/packages/plugin-webui/client/views/home/home.vue +++ b/packages/plugin-webui/client/views/home/home.vue @@ -1,18 +1,20 @@