feat(client): support pre-checkout queries

This commit is contained in:
teidesu 2022-10-30 20:51:50 +03:00
parent e75ac9fa5d
commit 70b09903f1
9 changed files with 183 additions and 2 deletions

View file

@ -14,3 +14,4 @@ history_read = HistoryReadUpdate
bot_stopped = BotStoppedUpdate bot_stopped = BotStoppedUpdate
bot_chat_join_request = BotChatJoinRequestUpdate bot_chat_join_request = BotChatJoinRequestUpdate
chat_join_request = ChatJoinRequestUpdate chat_join_request = ChatJoinRequestUpdate
pre_checkout_query = PreCheckoutQuery

View file

@ -43,6 +43,7 @@ import {
Poll, Poll,
PollUpdate, PollUpdate,
PollVoteUpdate, PollVoteUpdate,
PreCheckoutQuery,
RawDocument, RawDocument,
ReplyMarkup, ReplyMarkup,
SentCode, SentCode,
@ -83,6 +84,7 @@ import { startTest } from './methods/auth/start-test'
import { start } from './methods/auth/start' import { start } from './methods/auth/start'
import { answerCallbackQuery } from './methods/bots/answer-callback-query' import { answerCallbackQuery } from './methods/bots/answer-callback-query'
import { answerInlineQuery } from './methods/bots/answer-inline-query' import { answerInlineQuery } from './methods/bots/answer-inline-query'
import { answerPreCheckoutQuery } from './methods/bots/answer-pre-checkout-query'
import { deleteMyCommands } from './methods/bots/delete-my-commands' import { deleteMyCommands } from './methods/bots/delete-my-commands'
import { getBotMenuButton } from './methods/bots/get-bot-menu-button' import { getBotMenuButton } from './methods/bots/get-bot-menu-button'
import { getCallbackAnswer } from './methods/bots/get-callback-answer' import { getCallbackAnswer } from './methods/bots/get-callback-answer'
@ -412,6 +414,16 @@ export interface TelegramClient extends BaseTelegramClient {
name: 'chat_join_request', name: 'chat_join_request',
handler: (upd: ChatJoinRequestUpdate) => void handler: (upd: ChatJoinRequestUpdate) => void
): this ): this
/**
* Register a pre checkout query handler
*
* @param name Event name
* @param handler Pre checkout query handler
*/
on(
name: 'pre_checkout_query',
handler: (upd: PreCheckoutQuery) => void
): this
/** /**
* Accept the given TOS * Accept the given TOS
* *
@ -830,6 +842,13 @@ export interface TelegramClient extends BaseTelegramClient {
parseMode?: string | null parseMode?: string | null
} }
): Promise<void> ): Promise<void>
/**
* Answer a pre-checkout query.
*
* @param queryId Pre-checkout query ID
* @param error If pre-checkout is rejected, error message to show to the user
*/
answerPreCheckoutQuery(queryId: tl.Long, error?: string): Promise<void>
/** /**
* Delete commands for the current bot and the given scope. * Delete commands for the current bot and the given scope.
* *
@ -4100,6 +4119,7 @@ export class TelegramClient extends BaseTelegramClient {
start = start start = start
answerCallbackQuery = answerCallbackQuery answerCallbackQuery = answerCallbackQuery
answerInlineQuery = answerInlineQuery answerInlineQuery = answerInlineQuery
answerPreCheckoutQuery = answerPreCheckoutQuery
deleteMyCommands = deleteMyCommands deleteMyCommands = deleteMyCommands
getBotMenuButton = getBotMenuButton getBotMenuButton = getBotMenuButton
getCallbackAnswer = getCallbackAnswer getCallbackAnswer = getCallbackAnswer

View file

@ -57,7 +57,8 @@ import {
ChatJoinRequestUpdate, ChatJoinRequestUpdate,
PeerReaction, PeerReaction,
MessageReactions, MessageReactions,
Sticker Sticker,
PreCheckoutQuery
} from '../types' } from '../types'
// @copy // @copy

View file

@ -0,0 +1,23 @@
import { tl } from '@mtcute/tl'
import { TelegramClient } from '../../client'
/**
* Answer a pre-checkout query.
*
* @param queryId Pre-checkout query ID
* @param error If pre-checkout is rejected, error message to show to the user
* @internal
*/
export async function answerPreCheckoutQuery(
this: TelegramClient,
queryId: tl.Long,
error?: string
): Promise<void> {
await this.call({
_: 'messages.setBotPrecheckoutResults',
queryId,
success: !error,
error,
})
}

