feat(dispatcher): support more types in regex filter, inline filter for callback queries

This commit is contained in:
teidesu 2021-05-05 02:05:27 +03:00
parent 1fb7057866
commit 00c308dca7
2 changed files with 55 additions and 6 deletions

View file

@ -129,6 +129,24 @@ export class CallbackQuery {
return this.raw.data ?? null
}
private _dataStr?: string
/**
* Data that was contained in the callback button, if any,
* parsed as a UTF8 string
*
* Note that this field is defined by the client, and a bad
* client can send arbitrary data in this field.
*/
get dataStr(): string | null {
if (!this.raw.data) return null
if (!this._dataStr) {
this._dataStr = this.raw.data.toString('utf8')
}
return this._dataStr
}
/**
* In case this message was from {@link InputInlineResultGame},
* or the button was {@link BotKeyboard.game},

View file

@ -1,9 +1,11 @@
import {
Audio,
CallbackQuery,
Chat,
Contact,
Dice,
Document,
InlineQuery,
LiveLocation,
Location,
MaybeAsync,
@ -20,6 +22,7 @@ import { Game } from '@mtcute/client/src/types/media/game'
import { WebPage } from '@mtcute/client/src/types/media/web-page'
import { MaybeArray } from '@mtcute/core'
import { ChatMemberUpdate } from './updates'
import { ChosenInlineResult } from './updates/chosen-inline-result'
/**
* Type describing a primitive filter, which is a function taking some `Base`
@ -482,20 +485,36 @@ export namespace filters {
// todo: more filters, see https://github.com/pyrogram/pyrogram/blob/701c1cde07af779ab18dbf79a3e626f04fa5d5d2/pyrogram/filters.py#L191
/**
* Filter messages that match a given regular expression.
* Filter objects that match a given regular expression
* - for `Message`, `Message.text` is used
* - for `InlineQuery`, `InlineQuery.query` is used
* - for {@link ChosenInlineResult}, {@link ChosenInlineResult.id} is used
* - for `CallbackQuery`, `CallbackQuery.dataStr`
*
* When a regex matches, the match array is stored in a
* type-safe extension field `.match` of the {@link Message} object
* type-safe extension field `.match` of the object
*
* @param regex Regex to be matched
*/
export const regex = (
regex: RegExp
): UpdateFilter<Message, { match: RegExpMatchArray }> => (msg) => {
const m = msg.text.match(regex)
): UpdateFilter<
Message | InlineQuery | ChosenInlineResult | CallbackQuery,
{ match: RegExpMatchArray }
> => (obj) => {
let m: RegExpMatchArray | null = null
if (obj instanceof Message) {
m = obj.text.match(regex)
} else if (obj instanceof InlineQuery) {
m = obj.query.match(regex)
} else if (obj instanceof ChosenInlineResult) {
m = obj.id.match(regex)
} else if (obj instanceof CallbackQuery) {
if (obj.raw.data) m = obj.dataStr!.match(regex)
}
if (m) {
;(msg as Message & { match: RegExpMatchArray }).match = m
;(obj as any).match = m
return true
}
return false
@ -595,5 +614,17 @@ export namespace filters {
* Create a filter for {@link ChatMemberUpdate} for updates
* regarding current user
*/
export const chatMemberSelf: UpdateFilter<ChatMemberUpdate, { isSelf: true }> = (upd) => upd.isSelf
export const chatMemberSelf: UpdateFilter<
ChatMemberUpdate,
{ isSelf: true }
> = (upd) => upd.isSelf
/**
* Create a filter for callback queries that
* originated from an inline message
*/
export const callbackInline: UpdateFilter<
CallbackQuery,
{ isInline: true }
> = (q) => q.isInline
}