diff --git a/packages/dispatcher/scripts/update-types.txt b/packages/dispatcher/scripts/update-types.txt index 0b05ccc8..b465e796 100644 --- a/packages/dispatcher/scripts/update-types.txt +++ b/packages/dispatcher/scripts/update-types.txt @@ -3,6 +3,7 @@ raw: RawUpdate = IGNORE new_message = Message edit_message = Message +delete_message = DeleteMessageUpdate chat_member: ChatMemberUpdate = ChatMemberUpdate inline_query = InlineQuery chosen_inline_result = ChosenInlineResult diff --git a/packages/dispatcher/src/builders.ts b/packages/dispatcher/src/builders.ts index a7f4bb73..9bc0f871 100644 --- a/packages/dispatcher/src/builders.ts +++ b/packages/dispatcher/src/builders.ts @@ -4,6 +4,7 @@ import { RawUpdateHandler, NewMessageHandler, EditMessageHandler, + DeleteMessageHandler, ChatMemberUpdateHandler, InlineQueryHandler, ChosenInlineResultHandler, @@ -22,6 +23,7 @@ import { PollUpdate } from './updates/poll-update' import { PollVoteUpdate } from './updates/poll-vote' import { UserStatusUpdate } from './updates/user-status-update' import { UserTypingUpdate } from './updates/user-typing-update' +import { DeleteMessageUpdate } from './updates/delete-message-update' function _create( type: T['type'], @@ -123,6 +125,36 @@ export namespace handlers { return _create('edit_message', filter, handler) } + /** + * Create a delete message handler + * + * @param handler Delete message handler + */ + export function deleteMessage( + handler: DeleteMessageHandler['callback'] + ): DeleteMessageHandler + + /** + * Create a delete message handler with a filter + * + * @param filter Update filter + * @param handler Delete message handler + */ + export function deleteMessage( + filter: UpdateFilter, + handler: DeleteMessageHandler< + filters.Modify + >['callback'] + ): DeleteMessageHandler + + /** @internal */ + export function deleteMessage( + filter: any, + handler?: any + ): DeleteMessageHandler { + return _create('delete_message', filter, handler) + } + /** * Create a chat member update handler * diff --git a/packages/dispatcher/src/dispatcher.ts b/packages/dispatcher/src/dispatcher.ts index ff9ab167..1d49f5d9 100644 --- a/packages/dispatcher/src/dispatcher.ts +++ b/packages/dispatcher/src/dispatcher.ts @@ -20,6 +20,7 @@ import { RawUpdateHandler, NewMessageHandler, EditMessageHandler, + DeleteMessageHandler, ChatMemberUpdateHandler, InlineQueryHandler, ChosenInlineResultHandler, @@ -38,6 +39,7 @@ import { PollUpdate } from './updates/poll-update' import { PollVoteUpdate } from './updates/poll-vote' import { UserStatusUpdate } from './updates/user-status-update' import { UserTypingUpdate } from './updates/user-typing-update' +import { DeleteMessageUpdate } from './updates/delete-message-update' const noop = () => {} @@ -77,6 +79,10 @@ const userTypingParser: UpdateParser = [ 'user_typing', (client, upd) => new UserTypingUpdate(client, upd as any), ] +const deleteMessageParser: UpdateParser = [ + 'delete_message', + (client, upd) => new DeleteMessageUpdate(client, upd as any) +] const PARSERS: Partial< Record<(tl.TypeUpdate | tl.TypeMessage)['_'], UpdateParser> @@ -117,6 +123,8 @@ const PARSERS: Partial< updateChannelUserTyping: userTypingParser, updateChatUserTyping: userTypingParser, updateUserTyping: userTypingParser, + updateDeleteChannelMessages: deleteMessageParser, + updateDeleteMessages: deleteMessageParser, } /** @@ -503,6 +511,38 @@ export class Dispatcher { this._addKnownHandler('editMessage', filter, handler, group) } + /** + * Register a delete message handler without any filters + * + * @param handler Delete message handler + * @param group Handler group index + * @internal + */ + onDeleteMessage( + handler: DeleteMessageHandler['callback'], + group?: number + ): void + + /** + * Register a delete message handler with a filter + * + * @param filter Update filter + * @param handler Delete message handler + * @param group Handler group index + */ + onDeleteMessage( + filter: UpdateFilter, + handler: DeleteMessageHandler< + filters.Modify + >['callback'], + group?: number + ): void + + /** @internal */ + onDeleteMessage(filter: any, handler?: any, group?: number): void { + this._addKnownHandler('deleteMessage', filter, handler, group) + } + /** * Register a chat member update handler without any filters * diff --git a/packages/dispatcher/src/handler.ts b/packages/dispatcher/src/handler.ts index 71bb5c2d..63152067 100644 --- a/packages/dispatcher/src/handler.ts +++ b/packages/dispatcher/src/handler.ts @@ -15,6 +15,7 @@ import { PollUpdate } from './updates/poll-update' import { PollVoteUpdate } from './updates/poll-vote' import { UserStatusUpdate } from './updates/user-status-update' import { UserTypingUpdate } from './updates/user-typing-update' +import { DeleteMessageUpdate } from './updates/delete-message-update' interface BaseUpdateHandler { type: Type @@ -57,6 +58,10 @@ export type EditMessageHandler = ParsedUpdateHandler< 'edit_message', T > +export type DeleteMessageHandler = ParsedUpdateHandler< + 'delete_message', + T +> export type ChatMemberUpdateHandler = ParsedUpdateHandler< 'chat_member', T @@ -90,6 +95,7 @@ export type UpdateHandler = | RawUpdateHandler | NewMessageHandler | EditMessageHandler + | DeleteMessageHandler | ChatMemberUpdateHandler | InlineQueryHandler | ChosenInlineResultHandler diff --git a/packages/dispatcher/src/updates/delete-message-update.ts b/packages/dispatcher/src/updates/delete-message-update.ts new file mode 100644 index 00000000..b52034c7 --- /dev/null +++ b/packages/dispatcher/src/updates/delete-message-update.ts @@ -0,0 +1,38 @@ +import { tl } from '@mtcute/tl' +import { makeInspectable } from '@mtcute/client/src/types/utils' +import { MAX_CHANNEL_ID } from '@mtcute/core' +import { TelegramClient } from '@mtcute/client' + +/** + * One or more messages were deleted + */ +export class DeleteMessageUpdate { + readonly client: TelegramClient + readonly raw: tl.RawUpdateDeleteMessages | tl.RawUpdateDeleteChannelMessages + + constructor( + client: TelegramClient, + raw: tl.RawUpdateDeleteMessages | tl.RawUpdateDeleteChannelMessages + ) { + this.client = client + this.raw = raw + } + + /** + * IDs of the messages which were deleted + */ + get messageIds(): number[] { + return this.raw.messages + } + + /** + * Marked ID of the channel where the messages were deleted + */ + get channelId(): number | null { + return this.raw._ === 'updateDeleteChannelMessages' + ? MAX_CHANNEL_ID - this.raw.channelId + : null + } +} + +makeInspectable(DeleteMessageUpdate)