From 14a54f5a25ac6af5e15668b57a2393e85c244e40 Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Sun, 17 Mar 2024 06:23:40 +0300 Subject: [PATCH] fix(core): check for message id in _findMessageInUpdate --- .../methods/messages/find-in-update.ts | 41 ++++++++++++++----- .../highlevel/methods/messages/send-media.ts | 5 ++- .../highlevel/methods/messages/send-text.ts | 5 ++- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/core/src/highlevel/methods/messages/find-in-update.ts b/packages/core/src/highlevel/methods/messages/find-in-update.ts index b49c2458..8c7f1f3c 100644 --- a/packages/core/src/highlevel/methods/messages/find-in-update.ts +++ b/packages/core/src/highlevel/methods/messages/find-in-update.ts @@ -1,4 +1,4 @@ -/* eslint-disable max-params */ +/* eslint-disable max-params,no-lonely-if */ import { tl } from '@mtcute/tl' import { MtTypeAssertionError } from '../../../types/errors.js' @@ -17,6 +17,7 @@ export function _findMessageInUpdate( isEdit?: boolean, noDispatch?: boolean, allowNull?: false, + randomId?: tl.Long, ): Message /** * @internal @@ -28,6 +29,7 @@ export function _findMessageInUpdate( isEdit?: boolean, noDispatch?: boolean, allowNull?: true, + randomId?: tl.Long, ): Message | null /** @@ -40,23 +42,40 @@ export function _findMessageInUpdate( isEdit = false, noDispatch = true, allowNull = false, + randomId?: tl.Long, ): Message | null { assertIsUpdatesGroup('_findMessageInUpdate', res) client.handleClientUpdate(res, noDispatch) - for (const u of res.updates) { - if ( - (isEdit && (u._ === 'updateEditMessage' || u._ === 'updateEditChannelMessage')) || - (!isEdit && - (u._ === 'updateNewMessage' || - u._ === 'updateNewChannelMessage' || - u._ === 'updateNewScheduledMessage')) - ) { - const peers = PeersIndex.from(res) + let ourMessageId = 0 - return new Message(u.message, peers, u._ === 'updateNewScheduledMessage') + for (const u of res.updates) { + if (randomId && u._ === 'updateMessageID' && u.randomId.eq(randomId)) { + ourMessageId = u.id + continue } + + if (isEdit) { + if (!(u._ === 'updateEditMessage' || u._ === 'updateEditChannelMessage')) continue + } else { + if ( + !( + u._ === 'updateNewMessage' || + u._ === 'updateNewChannelMessage' || + u._ === 'updateNewScheduledMessage' + ) + ) { continue } + } + + // this *may* break if updateMessageID comes after the message update + // but it's unlikely and is not worth the effort to fix + // we should eventually move to properly handling updateMessageID + if (ourMessageId !== 0 && u.message.id !== ourMessageId) continue + + const peers = PeersIndex.from(res) + + return new Message(u.message, peers, u._ === 'updateNewScheduledMessage') } if (allowNull) return null diff --git a/packages/core/src/highlevel/methods/messages/send-media.ts b/packages/core/src/highlevel/methods/messages/send-media.ts index 2cb4ade3..edf13dde 100644 --- a/packages/core/src/highlevel/methods/messages/send-media.ts +++ b/packages/core/src/highlevel/methods/messages/send-media.ts @@ -82,6 +82,7 @@ export async function sendMedia( const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup) const { peer, replyTo, scheduleDate, chainId } = await _processCommonSendParameters(client, chatId, params) + const randomId = randomLong() const res = await client.call( { _: 'messages.sendMedia', @@ -89,7 +90,7 @@ export async function sendMedia( media: inputMedia, silent: params.silent, replyTo, - randomId: randomLong(), + randomId, scheduleDate, replyMarkup, message, @@ -102,7 +103,7 @@ export async function sendMedia( { chainId }, ) - const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch) + const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId) return msg } diff --git a/packages/core/src/highlevel/methods/messages/send-text.ts b/packages/core/src/highlevel/methods/messages/send-text.ts index f33aa4dc..aa571d42 100644 --- a/packages/core/src/highlevel/methods/messages/send-text.ts +++ b/packages/core/src/highlevel/methods/messages/send-text.ts @@ -56,6 +56,7 @@ export async function sendText( const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup) const { peer, replyTo, scheduleDate, chainId } = await _processCommonSendParameters(client, chatId, params) + const randomId = randomLong() const res = await client.call( { _: 'messages.sendMessage', @@ -63,7 +64,7 @@ export async function sendText( noWebpage: params.disableWebPreview, silent: params.silent, replyTo, - randomId: randomLong(), + randomId, scheduleDate, replyMarkup, message, @@ -135,7 +136,7 @@ export async function sendText( return ret } - const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch) + const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId) return msg }