From db0d5f51e4eb675aec1d5a8ba3600503bab9fb12 Mon Sep 17 00:00:00 2001 From: teidesu Date: Mon, 10 May 2021 17:30:05 +0300 Subject: [PATCH] feat(dispatcher): filtering for service messages, by chat type and for text-only msgs --- packages/client/src/types/messages/message.ts | 7 +++ packages/dispatcher/src/filters.ts | 43 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 692575e3..9a74b8ae 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -164,6 +164,13 @@ export class Message { return this.raw.out! } + /** + * Whether this message is a service message + */ + get isService(): boolean { + return this.raw._ === 'messageService' + } + /** * Multiple media messages with the same grouped ID * indicate an album or media group diff --git a/packages/dispatcher/src/filters.ts b/packages/dispatcher/src/filters.ts index 6f8b4897..ef3d5d7e 100644 --- a/packages/dispatcher/src/filters.ts +++ b/packages/dispatcher/src/filters.ts @@ -14,17 +14,19 @@ import { RawDocument, Sticker, TelegramClient, - User, Venue, + User, + Venue, Video, Voice, Poll, Invoice, Game, - WebPage + WebPage, } from '@mtcute/client' import { MaybeArray } from '@mtcute/core' import { ChatMemberUpdate } from './updates' import { ChosenInlineResult } from './updates/chosen-inline-result' +import { MessageAction } from '@mtcute/client/src/types/messages/message-action' /** * Type describing a primitive filter, which is a function taking some `Base` @@ -294,12 +296,12 @@ export namespace filters { msg.sender instanceof User && msg.sender.isBot /** - * Filter messages sent in broadcast channels + * Filter messages by chat type */ - export const channel: UpdateFilter< - Message, - { chat: Modify } - > = (msg) => msg.chat.type === 'channel' + export const chat = ( + type: T + ): UpdateFilter }> => (msg) => + msg.chat.type === type /** * Filter incoming messages. @@ -332,6 +334,33 @@ export namespace filters { { media: Exclude } > = (msg) => msg.media !== null + /** + * Filter text-only messages non-service messages + */ + export const text: UpdateFilter< + Message, + { + media: null + isService: false + } + > = (msg) => msg.media === null && !msg.isService + + /** + * Filter service messages + */ + export const service: UpdateFilter = (msg) => + msg.isService + + /** + * Filter service messages by action type + */ + export const action = ['type']>( + type: T + ): UpdateFilter< + Message, + { action: Extract } + > => (msg) => msg.action?.type === type + /** * Filter messages containing a photo */