fix(client): use inputMessageCallbackQuery
levin said this has better rate-limits, who am i to judge
This commit is contained in:
parent
1cdb75a0a9
commit
8050f8c586
4 changed files with 108 additions and 5 deletions
|
@ -132,6 +132,7 @@ import { deleteScheduledMessages } from './methods/messages/delete-scheduled-mes
|
||||||
import { editInlineMessage } from './methods/messages/edit-inline-message.js'
|
import { editInlineMessage } from './methods/messages/edit-inline-message.js'
|
||||||
import { editMessage } from './methods/messages/edit-message.js'
|
import { editMessage } from './methods/messages/edit-message.js'
|
||||||
import { ForwardMessageOptions, forwardMessages, forwardMessagesById } from './methods/messages/forward-messages.js'
|
import { ForwardMessageOptions, forwardMessages, forwardMessagesById } from './methods/messages/forward-messages.js'
|
||||||
|
import { getCallbackQueryMessage } from './methods/messages/get-callback-query-message.js'
|
||||||
import { getDiscussionMessage } from './methods/messages/get-discussion-message.js'
|
import { getDiscussionMessage } from './methods/messages/get-discussion-message.js'
|
||||||
import { getHistory, GetHistoryOffset } from './methods/messages/get-history.js'
|
import { getHistory, GetHistoryOffset } from './methods/messages/get-history.js'
|
||||||
import { getMessageByLink } from './methods/messages/get-message-by-link.js'
|
import { getMessageByLink } from './methods/messages/get-message-by-link.js'
|
||||||
|
@ -3070,6 +3071,23 @@ export interface TelegramClient extends BaseTelegramClient {
|
||||||
messages: Message[]
|
messages: Message[]
|
||||||
},
|
},
|
||||||
): Promise<Message[]>
|
): Promise<Message[]>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message containing the button being clicked
|
||||||
|
* in the given callback query.
|
||||||
|
* **Available**: 🤖 bots only
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
getCallbackQueryMessage(
|
||||||
|
id:
|
||||||
|
| CallbackQuery
|
||||||
|
| tl.RawUpdateBotCallbackQuery
|
||||||
|
| {
|
||||||
|
messageId: number
|
||||||
|
queryId: tl.Long
|
||||||
|
peer: InputPeerLike
|
||||||
|
},
|
||||||
|
): Promise<Message | null>
|
||||||
// public version of the same method because why not
|
// public version of the same method because why not
|
||||||
/**
|
/**
|
||||||
* Get discussion message for some channel post.
|
* Get discussion message for some channel post.
|
||||||
|
@ -5281,6 +5299,7 @@ export class TelegramClient extends BaseTelegramClient {
|
||||||
editMessage = editMessage.bind(null, this)
|
editMessage = editMessage.bind(null, this)
|
||||||
forwardMessagesById = forwardMessagesById.bind(null, this)
|
forwardMessagesById = forwardMessagesById.bind(null, this)
|
||||||
forwardMessages = forwardMessages.bind(null, this)
|
forwardMessages = forwardMessages.bind(null, this)
|
||||||
|
getCallbackQueryMessage = getCallbackQueryMessage.bind(null, this)
|
||||||
getDiscussionMessage = getDiscussionMessage.bind(null, this)
|
getDiscussionMessage = getDiscussionMessage.bind(null, this)
|
||||||
getHistory = getHistory.bind(null, this)
|
getHistory = getHistory.bind(null, this)
|
||||||
getMessageByLink = getMessageByLink.bind(null, this)
|
getMessageByLink = getMessageByLink.bind(null, this)
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { BaseTelegramClient, tl } from '@mtcute/core'
|
||||||
|
import { assertTypeIsNot } from '@mtcute/core/utils.js'
|
||||||
|
|
||||||
|
import type { CallbackQuery } from '../../types/bots/callback-query.js'
|
||||||
|
import { Message } from '../../types/messages/message.js'
|
||||||
|
import { InputPeerLike, PeersIndex } from '../../types/peers/index.js'
|
||||||
|
import { isInputPeerChannel, toInputChannel } from '../../utils/peer-utils.js'
|
||||||
|
import { resolvePeer } from '../users/resolve-peer.js'
|
||||||
|
|
||||||
|
// @available=bot
|
||||||
|
/**
|
||||||
|
* Get the message containing the button being clicked
|
||||||
|
* in the given callback query.
|
||||||
|
*/
|
||||||
|
export async function getCallbackQueryMessage(
|
||||||
|
client: BaseTelegramClient,
|
||||||
|
id:
|
||||||
|
| CallbackQuery
|
||||||
|
| tl.RawUpdateBotCallbackQuery
|
||||||
|
| {
|
||||||
|
messageId: number
|
||||||
|
queryId: tl.Long
|
||||||
|
peer: InputPeerLike
|
||||||
|
},
|
||||||
|
): Promise<Message | null> {
|
||||||
|
let msgId: number
|
||||||
|
let queryId: tl.Long
|
||||||
|
let peer: tl.TypeInputPeer
|
||||||
|
|
||||||
|
if ('_' in id) {
|
||||||
|
msgId = id.msgId
|
||||||
|
queryId = id.queryId
|
||||||
|
peer = await resolvePeer(client, id.peer)
|
||||||
|
} else if ('raw' in id) {
|
||||||
|
msgId = id.messageId
|
||||||
|
queryId = id.id
|
||||||
|
peer = id.chat.inputPeer
|
||||||
|
} else {
|
||||||
|
msgId = id.messageId
|
||||||
|
queryId = id.queryId
|
||||||
|
peer = await resolvePeer(client, id.peer)
|
||||||
|
}
|
||||||
|
|
||||||
|
const inputMessage: tl.TypeInputMessage = {
|
||||||
|
_: 'inputMessageCallbackQuery',
|
||||||
|
id: msgId,
|
||||||
|
queryId,
|
||||||
|
}
|
||||||
|
|
||||||
|
const isChannel = isInputPeerChannel(peer)
|
||||||
|
|
||||||
|
const res = await client.call(
|
||||||
|
isChannel ?
|
||||||
|
{
|
||||||
|
_: 'channels.getMessages',
|
||||||
|
id: [inputMessage],
|
||||||
|
channel: toInputChannel(peer),
|
||||||
|
} :
|
||||||
|
{
|
||||||
|
_: 'messages.getMessages',
|
||||||
|
id: [inputMessage],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assertTypeIsNot('getCallbackQueryMessage', res, 'messages.messagesNotModified')
|
||||||
|
|
||||||
|
if (res.messages[0]._ === 'messageEmpty') {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Message(res.messages[0], PeersIndex.from(res))
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ import { BasicPeerType, getBasicPeerType, getMarkedPeerId, MtArgumentError, tl }
|
||||||
import { makeInspectable, utf8Decode } from '../../utils/index.js'
|
import { makeInspectable, utf8Decode } from '../../utils/index.js'
|
||||||
import { encodeInlineMessageId } from '../../utils/inline-utils.js'
|
import { encodeInlineMessageId } from '../../utils/inline-utils.js'
|
||||||
import { memoizeGetters } from '../../utils/memoize.js'
|
import { memoizeGetters } from '../../utils/memoize.js'
|
||||||
|
import { Chat } from '../peers/chat.js'
|
||||||
import { PeersIndex } from '../peers/peers-index.js'
|
import { PeersIndex } from '../peers/peers-index.js'
|
||||||
import { User } from '../peers/user.js'
|
import { User } from '../peers/user.js'
|
||||||
|
|
||||||
|
@ -93,6 +94,19 @@ export class CallbackQuery {
|
||||||
return getMarkedPeerId(this.raw.peer)
|
return getMarkedPeerId(this.raw.peer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chat where this message was sent
|
||||||
|
*
|
||||||
|
* Only available in case `isInline = false`
|
||||||
|
*/
|
||||||
|
get chat(): Chat {
|
||||||
|
if (this.raw._ !== 'updateBotCallbackQuery') {
|
||||||
|
throw new MtArgumentError('Cannot get message id for inline callback')
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Chat(this._peers.get(this.raw.peer))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic peer type of the chat where this message was sent,
|
* Basic peer type of the chat where this message was sent,
|
||||||
* derived based on {@link chatId}
|
* derived based on {@link chatId}
|
||||||
|
@ -148,5 +162,5 @@ export class CallbackQuery {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memoizeGetters(CallbackQuery, ['user', 'dataStr'])
|
memoizeGetters(CallbackQuery, ['user', 'chat', 'dataStr', 'inlineMessageIdStr'])
|
||||||
makeInspectable(CallbackQuery)
|
makeInspectable(CallbackQuery)
|
||||||
|
|
|
@ -31,19 +31,17 @@ export class CallbackQueryContext extends CallbackQuery implements UpdateContext
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * Message that contained the callback button that was clicked.
|
* Get the message containing the callback button being clicked.
|
||||||
*
|
*
|
||||||
* Note that the message may have been deleted, in which case
|
* Note that the message may have been deleted, in which case
|
||||||
* `MessageNotFoundError` is thrown.
|
* `MessageNotFoundError` is thrown.
|
||||||
*
|
|
||||||
* Can only be used if `isInline = false`
|
|
||||||
*/
|
*/
|
||||||
async getMessage() {
|
async getMessage() {
|
||||||
if (this.raw._ !== 'updateBotCallbackQuery') {
|
if (this.raw._ !== 'updateBotCallbackQuery') {
|
||||||
throw new MtArgumentError('Cannot get message for inline callback query')
|
throw new MtArgumentError('Cannot get message for inline callback query')
|
||||||
}
|
}
|
||||||
|
|
||||||
const [msg] = await this.client.getMessages(this.raw.peer, this.raw.msgId)
|
const msg = await this.client.getCallbackQueryMessage(this)
|
||||||
|
|
||||||
if (!msg) {
|
if (!msg) {
|
||||||
throw new MtMessageNotFoundError(getMarkedPeerId(this.raw.peer), this.raw.msgId, 'Message not found')
|
throw new MtMessageNotFoundError(getMarkedPeerId(this.raw.peer), this.raw.msgId, 'Message not found')
|
||||||
|
|
Loading…
Reference in a new issue