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 */