diff --git a/ts/smartuniverse.classes.reactionrequest.ts b/ts/smartuniverse.classes.reactionrequest.ts index e027985..e2ebfa8 100644 --- a/ts/smartuniverse.classes.reactionrequest.ts +++ b/ts/smartuniverse.classes.reactionrequest.ts @@ -14,7 +14,11 @@ export interface ICombinatorPayload { diff --git a/ts/smartuniverse.classes.reactionresponse.ts b/ts/smartuniverse.classes.reactionresponse.ts index 9343d59..e8263eb 100644 --- a/ts/smartuniverse.classes.reactionresponse.ts +++ b/ts/smartuniverse.classes.reactionresponse.ts @@ -6,26 +6,54 @@ import { ClientUniverseChannel } from './smartuniverse.classes.clientuniversecha import { UniverseMessage } from './smartuniverse.classes.universemessage'; import { ClientUniverseMessage } from './smartuniverse.classes.clientuniversemessage'; -export interface IReactionResponseConstructorOptions { +export type TReactionResponseFuncDef = (dataArg: T['request']) => Promise; + +export interface IReactionResponseConstructorOptions< + T extends plugins.typedrequestInterfaces.ITypedRequest +> { method: T['method']; channels: Array; + funcDef: TReactionResponseFuncDef; } - export class ReactionResponse { public method: T['method']; public channels = new plugins.lik.Objectmap(); + public funcDef: TReactionResponseFuncDef; constructor(optionsArg: IReactionResponseConstructorOptions) { + this.method = optionsArg.method; this.channels.addArray(optionsArg.channels); + this.funcDef = optionsArg.funcDef; for (const channel of this.channels.getArray()) { channel.subscribe(messageArg => { - this.processMessageForReaction(messageArg); + this.processMessageForReaction(channel, messageArg); }); } } - private processMessageForReaction(messageArg: UniverseMessage> | ClientUniverseMessage>) { - + private async processMessageForReaction( + channelArg: UniverseChannel | ClientUniverseChannel, + messageArg: + | UniverseMessage> + | ClientUniverseMessage> + ) { + if ( + messageArg.messageText === 'reactionRequest' && + messageArg.payload.typedRequestPayload.method === this.method + ) { + const response: T['response'] = await this.funcDef(messageArg.payload.typedRequestPayload.request); + const payload: ICombinatorPayload = { + ...messageArg.payload, + typedRequestPayload: { + ...messageArg.payload.typedRequestPayload, + response + } + }; + channelArg.sendMessage({ + messageText: 'reactionResponse', + payload + }); + } } }