View file

@ -11,6 +11,7 @@ import { HistoryReadUpdate } from './history-read-update'
import { BotStoppedUpdate } from './bot-stopped' import { BotStoppedUpdate } from './bot-stopped'
import { BotChatJoinRequestUpdate } from './bot-chat-join-request' import { BotChatJoinRequestUpdate } from './bot-chat-join-request'
import { ChatJoinRequestUpdate } from './chat-join-request' import { ChatJoinRequestUpdate } from './chat-join-request'
import { PreCheckoutQuery } from './pre-checkout-query'
export { export {
DeleteMessageUpdate, DeleteMessageUpdate,
@ -24,6 +25,7 @@ export {
BotStoppedUpdate, BotStoppedUpdate,
BotChatJoinRequestUpdate, BotChatJoinRequestUpdate,
ChatJoinRequestUpdate, ChatJoinRequestUpdate,
PreCheckoutQuery,
} }
// begin-codegen // begin-codegen
@ -43,5 +45,6 @@ export type ParsedUpdate =
| { name: 'bot_stopped'; data: BotStoppedUpdate } | { name: 'bot_stopped'; data: BotStoppedUpdate }
| { name: 'bot_chat_join_request'; data: BotChatJoinRequestUpdate } | { name: 'bot_chat_join_request'; data: BotChatJoinRequestUpdate }
| { name: 'chat_join_request'; data: ChatJoinRequestUpdate } | { name: 'chat_join_request'; data: ChatJoinRequestUpdate }
| { name: 'pre_checkout_query'; data: PreCheckoutQuery }
// end-codegen // end-codegen

View file

@ -18,6 +18,7 @@ import {
PollVoteUpdate, PollVoteUpdate,
UserStatusUpdate, UserStatusUpdate,
UserTypingUpdate, UserTypingUpdate,
PreCheckoutQuery
} from '../index' } from '../index'
type ParserFunction = ( type ParserFunction = (
@ -123,6 +124,10 @@ const PARSERS: Partial<
(client, upd, peers) => (client, upd, peers) =>
new ChatJoinRequestUpdate(client, upd as any, peers), new ChatJoinRequestUpdate(client, upd as any, peers),
], ],
updateBotPrecheckoutQuery: [
'pre_checkout_query',
(client, upd, peers) => new PreCheckoutQuery(client, upd as any, peers),
]
} }
/** @internal */ /** @internal */

View file

@ -0,0 +1,85 @@
import { tl } from '@mtcute/tl'
import { TelegramClient } from '../../client'
import { makeInspectable } from '../utils'
import { PeersIndex, User } from '../peers'
export class PreCheckoutQuery {
constructor(
public readonly client: TelegramClient,
public readonly raw: tl.RawUpdateBotPrecheckoutQuery,
public readonly _peers: PeersIndex
) {}
/**
* ID of the query
*/
get queryId(): tl.Long {
return this.raw.queryId
}
/**
* ID of the user who sent the query
*/
get userId(): number {
return this.raw.userId
}
private _user?: User
/**
* User who sent the query
*/
get user(): User {
if (!this._user) {
this._user = new User(this.client, this._peers.user(this.userId))
}
return this._user
}
/**
* Bot-defined payload of the original invoice
* (see {@link InputMediaInvoice.payload})
*/
get payload(): Buffer {
return this.raw.payload
}
/**
* User-provided payment info (like name, phone, shipping address, etc.)
*/
get paymentInfo(): tl.RawPaymentRequestedInfo | null {
if (!this.raw.info) return null
return this.raw.info
}
/**
* Currency of the payment
*/
get currency(): string {
return this.raw.currency
}
/**
* Total price of the payment
*/
get totalAmount(): tl.Long {
return this.raw.totalAmount
}
/**
* Approve the query
*/
approve(): Promise<void> {
return this.client.answerPreCheckoutQuery(this.queryId)
}
/**
* Reject the query
*/
reject(error = ''): Promise<void> {
return this.client.answerPreCheckoutQuery(this.queryId, error)
}
}
makeInspectable(PreCheckoutQuery)

