feat(client): sendScheduled and getScheduledMessages methods

This commit is contained in:
teidesu 2021-07-10 01:19:59 +03:00
parent a33548e790
commit ca1e5c9efa
3 changed files with 199 additions and 0 deletions

View file

@ -101,6 +101,7 @@ import { getHistory } from './methods/messages/get-history'
import { getMessageGroup } from './methods/messages/get-message-group' import { getMessageGroup } from './methods/messages/get-message-group'
import { getMessagesUnsafe } from './methods/messages/get-messages-unsafe' import { getMessagesUnsafe } from './methods/messages/get-messages-unsafe'
import { getMessages } from './methods/messages/get-messages' import { getMessages } from './methods/messages/get-messages'
import { getScheduledMessages } from './methods/messages/get-scheduled-messages'
import { iterHistory } from './methods/messages/iter-history' import { iterHistory } from './methods/messages/iter-history'
import { _normalizeInline } from './methods/messages/normalize-inline' import { _normalizeInline } from './methods/messages/normalize-inline'
import { _parseEntities } from './methods/messages/parse-entities' import { _parseEntities } from './methods/messages/parse-entities'
@ -111,6 +112,7 @@ import { searchMessages } from './methods/messages/search-messages'
import { sendCopy } from './methods/messages/send-copy' import { sendCopy } from './methods/messages/send-copy'
import { sendMediaGroup } from './methods/messages/send-media-group' import { sendMediaGroup } from './methods/messages/send-media-group'
import { sendMedia } from './methods/messages/send-media' import { sendMedia } from './methods/messages/send-media'
import { sendScheduled } from './methods/messages/send-scheduled'
import { sendText } from './methods/messages/send-text' import { sendText } from './methods/messages/send-text'
import { sendTyping } from './methods/messages/send-typing' import { sendTyping } from './methods/messages/send-typing'
import { sendVote } from './methods/messages/send-vote' import { sendVote } from './methods/messages/send-vote'
@ -2183,6 +2185,29 @@ export interface TelegramClient extends BaseTelegramClient {
messageIds: number[], messageIds: number[],
fromReply?: boolean fromReply?: boolean
): Promise<(Message | null)[]> ): Promise<(Message | null)[]>
/**
* Get a single scheduled message in chat by its ID
*
* @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`
* @param messageId Scheduled message ID
*/
getScheduledMessages(
chatId: InputPeerLike,
messageId: number
): Promise<Message | null>
/**
* Get scheduled messages in chat by their IDs
*
* Fot messages that were not found, `null` will be
* returned at that position.
*
* @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`
* @param messageIds Scheduled messages IDs
*/
getScheduledMessages(
chatId: InputPeerLike,
messageIds: number[]
): Promise<(Message | null)[]>
/** /**
* Iterate through a chat history sequentially. * Iterate through a chat history sequentially.
* *
@ -2643,6 +2668,28 @@ export interface TelegramClient extends BaseTelegramClient {
clearDraft?: boolean clearDraft?: boolean
} }
): Promise<Message> ): Promise<Message>
/**
* Send s previously scheduled message.
*
* Note that if the message belongs to a media group,
* the entire group will be sent, but only
* the first message will be returned (in this overload).
*
* @param peer Chat where the messages were scheduled
* @param id ID of the message
*/
sendScheduled(peer: InputPeerLike, id: number): Promise<Message>
/**
* Send previously scheduled message(s)
*
* Note that if the message belongs to a media group,
* the entire group will be sent, and all the messages
* will be returned.
*
* @param peer Chat where the messages were scheduled
* @param ids ID(s) of the messages
*/
sendScheduled(peer: InputPeerLike, ids: number[]): Promise<Message[]>
/** /**
* Send a text message * Send a text message
* *
@ -3427,6 +3474,7 @@ export class TelegramClient extends BaseTelegramClient {
getMessageGroup = getMessageGroup getMessageGroup = getMessageGroup
getMessagesUnsafe = getMessagesUnsafe getMessagesUnsafe = getMessagesUnsafe
getMessages = getMessages getMessages = getMessages
getScheduledMessages = getScheduledMessages
iterHistory = iterHistory iterHistory = iterHistory
protected _normalizeInline = _normalizeInline protected _normalizeInline = _normalizeInline
protected _parseEntities = _parseEntities protected _parseEntities = _parseEntities
@ -3437,6 +3485,7 @@ export class TelegramClient extends BaseTelegramClient {
sendCopy = sendCopy sendCopy = sendCopy
sendMediaGroup = sendMediaGroup sendMediaGroup = sendMediaGroup
sendMedia = sendMedia sendMedia = sendMedia
sendScheduled = sendScheduled
sendText = sendText sendText = sendText
sendTyping = sendTyping sendTyping = sendTyping
sendVote = sendVote sendVote = sendVote

View file

@ -0,0 +1,72 @@
import { TelegramClient } from '../../client'
import { MaybeArray } from '@mtcute/core'
import {
createUsersChatsIndex,
isInputPeerChannel,
normalizeToInputChannel,
} from '../../utils/peer-utils'
import { tl } from '@mtcute/tl'
import { Message, InputPeerLike, MtCuteTypeAssertionError } from '../../types'
/**
* Get a single scheduled message in chat by its ID
*
* @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`
* @param messageId Scheduled message ID
* @internal
*/
export async function getScheduledMessages(
this: TelegramClient,
chatId: InputPeerLike,
messageId: number
): Promise<Message | null>
/**
* Get scheduled messages in chat by their IDs
*
* Fot messages that were not found, `null` will be
* returned at that position.
*
* @param chatId Chat's marked ID, its username, phone or `"me"` or `"self"`
* @param messageIds Scheduled messages IDs
* @internal
*/
export async function getScheduledMessages(
this: TelegramClient,
chatId: InputPeerLike,
messageIds: number[]
): Promise<(Message | null)[]>
/** @internal */
export async function getScheduledMessages(
this: TelegramClient,
chatId: InputPeerLike,
messageIds: MaybeArray<number>
): Promise<MaybeArray<Message | null>> {
const peer = await this.resolvePeer(chatId)
const isSingle = !Array.isArray(messageIds)
if (isSingle) messageIds = [messageIds as number]
const res = await this.call({
_: 'messages.getScheduledMessages',
peer,
id: messageIds as number[],
})
if (res._ === 'messages.messagesNotModified')
throw new MtCuteTypeAssertionError(
'getMessages',
'!messages.messagesNotModified',
res._
)
const { users, chats } = createUsersChatsIndex(res)
const ret = res.messages.map((msg) => {
if (msg._ === 'messageEmpty') return null
return new Message(this, msg, users, chats)
})
return isSingle ? ret[0] : ret
}

