From 8f16bf56407acec3f9a873d0df44ce46844c90ea Mon Sep 17 00:00:00 2001 From: Shigma Date: Wed, 17 Apr 2024 15:54:36 +0800 Subject: [PATCH] feat(satori): refactor to ctx.satori service --- packages/core/src/bot.ts | 2 +- packages/core/src/index.ts | 59 +++++++++++++++--------------------- packages/core/src/session.ts | 2 -- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/packages/core/src/bot.ts b/packages/core/src/bot.ts index 870499a2..2cc966d0 100644 --- a/packages/core/src/bot.ts +++ b/packages/core/src/bot.ts @@ -87,7 +87,7 @@ export abstract class Bot implements Login set status(value) { if (value === this._status) return this._status = value - if (this.ctx.bots.includes(this)) { + if (this.ctx.bots?.includes(this)) { this.context.emit('bot-status-updated', this) this.dispatchLoginEvent('login-updated') } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c7df6024..38cbbac2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -98,11 +98,12 @@ export interface Events extends cordis.Events { 'bot-disconnect'(client: Bot): Awaitable } -export interface Events extends cordis.Events {} - export interface Context { [Context.events]: Events [Context.session]: Session + satori: Satori + bots: Bot[] & Dict> + component(name: string, component: Component>, options?: Component.Options): () => void } export class Context extends cordis.Context { @@ -110,6 +111,25 @@ export class Context extends cordis.Context { // remove generic type to loosen the constraint static readonly Session = Session as new (bot: Bot, event: Partial) => Session + constructor(config?: any) { + super(config) + this.provide('http', undefined, true) + this.provide('satori', undefined, true) + this.plugin(HTTP, config.request) + this.plugin(file) + this.plugin(Satori) + } +} + +export class Satori extends cordis.Service { + static [cordis.Service.provide] = 'satori' + static [cordis.Service.immediate] = true + + constructor(ctx?: C) { + super(ctx) + ctx.mixin('satori', ['bots', 'component']) + } + public bots = new Proxy([], { get(target, prop) { if (prop in target || typeof prop === 'symbol') { @@ -126,16 +146,9 @@ export class Context extends cordis.Context { target.splice(bot, 1) return true }, - }) as Bot[] & Dict> + }) as Bot[] & Dict> - constructor(config: Context.Config = {}) { - super(config) - this.provide('http', undefined, true) - this.plugin(HTTP, config.request) - this.plugin(file) - } - - component(name: string, component: Component, options: Component.Options = {}) { + component(name: string, component: Component, options: Component.Options = {}) { const render: Component = async (attrs, children, session) => { if (options.session && session.type === 'send') { throw new Error('interactive components is not available outside sessions') @@ -143,28 +156,6 @@ export class Context extends cordis.Context { const result = await component(attrs, children, session) return session.transform(h.normalize(result)) } - return this.set('component:' + name, render) - } -} - -export namespace Context { - export interface Config { - request?: HTTP.Config - } - - export const Config: Config.Static = z.intersect([ - z.object({}), - ]) - - namespace Config { - export interface Static extends z {} - } - - export type Associate

= cordis.Context.Associate -} - -export abstract class Service extends cordis.Service { - [cordis.Service.setup]() { - this.ctx = new Context() as C + return this.ctx.set('component:' + name, render) } } diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index ab81e1e3..009887ad 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -27,8 +27,6 @@ export interface Session { quote: Message } -export interface Session extends Context.Associate<'session'> {} - export class Session { static counter = 0