From 36f67ce29d5f5ae20f2bede9dbc9dd1fe949bd50 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 26 Dec 2020 23:19:30 +0300 Subject: [PATCH] refactor(): reply switch with dynamic telegraf method call --- lib/decorators/core/index.ts | 3 +- .../{ => core}/inject-bot.decorator.ts | 2 +- lib/decorators/core/use.decorator.ts | 12 -- lib/decorators/index.ts | 1 - lib/decorators/listeners/action.decorator.ts | 14 +-- lib/decorators/listeners/cashtag.decorator.ts | 14 +-- lib/decorators/listeners/command.decorator.ts | 14 +-- lib/decorators/listeners/email.decorator.ts | 14 +-- .../listeners/game-query.decorator.ts | 6 +- lib/decorators/listeners/hashtag.decorator.ts | 14 +-- lib/decorators/listeners/hears.decorator.ts | 14 +-- lib/decorators/listeners/help.decorator.ts | 6 +- lib/decorators/listeners/index.ts | 2 + .../listeners/inline-query.decorator.ts | 14 +-- lib/decorators/listeners/mention.decorator.ts | 14 +-- .../{core => listeners}/on.decorator.ts | 14 +-- lib/decorators/listeners/phone.decorator.ts | 14 +-- .../listeners/settings.decorator.ts | 6 +- lib/decorators/listeners/start.decorator.ts | 6 +- .../listeners/text-link.decorator.ts | 16 +-- .../listeners/text-mention.decorator.ts | 16 +-- lib/decorators/listeners/url.decorator.ts | 14 +-- lib/decorators/listeners/use.decorator.ts | 12 ++ lib/enums/index.ts | 2 +- ...-type.enum.ts => listener-menthod.enum.ts} | 2 +- lib/enums/update-paramtypes.enum.ts | 5 + lib/telegraf.constants.ts | 4 +- lib/telegraf.explorer.ts | 115 ++---------------- lib/telegraf.metadata-accessor.ts | 20 ++- 29 files changed, 106 insertions(+), 284 deletions(-) rename lib/decorators/{ => core}/inject-bot.decorator.ts (66%) delete mode 100644 lib/decorators/core/use.decorator.ts rename lib/decorators/{core => listeners}/on.decorator.ts (56%) create mode 100644 lib/decorators/listeners/use.decorator.ts rename lib/enums/{listener-type.enum.ts => listener-menthod.enum.ts} (93%) create mode 100644 lib/enums/update-paramtypes.enum.ts diff --git a/lib/decorators/core/index.ts b/lib/decorators/core/index.ts index c7875e3..7d609ad 100644 --- a/lib/decorators/core/index.ts +++ b/lib/decorators/core/index.ts @@ -1,3 +1,2 @@ -export * from './on.decorator'; export * from './update.decorator'; -export * from './use.decorator'; +export * from './inject-bot.decorator'; diff --git a/lib/decorators/inject-bot.decorator.ts b/lib/decorators/core/inject-bot.decorator.ts similarity index 66% rename from lib/decorators/inject-bot.decorator.ts rename to lib/decorators/core/inject-bot.decorator.ts index 76ef284..f697bd7 100644 --- a/lib/decorators/inject-bot.decorator.ts +++ b/lib/decorators/core/inject-bot.decorator.ts @@ -1,4 +1,4 @@ import { Inject } from '@nestjs/common'; -import { TelegrafProvider } from '../telegraf.provider'; +import { TelegrafProvider } from '../../telegraf.provider'; export const InjectBot = (): ParameterDecorator => Inject(TelegrafProvider); diff --git a/lib/decorators/core/use.decorator.ts b/lib/decorators/core/use.decorator.ts deleted file mode 100644 index 8b393e6..0000000 --- a/lib/decorators/core/use.decorator.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SetMetadata } from '@nestjs/common'; -import { UPDATE_LISTENER_TYPE_METADATA } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; - -/** - * Registers a middleware. - * - * @see https://telegraf.js.org/#/?id=use - */ -export const Use = (): MethodDecorator => { - return SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Use); -}; diff --git a/lib/decorators/index.ts b/lib/decorators/index.ts index dd680b1..f6f8104 100644 --- a/lib/decorators/index.ts +++ b/lib/decorators/index.ts @@ -1,3 +1,2 @@ -export * from './inject-bot.decorator'; export * from './core'; export * from './listeners'; diff --git a/lib/decorators/listeners/action.decorator.ts b/lib/decorators/listeners/action.decorator.ts index 1a8a5a1..4fae6e7 100644 --- a/lib/decorators/listeners/action.decorator.ts +++ b/lib/decorators/listeners/action.decorator.ts @@ -1,14 +1,10 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; import { TelegrafActionTriggers } from '../../telegraf.types'; -import { ListenerType } from '../../enums/listener-type.enum'; - -export interface ActionOptions { - triggers: TelegrafActionTriggers; -} /** * Registers middleware for handling callback_data actions with regular expressions. @@ -17,9 +13,7 @@ export interface ActionOptions { */ export const Action = (triggers: TelegrafActionTriggers): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Action), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - triggers, - } as ActionOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Action), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [triggers]), ); }; diff --git a/lib/decorators/listeners/cashtag.decorator.ts b/lib/decorators/listeners/cashtag.decorator.ts index 8b4f859..a43dbcc 100644 --- a/lib/decorators/listeners/cashtag.decorator.ts +++ b/lib/decorators/listeners/cashtag.decorator.ts @@ -1,14 +1,10 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; import { TelegrafCashtag } from '../../telegraf.types'; -import { ListenerType } from '../../enums/listener-type.enum'; - -export interface CashtagOptions { - cashtag: TelegrafCashtag; -} /** * Cashtag handling. @@ -17,9 +13,7 @@ export interface CashtagOptions { */ export const Cashtag = (cashtag: TelegrafCashtag): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Cashtag), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - cashtag, - } as CashtagOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Cashtag), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [cashtag]), ); }; diff --git a/lib/decorators/listeners/command.decorator.ts b/lib/decorators/listeners/command.decorator.ts index 15d4d36..6c668d6 100644 --- a/lib/decorators/listeners/command.decorator.ts +++ b/lib/decorators/listeners/command.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafCommand } from '../../telegraf.types'; -export interface CommandOptions { - command: TelegrafCommand; -} - /** * Command handling. * @@ -17,9 +13,7 @@ export interface CommandOptions { */ export const Command = (command: TelegrafCommand): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Command), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - command: command, - } as CommandOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Command), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [command]), ); }; diff --git a/lib/decorators/listeners/email.decorator.ts b/lib/decorators/listeners/email.decorator.ts index 23aad1b..5658bdb 100644 --- a/lib/decorators/listeners/email.decorator.ts +++ b/lib/decorators/listeners/email.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafEmail } from '../../telegraf.types'; -export interface EmailOptions { - email: TelegrafEmail; -} - /** * Registers middleware for handling messages with email entity. * @@ -17,9 +13,7 @@ export interface EmailOptions { */ export const Email = (email: TelegrafEmail): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Email), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - email, - } as EmailOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Email), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [email]), ); }; diff --git a/lib/decorators/listeners/game-query.decorator.ts b/lib/decorators/listeners/game-query.decorator.ts index 898b1d5..525791c 100644 --- a/lib/decorators/listeners/game-query.decorator.ts +++ b/lib/decorators/listeners/game-query.decorator.ts @@ -1,6 +1,6 @@ import { SetMetadata } from '@nestjs/common'; -import { UPDATE_LISTENER_TYPE_METADATA } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { UPDATE_LISTENER_METHOD_METADATA } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; /** * Registers middleware for handling callback_data actions with game query. @@ -8,5 +8,5 @@ import { ListenerType } from '../../enums/listener-type.enum'; * @see https://telegraf.js.org/#/?id=inlinequery */ export const GameQuery = (): MethodDecorator => { - return SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.GameQuery); + return SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.GameQuery); }; diff --git a/lib/decorators/listeners/hashtag.decorator.ts b/lib/decorators/listeners/hashtag.decorator.ts index 4d344c6..012e723 100644 --- a/lib/decorators/listeners/hashtag.decorator.ts +++ b/lib/decorators/listeners/hashtag.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafHashtag } from '../../telegraf.types'; -export interface HashtagOptions { - hashtag: TelegrafHashtag; -} - /** * Hashtag handling. * @@ -17,9 +13,7 @@ export interface HashtagOptions { */ export const Hashtag = (hashtag: TelegrafHashtag): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Hashtag), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - hashtag, - } as HashtagOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Hashtag), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [hashtag]), ); }; diff --git a/lib/decorators/listeners/hears.decorator.ts b/lib/decorators/listeners/hears.decorator.ts index 760409a..8c2bfd2 100644 --- a/lib/decorators/listeners/hears.decorator.ts +++ b/lib/decorators/listeners/hears.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums'; +import { ListenerMethod } from '../../enums'; import { TelegrafHearsTriggers } from '../../telegraf.types'; -export interface HearsOptions { - triggers: TelegrafHearsTriggers; -} - /** * Registers middleware for handling text messages. * @@ -17,9 +13,7 @@ export interface HearsOptions { */ export const Hears = (triggers: TelegrafHearsTriggers): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Hears), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - triggers, - } as HearsOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Hears), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [triggers]), ); }; diff --git a/lib/decorators/listeners/help.decorator.ts b/lib/decorators/listeners/help.decorator.ts index 9909f1d..c7a17fb 100644 --- a/lib/decorators/listeners/help.decorator.ts +++ b/lib/decorators/listeners/help.decorator.ts @@ -1,6 +1,6 @@ import { SetMetadata } from '@nestjs/common'; -import { UPDATE_LISTENER_TYPE_METADATA } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { UPDATE_LISTENER_METHOD_METADATA } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; /** * Handler for /help command. @@ -8,5 +8,5 @@ import { ListenerType } from '../../enums/listener-type.enum'; * @see https://telegraf.js.org/#/?id=help */ export const Help = (): MethodDecorator => { - return SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Help); + return SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Help); }; diff --git a/lib/decorators/listeners/index.ts b/lib/decorators/listeners/index.ts index 2108a90..a332f5a 100644 --- a/lib/decorators/listeners/index.ts +++ b/lib/decorators/listeners/index.ts @@ -1,3 +1,5 @@ +export * from './on.decorator'; +export * from './use.decorator'; export * from './action.decorator'; export * from './cashtag.decorator'; export * from './command.decorator'; diff --git a/lib/decorators/listeners/inline-query.decorator.ts b/lib/decorators/listeners/inline-query.decorator.ts index f9a4efd..641af40 100644 --- a/lib/decorators/listeners/inline-query.decorator.ts +++ b/lib/decorators/listeners/inline-query.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafInlineQueryTriggers } from '../../telegraf.types'; -export interface InlineQueryOptions { - triggers: TelegrafInlineQueryTriggers; -} - /** * Registers middleware for handling inline_query actions with regular expressions. * @@ -19,9 +15,7 @@ export const InlineQuery = ( triggers: TelegrafInlineQueryTriggers, ): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.InlineQuery), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - triggers, - } as InlineQueryOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.InlineQuery), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [triggers]), ); }; diff --git a/lib/decorators/listeners/mention.decorator.ts b/lib/decorators/listeners/mention.decorator.ts index db25ff8..9eaeaee 100644 --- a/lib/decorators/listeners/mention.decorator.ts +++ b/lib/decorators/listeners/mention.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafMention } from '../../telegraf.types'; -export interface MentionOptions { - mention: TelegrafMention; -} - /** * Mention handling. * @@ -17,9 +13,7 @@ export interface MentionOptions { */ export const Mention = (mention: TelegrafMention): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Mention), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - mention, - } as MentionOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Mention), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [mention]), ); }; diff --git a/lib/decorators/core/on.decorator.ts b/lib/decorators/listeners/on.decorator.ts similarity index 56% rename from lib/decorators/core/on.decorator.ts rename to lib/decorators/listeners/on.decorator.ts index 17b052b..c467e51 100644 --- a/lib/decorators/core/on.decorator.ts +++ b/lib/decorators/listeners/on.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafUpdateType } from '../../telegraf.types'; -export interface OnOptions { - updateTypes: TelegrafUpdateType; -} - /** * Registers middleware for provided update type. * @@ -17,9 +13,7 @@ export interface OnOptions { */ export const On = (updateTypes: TelegrafUpdateType): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.On), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - updateTypes, - } as OnOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.On), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [updateTypes]), ); }; diff --git a/lib/decorators/listeners/phone.decorator.ts b/lib/decorators/listeners/phone.decorator.ts index f327762..b217804 100644 --- a/lib/decorators/listeners/phone.decorator.ts +++ b/lib/decorators/listeners/phone.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafPhone } from '../../telegraf.types'; -export interface PhoneOptions { - phone: TelegrafPhone; -} - /** * Phone number handling. * @@ -17,9 +13,7 @@ export interface PhoneOptions { */ export const Phone = (phone: TelegrafPhone): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Phone), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - phone, - } as PhoneOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Phone), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [phone]), ); }; diff --git a/lib/decorators/listeners/settings.decorator.ts b/lib/decorators/listeners/settings.decorator.ts index 8c25331..d53048c 100644 --- a/lib/decorators/listeners/settings.decorator.ts +++ b/lib/decorators/listeners/settings.decorator.ts @@ -1,6 +1,6 @@ import { SetMetadata } from '@nestjs/common'; -import { UPDATE_LISTENER_TYPE_METADATA } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { UPDATE_LISTENER_METHOD_METADATA } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; /** * Handler for /settings command. @@ -8,5 +8,5 @@ import { ListenerType } from '../../enums/listener-type.enum'; * @see https://telegraf.js.org/#/?id=settings */ export const Settings = (): MethodDecorator => { - return SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Settings); + return SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Settings); }; diff --git a/lib/decorators/listeners/start.decorator.ts b/lib/decorators/listeners/start.decorator.ts index 6de6e55..ec13aa0 100644 --- a/lib/decorators/listeners/start.decorator.ts +++ b/lib/decorators/listeners/start.decorator.ts @@ -1,6 +1,6 @@ import { SetMetadata } from '@nestjs/common'; -import { UPDATE_LISTENER_TYPE_METADATA } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { UPDATE_LISTENER_METHOD_METADATA } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; /** * Handler for /start command. @@ -8,5 +8,5 @@ import { ListenerType } from '../../enums/listener-type.enum'; * @see https://telegraf.js.org/#/?id=start */ export const Start = (): MethodDecorator => { - return SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Start); + return SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Start); }; diff --git a/lib/decorators/listeners/text-link.decorator.ts b/lib/decorators/listeners/text-link.decorator.ts index cfefc96..9f7fa44 100644 --- a/lib/decorators/listeners/text-link.decorator.ts +++ b/lib/decorators/listeners/text-link.decorator.ts @@ -1,25 +1,19 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafTextLink } from '../../telegraf.types'; -export interface TextLinkOptions { - link: TelegrafTextLink; -} - /** * Registers middleware for handling messages with text_link entity. * * @see https://telegraf.js.org/#/?id=telegraf-textlink */ -export const TetxLink = (link: TelegrafTextLink): MethodDecorator => { +export const TextLink = (link: TelegrafTextLink): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.TextLink), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - link, - } as TextLinkOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.TextLink), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [link]), ); }; diff --git a/lib/decorators/listeners/text-mention.decorator.ts b/lib/decorators/listeners/text-mention.decorator.ts index fc8cecc..0791ab6 100644 --- a/lib/decorators/listeners/text-mention.decorator.ts +++ b/lib/decorators/listeners/text-mention.decorator.ts @@ -1,25 +1,19 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafTextMention } from '../../telegraf.types'; -export interface TextMentionOptions { - mention: TelegrafTextMention; -} - /** * Registers middleware for handling messages with text_mention entity. * * @see https://telegraf.js.org/#/?id=telegraf-textlink */ -export const TetxMention = (mention: TelegrafTextMention): MethodDecorator => { +export const TextMention = (mention: TelegrafTextMention): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.TextMention), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - mention, - } as TextMentionOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.TextMention), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [mention]), ); }; diff --git a/lib/decorators/listeners/url.decorator.ts b/lib/decorators/listeners/url.decorator.ts index b104dd2..04f9704 100644 --- a/lib/decorators/listeners/url.decorator.ts +++ b/lib/decorators/listeners/url.decorator.ts @@ -1,15 +1,11 @@ import { applyDecorators, SetMetadata } from '@nestjs/common'; import { UPDATE_LISTENER_OPTIONS_METADATA, - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, } from '../../telegraf.constants'; -import { ListenerType } from '../../enums/listener-type.enum'; +import { ListenerMethod } from '../../enums'; import { TelegrafUrl } from '../../telegraf.types'; -export interface UrlOptions { - url: TelegrafUrl; -} - /** * Registers middleware for handling messages with url entity. * @@ -17,9 +13,7 @@ export interface UrlOptions { */ export const Url = (url: TelegrafUrl): MethodDecorator => { return applyDecorators( - SetMetadata(UPDATE_LISTENER_TYPE_METADATA, ListenerType.Url), - SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, { - url, - } as UrlOptions), + SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Url), + SetMetadata(UPDATE_LISTENER_OPTIONS_METADATA, [url]), ); }; diff --git a/lib/decorators/listeners/use.decorator.ts b/lib/decorators/listeners/use.decorator.ts new file mode 100644 index 0000000..84c7d2c --- /dev/null +++ b/lib/decorators/listeners/use.decorator.ts @@ -0,0 +1,12 @@ +import { SetMetadata } from '@nestjs/common'; +import { UPDATE_LISTENER_METHOD_METADATA } from '../../telegraf.constants'; +import { ListenerMethod } from '../../enums'; + +/** + * Registers a middleware. + * + * @see https://telegraf.js.org/#/?id=use + */ +export const Use = (): MethodDecorator => { + return SetMetadata(UPDATE_LISTENER_METHOD_METADATA, ListenerMethod.Use); +}; diff --git a/lib/enums/index.ts b/lib/enums/index.ts index 1f890a3..5f145a0 100644 --- a/lib/enums/index.ts +++ b/lib/enums/index.ts @@ -1 +1 @@ -export * from './listener-type.enum'; +export * from './listener-menthod.enum'; diff --git a/lib/enums/listener-type.enum.ts b/lib/enums/listener-menthod.enum.ts similarity index 93% rename from lib/enums/listener-type.enum.ts rename to lib/enums/listener-menthod.enum.ts index 932382f..05a55eb 100644 --- a/lib/enums/listener-type.enum.ts +++ b/lib/enums/listener-menthod.enum.ts @@ -1,4 +1,4 @@ -export enum ListenerType { +export enum ListenerMethod { Use = 'use', On = 'on', Hears = 'hears', diff --git a/lib/enums/update-paramtypes.enum.ts b/lib/enums/update-paramtypes.enum.ts new file mode 100644 index 0000000..e5a3303 --- /dev/null +++ b/lib/enums/update-paramtypes.enum.ts @@ -0,0 +1,5 @@ +export enum UpdateParamtypes { + CONTEXT, + NEXT, + MESSAGE, +} diff --git a/lib/telegraf.constants.ts b/lib/telegraf.constants.ts index 6bba348..ce4f7f1 100644 --- a/lib/telegraf.constants.ts +++ b/lib/telegraf.constants.ts @@ -1,6 +1,8 @@ export const TELEGRAF_MODULE_OPTIONS = 'TELEGRAF_MODULE_OPTIONS'; export const UPDATE_METADATA = 'UPDATE_METADATA'; -export const UPDATE_LISTENER_TYPE_METADATA = 'UPDATE_LISTENER_TYPE_METADATA'; +export const UPDATE_LISTENER_METHOD_METADATA = + 'UPDATE_LISTENER_METHOD_METADATA'; export const UPDATE_LISTENER_OPTIONS_METADATA = 'UPDATE_LISTENER_OPTIONS_METADATA'; +export const UPDATE_ARGS_METADATA = 'UPDATE_ARGS_METADATA'; diff --git a/lib/telegraf.explorer.ts b/lib/telegraf.explorer.ts index 0d2751b..6d9f427 100644 --- a/lib/telegraf.explorer.ts +++ b/lib/telegraf.explorer.ts @@ -1,24 +1,8 @@ import { Injectable, OnModuleInit } from '@nestjs/common'; -import { DiscoveryService, ModuleRef } from '@nestjs/core'; +import { DiscoveryService } from '@nestjs/core'; import { MetadataScanner } from '@nestjs/core/metadata-scanner'; import { TelegrafMetadataAccessor } from './telegraf.metadata-accessor'; import { TelegrafProvider } from './telegraf.provider'; -import { ListenerType } from './enums'; -import { - ActionOptions, - CashtagOptions, - CommandOptions, - EmailOptions, - HashtagOptions, - HearsOptions, - InlineQueryOptions, - MentionOptions, - OnOptions, - PhoneOptions, - TextLinkOptions, - TextMentionOptions, - UrlOptions, -} from './decorators'; import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper'; @Injectable() @@ -35,7 +19,7 @@ export class TelegrafExplorer implements OnModuleInit { } explore(): void { - const updateClasses = this.filterUpdateClass(); + const updateClasses = this.filterUpdateClasses(); updateClasses.forEach((wrapper) => { const { instance } = wrapper; @@ -49,7 +33,7 @@ export class TelegrafExplorer implements OnModuleInit { }); } - private filterUpdateClass(): InstanceWrapper[] { + private filterUpdateClasses(): InstanceWrapper[] { return this.discoveryService .getProviders() .filter((wrapper) => wrapper.instance) @@ -65,97 +49,12 @@ export class TelegrafExplorer implements OnModuleInit { const methodRef = instance[methodKey]; const middlewareFn = methodRef.bind(instance); - const listenerType = this.metadataAccessor.getListenerType(methodRef); - if (!listenerType) return; + const listenerMethod = this.metadataAccessor.getListenerMethod(methodRef); + if (!listenerMethod) return; const listenerOptions = this.metadataAccessor.getListenerOptions(methodRef); - switch (listenerType) { - case ListenerType.On: { - const { updateTypes } = listenerOptions as OnOptions; - this.telegraf.on(updateTypes, middlewareFn); - break; - } - case ListenerType.Use: { - this.telegraf.use(middlewareFn); - break; - } - case ListenerType.Start: { - this.telegraf.start(middlewareFn); - break; - } - case ListenerType.Help: { - this.telegraf.help(middlewareFn); - break; - } - case ListenerType.Settings: { - this.telegraf.settings(middlewareFn); - break; - } - case ListenerType.Hears: { - const { triggers } = listenerOptions as HearsOptions; - this.telegraf.hears(triggers, middlewareFn); - break; - } - case ListenerType.Command: { - const { command } = listenerOptions as CommandOptions; - this.telegraf.command(command, middlewareFn); - break; - } - case ListenerType.Action: { - const { triggers } = listenerOptions as ActionOptions; - this.telegraf.action(triggers, middlewareFn); - break; - } - case ListenerType.Mention: { - const { mention } = listenerOptions as MentionOptions; - this.telegraf.mention(mention, middlewareFn); - break; - } - case ListenerType.Phone: { - const { phone } = listenerOptions as PhoneOptions; - this.telegraf.phone(phone, middlewareFn); - break; - } - case ListenerType.Hashtag: { - const { hashtag } = listenerOptions as HashtagOptions; - this.telegraf.hashtag(hashtag, middlewareFn); - break; - } - case ListenerType.Cashtag: { - const { cashtag } = listenerOptions as CashtagOptions; - this.telegraf.cashtag(cashtag, middlewareFn); - break; - } - case ListenerType.Email: { - const { email } = listenerOptions as EmailOptions; - this.telegraf.email(email, middlewareFn); - break; - } - case ListenerType.Url: { - const { url } = listenerOptions as UrlOptions; - this.telegraf.url(url, middlewareFn); - break; - } - case ListenerType.TextLink: { - const { link } = listenerOptions as TextLinkOptions; - this.telegraf.textLink(link, middlewareFn); - break; - } - case ListenerType.TextMention: { - const { mention } = listenerOptions as TextMentionOptions; - this.telegraf.textMention(mention, middlewareFn); - break; - } - case ListenerType.InlineQuery: { - const { triggers } = listenerOptions as InlineQueryOptions; - this.telegraf.inlineQuery(triggers, middlewareFn); - break; - } - case ListenerType.GameQuery: { - this.telegraf.gameQuery(middlewareFn); - break; - } - } + // NOTE: Disable spread operator checking because of error: "Expected at least 1 arguments, but got 1 or more." + (this.telegraf as any)[listenerMethod](...listenerOptions, middlewareFn); } } diff --git a/lib/telegraf.metadata-accessor.ts b/lib/telegraf.metadata-accessor.ts index e79e9e1..bb86898 100644 --- a/lib/telegraf.metadata-accessor.ts +++ b/lib/telegraf.metadata-accessor.ts @@ -1,31 +1,25 @@ import { Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { - UPDATE_LISTENER_TYPE_METADATA, + UPDATE_LISTENER_METHOD_METADATA, UPDATE_METADATA, UPDATE_LISTENER_OPTIONS_METADATA, } from './telegraf.constants'; -import { ListenerType } from './enums'; +import { ListenerMethod } from './enums'; @Injectable() export class TelegrafMetadataAccessor { constructor(private readonly reflector: Reflector) {} isUpdate(target: Function): boolean { - return !!this.reflector.get(UPDATE_METADATA, target); + return !!this.reflector.get(UPDATE_METADATA, target); } - getListenerType(target: Function): ListenerType | undefined { - return this.reflector.get( - UPDATE_LISTENER_TYPE_METADATA, - target, - ); + getListenerMethod(target: Function): ListenerMethod | undefined { + return this.reflector.get(UPDATE_LISTENER_METHOD_METADATA, target); } - getListenerOptions(target: Function): unknown | undefined { - return this.reflector.get( - UPDATE_LISTENER_OPTIONS_METADATA, - target, - ); + getListenerOptions(target: Function): unknown[] { + return this.reflector.get(UPDATE_LISTENER_OPTIONS_METADATA, target) || []; } }