From b409292497a804e9219f8748137f83fcfc210a47 Mon Sep 17 00:00:00 2001 From: teidesu Date: Wed, 5 May 2021 18:43:02 +0300 Subject: [PATCH] fix(client): support for uploaded media in editInlineMessage thanks to @pacificescape for pointing out messages.uploadMedia method --- .../methods/files/normalize-input-media.ts | 55 ++++++++++++++++++- .../methods/messages/edit-inline-message.ts | 34 ++++++------ .../types/bots/input/input-inline-result.ts | 2 +- .../client/src/types/media/input-media.ts | 1 + 4 files changed, 72 insertions(+), 20 deletions(-) diff --git a/packages/client/src/methods/files/normalize-input-media.ts b/packages/client/src/methods/files/normalize-input-media.ts index 4e5ebd49..463e4728 100644 --- a/packages/client/src/methods/files/normalize-input-media.ts +++ b/packages/client/src/methods/files/normalize-input-media.ts @@ -13,6 +13,7 @@ import { tdFileId, } from '@mtcute/file-id' import { extractFileName } from '../../utils/file-utils' +import { assertTypeIs } from '../../utils/type-assertion' /** * Normalize an {@link InputMediaLike} to `InputMedia`, @@ -25,10 +26,15 @@ export async function _normalizeInputMedia( media: InputMediaLike, params: { progressCallback?: (uploaded: number, total: number) => void - } + }, + uploadMedia = false ): Promise { // my condolences to those poor souls who are going to maintain this (myself included) + // thanks to @pacificescape for pointing out messages.uploadMedia method + + if (tl.isAnyInputMedia(media)) return media + let inputFile: tl.TypeInputFile | undefined = undefined let thumb: tl.TypeInputFile | undefined = undefined let mime = 'application/octet-stream' @@ -100,11 +106,32 @@ export async function _normalizeInputMedia( if (!inputFile) throw new Error('should not happen') if (media.type === 'photo') { - return { + const ret: tl.RawInputMediaUploadedPhoto = { _: 'inputMediaUploadedPhoto', file: inputFile, ttlSeconds: media.ttlSeconds, } + if (!uploadMedia) return ret + + const res = await this.call({ + _: 'messages.uploadMedia', + peer: { _: 'inputPeerSelf' }, + media: ret + }) + + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaPhoto') + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.photo!, 'photo') + + return { + _: 'inputMediaPhoto', + id: { + _: 'inputPhoto', + id: res.photo.id, + accessHash: res.photo.accessHash, + fileReference: res.photo.fileReference + }, + ttlSeconds: media.ttlSeconds + } } if ('thumb' in media && media.thumb) { @@ -158,7 +185,7 @@ export async function _normalizeInputMedia( }) } - return { + const ret: tl.RawInputMediaUploadedDocument = { _: 'inputMediaUploadedDocument', nosoundVideo: media.type === 'video' && media.isAnimated, forceFile: media.type === 'document', @@ -168,4 +195,26 @@ export async function _normalizeInputMedia( attributes, ttlSeconds: media.ttlSeconds } + + if (!uploadMedia) return ret + + const res = await this.call({ + _: 'messages.uploadMedia', + peer: { _: 'inputPeerSelf' }, + media: ret + }) + + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaDocument') + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.document!, 'document') + + return { + _: 'inputMediaDocument', + id: { + _: 'inputDocument', + id: res.document.id, + accessHash: res.document.accessHash, + fileReference: res.document.fileReference + }, + ttlSeconds: media.ttlSeconds + } } diff --git a/packages/client/src/methods/messages/edit-inline-message.ts b/packages/client/src/methods/messages/edit-inline-message.ts index 678fdf62..9893c7e3 100644 --- a/packages/client/src/methods/messages/edit-inline-message.ts +++ b/packages/client/src/methods/messages/edit-inline-message.ts @@ -81,21 +81,6 @@ export async function editInlineMessage( let entities: tl.TypeMessageEntity[] | undefined let media: tl.TypeInputMedia | undefined = undefined - if (params.media) { - media = await this._normalizeInputMedia(params.media, params) - ;[content, entities] = await this._parseEntities( - params.media.caption, - params.parseMode, - params.media.entities - ) - } else { - ;[content, entities] = await this._parseEntities( - params.text, - params.parseMode, - params.entities - ) - } - if (typeof id === 'string') { id = parseInlineMessageId(id) } @@ -105,11 +90,28 @@ export async function editInlineMessage( if (!(id.dcId in this._connectionsForInline)) { this._connectionsForInline[ id.dcId - ] = await this.createAdditionalConnection(id.dcId) + ] = await this.createAdditionalConnection(id.dcId) } connection = this._connectionsForInline[id.dcId] } + if (params.media) { + media = await this._normalizeInputMedia(params.media, params, true) + if ('caption' in params.media) { + ;[content, entities] = await this._parseEntities( + params.media.caption, + params.parseMode, + params.media.entities + ) + } + } else { + ;[content, entities] = await this._parseEntities( + params.text, + params.parseMode, + params.entities + ) + } + await this.call( { _: 'messages.editInlineBotMessage', diff --git a/packages/client/src/types/bots/input/input-inline-result.ts b/packages/client/src/types/bots/input/input-inline-result.ts index 62595642..31f9e0e1 100644 --- a/packages/client/src/types/bots/input/input-inline-result.ts +++ b/packages/client/src/types/bots/input/input-inline-result.ts @@ -345,7 +345,7 @@ export interface InputInlineResultFile extends BaseInputInlineResult { /** * Title of the result */ - title?: string + title: string /** * Description of the result diff --git a/packages/client/src/types/media/input-media.ts b/packages/client/src/types/media/input-media.ts index 5eee54cf..43f3f4ab 100644 --- a/packages/client/src/types/media/input-media.ts +++ b/packages/client/src/types/media/input-media.ts @@ -250,6 +250,7 @@ export type InputMediaLike = | InputMediaVideo | InputMediaAuto | InputMediaSticker + | tl.TypeInputMedia export namespace InputMedia { type OmitTypeAndFile = Omit