View file

@ -19,6 +19,7 @@ import {
BotStoppedUpdate, BotStoppedUpdate,
BotChatJoinRequestUpdate, BotChatJoinRequestUpdate,
ChatJoinRequestUpdate, ChatJoinRequestUpdate,
PreCheckoutQuery,
} from '@mtcute/client' } from '@mtcute/client'
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
@ -41,6 +42,7 @@ import {
BotStoppedHandler, BotStoppedHandler,
BotChatJoinRequestHandler, BotChatJoinRequestHandler,
ChatJoinRequestHandler, ChatJoinRequestHandler,
PreCheckoutQueryHandler,
} from './handler' } from './handler'
// end-codegen-imports // end-codegen-imports
@ -1554,5 +1556,36 @@ export class Dispatcher<State = never, SceneName extends string = string> {
this._addKnownHandler('chat_join_request', filter, handler, group) this._addKnownHandler('chat_join_request', filter, handler, group)
} }
/**
* Register a pre checkout query handler without any filters
*
* @param handler Pre checkout query handler
* @param group Handler group index
*/
onPreCheckoutQuery(
handler: PreCheckoutQueryHandler['callback'],
group?: number
): void
/**
* Register a pre checkout query handler with a filter
*
* @param filter Update filter
* @param handler Pre checkout query handler
* @param group Handler group index
*/
onPreCheckoutQuery<Mod>(
filter: UpdateFilter<PreCheckoutQuery, Mod>,
handler: PreCheckoutQueryHandler<
filters.Modify<PreCheckoutQuery, Mod>
>['callback'],
group?: number
): void
/** @internal */
onPreCheckoutQuery(filter: any, handler?: any, group?: number): void {
this._addKnownHandler('pre_checkout_query', filter, handler, group)
}
// end-codegen // end-codegen
} }

View file

@ -16,6 +16,7 @@ import {
BotStoppedUpdate, BotStoppedUpdate,
BotChatJoinRequestUpdate, BotChatJoinRequestUpdate,
ChatJoinRequestUpdate, ChatJoinRequestUpdate,
PreCheckoutQuery,
} from '@mtcute/client' } from '@mtcute/client'
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
@ -28,7 +29,11 @@ export interface BaseUpdateHandler<Name, Handler, Checker> {
check?: Checker check?: Checker
} }
export type ParsedUpdateHandler<Name, Update, State = never> = BaseUpdateHandler< export type ParsedUpdateHandler<
Name,
Update,
State = never
> = BaseUpdateHandler<
Name, Name,
(update: Update, state: State) => MaybeAsync<void | PropagationAction>, (update: Update, state: State) => MaybeAsync<void | PropagationAction>,
(update: Update, state: State) => MaybeAsync<boolean> (update: Update, state: State) => MaybeAsync<boolean>
@ -102,6 +107,10 @@ export type BotChatJoinRequestHandler<T = BotChatJoinRequestUpdate> =
ParsedUpdateHandler<'bot_chat_join_request', T> ParsedUpdateHandler<'bot_chat_join_request', T>
export type ChatJoinRequestHandler<T = ChatJoinRequestUpdate> = export type ChatJoinRequestHandler<T = ChatJoinRequestUpdate> =
ParsedUpdateHandler<'chat_join_request', T> ParsedUpdateHandler<'chat_join_request', T>
export type PreCheckoutQueryHandler<T = PreCheckoutQuery> = ParsedUpdateHandler<
'pre_checkout_query',
T
>
export type UpdateHandler = export type UpdateHandler =
| RawUpdateHandler | RawUpdateHandler
@ -120,5 +129,6 @@ export type UpdateHandler =
| BotStoppedHandler | BotStoppedHandler
| BotChatJoinRequestHandler | BotChatJoinRequestHandler
| ChatJoinRequestHandler | ChatJoinRequestHandler
| PreCheckoutQueryHandler
// end-codegen // end-codegen