View file

@ -0,0 +1,78 @@
import { InputPeerLike, Message } from '../../types'
import { MaybeArray } from '@mtcute/core'
import { TelegramClient } from '../../client'
import { assertIsUpdatesGroup } from '../../utils/updates-utils'
import { createUsersChatsIndex } from '../../utils/peer-utils'
/**
* Send s previously scheduled message.
*
* Note that if the message belongs to a media group,
* the entire group will be sent, but only
* the first message will be returned (in this overload).
*
* @param peer Chat where the messages were scheduled
* @param id ID of the message
* @internal
*/
export async function sendScheduled(
this: TelegramClient,
peer: InputPeerLike,
id: number
): Promise<Message>
/**
* Send previously scheduled message(s)
*
* Note that if the message belongs to a media group,
* the entire group will be sent, and all the messages
* will be returned.
*
* @param peer Chat where the messages were scheduled
* @param ids ID(s) of the messages
* @internal
*/
export async function sendScheduled(
this: TelegramClient,
peer: InputPeerLike,
ids: number[]
): Promise<Message[]>
/** @internal */
export async function sendScheduled(
this: TelegramClient,
peer: InputPeerLike,
ids: MaybeArray<number>
): Promise<MaybeArray<Message>> {
const isSingle = !Array.isArray(ids)
if (isSingle) ids = [ids as number]
const res = await this.call({
_: 'messages.sendScheduledMessages',
peer: await this.resolvePeer(peer),
id: (ids as number[])
})
assertIsUpdatesGroup('sendScheduled', res)
this._handleUpdate(res, true)
const { users, chats } = createUsersChatsIndex(res)
const msgs = res.updates
.filter(
(u) =>
u._ === 'updateNewMessage' ||
u._ === 'updateNewChannelMessage'
)
.map(
(u) =>
new Message(
this,
(u as any).message,
users,
chats
)
)
return isSingle ? msgs[0] : msgs
}