diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index 76c34905..59216644 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -134,6 +134,7 @@ import { editMessage } from './methods/messages/edit-message.js' import { ForwardMessageOptions, forwardMessages, forwardMessagesById } from './methods/messages/forward-messages.js' import { getDiscussionMessage } from './methods/messages/get-discussion-message.js' import { getHistory, GetHistoryOffset } from './methods/messages/get-history.js' +import { getMessageByLink } from './methods/messages/get-message-by-link.js' import { getMessageGroup } from './methods/messages/get-message-group.js' import { getMessageReactions, getMessageReactionsById } from './methods/messages/get-message-reactions.js' import { getMessages } from './methods/messages/get-messages.js' @@ -3153,6 +3154,12 @@ export interface TelegramClient extends BaseTelegramClient { reverse?: boolean }, ): Promise> + /** + * Given a message link (e.g. `t.me/durov/1`), fetch the relevant message. + * **Available**: ✅ both users and bots + * + */ + getMessageByLink(link: string): Promise /** * Get all messages inside of a message group * @@ -5276,6 +5283,7 @@ export class TelegramClient extends BaseTelegramClient { forwardMessages = forwardMessages.bind(null, this) getDiscussionMessage = getDiscussionMessage.bind(null, this) getHistory = getHistory.bind(null, this) + getMessageByLink = getMessageByLink.bind(null, this) getMessageGroup = getMessageGroup.bind(null, this) getMessageReactionsById = getMessageReactionsById.bind(null, this) getMessageReactions = getMessageReactions.bind(null, this) diff --git a/packages/client/src/methods/messages/get-message-by-link.ts b/packages/client/src/methods/messages/get-message-by-link.ts new file mode 100644 index 00000000..9500da95 --- /dev/null +++ b/packages/client/src/methods/messages/get-message-by-link.ts @@ -0,0 +1,37 @@ +import { BaseTelegramClient, MtArgumentError, toggleChannelIdMark } from '@mtcute/core' +import { links } from '@mtcute/core/utils.js' + +import { Message } from '../../index.js' +import { resolvePeer } from '../users/resolve-peer.js' +import { _getDiscussionMessage } from './get-discussion-message.js' +import { getMessages } from './get-messages.js' + +/** + * Given a message link (e.g. `t.me/durov/1`), fetch the relevant message. + */ +export async function getMessageByLink(client: BaseTelegramClient, link: string): Promise { + const parsed = links.message.parse(link) + + if (!parsed) { + throw new MtArgumentError(`Invalid message link: ${link}`) + } + + let peer + + if ('username' in parsed) { + peer = await resolvePeer(client, parsed.username) + } else { + peer = await resolvePeer(client, toggleChannelIdMark(parsed.channelId)) + } + + let msgId = parsed.id + + if (parsed.commentId) { + [peer] = await _getDiscussionMessage(client, peer, parsed.id) + msgId = parsed.commentId + } + + const [msg] = await getMessages(client, peer, msgId) + + return msg +}