From df84137391d8dabec4b957684ab9685815c1ce30 Mon Sep 17 00:00:00 2001 From: teidesu Date: Sun, 9 May 2021 18:29:33 +0300 Subject: [PATCH] feat(client): get messages inside message groups --- packages/client/src/client.ts | 9 ++++++ .../src/methods/messages/get-message-group.ts | 31 +++++++++++++++++++ packages/client/src/types/messages/message.ts | 14 +++++++++ 3 files changed, 54 insertions(+) create mode 100644 packages/client/src/methods/messages/get-message-group.ts diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index f856ad11..937a226c 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -67,6 +67,7 @@ import { editMessage } from './methods/messages/edit-message' import { _findMessageInUpdate } from './methods/messages/find-in-update' import { forwardMessages } from './methods/messages/forward-messages' import { getHistory } from './methods/messages/get-history' +import { getMessageGroup } from './methods/messages/get-message-group' import { getMessages } from './methods/messages/get-messages' import { iterHistory } from './methods/messages/iter-history' import { _parseEntities } from './methods/messages/parse-entities' @@ -1496,6 +1497,13 @@ export interface TelegramClient extends BaseTelegramClient { reverse?: boolean } ): Promise + /** + * Get all messages inside of a message group + * + * @param chatId Chat ID + * @param message ID of one of the messages in the group + */ + getMessageGroup(chatId: InputPeerLike, message: number): Promise /** * Get a single message in chat by its ID * @@ -2555,6 +2563,7 @@ export class TelegramClient extends BaseTelegramClient { protected _findMessageInUpdate = _findMessageInUpdate forwardMessages = forwardMessages getHistory = getHistory + getMessageGroup = getMessageGroup getMessages = getMessages iterHistory = iterHistory protected _parseEntities = _parseEntities diff --git a/packages/client/src/methods/messages/get-message-group.ts b/packages/client/src/methods/messages/get-message-group.ts new file mode 100644 index 00000000..a044f4b5 --- /dev/null +++ b/packages/client/src/methods/messages/get-message-group.ts @@ -0,0 +1,31 @@ +import { TelegramClient } from '../../client' +import { InputPeerLike, MtCuteArgumentError, Message } from '../../types' + +/** + * Get all messages inside of a message group + * + * @param chatId Chat ID + * @param message ID of one of the messages in the group + * @internal + */ +export async function getMessageGroup( + this: TelegramClient, + chatId: InputPeerLike, + message: number +): Promise { + // awesome hack stolen from pyrogram + // groups have no more than 10 items + + const ids: number[] = [] + for (let i = Math.max(message - 9, 0); i <= message + 9; i++) { + ids.push(i) + } + + const messages = await this.getMessages(chatId, ids) + const groupedId = messages.find((it) => it.id === message)!.groupedId + + if (!groupedId) + throw new MtCuteArgumentError('This message is not grouped') + + return messages.filter((it) => it.groupedId?.eq(groupedId)) +} diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 635411f7..56dc7ef7 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -924,6 +924,20 @@ export class Message { return this.client.sendText(toChatId, this.raw.message, params) } + + /** + * Get all messages inside a group that this + * message belongs to (see {@link groupedId}), + * including this message. + * + * In case this message is not inside of a group, + * will just return itself. + */ + async getGroup(): Promise { + if (!this.groupedId) return [this] + + return this.client.getMessageGroup(this.chat.inputPeer, this.raw.id) + } }