@mtcute/core 0.12.5 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/highlevel/client.d.ts +83 -2
- package/cjs/highlevel/client.js +19 -0
- package/cjs/highlevel/client.js.map +1 -1
- package/cjs/highlevel/methods/_imports.js.map +1 -1
- package/cjs/highlevel/methods/chats/archive-chats.js +2 -1
- package/cjs/highlevel/methods/chats/archive-chats.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
- package/cjs/highlevel/methods/dialogs/find-dialogs.js +88 -0
- package/cjs/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
- package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
- package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js +3 -1
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/messages/_business-connection.d.ts +2 -1
- package/cjs/highlevel/methods/messages/_business-connection.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-available-effects.d.ts +6 -0
- package/cjs/highlevel/methods/messages/get-available-effects.js +26 -0
- package/cjs/highlevel/methods/messages/get-available-effects.js.map +1 -0
- package/cjs/highlevel/methods/messages/get-fact-check.d.ts +11 -0
- package/cjs/highlevel/methods/messages/get-fact-check.js +27 -0
- package/cjs/highlevel/methods/messages/get-fact-check.js.map +1 -0
- package/cjs/highlevel/methods/messages/search-hashtag.d.ts +44 -0
- package/cjs/highlevel/methods/messages/search-hashtag.js +75 -0
- package/cjs/highlevel/methods/messages/search-hashtag.js.map +1 -0
- package/cjs/highlevel/methods/messages/send-common.d.ts +5 -0
- package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media-group.js +1 -0
- package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media.js +1 -0
- package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-text.js +1 -0
- package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
- package/cjs/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
- package/cjs/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
- package/cjs/highlevel/methods/users/resolve-peer-many.js +22 -6
- package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer.js +30 -11
- package/cjs/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/cjs/highlevel/methods.d.ts +6 -0
- package/cjs/highlevel/methods.js +15 -4
- package/cjs/highlevel/methods.js.map +1 -1
- package/cjs/highlevel/types/conversation.js +1 -1
- package/cjs/highlevel/types/conversation.js.map +1 -1
- package/cjs/highlevel/types/messages/dialog.d.ts +2 -2
- package/cjs/highlevel/types/messages/dialog.js +2 -3
- package/cjs/highlevel/types/messages/dialog.js.map +1 -1
- package/cjs/highlevel/types/messages/fact-check.d.ts +30 -0
- package/cjs/highlevel/types/messages/fact-check.js +56 -0
- package/cjs/highlevel/types/messages/fact-check.js.map +1 -0
- package/cjs/highlevel/types/messages/index.d.ts +2 -0
- package/cjs/highlevel/types/messages/index.js +2 -0
- package/cjs/highlevel/types/messages/index.js.map +1 -1
- package/cjs/highlevel/types/messages/message-effect.d.ts +20 -0
- package/cjs/highlevel/types/messages/message-effect.js +69 -0
- package/cjs/highlevel/types/messages/message-effect.js.map +1 -0
- package/cjs/highlevel/types/messages/message-entity.d.ts +4 -1
- package/cjs/highlevel/types/messages/message-entity.js +1 -1
- package/cjs/highlevel/types/messages/message-entity.js.map +1 -1
- package/cjs/highlevel/types/messages/message.d.ts +12 -0
- package/cjs/highlevel/types/messages/message.js +23 -0
- package/cjs/highlevel/types/messages/message.js.map +1 -1
- package/cjs/network/network-manager.js +1 -1
- package/esm/highlevel/client.d.ts +83 -2
- package/esm/highlevel/client.js +19 -0
- package/esm/highlevel/client.js.map +1 -1
- package/esm/highlevel/methods/_imports.js.map +1 -1
- package/esm/highlevel/methods/chats/archive-chats.js +2 -1
- package/esm/highlevel/methods/chats/archive-chats.js.map +1 -1
- package/esm/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
- package/esm/highlevel/methods/dialogs/find-dialogs.js +84 -0
- package/esm/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
- package/esm/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
- package/esm/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
- package/esm/highlevel/methods/dialogs/iter-dialogs.js +3 -1
- package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/esm/highlevel/methods/messages/_business-connection.d.ts +2 -1
- package/esm/highlevel/methods/messages/_business-connection.js.map +1 -1
- package/esm/highlevel/methods/messages/get-available-effects.d.ts +6 -0
- package/esm/highlevel/methods/messages/get-available-effects.js +22 -0
- package/esm/highlevel/methods/messages/get-available-effects.js.map +1 -0
- package/esm/highlevel/methods/messages/get-fact-check.d.ts +11 -0
- package/esm/highlevel/methods/messages/get-fact-check.js +23 -0
- package/esm/highlevel/methods/messages/get-fact-check.js.map +1 -0
- package/esm/highlevel/methods/messages/search-hashtag.d.ts +44 -0
- package/esm/highlevel/methods/messages/search-hashtag.js +70 -0
- package/esm/highlevel/methods/messages/search-hashtag.js.map +1 -0
- package/esm/highlevel/methods/messages/send-common.d.ts +5 -0
- package/esm/highlevel/methods/messages/send-common.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media-group.js +1 -0
- package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media.js +1 -0
- package/esm/highlevel/methods/messages/send-media.js.map +1 -1
- package/esm/highlevel/methods/messages/send-text.js +1 -0
- package/esm/highlevel/methods/messages/send-text.js.map +1 -1
- package/esm/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
- package/esm/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
- package/esm/highlevel/methods/users/resolve-peer-many.js +22 -6
- package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer.js +30 -11
- package/esm/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/esm/highlevel/methods.d.ts +6 -0
- package/esm/highlevel/methods.js +5 -0
- package/esm/highlevel/methods.js.map +1 -1
- package/esm/highlevel/types/conversation.js +1 -1
- package/esm/highlevel/types/conversation.js.map +1 -1
- package/esm/highlevel/types/messages/dialog.d.ts +2 -2
- package/esm/highlevel/types/messages/dialog.js +2 -3
- package/esm/highlevel/types/messages/dialog.js.map +1 -1
- package/esm/highlevel/types/messages/fact-check.d.ts +30 -0
- package/esm/highlevel/types/messages/fact-check.js +53 -0
- package/esm/highlevel/types/messages/fact-check.js.map +1 -0
- package/esm/highlevel/types/messages/index.d.ts +2 -0
- package/esm/highlevel/types/messages/index.js +2 -0
- package/esm/highlevel/types/messages/index.js.map +1 -1
- package/esm/highlevel/types/messages/message-effect.d.ts +20 -0
- package/esm/highlevel/types/messages/message-effect.js +66 -0
- package/esm/highlevel/types/messages/message-effect.js.map +1 -0
- package/esm/highlevel/types/messages/message-entity.d.ts +4 -1
- package/esm/highlevel/types/messages/message-entity.js +1 -1
- package/esm/highlevel/types/messages/message-entity.js.map +1 -1
- package/esm/highlevel/types/messages/message.d.ts +12 -0
- package/esm/highlevel/types/messages/message.js +23 -0
- package/esm/highlevel/types/messages/message.js.map +1 -1
- package/esm/network/network-manager.js +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_imports.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_imports.ts"],"names":[],"mappings":"AAAA,sDAAsD","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { tdFileId } from '@mtcute/file-id'\n// @copy\nimport { tl } from '@mtcute/tl'\n\n// @copy\nimport { RpcCallOptions } from '../../network/index.js'\n// @copy\nimport { MaybeArray, MaybePromise, MtUnsupportedError, PartialExcept, PartialOnly } from '../../types/index.js'\n// @copy\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\n// @copy\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport {\n AllStories,\n ArrayPaginated,\n ArrayWithTotal,\n Boost,\n BoostSlot,\n BoostStats,\n BotChatJoinRequestUpdate,\n BotCommands,\n BotReactionCountUpdate,\n BotReactionUpdate,\n BotStoppedUpdate,\n BusinessChatLink,\n BusinessConnection,\n BusinessMessage,\n BusinessWorkHoursDay,\n CallbackQuery,\n Chat,\n ChatEvent,\n ChatInviteLink,\n ChatInviteLinkMember,\n ChatJoinRequestUpdate,\n ChatMember,\n ChatMemberUpdate,\n ChatPreview,\n ChosenInlineResult,\n CollectibleInfo,\n DeleteBusinessMessageUpdate,\n DeleteMessageUpdate,\n DeleteStoryUpdate,\n Dialog,\n FileDownloadLocation,\n FileDownloadParameters,\n ForumTopic,\n FullChat,\n GameHighScore,\n HistoryReadUpdate,\n InlineCallbackQuery,\n InlineQuery,\n InputChatEventFilters,\n InputDialogFolder,\n InputFileLike,\n InputInlineResult,\n InputMediaLike,\n InputMediaSticker,\n InputMessageId,\n InputPeerLike,\n InputPrivacyRule,\n InputReaction,\n InputStickerSet,\n InputStickerSetItem,\n InputText,\n MaybeDynamic,\n Message,\n MessageMedia,\n MessageReactions,\n ParametersSkip2,\n ParsedUpdate,\n PeerReaction,\n PeersIndex,\n PeerStories,\n Photo,\n Poll,\n PollUpdate,\n PollVoteUpdate,\n PreCheckoutQuery,\n RawDocument,\n ReplyMarkup,\n SentCode,\n Sticker,\n StickerSet,\n StickerSourceType,\n StickerType,\n StoriesStealthMode,\n Story,\n StoryInteractions,\n StoryUpdate,\n StoryViewer,\n StoryViewersList,\n TakeoutSession,\n TextWithEntities,\n TypingStatus,\n UploadedFile,\n UploadFileLike,\n User,\n UserStatusUpdate,\n UserTypingUpdate,\n} from '../types/index.js'\n// @copy\nimport { StringSessionData } from '../utils/string-session.js'\n"]}
|
|
1
|
+
{"version":3,"file":"_imports.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_imports.ts"],"names":[],"mappings":"AAAA,sDAAsD","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { tdFileId } from '@mtcute/file-id'\n// @copy\nimport { tl } from '@mtcute/tl'\n\n// @copy\nimport { RpcCallOptions } from '../../network/index.js'\n// @copy\nimport { MaybeArray, MaybePromise, MtUnsupportedError, PartialExcept, PartialOnly } from '../../types/index.js'\n// @copy\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\n// @copy\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport {\n AllStories,\n ArrayPaginated,\n ArrayWithTotal,\n Boost,\n BoostSlot,\n BoostStats,\n BotChatJoinRequestUpdate,\n BotCommands,\n BotReactionCountUpdate,\n BotReactionUpdate,\n BotStoppedUpdate,\n BusinessChatLink,\n BusinessConnection,\n BusinessMessage,\n BusinessWorkHoursDay,\n CallbackQuery,\n Chat,\n ChatEvent,\n ChatInviteLink,\n ChatInviteLinkMember,\n ChatJoinRequestUpdate,\n ChatMember,\n ChatMemberUpdate,\n ChatPreview,\n ChosenInlineResult,\n CollectibleInfo,\n DeleteBusinessMessageUpdate,\n DeleteMessageUpdate,\n DeleteStoryUpdate,\n Dialog,\n FactCheck,\n FileDownloadLocation,\n FileDownloadParameters,\n ForumTopic,\n FullChat,\n GameHighScore,\n HistoryReadUpdate,\n InlineCallbackQuery,\n InlineQuery,\n InputChatEventFilters,\n InputDialogFolder,\n InputFileLike,\n InputInlineResult,\n InputMediaLike,\n InputMediaSticker,\n InputMessageId,\n InputPeerLike,\n InputPrivacyRule,\n InputReaction,\n InputStickerSet,\n InputStickerSetItem,\n InputText,\n MaybeDynamic,\n Message,\n MessageEffect,\n MessageMedia,\n MessageReactions,\n ParametersSkip2,\n ParsedUpdate,\n PeerReaction,\n PeersIndex,\n PeerStories,\n Photo,\n Poll,\n PollUpdate,\n PollVoteUpdate,\n PreCheckoutQuery,\n RawDocument,\n ReplyMarkup,\n SentCode,\n Sticker,\n StickerSet,\n StickerSourceType,\n StickerType,\n StoriesStealthMode,\n Story,\n StoryInteractions,\n StoryUpdate,\n StoryViewer,\n StoryViewersList,\n TakeoutSession,\n TextWithEntities,\n TypingStatus,\n UploadedFile,\n UploadFileLike,\n User,\n UserStatusUpdate,\n UserTypingUpdate,\n} from '../types/index.js'\n// @copy\nimport { StringSessionData } from '../utils/string-session.js'\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isPresent } from '../../../utils/type-assertions.js';
|
|
1
2
|
import { resolvePeerMany } from '../users/resolve-peer-many.js';
|
|
2
3
|
/**
|
|
3
4
|
* Archive one or more chats
|
|
@@ -10,7 +11,7 @@ export async function archiveChats(client, chats) {
|
|
|
10
11
|
const resolvedPeers = await resolvePeerMany(client, chats);
|
|
11
12
|
const updates = await client.call({
|
|
12
13
|
_: 'folders.editPeerFolders',
|
|
13
|
-
folderPeers: resolvedPeers.map((peer) => ({
|
|
14
|
+
folderPeers: resolvedPeers.filter(isPresent).map((peer) => ({
|
|
14
15
|
_: 'inputFolderPeer',
|
|
15
16
|
peer,
|
|
16
17
|
folderId: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/archive-chats.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"archive-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/archive-chats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAuB,EAAE,KAAgC;IACxF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAA;IAE1C,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC,EAAE,yBAAyB;QAC5B,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC,EAAE,iBAAiB;YACpB,IAAI;YACJ,QAAQ,EAAE,CAAC;SACd,CAAC,CAAC;KACN,CAAC,CAAA;IACF,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC","sourcesContent":["import { MaybeArray } from '../../../types/utils.js'\nimport { isPresent } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\n\n/**\n * Archive one or more chats\n *\n * @param chats Chat ID(s), username(s), phone number(s), `\"me\"` or `\"self\"`\n */\nexport async function archiveChats(client: ITelegramClient, chats: MaybeArray<InputPeerLike>): Promise<void> {\n if (!Array.isArray(chats)) chats = [chats]\n\n const resolvedPeers = await resolvePeerMany(client, chats)\n\n const updates = await client.call({\n _: 'folders.editPeerFolders',\n folderPeers: resolvedPeers.filter(isPresent).map((peer) => ({\n _: 'inputFolderPeer',\n peer,\n folderId: 1,\n })),\n })\n client.handleClientUpdate(updates)\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MaybeArray } from '../../../types/utils.js';
|
|
2
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
3
|
+
import { Dialog } from '../../types/messages/dialog.js';
|
|
4
|
+
/**
|
|
5
|
+
* Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.
|
|
6
|
+
*
|
|
7
|
+
* This might be an expensive call, as it will potentially iterate over all
|
|
8
|
+
* dialogs to find the one with the given peer
|
|
9
|
+
*
|
|
10
|
+
* @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found
|
|
11
|
+
*/
|
|
12
|
+
export declare function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { MtPeerNotFoundError } from '../../types/errors.js';
|
|
2
|
+
import { resolvePeerMany } from '../users/resolve-peer-many.js';
|
|
3
|
+
import { getPeerDialogs } from './get-peer-dialogs.js';
|
|
4
|
+
import { iterDialogs } from './iter-dialogs.js';
|
|
5
|
+
// @available=user
|
|
6
|
+
/**
|
|
7
|
+
* Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.
|
|
8
|
+
*
|
|
9
|
+
* This might be an expensive call, as it will potentially iterate over all
|
|
10
|
+
* dialogs to find the one with the given peer
|
|
11
|
+
*
|
|
12
|
+
* @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found
|
|
13
|
+
*/
|
|
14
|
+
export async function findDialogs(client, peers) {
|
|
15
|
+
if (!Array.isArray(peers))
|
|
16
|
+
peers = [peers];
|
|
17
|
+
const resolved = await resolvePeerMany(client, peers);
|
|
18
|
+
// now we need to split `peers` into two parts: ids that we could resolve and those we couldn't
|
|
19
|
+
// those that we couldn't we'll iterate over all dialogs and try to find them by username/id
|
|
20
|
+
// those that we could we'll use getPeerDialogs
|
|
21
|
+
// id -> idx
|
|
22
|
+
const notFoundIds = new Map();
|
|
23
|
+
// username -> idx
|
|
24
|
+
const notFoundUsernames = new Map();
|
|
25
|
+
let notFoundCount = 0;
|
|
26
|
+
const foundInputPeers = [];
|
|
27
|
+
const foundIdxToOriginalIdx = new Map();
|
|
28
|
+
for (let i = 0; i < peers.length; i++) {
|
|
29
|
+
const input = peers[i];
|
|
30
|
+
const resolvedPeer = resolved[i];
|
|
31
|
+
if (!resolvedPeer) {
|
|
32
|
+
if (typeof input === 'number') {
|
|
33
|
+
notFoundIds.set(input, i);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
notFoundUsernames.set(input, i);
|
|
37
|
+
}
|
|
38
|
+
notFoundCount += 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
foundInputPeers.push(resolvedPeer);
|
|
42
|
+
foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i);
|
|
43
|
+
}
|
|
44
|
+
const dialogs = await getPeerDialogs(client, foundInputPeers);
|
|
45
|
+
if (foundInputPeers.length === peers.length) {
|
|
46
|
+
return dialogs;
|
|
47
|
+
}
|
|
48
|
+
const ret = new Array(peers.length);
|
|
49
|
+
// populate found dialogs
|
|
50
|
+
for (const [idx, origIdx] of foundIdxToOriginalIdx) {
|
|
51
|
+
ret[origIdx] = dialogs[idx];
|
|
52
|
+
}
|
|
53
|
+
// now we need to iterate over all dialogs and try to find the rest
|
|
54
|
+
for await (const dialog of iterDialogs(client, {
|
|
55
|
+
archived: 'keep',
|
|
56
|
+
})) {
|
|
57
|
+
const chat = dialog.chat;
|
|
58
|
+
const idxById = notFoundIds.get(chat.id);
|
|
59
|
+
if (idxById !== undefined) {
|
|
60
|
+
ret[idxById] = dialog;
|
|
61
|
+
notFoundIds.delete(chat.id);
|
|
62
|
+
notFoundCount -= 1;
|
|
63
|
+
}
|
|
64
|
+
if (notFoundCount === 0)
|
|
65
|
+
break;
|
|
66
|
+
if (!chat.username)
|
|
67
|
+
continue;
|
|
68
|
+
const idxByUsername = notFoundUsernames.get(chat.username);
|
|
69
|
+
if (idxByUsername !== undefined) {
|
|
70
|
+
ret[idxByUsername] = dialog;
|
|
71
|
+
notFoundUsernames.delete(chat.username);
|
|
72
|
+
notFoundCount -= 1;
|
|
73
|
+
}
|
|
74
|
+
if (notFoundCount === 0)
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
// if we still have some dialogs that we couldn't find, fail
|
|
78
|
+
if (notFoundCount > 0) {
|
|
79
|
+
const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()];
|
|
80
|
+
throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
return ret;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=find-dialogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/find-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getPeerDialogs } from './get-peer-dialogs.js'\nimport { iterDialogs } from './iter-dialogs.js'\n\n// @available=user\n/**\n * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.\n *\n * This might be an expensive call, as it will potentially iterate over all\n * dialogs to find the one with the given peer\n *\n * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found\n */\nexport async function findDialogs(client: ITelegramClient, peers: MaybeArray<string | number>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n const resolved = await resolvePeerMany(client, peers)\n\n // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't\n // those that we couldn't we'll iterate over all dialogs and try to find them by username/id\n // those that we could we'll use getPeerDialogs\n\n // id -> idx\n const notFoundIds = new Map<number, number>()\n // username -> idx\n const notFoundUsernames = new Map<string, number>()\n let notFoundCount = 0\n\n const foundInputPeers: tl.TypeInputPeer[] = []\n const foundIdxToOriginalIdx = new Map<number, number>()\n\n for (let i = 0; i < peers.length; i++) {\n const input = peers[i]\n const resolvedPeer = resolved[i]\n\n if (!resolvedPeer) {\n if (typeof input === 'number') {\n notFoundIds.set(input, i)\n } else {\n notFoundUsernames.set(input, i)\n }\n\n notFoundCount += 1\n\n continue\n }\n\n foundInputPeers.push(resolvedPeer)\n foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i)\n }\n\n const dialogs = await getPeerDialogs(client, foundInputPeers)\n\n if (foundInputPeers.length === peers.length) {\n return dialogs\n }\n\n const ret = new Array<Dialog>(peers.length)\n\n // populate found dialogs\n for (const [idx, origIdx] of foundIdxToOriginalIdx) {\n ret[origIdx] = dialogs[idx]\n }\n\n // now we need to iterate over all dialogs and try to find the rest\n for await (const dialog of iterDialogs(client, {\n archived: 'keep',\n })) {\n const chat = dialog.chat\n\n const idxById = notFoundIds.get(chat.id)\n\n if (idxById !== undefined) {\n ret[idxById] = dialog\n notFoundIds.delete(chat.id)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n\n if (!chat.username) continue\n\n const idxByUsername = notFoundUsernames.get(chat.username)\n\n if (idxByUsername !== undefined) {\n ret[idxByUsername] = dialog\n notFoundUsernames.delete(chat.username)\n notFoundCount -= 1\n }\n\n if (notFoundCount === 0) break\n }\n\n // if we still have some dialogs that we couldn't find, fail\n\n if (notFoundCount > 0) {\n const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()]\n throw new MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`)\n }\n\n return ret\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isPresent } from '../../../utils/type-assertions.js';
|
|
1
2
|
import { Dialog } from '../../types/messages/dialog.js';
|
|
2
3
|
import { resolvePeerMany } from '../users/resolve-peer-many.js';
|
|
3
4
|
/**
|
|
@@ -10,7 +11,7 @@ export async function getPeerDialogs(client, peers) {
|
|
|
10
11
|
peers = [peers];
|
|
11
12
|
const res = await client.call({
|
|
12
13
|
_: 'messages.getPeerDialogs',
|
|
13
|
-
peers: await resolvePeerMany(client, peers).then((peers) => peers.map((it) => ({
|
|
14
|
+
peers: await resolvePeerMany(client, peers).then((peers) => peers.filter(isPresent).map((it) => ({
|
|
14
15
|
_: 'inputDialogPeer',
|
|
15
16
|
peer: it,
|
|
16
17
|
}))),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-peer-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/get-peer-dialogs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-peer-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/get-peer-dialogs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB,EAAE,KAAgC;IAC1F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,CAAC,KAAK,CAAC,CAAA;IAE1C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,yBAAyB;QAC5B,KAAK,EAAE,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACvD,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,iBAAiB;YACpB,IAAI,EAAE,EAAE;SACX,CAAC,CAAC,CACN;KACJ,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC","sourcesContent":["import { MaybeArray } from '../../../types/utils.js'\nimport { isPresent } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Dialog } from '../../types/messages/dialog.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\n\n/**\n * Get dialogs with certain peers.\n *\n * @param peers Peers for which to fetch dialogs.\n */\nexport async function getPeerDialogs(client: ITelegramClient, peers: MaybeArray<InputPeerLike>): Promise<Dialog[]> {\n if (!Array.isArray(peers)) peers = [peers]\n\n const res = await client.call({\n _: 'messages.getPeerDialogs',\n peers: await resolvePeerMany(client, peers).then((peers) =>\n peers.filter(isPresent).map((it) => ({\n _: 'inputDialogPeer',\n peer: it,\n })),\n ),\n })\n\n return Dialog.parseTlDialogs(res)\n}\n"]}
|
|
@@ -128,7 +128,9 @@ export async function* iterDialogs(client, params) {
|
|
|
128
128
|
const last = dialogs[dialogs.length - 1];
|
|
129
129
|
offsetPeer = last.chat.inputPeer;
|
|
130
130
|
offsetId = last.raw.topMessage;
|
|
131
|
-
|
|
131
|
+
if (last.lastMessage) {
|
|
132
|
+
offsetDate = last.lastMessage.raw.date;
|
|
133
|
+
}
|
|
132
134
|
for (const d of dialogs) {
|
|
133
135
|
if (filterFolder && !filterFolder(d))
|
|
134
136
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iter-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/iter-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tl } from '@mtcute/tl'\n\nimport { MtUnsupportedError } from '../../../types/errors.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Dialog, InputDialogFolder } from '../../types/index.js'\nimport { normalizeDate } from '../../utils/misc-utils.js'\nimport { _normalizeInputFolder } from './get-folders.js'\n\n/**\n * Iterate over dialogs.\n *\n * Note that due to Telegram API limitations,\n * ordering here can only be anti-chronological\n * (i.e. newest - first), and draft update date\n * is not considered when sorting.\n *\n * @param params Fetch parameters\n */\nexport async function* iterDialogs(\n client: ITelegramClient,\n params?: {\n /**\n * Offset message date used as an anchor for pagination.\n */\n offsetDate?: Date | number\n\n /**\n * Offset message ID used as an anchor for pagination\n */\n offsetId?: number\n\n /**\n * Offset peer used as an anchor for pagination\n */\n offsetPeer?: tl.TypeInputPeer\n\n /**\n * Limits the number of dialogs to be received.\n *\n * @default `Infinity`, i.e. all dialogs are fetched\n */\n limit?: number\n\n /**\n * Chunk size which will be passed to `messages.getDialogs`.\n * You shouldn't usually care about this.\n *\n * @default 100.\n */\n chunkSize?: number\n\n /**\n * How to handle pinned dialogs?\n *\n * Whether to `include` them at the start of the list,\n * `exclude` them at all, or `only` return pinned dialogs.\n *\n * Additionally, for folders you can specify\n * `keep`, which will return pinned dialogs\n * ordered by date among other non-pinned dialogs.\n *\n * > **Note**: When using `include` mode with folders,\n * > pinned dialogs will only be fetched if all offset\n * > parameters are unset.\n *\n * @default `include`.\n */\n pinned?: 'include' | 'exclude' | 'only' | 'keep'\n\n /**\n * How to handle archived chats?\n *\n * Whether to `keep` them among other dialogs,\n * `exclude` them from the list, or `only`\n * return archived dialogs\n *\n * Ignored for folders, since folders\n * themselves contain information about archived chats.\n *\n * > **Note**: when `pinned=only`, `archived=keep` will act as `only`\n * > because of Telegram API limitations.\n *\n * @default `exclude`\n */\n archived?: 'keep' | 'exclude' | 'only'\n\n /**\n * Folder from which the dialogs will be fetched.\n *\n * You can pass folder object, id or title\n *\n * Note that passing anything except object will\n * cause the list of the folders to be fetched,\n * and passing a title may fetch from\n * a wrong folder if you have multiple with the same title.\n *\n * Also note that fetching dialogs in a folder is\n * *orders of magnitudes* slower than normal because\n * of Telegram API limitations - we have to fetch all dialogs\n * and filter the ones we need manually. If possible,\n * use {@link Dialog.filterFolder} instead.\n *\n * When a folder with given ID or title is not found,\n * {@link MtArgumentError} is thrown\n *\n * @default <empty> (fetches from \"All\" folder)\n */\n folder?: InputDialogFolder\n\n /**\n * Additional filtering for the dialogs.\n *\n * If `folder` is not provided, this filter is used instead.\n * If `folder` is provided, fields from this object are used\n * to override filters inside the folder.\n */\n filter?: Partial<Omit<tl.RawDialogFilter, '_' | 'id' | 'title'>>\n },\n): AsyncIterableIterator<Dialog> {\n if (!params) params = {}\n\n const { limit = Infinity, chunkSize = 100, folder, filter, pinned = 'include' } = params\n\n let { offsetId = 0, offsetPeer = { _: 'inputPeerEmpty' }, archived = 'exclude' } = params\n\n let offsetDate = normalizeDate(params.offsetDate) ?? 0\n\n let localFilters_: tl.TypeDialogFilter | undefined\n\n if (folder) {\n localFilters_ = await _normalizeInputFolder(client, folder)\n }\n\n if (filter) {\n if (localFilters_ && localFilters_._ !== 'dialogFilterDefault') {\n localFilters_ = {\n ...localFilters_,\n ...filter,\n }\n } else {\n localFilters_ = {\n _: 'dialogFilter',\n id: 0,\n title: '',\n pinnedPeers: [],\n includePeers: [],\n excludePeers: [],\n ...params.filter,\n }\n }\n }\n\n if (localFilters_?._ === 'dialogFilterDefault') {\n localFilters_ = undefined\n }\n\n if (localFilters_?._ === 'dialogFilterChatlist') {\n throw new MtUnsupportedError('Shared chat folders are not supported yet')\n }\n\n const localFilters = localFilters_\n\n if (localFilters) {\n archived = localFilters.excludeArchived ? 'exclude' : 'keep'\n }\n\n const fetchPinnedDialogsFromFolder = async (): Promise<tl.messages.RawPeerDialogs | null> => {\n if (!localFilters || !localFilters.pinnedPeers.length) {\n return null\n }\n const res = await client.call({\n _: 'messages.getPeerDialogs',\n peers: localFilters.pinnedPeers.map((peer) => ({\n _: 'inputDialogPeer' as const,\n peer,\n })),\n })\n\n res.dialogs.forEach((dialog: tl.Mutable<tl.TypeDialog>) => (dialog.pinned = true))\n\n return res\n }\n\n if (pinned === 'only') {\n let res\n\n if (localFilters) {\n res = await fetchPinnedDialogsFromFolder()\n } else {\n res = await client.call({\n _: 'messages.getPinnedDialogs',\n folderId: archived === 'exclude' ? 0 : 1,\n })\n }\n if (res) yield* Dialog.parseTlDialogs(res, limit)\n\n return\n }\n\n let current = 0\n\n if (\n localFilters?.pinnedPeers.length &&\n pinned === 'include' &&\n offsetId === 0 &&\n offsetDate === 0 &&\n offsetPeer._ === 'inputPeerEmpty'\n ) {\n const res = await fetchPinnedDialogsFromFolder()\n\n if (res) {\n const dialogs = Dialog.parseTlDialogs(res, limit)\n\n for (const d of dialogs) {\n yield d\n if (++current >= limit) return\n }\n }\n }\n // if pinned is `only`, this wouldn't be reached\n // if pinned is `exclude`, we want to exclude them\n // if pinned is `include`, we already yielded them, so we also want to exclude them\n // if pinned is `keep`, we want to keep them\n const filterFolder = localFilters ? Dialog.filterFolder(localFilters, pinned !== 'keep') : undefined\n\n let folderId\n\n if (archived === 'keep') {\n folderId = undefined\n } else if (archived === 'only') {\n folderId = 1\n } else {\n folderId = 0\n }\n\n for (;;) {\n const dialogs = Dialog.parseTlDialogs(\n await client.call({\n _: 'messages.getDialogs',\n excludePinned: params.pinned === 'exclude',\n folderId,\n offsetDate,\n offsetId,\n offsetPeer,\n limit: filterFolder ? chunkSize : Math.min(limit - current, chunkSize),\n hash: Long.ZERO,\n }),\n )\n if (!dialogs.length) return\n\n const last = dialogs[dialogs.length - 1]\n offsetPeer = last.chat.inputPeer\n offsetId = last.raw.topMessage\n offsetDate = last.lastMessage.raw.date\n\n for (const d of dialogs) {\n if (filterFolder && !filterFolder(d)) continue\n\n yield d\n if (++current >= limit) return\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"iter-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/iter-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport { tl } from '@mtcute/tl'\n\nimport { MtUnsupportedError } from '../../../types/errors.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Dialog, InputDialogFolder } from '../../types/index.js'\nimport { normalizeDate } from '../../utils/misc-utils.js'\nimport { _normalizeInputFolder } from './get-folders.js'\n\n/**\n * Iterate over dialogs.\n *\n * Note that due to Telegram API limitations,\n * ordering here can only be anti-chronological\n * (i.e. newest - first), and draft update date\n * is not considered when sorting.\n *\n * @param params Fetch parameters\n */\nexport async function* iterDialogs(\n client: ITelegramClient,\n params?: {\n /**\n * Offset message date used as an anchor for pagination.\n */\n offsetDate?: Date | number\n\n /**\n * Offset message ID used as an anchor for pagination\n */\n offsetId?: number\n\n /**\n * Offset peer used as an anchor for pagination\n */\n offsetPeer?: tl.TypeInputPeer\n\n /**\n * Limits the number of dialogs to be received.\n *\n * @default `Infinity`, i.e. all dialogs are fetched\n */\n limit?: number\n\n /**\n * Chunk size which will be passed to `messages.getDialogs`.\n * You shouldn't usually care about this.\n *\n * @default 100.\n */\n chunkSize?: number\n\n /**\n * How to handle pinned dialogs?\n *\n * Whether to `include` them at the start of the list,\n * `exclude` them at all, or `only` return pinned dialogs.\n *\n * Additionally, for folders you can specify\n * `keep`, which will return pinned dialogs\n * ordered by date among other non-pinned dialogs.\n *\n * > **Note**: When using `include` mode with folders,\n * > pinned dialogs will only be fetched if all offset\n * > parameters are unset.\n *\n * @default `include`.\n */\n pinned?: 'include' | 'exclude' | 'only' | 'keep'\n\n /**\n * How to handle archived chats?\n *\n * Whether to `keep` them among other dialogs,\n * `exclude` them from the list, or `only`\n * return archived dialogs\n *\n * Ignored for folders, since folders\n * themselves contain information about archived chats.\n *\n * > **Note**: when `pinned=only`, `archived=keep` will act as `only`\n * > because of Telegram API limitations.\n *\n * @default `exclude`\n */\n archived?: 'keep' | 'exclude' | 'only'\n\n /**\n * Folder from which the dialogs will be fetched.\n *\n * You can pass folder object, id or title\n *\n * Note that passing anything except object will\n * cause the list of the folders to be fetched,\n * and passing a title may fetch from\n * a wrong folder if you have multiple with the same title.\n *\n * Also note that fetching dialogs in a folder is\n * *orders of magnitudes* slower than normal because\n * of Telegram API limitations - we have to fetch all dialogs\n * and filter the ones we need manually. If possible,\n * use {@link Dialog.filterFolder} instead.\n *\n * When a folder with given ID or title is not found,\n * {@link MtArgumentError} is thrown\n *\n * @default <empty> (fetches from \"All\" folder)\n */\n folder?: InputDialogFolder\n\n /**\n * Additional filtering for the dialogs.\n *\n * If `folder` is not provided, this filter is used instead.\n * If `folder` is provided, fields from this object are used\n * to override filters inside the folder.\n */\n filter?: Partial<Omit<tl.RawDialogFilter, '_' | 'id' | 'title'>>\n },\n): AsyncIterableIterator<Dialog> {\n if (!params) params = {}\n\n const { limit = Infinity, chunkSize = 100, folder, filter, pinned = 'include' } = params\n\n let { offsetId = 0, offsetPeer = { _: 'inputPeerEmpty' }, archived = 'exclude' } = params\n\n let offsetDate = normalizeDate(params.offsetDate) ?? 0\n\n let localFilters_: tl.TypeDialogFilter | undefined\n\n if (folder) {\n localFilters_ = await _normalizeInputFolder(client, folder)\n }\n\n if (filter) {\n if (localFilters_ && localFilters_._ !== 'dialogFilterDefault') {\n localFilters_ = {\n ...localFilters_,\n ...filter,\n }\n } else {\n localFilters_ = {\n _: 'dialogFilter',\n id: 0,\n title: '',\n pinnedPeers: [],\n includePeers: [],\n excludePeers: [],\n ...params.filter,\n }\n }\n }\n\n if (localFilters_?._ === 'dialogFilterDefault') {\n localFilters_ = undefined\n }\n\n if (localFilters_?._ === 'dialogFilterChatlist') {\n throw new MtUnsupportedError('Shared chat folders are not supported yet')\n }\n\n const localFilters = localFilters_\n\n if (localFilters) {\n archived = localFilters.excludeArchived ? 'exclude' : 'keep'\n }\n\n const fetchPinnedDialogsFromFolder = async (): Promise<tl.messages.RawPeerDialogs | null> => {\n if (!localFilters || !localFilters.pinnedPeers.length) {\n return null\n }\n const res = await client.call({\n _: 'messages.getPeerDialogs',\n peers: localFilters.pinnedPeers.map((peer) => ({\n _: 'inputDialogPeer' as const,\n peer,\n })),\n })\n\n res.dialogs.forEach((dialog: tl.Mutable<tl.TypeDialog>) => (dialog.pinned = true))\n\n return res\n }\n\n if (pinned === 'only') {\n let res\n\n if (localFilters) {\n res = await fetchPinnedDialogsFromFolder()\n } else {\n res = await client.call({\n _: 'messages.getPinnedDialogs',\n folderId: archived === 'exclude' ? 0 : 1,\n })\n }\n if (res) yield* Dialog.parseTlDialogs(res, limit)\n\n return\n }\n\n let current = 0\n\n if (\n localFilters?.pinnedPeers.length &&\n pinned === 'include' &&\n offsetId === 0 &&\n offsetDate === 0 &&\n offsetPeer._ === 'inputPeerEmpty'\n ) {\n const res = await fetchPinnedDialogsFromFolder()\n\n if (res) {\n const dialogs = Dialog.parseTlDialogs(res, limit)\n\n for (const d of dialogs) {\n yield d\n if (++current >= limit) return\n }\n }\n }\n // if pinned is `only`, this wouldn't be reached\n // if pinned is `exclude`, we want to exclude them\n // if pinned is `include`, we already yielded them, so we also want to exclude them\n // if pinned is `keep`, we want to keep them\n const filterFolder = localFilters ? Dialog.filterFolder(localFilters, pinned !== 'keep') : undefined\n\n let folderId\n\n if (archived === 'keep') {\n folderId = undefined\n } else if (archived === 'only') {\n folderId = 1\n } else {\n folderId = 0\n }\n\n for (;;) {\n const dialogs = Dialog.parseTlDialogs(\n await client.call({\n _: 'messages.getDialogs',\n excludePinned: params.pinned === 'exclude',\n folderId,\n offsetDate,\n offsetId,\n offsetPeer,\n limit: filterFolder ? chunkSize : Math.min(limit - current, chunkSize),\n hash: Long.ZERO,\n }),\n )\n if (!dialogs.length) return\n\n const last = dialogs[dialogs.length - 1]\n offsetPeer = last.chat.inputPeer\n offsetId = last.raw.topMessage\n\n if (last.lastMessage) {\n offsetDate = last.lastMessage.raw.date\n }\n\n for (const d of dialogs) {\n if (filterFolder && !filterFolder(d)) continue\n\n yield d\n if (++current >= limit) return\n }\n }\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { tl } from '@mtcute/tl';
|
|
2
2
|
import { RpcCallOptions } from '../../../network/network-manager.js';
|
|
3
|
+
import { MustEqual } from '../../../types/utils.js';
|
|
3
4
|
import { ITelegramClient } from '../../client.types.js';
|
|
4
5
|
/**
|
|
5
6
|
* @internal
|
|
6
7
|
*/
|
|
7
|
-
export declare function _maybeInvokeWithBusinessConnection<T extends tl.RpcMethod>(client: ITelegramClient, businessConnectionId: string | undefined, request: T, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
|
|
8
|
+
export declare function _maybeInvokeWithBusinessConnection<T extends tl.RpcMethod>(client: ITelegramClient, businessConnectionId: string | undefined, request: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/_business-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/_business-connection.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAE7E,qBAAqB;AACrB,oEAAoE;AACpE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;AAErC,MAAM,QAAQ,GAAG,CAAC,MAAuB,EAA0B,EAAE;IACjE,MAAM,OAAO,GAAG,MAAsE,CAAA;IAEtF,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC,aAAa,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,kBAAkB;AAClB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACpD,MAAuB,EACvB,oBAAwC,EACxC,OAAmC,EACnC,MAAuB;IAEvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAE9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;QAErE,KAAK,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAE,CAAA;IAE7C,+DAA+D;IAC/D,OAAO,MAAM,CAAC,IAAI,CACd;QACI,CAAC,EAAE,8BAA8B;QACjC,YAAY,EAAE,oBAAoB;QAClC,KAAK,EAAE,OAAO;KACjB,EACD;QACI,GAAG,MAAM;QACT,YAAY,EAAE,IAAI,EAAE,eAAe;QACnC,IAAI;KACP,CACJ,CAAA;AACL,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { RpcCallOptions } from '../../../network/network-manager.js'\nimport { MustEqual } from '../../../types/utils.js'\nimport { LruMap } from '../../../utils/lru-map.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { getBusinessConnection } from '../premium/get-business-connection.js'\n\n// temporary solution\n// todo – rework once we have either a more generic caching solution\nconst DC_MAP_SYMBOL = Symbol('dcMap')\n\nconst getDcMap = (client: ITelegramClient): LruMap<string, number> => {\n const client_ = client as typeof client & { [DC_MAP_SYMBOL]?: LruMap<string, number> }\n\n if (!client_[DC_MAP_SYMBOL]) {\n client_[DC_MAP_SYMBOL] = new LruMap(50)\n }\n\n return client_[DC_MAP_SYMBOL]\n}\n\n// @available=both\n/**\n * @internal\n */\nexport async function _maybeInvokeWithBusinessConnection<T extends tl.RpcMethod>(\n client: ITelegramClient,\n businessConnectionId: string | undefined,\n request: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n): Promise<tl.RpcCallReturn[T['_']]> {\n if (!businessConnectionId) {\n return client.call(request, params)\n }\n\n const dcMap = getDcMap(client)\n\n if (!dcMap.has(businessConnectionId)) {\n const res = await getBusinessConnection(client, businessConnectionId)\n\n dcMap.set(businessConnectionId, res.dcId)\n }\n\n const dcId = dcMap.get(businessConnectionId)!\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return client.call(\n {\n _: 'invokeWithBusinessConnection',\n connectionId: businessConnectionId,\n query: request,\n },\n {\n ...params,\n localMigrate: true, // just in case\n dcId,\n },\n )\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
2
|
+
import { MessageEffect } from '../../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get a list of available message effects
|
|
5
|
+
*/
|
|
6
|
+
export declare function getAvailableMessageEffects(client: ITelegramClient): Promise<MessageEffect[]>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LongMap } from '../../../utils/long-utils.js';
|
|
2
|
+
import { assertTypeIsNot } from '../../../utils/type-assertions.js';
|
|
3
|
+
import { MessageEffect } from '../../types/index.js';
|
|
4
|
+
// @available=user
|
|
5
|
+
/**
|
|
6
|
+
* Get a list of available message effects
|
|
7
|
+
*/
|
|
8
|
+
export async function getAvailableMessageEffects(client) {
|
|
9
|
+
const res = await client.call({
|
|
10
|
+
_: 'messages.getAvailableEffects',
|
|
11
|
+
hash: 0,
|
|
12
|
+
});
|
|
13
|
+
assertTypeIsNot('getAvailableMessageEffects', res, 'messages.availableEffectsNotModified');
|
|
14
|
+
const documentsMap = new LongMap();
|
|
15
|
+
for (const doc of res.documents) {
|
|
16
|
+
if (doc._ !== 'document')
|
|
17
|
+
continue;
|
|
18
|
+
documentsMap.set(doc.id, doc);
|
|
19
|
+
}
|
|
20
|
+
return res.effects.map((effect) => new MessageEffect(effect, documentsMap));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=get-available-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-available-effects.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/get-available-effects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,kBAAkB;AAClB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,MAAuB;IACpE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,8BAA8B;QACjC,IAAI,EAAE,CAAC;KACV,CAAC,CAAA;IAEF,eAAe,CAAC,4BAA4B,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAA;IAE1F,MAAM,YAAY,GAAG,IAAI,OAAO,EAAkB,CAAA;IAElD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,CAAC,KAAK,UAAU;YAAE,SAAQ;QAClC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;AAC/E,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { LongMap } from '../../../utils/long-utils.js'\nimport { assertTypeIsNot } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MessageEffect } from '../../types/index.js'\n\n// @available=user\n/**\n * Get a list of available message effects\n */\nexport async function getAvailableMessageEffects(client: ITelegramClient): Promise<MessageEffect[]> {\n const res = await client.call({\n _: 'messages.getAvailableEffects',\n hash: 0,\n })\n\n assertTypeIsNot('getAvailableMessageEffects', res, 'messages.availableEffectsNotModified')\n\n const documentsMap = new LongMap<tl.RawDocument>()\n\n for (const doc of res.documents) {\n if (doc._ !== 'document') continue\n documentsMap.set(doc.id, doc)\n }\n\n return res.effects.map((effect) => new MessageEffect(effect, documentsMap))\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MaybeArray } from '../../../types/utils.js';
|
|
2
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
3
|
+
import { InputPeerLike } from '../../types/index.js';
|
|
4
|
+
import { FactCheck } from '../../types/messages/fact-check.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get fact check information for one or more messages in a chat
|
|
7
|
+
*
|
|
8
|
+
* @param chatId Chat where the messages are located
|
|
9
|
+
* @param msgIds One or more message IDs
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFactCheck(client: ITelegramClient, chatId: InputPeerLike, msgIds: MaybeArray<number>): Promise<(FactCheck | null)[]>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FactCheck } from '../../types/messages/fact-check.js';
|
|
2
|
+
import { resolvePeer } from '../users/resolve-peer.js';
|
|
3
|
+
// @available=user
|
|
4
|
+
/**
|
|
5
|
+
* Get fact check information for one or more messages in a chat
|
|
6
|
+
*
|
|
7
|
+
* @param chatId Chat where the messages are located
|
|
8
|
+
* @param msgIds One or more message IDs
|
|
9
|
+
*/
|
|
10
|
+
export async function getFactCheck(client, chatId, msgIds) {
|
|
11
|
+
const res = await client.call({
|
|
12
|
+
_: 'messages.getFactCheck',
|
|
13
|
+
peer: await resolvePeer(client, chatId),
|
|
14
|
+
msgId: Array.isArray(msgIds) ? msgIds : [msgIds],
|
|
15
|
+
});
|
|
16
|
+
return res.map((x) => {
|
|
17
|
+
if (x.hash.isZero()) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return new FactCheck(x);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=get-fact-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-fact-check.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/get-fact-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,kBAAkB;AAClB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,MAAuB,EACvB,MAAqB,EACrB,MAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,uBAAuB;QAC1B,IAAI,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;KACnD,CAAC,CAAA;IAEF,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;QACf,CAAC;QAED,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACN,CAAC","sourcesContent":["import { MaybeArray } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { FactCheck } from '../../types/messages/fact-check.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n// @available=user\n/**\n * Get fact check information for one or more messages in a chat\n *\n * @param chatId Chat where the messages are located\n * @param msgIds One or more message IDs\n */\nexport async function getFactCheck(\n client: ITelegramClient,\n chatId: InputPeerLike,\n msgIds: MaybeArray<number>,\n): Promise<(FactCheck | null)[]> {\n const res = await client.call({\n _: 'messages.getFactCheck',\n peer: await resolvePeer(client, chatId),\n msgId: Array.isArray(msgIds) ? msgIds : [msgIds],\n })\n\n return res.map((x) => {\n if (x.hash.isZero()) {\n return null\n }\n\n return new FactCheck(x)\n })\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { tl } from '@mtcute/tl';
|
|
2
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
3
|
+
import { Message } from '../../types/index.js';
|
|
4
|
+
import { ArrayPaginated } from '../../types/utils.js';
|
|
5
|
+
export interface SearchHashtagOffset {
|
|
6
|
+
rate: number;
|
|
7
|
+
peer: tl.TypeInputPeer;
|
|
8
|
+
id: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
12
|
+
*
|
|
13
|
+
* @param hashtag Hashtag to search for
|
|
14
|
+
* @param params Additional parameters
|
|
15
|
+
*/
|
|
16
|
+
export declare function searchHashtag(client: ITelegramClient, hashtag: string, params?: {
|
|
17
|
+
/** Offset for the search */
|
|
18
|
+
offset?: SearchHashtagOffset;
|
|
19
|
+
/** Limit the number of results */
|
|
20
|
+
limit?: number;
|
|
21
|
+
}): Promise<ArrayPaginated<Message, SearchHashtagOffset>>;
|
|
22
|
+
/**
|
|
23
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
24
|
+
*
|
|
25
|
+
* Iterable version of {@link searchHashtag}
|
|
26
|
+
*
|
|
27
|
+
* @param hashtag Hashtag to search for
|
|
28
|
+
* @param params Additional parameters
|
|
29
|
+
*/
|
|
30
|
+
export declare function iterSearchHashtag(client: ITelegramClient, hashtag: string, params?: Parameters<typeof searchHashtag>[2] & {
|
|
31
|
+
/**
|
|
32
|
+
* Limits the number of messages to be retrieved.
|
|
33
|
+
*
|
|
34
|
+
* @default `Infinity`, i.e. all messages are returned
|
|
35
|
+
*/
|
|
36
|
+
limit?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Chunk size, which will be passed as `limit` parameter
|
|
39
|
+
* for `messages.search`. Usually you shouldn't care about this.
|
|
40
|
+
*
|
|
41
|
+
* @default 100
|
|
42
|
+
*/
|
|
43
|
+
chunkSize?: number;
|
|
44
|
+
}): AsyncIterableIterator<Message>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { assertTypeIsNot } from '../../../utils/type-assertions.js';
|
|
2
|
+
import { Message, PeersIndex } from '../../types/index.js';
|
|
3
|
+
import { makeArrayPaginated } from '../../utils/misc-utils.js';
|
|
4
|
+
const defaultOffset = {
|
|
5
|
+
rate: 0,
|
|
6
|
+
peer: { _: 'inputPeerEmpty' },
|
|
7
|
+
id: 0,
|
|
8
|
+
};
|
|
9
|
+
// @available=user
|
|
10
|
+
/**
|
|
11
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
12
|
+
*
|
|
13
|
+
* @param hashtag Hashtag to search for
|
|
14
|
+
* @param params Additional parameters
|
|
15
|
+
*/
|
|
16
|
+
export async function searchHashtag(client, hashtag, params) {
|
|
17
|
+
const { offset: { rate: offsetRate, peer: offsetPeer, id: offsetId } = defaultOffset, limit = 100 } = params ?? {};
|
|
18
|
+
const res = await client.call({
|
|
19
|
+
_: 'channels.searchPosts',
|
|
20
|
+
hashtag,
|
|
21
|
+
offsetId,
|
|
22
|
+
offsetRate,
|
|
23
|
+
offsetPeer,
|
|
24
|
+
limit,
|
|
25
|
+
});
|
|
26
|
+
assertTypeIsNot('searchHashtag', res, 'messages.messagesNotModified');
|
|
27
|
+
const peers = PeersIndex.from(res);
|
|
28
|
+
const msgs = res.messages.filter((msg) => msg._ !== 'messageEmpty').map((msg) => new Message(msg, peers));
|
|
29
|
+
const last = msgs[msgs.length - 1];
|
|
30
|
+
const next = last ?
|
|
31
|
+
{
|
|
32
|
+
rate: res.nextRate ?? last.raw.date,
|
|
33
|
+
peer: last.chat.inputPeer,
|
|
34
|
+
id: last.id,
|
|
35
|
+
} :
|
|
36
|
+
undefined;
|
|
37
|
+
return makeArrayPaginated(msgs, res.count ?? msgs.length, next);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
41
|
+
*
|
|
42
|
+
* Iterable version of {@link searchHashtag}
|
|
43
|
+
*
|
|
44
|
+
* @param hashtag Hashtag to search for
|
|
45
|
+
* @param params Additional parameters
|
|
46
|
+
*/
|
|
47
|
+
export async function* iterSearchHashtag(client, hashtag, params) {
|
|
48
|
+
if (!params)
|
|
49
|
+
params = {};
|
|
50
|
+
const { limit = Infinity, chunkSize = 100 } = params;
|
|
51
|
+
let { offset } = params;
|
|
52
|
+
let current = 0;
|
|
53
|
+
for (;;) {
|
|
54
|
+
const res = await searchHashtag(client, hashtag, {
|
|
55
|
+
offset,
|
|
56
|
+
limit: Math.min(chunkSize, limit - current),
|
|
57
|
+
});
|
|
58
|
+
if (!res.length)
|
|
59
|
+
return;
|
|
60
|
+
for (const msg of res) {
|
|
61
|
+
yield msg;
|
|
62
|
+
if (++current >= limit)
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!res.next)
|
|
66
|
+
return;
|
|
67
|
+
offset = res.next;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=search-hashtag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-hashtag.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/search-hashtag.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAS9D,MAAM,aAAa,GAAwB;IACvC,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE;IAC7B,EAAE,EAAE,CAAC;CACR,CAAA;AAED,kBAAkB;AAClB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,MAAuB,EACvB,OAAe,EACf,MAKC;IAED,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAClH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,sBAAsB;QACzB,OAAO;QACP,QAAQ;QACR,UAAU;QACV,UAAU;QACV,KAAK;KACR,CAAC,CAAA;IAEF,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAA;IAErE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACzG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC;QACf;YACI,IAAI,EAAG,GAAoC,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI;YACrE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YACzB,EAAE,EAAE,IAAI,CAAC,EAAE;SACd,CAAC,CAAC;QACH,SAAS,CAAA;IAEb,OAAO,kBAAkB,CAAC,IAAI,EAAG,GAAoC,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACrG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACpC,MAAuB,EACvB,OAAe,EACf,MAeC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IACxB,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,MAAM,CAAA;IACpD,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACvB,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,SAAS,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE;YAC7C,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;SAC9C,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAM;QAEvB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,GAAG,CAAA;YAET,IAAI,EAAE,OAAO,IAAI,KAAK;gBAAE,OAAM;QAClC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAM;QACrB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAA;IACrB,CAAC;AACL,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { assertTypeIsNot } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Message, PeersIndex } from '../../types/index.js'\nimport { ArrayPaginated } from '../../types/utils.js'\nimport { makeArrayPaginated } from '../../utils/misc-utils.js'\n\n// @exported\nexport interface SearchHashtagOffset {\n rate: number\n peer: tl.TypeInputPeer\n id: number\n}\n\nconst defaultOffset: SearchHashtagOffset = {\n rate: 0,\n peer: { _: 'inputPeerEmpty' },\n id: 0,\n}\n\n// @available=user\n/**\n * Perform a global hashtag search, across the entire Telegram\n *\n * @param hashtag Hashtag to search for\n * @param params Additional parameters\n */\nexport async function searchHashtag(\n client: ITelegramClient,\n hashtag: string,\n params?: {\n /** Offset for the search */\n offset?: SearchHashtagOffset\n /** Limit the number of results */\n limit?: number\n },\n): Promise<ArrayPaginated<Message, SearchHashtagOffset>> {\n const { offset: { rate: offsetRate, peer: offsetPeer, id: offsetId } = defaultOffset, limit = 100 } = params ?? {}\n const res = await client.call({\n _: 'channels.searchPosts',\n hashtag,\n offsetId,\n offsetRate,\n offsetPeer,\n limit,\n })\n\n assertTypeIsNot('searchHashtag', res, 'messages.messagesNotModified')\n\n const peers = PeersIndex.from(res)\n const msgs = res.messages.filter((msg) => msg._ !== 'messageEmpty').map((msg) => new Message(msg, peers))\n const last = msgs[msgs.length - 1]\n\n const next = last ?\n {\n rate: (res as tl.messages.RawMessagesSlice).nextRate ?? last.raw.date,\n peer: last.chat.inputPeer,\n id: last.id,\n } :\n undefined\n\n return makeArrayPaginated(msgs, (res as tl.messages.RawMessagesSlice).count ?? msgs.length, next)\n}\n\n/**\n * Perform a global hashtag search, across the entire Telegram\n *\n * Iterable version of {@link searchHashtag}\n *\n * @param hashtag Hashtag to search for\n * @param params Additional parameters\n */\nexport async function* iterSearchHashtag(\n client: ITelegramClient,\n hashtag: string,\n params?: Parameters<typeof searchHashtag>[2] & {\n /**\n * Limits the number of messages to be retrieved.\n *\n * @default `Infinity`, i.e. all messages are returned\n */\n limit?: number\n\n /**\n * Chunk size, which will be passed as `limit` parameter\n * for `messages.search`. Usually you shouldn't care about this.\n *\n * @default 100\n */\n chunkSize?: number\n },\n): AsyncIterableIterator<Message> {\n if (!params) params = {}\n const { limit = Infinity, chunkSize = 100 } = params\n let { offset } = params\n let current = 0\n\n for (;;) {\n const res = await searchHashtag(client, hashtag, {\n offset,\n limit: Math.min(chunkSize, limit - current),\n })\n\n if (!res.length) return\n\n for (const msg of res) {\n yield msg\n\n if (++current >= limit) return\n }\n\n if (!res.next) return\n offset = res.next\n }\n}\n"]}
|
|
@@ -92,6 +92,11 @@ export interface CommonSendParams {
|
|
|
92
92
|
* the message will be sent
|
|
93
93
|
*/
|
|
94
94
|
businessConnectionId?: string;
|
|
95
|
+
/**
|
|
96
|
+
* ID of a message effect to use when sending the message
|
|
97
|
+
* (see {@link TelegramClient.getAvailableMessageEffects})
|
|
98
|
+
*/
|
|
99
|
+
effect?: tl.Long;
|
|
95
100
|
}
|
|
96
101
|
/**
|
|
97
102
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../../types/errors.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtMessageNotFoundError } from '../../types/errors.js'\nimport { Message } from '../../types/messages/message.js'\nimport { TextWithEntities } from '../../types/misc/entities.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { normalizeDate, normalizeMessageId } from '../../utils/index.js'\nimport { _getPeerChainId } from '../misc/chain-id.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { getMessages } from './get-messages.js'\n\n// @exported\nexport interface CommonSendParams {\n /**\n * Message to reply to. Either a message object or message ID.\n *\n * For forums - can also be an ID of the topic (i.e. its top message ID)\n *\n * Can also be a message from another chat, in which case a quote will be sent.\n */\n replyTo?: number | Message\n\n /**\n * Whether to throw an error if {@link replyTo}\n * message does not exist.\n *\n * If that message was not found, `NotFoundError` is thrown,\n * with `text` set to `MESSAGE_NOT_FOUND`.\n *\n * Incurs an additional request, so only use when really needed.\n *\n * @default `false`\n */\n mustReply?: boolean\n\n /**\n * Message to comment to. Either a message object or message ID.\n *\n * This overwrites `replyTo` if it was passed\n */\n commentTo?: number | Message\n\n /**\n * Story to reply to.\n *\n * Must be the story sent by the peer you are sending the message to.\n *\n * Can't be used together with {@link replyTo} or {@link commentTo}.\n */\n replyToStory?: number\n\n /**\n * Quoted text. Must be exactly contained in the message\n * being quoted to be accepted by the server (as well as entities)\n */\n quote?: TextWithEntities\n\n /**\n * Offset of the start of the quote in the message.\n */\n quoteOffset?: number\n\n /**\n * Whether to send this message silently.\n */\n silent?: boolean\n\n /**\n * If set, the message will be scheduled to this date.\n * When passing a number, a UNIX time in ms is expected.\n *\n * You can also pass `online` - this will send the message\n * once the peer is online. Note that this requires that\n * peer's online status to be visible to you.\n */\n schedule?: Date | number | 'online'\n\n /**\n * Whether to clear draft after sending this message.\n *\n * @default `false`\n */\n clearDraft?: boolean\n\n /**\n * Whether to disallow further forwards of this message.\n *\n * Only for bots, works even if the target chat does not\n * have content protection.\n */\n forbidForwards?: boolean\n\n /**\n * Peer to use when sending the message.\n */\n sendAs?: InputPeerLike\n\n /**\n * If passed, instead of sending the message, it will be saved into the\n * given quick reply shortcut (either its ID or its shortcut string).\n */\n quickReply?: number | string\n\n /**\n * Whether to dispatch the returned message\n * to the client's update handler.\n */\n shouldDispatch?: true\n\n /**\n * Unique identifier of the business connection on behalf of which\n * the message will be sent\n */\n businessConnectionId?: string\n\n /**\n * ID of a message effect to use when sending the message\n * (see {@link TelegramClient.getAvailableMessageEffects})\n */\n effect?: tl.Long\n // todo: once we have a caching layer, we can accept an emoji here\n}\n\n/**\n * @internal\n * @noemit\n */\nexport function _normalizeQuickReplyShortcut(\n shortcut: number | string | undefined,\n): tl.TypeInputQuickReplyShortcut | undefined {\n if (!shortcut) return undefined\n\n if (typeof shortcut === 'number') {\n return {\n _: 'inputQuickReplyShortcutId',\n shortcutId: shortcut,\n }\n }\n\n return {\n _: 'inputQuickReplyShortcut',\n shortcut,\n }\n}\n\n/**\n * @internal\n * @noemit\n */\nexport async function _processCommonSendParameters(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params: CommonSendParams,\n) {\n let peer = await resolvePeer(client, chatId)\n\n let replyTo = normalizeMessageId(params.replyTo)\n const replyToPeer = typeof params.replyTo === 'number' ? undefined : params.replyTo?.chat.inputPeer\n\n if (params.commentTo) {\n [peer, replyTo] = await _getDiscussionMessage(client, peer, normalizeMessageId(params.commentTo)!)\n }\n\n if (params.mustReply) {\n if (!replyTo) {\n throw new MtArgumentError('mustReply used, but replyTo was not passed')\n }\n\n const msg = await getMessages(client, peer, replyTo)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(peer), replyTo, 'to reply to')\n }\n }\n\n if (params.replyToStory && replyTo) {\n throw new MtArgumentError('replyTo/commentTo and replyToStory cannot be used together')\n }\n\n let tlReplyTo: tl.TypeInputReplyTo | undefined = undefined\n\n if (replyTo) {\n tlReplyTo = {\n _: 'inputReplyToMessage',\n replyToMsgId: replyTo,\n replyToPeerId: replyToPeer,\n quoteText: params.quote?.text,\n quoteEntities: params.quote?.entities as tl.TypeMessageEntity[],\n quoteOffset: params.quoteOffset,\n }\n } else if (params.replyToStory) {\n tlReplyTo = {\n _: 'inputReplyToStory',\n storyId: params.replyToStory,\n peer,\n }\n }\n\n let scheduleDate: number | undefined = undefined\n\n if (params.schedule === 'online') {\n scheduleDate = 0x7ffffffe\n } else if (params.schedule) {\n scheduleDate = normalizeDate(params.schedule)\n }\n\n return {\n peer,\n replyTo: tlReplyTo,\n scheduleDate,\n quickReplyShortcut: _normalizeQuickReplyShortcut(params.quickReply),\n chainId: _getPeerChainId(client, peer, 'send'),\n }\n}\n"]}
|
|
@@ -63,6 +63,7 @@ export async function sendMediaGroup(client, chatId, medias, params) {
|
|
|
63
63
|
sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,
|
|
64
64
|
invertMedia: params.invertMedia,
|
|
65
65
|
quickReplyShortcut,
|
|
66
|
+
effect: params.effect,
|
|
66
67
|
}, { chainId });
|
|
67
68
|
assertIsUpdatesGroup('sendMediaGroup', res);
|
|
68
69
|
client.handleClientUpdate(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-media-group.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media-group.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAGzD,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAiB,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,MAAuB,EACvB,MAAqB,EACrB,MAAmC,EACnC,MAmBC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,UAAU,GAA6B,EAAE,CAAA;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,GAAG;gBACJ,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK;aACd,CAAA;QACL,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CACzC,MAAM,EACN,KAAK,EACL;YACI,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,2DAA2D;YAC3D,8CAA8C;YAC9C,eAAe;YACf,UAAU,EAAE,IAAI;YAChB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;SACpD,EACD,IAAI,CACP,CAAA;QAED,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CACjD,MAAM;QACN,yDAAyD;QACzD,oFAAoF;QACnF,KAAsD,CAAC,OAAO,CAClE,CAAA;QAED,UAAU,CAAC,IAAI,CAAC;YACZ,CAAC,EAAE,kBAAkB;YACrB,QAAQ,EAAE,UAAU,EAAE;YACtB,KAAK,EAAE,UAAU;YACjB,OAAO;YACP,QAAQ;SACX,CAAC,CAAA;IACN,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,yBAAyB;QAC5B,IAAI;QACJ,UAAU;QACV,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,YAAY;QACZ,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB;
|
|
1
|
+
{"version":3,"file":"send-media-group.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { randomLong } from '../../../utils/long-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputMediaLike } from '../../types/media/input-media/types.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputPeerLike, PeersIndex } from '../../types/peers/index.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\nimport { _normalizeInputMedia } from '../files/normalize-input-media.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a group of media.\n *\n * To add a caption to the group, add caption to the first\n * media in the group and don't add caption for any other.\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param medias Medias contained in the message.\n * @param params Additional sending parameters\n * @link InputMedia\n */\nexport async function sendMediaGroup(\n client: ITelegramClient,\n chatId: InputPeerLike,\n medias: (InputMediaLike | string)[],\n params?: CommonSendParams & {\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invertMedia?: boolean\n\n /**\n * Function that will be called after some part has been uploaded.\n * Only used when a file that requires uploading is passed,\n * and not used when uploading a thumbnail.\n *\n * @param index Index of the media in the original array\n * @param uploaded Number of bytes already uploaded\n * @param total Total file size\n */\n progressCallback?: (index: number, uploaded: number, total: number) => void\n },\n): Promise<Message[]> {\n if (!params) params = {}\n\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const multiMedia: tl.RawInputSingleMedia[] = []\n\n for (let i = 0; i < medias.length; i++) {\n let media = medias[i]\n\n if (typeof media === 'string') {\n media = {\n type: 'auto',\n file: media,\n }\n }\n\n const inputMedia = await _normalizeInputMedia(\n client,\n media,\n {\n progressCallback: params.progressCallback?.bind(null, i),\n // i have no fucking clue why we should upload it manually,\n // but otherwise Telegram throws MEDIA_INVALID\n // fuck my life\n uploadPeer: peer,\n businessConnectionId: params.businessConnectionId,\n },\n true,\n )\n\n const [message, entities] = await _normalizeInputText(\n client,\n // some types dont have `caption` field, and ts warns us,\n // but since it's JS, they'll just be `undefined` and properly handled by the method\n (media as Extract<typeof media, { caption?: unknown }>).caption,\n )\n\n multiMedia.push({\n _: 'inputSingleMedia',\n randomId: randomLong(),\n media: inputMedia,\n message,\n entities,\n })\n }\n\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMultiMedia',\n peer,\n multiMedia,\n silent: params.silent,\n replyTo,\n scheduleDate,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invertMedia,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n assertIsUpdatesGroup('sendMediaGroup', res)\n client.handleClientUpdate(res)\n\n const peers = PeersIndex.from(res)\n\n const msgs = res.updates\n .filter(\n (u): u is tl.RawUpdateNewMessage | tl.RawUpdateNewChannelMessage | tl.RawUpdateNewScheduledMessage =>\n u._ === 'updateNewMessage' || u._ === 'updateNewChannelMessage' || u._ === 'updateNewScheduledMessage',\n )\n .map((u) => new Message(u.message, peers, u._ === 'updateNewScheduledMessage'))\n\n return msgs\n}\n"]}
|