diff --git a/src/user/contact.ts b/src/user/contact.ts index 3c2b22f7607e7316e5d0e4c5673ad224c55750c5..0c34421a5453cda38e76217f89aff27c919411f5 100644 --- a/src/user/contact.ts +++ b/src/user/contact.ts @@ -320,11 +320,12 @@ export class Contact extends Accessory implements Sayable { return `Contact<${identity}>` } - public async say (text: string) : Promise - public async say (contact: Contact) : Promise - public async say (file: FileBox) : Promise - public async say (mini: MiniProgram) : Promise - public async say (url: UrlLink) : Promise + public say (text: string) : Promise + public say (message: Message) : Promise + public say (contact: Contact) : Promise + public say (file: FileBox) : Promise + public say (mini: MiniProgram) : Promise + public say (url: UrlLink) : Promise /** * > Tips: @@ -385,12 +386,18 @@ export class Contact extends Accessory implements Sayable { */ public async say ( something: string + | Message | Contact | FileBox | MiniProgram | UrlLink ): Promise { log.verbose('Contact', 'say(%s)', something) + + if (something instanceof Message) { + return something.forward(this) + } + let msgId: string | void if (typeof something === 'string') { /** diff --git a/src/user/message.ts b/src/user/message.ts index 3413429f253eeeff211071626bbf38caaae5970c..e6bade322ca69b7bd737552655cddc8531e9d7f2 100644 --- a/src/user/message.ts +++ b/src/user/message.ts @@ -416,13 +416,14 @@ export class Message extends Accessory implements Sayable { } } - public async say (text: string, mention?: Contact | Contact[]) : Promise - public async say (contact: Contact) : Promise - public async say (file: FileBox) : Promise - public async say (url: UrlLink) : Promise - public async say (mini: MiniProgram) : Promise - - public async say (...args: never[]): Promise + public say (text: string, mention?: Contact | Contact[]) : Promise + public say (message: Message) : Promise + public say (contact: Contact) : Promise + public say (file: FileBox) : Promise + public say (url: UrlLink) : Promise + public say (mini: MiniProgram) : Promise + + public say (...args: never[]): Promise /** * Reply a Text or Media File message to the sender. * > Tips: @@ -501,7 +502,12 @@ export class Message extends Accessory implements Sayable { * .start() */ public async say ( - textOrContactOrFileOrUrlOrMini : string | Contact | FileBox | UrlLink | MiniProgram, + textOrContactOrFileOrUrlOrMini : string + | Message + | Contact + | FileBox + | UrlLink + | MiniProgram, ): Promise { log.verbose('Message', 'say(%s)', textOrContactOrFileOrUrlOrMini) @@ -511,14 +517,24 @@ export class Message extends Accessory implements Sayable { const room = this.room() let conversationId: string + let conversation if (room) { + conversation = room conversationId = room.id } else if (from) { + conversation = from conversationId = from.id } else { throw new Error('neither room nor from?') } + /** + * Support say a existing message: just forward it. + */ + if (textOrContactOrFileOrUrlOrMini instanceof Message) { + return textOrContactOrFileOrUrlOrMini.forward(conversation) + } + let msgId: void | string if (typeof textOrContactOrFileOrUrlOrMini === 'string') { /** diff --git a/src/user/room.ts b/src/user/room.ts index ddd0647d6205ad002017db8adf112dd1c8653159..28f9ddf5114a474ee7282297a25854b995547251 100644 --- a/src/user/room.ts +++ b/src/user/room.ts @@ -378,6 +378,7 @@ export class Room extends Accessory implements Sayable { } public say (text: string) : Promise + public say (message: Message) : Promise public say (text: string, ...mentionList: Contact[]) : Promise public say (textList: TemplateStringsArray, ...varList: any[]) : Promise public say (file: FileBox) : Promise @@ -458,6 +459,7 @@ export class Room extends Accessory implements Sayable { */ public async say ( something : string + | Message | Contact | FileBox | MiniProgram @@ -474,12 +476,20 @@ export class Room extends Accessory implements Sayable { let text: string let msgId: string | void + if (something instanceof Message) { + return something.forward(this) + } + + function isTemplateStringArray (tsa: any): tsa is TemplateStringsArray { + return tsa instanceof Array + } + /** * * 0. TemplateStringArray * */ - if (something instanceof Array) { + if (isTemplateStringArray(something)) { const msgId = await this.sayTemplateStringsArray( something as TemplateStringsArray, ...varList,