@mtcute/core 0.13.0 → 0.13.2
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/base.js +1 -1
- package/cjs/highlevel/base.js.map +1 -1
- package/cjs/highlevel/client.d.ts +22 -1
- package/cjs/highlevel/client.js +8 -0
- package/cjs/highlevel/client.js.map +1 -1
- package/cjs/highlevel/methods/_imports.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-nearby-chats.js +1 -1
- package/cjs/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/cjs/highlevel/methods/chats/open-chat.d.ts +4 -0
- package/cjs/highlevel/methods/chats/open-chat.js +4 -0
- package/cjs/highlevel/methods/chats/open-chat.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.d.ts +8 -0
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.js +18 -0
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.js.map +1 -0
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js +52 -3
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/join-chatlist.d.ts +15 -0
- package/cjs/highlevel/methods/dialogs/join-chatlist.js +42 -0
- package/cjs/highlevel/methods/dialogs/join-chatlist.js.map +1 -0
- package/cjs/highlevel/methods/messages/get-message-reactions.js +1 -0
- package/cjs/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/cjs/highlevel/methods/premium/get-business-connection.js +1 -0
- package/cjs/highlevel/methods/premium/get-business-connection.js.map +1 -1
- package/cjs/highlevel/methods/users/set-offline.js +1 -3
- package/cjs/highlevel/methods/users/set-offline.js.map +1 -1
- package/cjs/highlevel/methods.d.ts +2 -0
- package/cjs/highlevel/methods.js +9 -5
- package/cjs/highlevel/methods.js.map +1 -1
- package/cjs/highlevel/types/bots/keyboards/index.d.ts +1 -0
- package/cjs/highlevel/types/bots/keyboards/index.js +1 -0
- package/cjs/highlevel/types/bots/keyboards/index.js.map +1 -1
- package/cjs/highlevel/types/peers/chat.d.ts +2 -0
- package/cjs/highlevel/types/peers/chat.js +4 -0
- package/cjs/highlevel/types/peers/chat.js.map +1 -1
- package/cjs/highlevel/types/peers/chatlist-preview.d.ts +21 -0
- package/cjs/highlevel/types/peers/chatlist-preview.js +49 -0
- package/cjs/highlevel/types/peers/chatlist-preview.js.map +1 -0
- package/cjs/highlevel/types/peers/index.d.ts +1 -0
- package/cjs/highlevel/types/peers/index.js +1 -0
- package/cjs/highlevel/types/peers/index.js.map +1 -1
- package/cjs/network/network-manager.js +2 -2
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/utils/links/misc.d.ts +6 -0
- package/cjs/utils/links/misc.js +24 -1
- package/cjs/utils/links/misc.js.map +1 -1
- package/esm/highlevel/base.js +1 -1
- package/esm/highlevel/base.js.map +1 -1
- package/esm/highlevel/client.d.ts +22 -1
- package/esm/highlevel/client.js +8 -0
- package/esm/highlevel/client.js.map +1 -1
- package/esm/highlevel/methods/_imports.js.map +1 -1
- package/esm/highlevel/methods/chats/get-nearby-chats.js +1 -1
- package/esm/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/esm/highlevel/methods/chats/open-chat.d.ts +4 -0
- package/esm/highlevel/methods/chats/open-chat.js +4 -0
- package/esm/highlevel/methods/chats/open-chat.js.map +1 -1
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.d.ts +8 -0
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.js +14 -0
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.js.map +1 -0
- package/esm/highlevel/methods/dialogs/iter-dialogs.js +53 -4
- package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/esm/highlevel/methods/dialogs/join-chatlist.d.ts +15 -0
- package/esm/highlevel/methods/dialogs/join-chatlist.js +38 -0
- package/esm/highlevel/methods/dialogs/join-chatlist.js.map +1 -0
- package/esm/highlevel/methods/messages/get-message-reactions.js +1 -0
- package/esm/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/esm/highlevel/methods/premium/get-business-connection.js +1 -0
- package/esm/highlevel/methods/premium/get-business-connection.js.map +1 -1
- package/esm/highlevel/methods/users/set-offline.js +1 -3
- package/esm/highlevel/methods/users/set-offline.js.map +1 -1
- package/esm/highlevel/methods.d.ts +2 -0
- package/esm/highlevel/methods.js +2 -0
- package/esm/highlevel/methods.js.map +1 -1
- package/esm/highlevel/types/bots/keyboards/index.d.ts +1 -0
- package/esm/highlevel/types/bots/keyboards/index.js +1 -0
- package/esm/highlevel/types/bots/keyboards/index.js.map +1 -1
- package/esm/highlevel/types/peers/chat.d.ts +2 -0
- package/esm/highlevel/types/peers/chat.js +4 -0
- package/esm/highlevel/types/peers/chat.js.map +1 -1
- package/esm/highlevel/types/peers/chatlist-preview.d.ts +21 -0
- package/esm/highlevel/types/peers/chatlist-preview.js +46 -0
- package/esm/highlevel/types/peers/chatlist-preview.js.map +1 -0
- package/esm/highlevel/types/peers/index.d.ts +1 -0
- package/esm/highlevel/types/peers/index.js +1 -0
- package/esm/highlevel/types/peers/index.js.map +1 -1
- package/esm/network/network-manager.js +2 -2
- package/esm/network/network-manager.js.map +1 -1
- package/esm/utils/links/misc.d.ts +6 -0
- package/esm/utils/links/misc.js +23 -0
- package/esm/utils/links/misc.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 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
|
+
{"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 ChatlistPreview,\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"]}
|
|
@@ -18,7 +18,7 @@ export async function getNearbyChats(client, latitude, longitude) {
|
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
20
|
assertIsUpdatesGroup('contacts.getLocated', res);
|
|
21
|
-
|
|
21
|
+
client.handleClientUpdate(res, true);
|
|
22
22
|
if (!res.updates.length)
|
|
23
23
|
return [];
|
|
24
24
|
assertTypeIs('contacts.getLocated (@ .updates[0])', res.updates[0], 'updatePeerLocated');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-nearby-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/get-nearby-chats.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB,EAAE,QAAgB,EAAE,SAAiB;IAC7F,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,qBAAqB;QACxB,QAAQ,EAAE;YACN,CAAC,EAAE,eAAe;YAClB,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,SAAS;SAClB;KACJ,CAAC,CAAA;IAEF,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IAChD,
|
|
1
|
+
{"version":3,"file":"get-nearby-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/get-nearby-chats.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAuB,EAAE,QAAgB,EAAE,SAAiB;IAC7F,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,qBAAqB;QACxB,QAAQ,EAAE;YACN,CAAC,EAAE,eAAe;YAClB,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,SAAS;SAClB;KACJ,CAAC,CAAA;IAEF,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IAChD,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEpC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAElC,YAAY,CAAC,qCAAqC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAA;IAExF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAEjD,MAAM,KAAK,GAAyB,EAAE,CAAA;IACtC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAEvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,IAAI,CAAC,CAAC,KAAK,iBAAiB;YAAE,OAAM;QAExC,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAErC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,EAAE,CAAsB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC5D,CAAC;IACL,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AAChB,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Chat } from '../../types/index.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\n\n/**\n * Get nearby chats\n *\n * @param latitude Latitude of the location\n * @param longitude Longitude of the location\n */\nexport async function getNearbyChats(client: ITelegramClient, latitude: number, longitude: number): Promise<Chat[]> {\n const res = await client.call({\n _: 'contacts.getLocated',\n geoPoint: {\n _: 'inputGeoPoint',\n lat: latitude,\n long: longitude,\n },\n })\n\n assertIsUpdatesGroup('contacts.getLocated', res)\n client.handleClientUpdate(res, true)\n\n if (!res.updates.length) return []\n\n assertTypeIs('contacts.getLocated (@ .updates[0])', res.updates[0], 'updatePeerLocated')\n\n const chats = res.chats.map((it) => new Chat(it))\n\n const index: Record<number, Chat> = {}\n chats.forEach((c) => (index[c.id] = c))\n\n res.updates[0].peers.forEach((peer) => {\n if (peer._ === 'peerSelfLocated') return\n\n const id = getMarkedPeerId(peer.peer)\n\n if (index[id]) {\n (index[id] as tl.Mutable<Chat>).distance = peer.distance\n }\n })\n\n return chats\n}\n"]}
|
|
@@ -6,6 +6,10 @@ import { InputPeerLike } from '../../types/peers/index.js';
|
|
|
6
6
|
* Some library logic depends on this, for example, the library will
|
|
7
7
|
* periodically ping the server to keep the updates flowing.
|
|
8
8
|
*
|
|
9
|
+
* > **Warning**: Opening a chat with `openChat` method will make the library make additional requests every so often.
|
|
10
|
+
* > Which means that you should **avoid opening more than 5-10 chats at once**, as it will probably trigger
|
|
11
|
+
* > server-side limits and you might start getting transport errors or even get banned.
|
|
12
|
+
*
|
|
9
13
|
* @param chat Chat to open
|
|
10
14
|
*/
|
|
11
15
|
export declare function openChat(client: ITelegramClient, chat: InputPeerLike): Promise<void>;
|
|
@@ -7,6 +7,10 @@ import { resolvePeer } from '../users/resolve-peer.js';
|
|
|
7
7
|
* Some library logic depends on this, for example, the library will
|
|
8
8
|
* periodically ping the server to keep the updates flowing.
|
|
9
9
|
*
|
|
10
|
+
* > **Warning**: Opening a chat with `openChat` method will make the library make additional requests every so often.
|
|
11
|
+
* > Which means that you should **avoid opening more than 5-10 chats at once**, as it will probably trigger
|
|
12
|
+
* > server-side limits and you might start getting transport errors or even get banned.
|
|
13
|
+
*
|
|
10
14
|
* @param chat Chat to open
|
|
11
15
|
*/
|
|
12
16
|
export async function openChat(client, chat) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-chat.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/open-chat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD
|
|
1
|
+
{"version":3,"file":"open-chat.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/open-chat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAuB,EAAE,IAAmB;IACvE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAE5C,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEnD,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACpE,CAAC;IAED,6DAA6D;IAC7D,4EAA4E;AAChF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAuB,EAAE,IAAmB;IACxE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAE5C,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpD,CAAC;IAED,6DAA6D;IAC7D,4EAA4E;AAChF,CAAC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { isInputPeerChannel } from '../../utils/peer-utils.js'\nimport { getPeerDialogs } from '../dialogs/get-peer-dialogs.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Inform the library that the user has opened a chat.\n *\n * Some library logic depends on this, for example, the library will\n * periodically ping the server to keep the updates flowing.\n *\n * > **Warning**: Opening a chat with `openChat` method will make the library make additional requests every so often.\n * > Which means that you should **avoid opening more than 5-10 chats at once**, as it will probably trigger\n * > server-side limits and you might start getting transport errors or even get banned.\n *\n * @param chat Chat to open\n */\nexport async function openChat(client: ITelegramClient, chat: InputPeerLike): Promise<void> {\n const peer = await resolvePeer(client, chat)\n\n if (isInputPeerChannel(peer)) {\n const [dialog] = await getPeerDialogs(client, peer)\n\n await client.notifyChannelOpened(peer.channelId, dialog.raw.pts)\n }\n\n // todo: once we have proper dialogs/peers db, we should also\n // update full info here and fetch auxillary info (like channel members etc)\n}\n\n/**\n * Inform the library that the user has closed a chat.\n * Un-does the effect of {@link openChat}.\n *\n * Some library logic depends on this, for example, the library will\n * periodically ping the server to keep the updates flowing.\n *\n * @param chat Chat to open\n */\nexport async function closeChat(client: ITelegramClient, chat: InputPeerLike): Promise<void> {\n const peer = await resolvePeer(client, chat)\n\n if (isInputPeerChannel(peer)) {\n await client.notifyChannelClosed(peer.channelId)\n }\n\n // todo: once we have proper dialogs/peers db, we should also\n // update full info here and fetch auxillary info (like channel members etc)\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
2
|
+
import { ChatlistPreview } from '../../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get a preview of a chatlist by its invite link
|
|
5
|
+
*
|
|
6
|
+
* @param link Invite link
|
|
7
|
+
*/
|
|
8
|
+
export declare function getChatlistPreview(client: ITelegramClient, link: string): Promise<ChatlistPreview>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ChatlistPreview } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get a preview of a chatlist by its invite link
|
|
4
|
+
*
|
|
5
|
+
* @param link Invite link
|
|
6
|
+
*/
|
|
7
|
+
export async function getChatlistPreview(client, link) {
|
|
8
|
+
const res = await client.call({
|
|
9
|
+
_: 'chatlists.checkChatlistInvite',
|
|
10
|
+
slug: link,
|
|
11
|
+
});
|
|
12
|
+
return new ChatlistPreview(res);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=get-chatlist-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-chatlist-preview.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/get-chatlist-preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAuB,EAAE,IAAY;IAC1E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,+BAA+B;QAClC,IAAI,EAAE,IAAI;KACb,CAAC,CAAA;IAEF,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { ChatlistPreview } from '../../types/index.js'\n\n/**\n * Get a preview of a chatlist by its invite link\n *\n * @param link Invite link\n */\nexport async function getChatlistPreview(client: ITelegramClient, link: string): Promise<ChatlistPreview> {\n const res = await client.call({\n _: 'chatlists.checkChatlistInvite',\n slug: link,\n })\n\n return new ChatlistPreview(res)\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Long from 'long';
|
|
2
|
-
import {
|
|
2
|
+
import { MtArgumentError } from '../../../types/errors.js';
|
|
3
3
|
import { Dialog } from '../../types/index.js';
|
|
4
4
|
import { normalizeDate } from '../../utils/misc-utils.js';
|
|
5
5
|
import { _normalizeInputFolder } from './get-folders.js';
|
|
@@ -45,10 +45,59 @@ export async function* iterDialogs(client, params) {
|
|
|
45
45
|
if (localFilters_?._ === 'dialogFilterDefault') {
|
|
46
46
|
localFilters_ = undefined;
|
|
47
47
|
}
|
|
48
|
-
if (localFilters_?._ === 'dialogFilterChatlist') {
|
|
49
|
-
throw new MtUnsupportedError('Shared chat folders are not supported yet');
|
|
50
|
-
}
|
|
51
48
|
const localFilters = localFilters_;
|
|
49
|
+
if (localFilters?._ === 'dialogFilterChatlist') {
|
|
50
|
+
if (offsetId !== 0 || offsetDate !== 0 || offsetPeer._ !== 'inputPeerEmpty') {
|
|
51
|
+
throw new MtArgumentError('Cannot use offset parameters with chatlist filters');
|
|
52
|
+
}
|
|
53
|
+
// we only need to fetch pinnedPeers and includePeers
|
|
54
|
+
// instead of fetching the entire dialog list, we can shortcut
|
|
55
|
+
// and just fetch the peer dialogs
|
|
56
|
+
let remaining = Math.min(limit, localFilters.includePeers.length + localFilters.pinnedPeers.length);
|
|
57
|
+
if (pinned === 'include' || pinned === 'only') {
|
|
58
|
+
// yield pinned dialogs
|
|
59
|
+
const peers = [];
|
|
60
|
+
for (const peer of localFilters.pinnedPeers) {
|
|
61
|
+
if (remaining <= 0)
|
|
62
|
+
break;
|
|
63
|
+
remaining--;
|
|
64
|
+
peers.push({
|
|
65
|
+
_: 'inputDialogPeer',
|
|
66
|
+
peer,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const res = await client.call({
|
|
70
|
+
_: 'messages.getPeerDialogs',
|
|
71
|
+
peers,
|
|
72
|
+
});
|
|
73
|
+
res.dialogs.forEach((dialog) => (dialog.pinned = true));
|
|
74
|
+
yield* Dialog.parseTlDialogs(res);
|
|
75
|
+
}
|
|
76
|
+
if (pinned === 'only' || remaining <= 0) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// yield non-pinned dialogs
|
|
80
|
+
let offset = 0;
|
|
81
|
+
while (remaining > 0) {
|
|
82
|
+
const peers = [];
|
|
83
|
+
for (let i = 0; i < chunkSize; i++) {
|
|
84
|
+
if (remaining <= 0)
|
|
85
|
+
break;
|
|
86
|
+
remaining--;
|
|
87
|
+
peers.push({
|
|
88
|
+
_: 'inputDialogPeer',
|
|
89
|
+
peer: localFilters.includePeers[offset + i],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
offset += chunkSize;
|
|
93
|
+
const res = await client.call({
|
|
94
|
+
_: 'messages.getPeerDialogs',
|
|
95
|
+
peers,
|
|
96
|
+
});
|
|
97
|
+
yield* Dialog.parseTlDialogs(res);
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
52
101
|
if (localFilters) {
|
|
53
102
|
archived = localFilters.excludeArchived ? 'exclude' : 'keep';
|
|
54
103
|
}
|
|
@@ -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\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
|
+
{"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 { MtArgumentError } 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 const localFilters = localFilters_\n\n if (localFilters?._ === 'dialogFilterChatlist') {\n if (offsetId !== 0 || offsetDate !== 0 || offsetPeer._ !== 'inputPeerEmpty') {\n throw new MtArgumentError('Cannot use offset parameters with chatlist filters')\n }\n\n // we only need to fetch pinnedPeers and includePeers\n // instead of fetching the entire dialog list, we can shortcut\n // and just fetch the peer dialogs\n\n let remaining = Math.min(limit, localFilters.includePeers.length + localFilters.pinnedPeers.length)\n\n if (pinned === 'include' || pinned === 'only') {\n // yield pinned dialogs\n\n const peers: tl.TypeInputDialogPeer[] = []\n\n for (const peer of localFilters.pinnedPeers) {\n if (remaining <= 0) break\n remaining--\n peers.push({\n _: 'inputDialogPeer',\n peer,\n })\n }\n\n const res = await client.call({\n _: 'messages.getPeerDialogs',\n peers,\n })\n\n res.dialogs.forEach((dialog: tl.Mutable<tl.TypeDialog>) => (dialog.pinned = true))\n\n yield* Dialog.parseTlDialogs(res)\n }\n\n if (pinned === 'only' || remaining <= 0) {\n return\n }\n\n // yield non-pinned dialogs\n\n let offset = 0\n\n while (remaining > 0) {\n const peers: tl.TypeInputDialogPeer[] = []\n\n for (let i = 0; i < chunkSize; i++) {\n if (remaining <= 0) break\n remaining--\n peers.push({\n _: 'inputDialogPeer',\n peer: localFilters.includePeers[offset + i],\n })\n }\n\n offset += chunkSize\n\n const res = await client.call({\n _: 'messages.getPeerDialogs',\n peers,\n })\n\n yield* Dialog.parseTlDialogs(res)\n }\n\n return\n }\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"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { tl } from '@mtcute/tl';
|
|
2
|
+
import { MaybeArray } from '../../../types/utils.js';
|
|
3
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
4
|
+
import { InputPeerLike } from '../../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Join a chatlist by its link
|
|
7
|
+
*
|
|
8
|
+
* @param link Invite link to the chatlist
|
|
9
|
+
* @param params Additional parameters
|
|
10
|
+
* @returns Folder representing the chatlist
|
|
11
|
+
*/
|
|
12
|
+
export declare function joinChatlist(client: ITelegramClient, link: string, params?: {
|
|
13
|
+
/** Chats to join from the chatlist (all by default) */
|
|
14
|
+
peers?: MaybeArray<InputPeerLike>;
|
|
15
|
+
}): Promise<tl.RawDialogFilterChatlist>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MtTypeAssertionError } from '../../../types/errors.js';
|
|
2
|
+
import { assertTypeIs, isPresent } from '../../../utils/type-assertions.js';
|
|
3
|
+
import { assertIsUpdatesGroup } from '../../updates/utils.js';
|
|
4
|
+
import { resolvePeerMany } from '../users/resolve-peer-many.js';
|
|
5
|
+
import { getChatlistPreview } from './get-chatlist-preview.js';
|
|
6
|
+
/**
|
|
7
|
+
* Join a chatlist by its link
|
|
8
|
+
*
|
|
9
|
+
* @param link Invite link to the chatlist
|
|
10
|
+
* @param params Additional parameters
|
|
11
|
+
* @returns Folder representing the chatlist
|
|
12
|
+
*/
|
|
13
|
+
export async function joinChatlist(client, link, params) {
|
|
14
|
+
let peers;
|
|
15
|
+
if (params?.peers) {
|
|
16
|
+
const inputs = Array.isArray(params.peers) ? params.peers : [params.peers];
|
|
17
|
+
const all = await resolvePeerMany(client, inputs);
|
|
18
|
+
peers = all.filter(isPresent);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const preview = await getChatlistPreview(client, link);
|
|
22
|
+
peers = preview.chats.filter((it) => !it.isUnavailable).map((it) => it.inputPeer);
|
|
23
|
+
}
|
|
24
|
+
const res = await client.call({
|
|
25
|
+
_: 'chatlists.joinChatlistInvite',
|
|
26
|
+
slug: link,
|
|
27
|
+
peers,
|
|
28
|
+
});
|
|
29
|
+
assertIsUpdatesGroup('joinChatlist', res);
|
|
30
|
+
client.handleClientUpdate(res);
|
|
31
|
+
const filter = res.updates.find((it) => it._ === 'updateDialogFilter');
|
|
32
|
+
if (!filter?.filter) {
|
|
33
|
+
throw new MtTypeAssertionError('joinChatlist', 'updateDialogFilter', 'nothing');
|
|
34
|
+
}
|
|
35
|
+
assertTypeIs('joinChatlist', filter.filter, 'dialogFilterChatlist');
|
|
36
|
+
return filter.filter;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=join-chatlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-chatlist.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/join-chatlist.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAG3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,MAAuB,EACvB,IAAY,EACZ,MAGC;IAED,IAAI,KAAyB,CAAA;IAE7B,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1E,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACjD,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjC,CAAC;SAAM,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACtD,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,8BAA8B;QACjC,IAAI,EAAE,IAAI;QACV,KAAK;KACR,CAAC,CAAA;IAEF,oBAAoB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IACzC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,oBAAoB,CAA6B,CAAA;IAElG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,oBAAoB,CAAC,cAAc,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAA;IACnF,CAAC;IAED,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAEnE,OAAO,MAAM,CAAC,MAAM,CAAA;AACxB,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../../../types/errors.js'\nimport { MaybeArray } from '../../../types/utils.js'\nimport { assertTypeIs, isPresent } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\nimport { getChatlistPreview } from './get-chatlist-preview.js'\n\n/**\n * Join a chatlist by its link\n *\n * @param link Invite link to the chatlist\n * @param params Additional parameters\n * @returns Folder representing the chatlist\n */\nexport async function joinChatlist(\n client: ITelegramClient,\n link: string,\n params?: {\n /** Chats to join from the chatlist (all by default) */\n peers?: MaybeArray<InputPeerLike>\n },\n): Promise<tl.RawDialogFilterChatlist> {\n let peers: tl.TypeInputPeer[]\n\n if (params?.peers) {\n const inputs = Array.isArray(params.peers) ? params.peers : [params.peers]\n const all = await resolvePeerMany(client, inputs)\n peers = all.filter(isPresent)\n } else {\n const preview = await getChatlistPreview(client, link)\n peers = preview.chats.filter((it) => !it.isUnavailable).map((it) => it.inputPeer)\n }\n\n const res = await client.call({\n _: 'chatlists.joinChatlistInvite',\n slug: link,\n peers,\n })\n\n assertIsUpdatesGroup('joinChatlist', res)\n client.handleClientUpdate(res)\n\n const filter = res.updates.find((it) => it._ === 'updateDialogFilter') as tl.RawUpdateDialogFilter\n\n if (!filter?.filter) {\n throw new MtTypeAssertionError('joinChatlist', 'updateDialogFilter', 'nothing')\n }\n\n assertTypeIs('joinChatlist', filter.filter, 'dialogFilterChatlist')\n\n return filter.filter\n}\n"]}
|
|
@@ -21,6 +21,7 @@ export async function getMessageReactionsById(client, chatId, messages) {
|
|
|
21
21
|
id: messages,
|
|
22
22
|
});
|
|
23
23
|
assertIsUpdatesGroup('messages.getMessagesReactions', res);
|
|
24
|
+
client.handleClientUpdate(res);
|
|
24
25
|
// normally the group contains updateMessageReactions
|
|
25
26
|
// for each message requested that has reactions
|
|
26
27
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-message-reactions.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/get-message-reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAA0B,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,MAAuB,EACvB,MAAqB,EACrB,QAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,+BAA+B;QAClC,IAAI,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,EAAE,EAAE,QAAQ;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"get-message-reactions.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/get-message-reactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAA0B,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,MAAuB,EACvB,MAAqB,EACrB,QAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,+BAA+B;QAClC,IAAI,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,EAAE,EAAE,QAAQ;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAE9B,qDAAqD;IACrD,gDAAgD;IAChD,EAAE;IACF,+CAA+C;IAC/C,+CAA+C;IAE/C,MAAM,KAAK,GAAqC,EAAE,CAAA;IAElD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/B,YAAY,CAAC,+BAA+B,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAA;QAE/E,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACnH,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAA;AAChE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,MAAuB,EACvB,QAAmB;IAEnB,OAAO,uBAAuB,CAC1B,MAAM,EACN,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAC1B,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAC9B,CAAA;AACL,CAAC","sourcesContent":["import { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike, Message, MessageReactions, PeersIndex } from '../../types/index.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Get reactions to messages by their IDs.\n *\n * > Apps should short-poll reactions for visible messages\n * > (that weren't sent by the user) once every 15-30 seconds,\n * > but only if `message.reactions` is set\n *\n * @param chatId ID of the chat with messages\n * @param messages Message IDs\n * @returns Reactions to corresponding messages, or `null` if there are none\n */\nexport async function getMessageReactionsById(\n client: ITelegramClient,\n chatId: InputPeerLike,\n messages: number[],\n): Promise<(MessageReactions | null)[]> {\n const res = await client.call({\n _: 'messages.getMessagesReactions',\n peer: await resolvePeer(client, chatId),\n id: messages,\n })\n\n assertIsUpdatesGroup('messages.getMessagesReactions', res)\n client.handleClientUpdate(res)\n\n // normally the group contains updateMessageReactions\n // for each message requested that has reactions\n //\n // these updates are not ordered in any way, so\n // we don't need to pass them to updates engine\n\n const index: Record<number, MessageReactions> = {}\n\n const peers = PeersIndex.from(res)\n\n for (const update of res.updates) {\n assertTypeIs('messages.getMessagesReactions', update, 'updateMessageReactions')\n\n index[update.msgId] = new MessageReactions(update.msgId, getMarkedPeerId(update.peer), update.reactions, peers)\n }\n\n return messages.map((messageId) => index[messageId] ?? null)\n}\n\n/**\n * Get reactions to {@link Message}s.\n *\n * > **Note**: messages must all be from the same chat.\n *\n * > Apps should short-poll reactions for visible messages\n * > (that weren't sent by the user) once every 15-30 seconds,\n * > but only if `message.reactions` is set\n *\n * @param chatId ID of the chat with messages\n * @param messages Message IDs\n * @returns Reactions to corresponding messages, or `null` if there are none\n */\nexport async function getMessageReactions(\n client: ITelegramClient,\n messages: Message[],\n): Promise<(MessageReactions | null)[]> {\n return getMessageReactionsById(\n client,\n messages[0].chat.inputPeer,\n messages.map((it) => it.id),\n )\n}\n"]}
|
|
@@ -14,6 +14,7 @@ export async function getBusinessConnection(client, connectionId) {
|
|
|
14
14
|
connectionId,
|
|
15
15
|
});
|
|
16
16
|
assertIsUpdatesGroup('account.getBotBusinessConnection', res);
|
|
17
|
+
client.handleClientUpdate(res);
|
|
17
18
|
assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect');
|
|
18
19
|
const peers = PeersIndex.from(res);
|
|
19
20
|
return new BusinessConnection(res.updates[0].connection, peers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/premium/get-business-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,iBAAiB;AACjB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,MAAuB,EACvB,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,kCAAkC;QACrC,YAAY;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;IAC7D,YAAY,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { PeersIndex } from '../../types/peers/peers-index.js'\nimport { BusinessConnection } from '../../types/premium/business-connection.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\n\n// @available=bot\n/**\n * Get information about the connection of the bot with a business account\n *\n * @param connectionId ID of the business connection\n */\nexport async function getBusinessConnection(\n client: ITelegramClient,\n connectionId: string,\n): Promise<BusinessConnection> {\n const res = await client.call({\n _: 'account.getBotBusinessConnection',\n connectionId,\n })\n\n assertIsUpdatesGroup('account.getBotBusinessConnection', res)\n assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect')\n\n const peers = PeersIndex.from(res)\n\n return new BusinessConnection(res.updates[0].connection, peers)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"get-business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/premium/get-business-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,iBAAiB;AACjB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,MAAuB,EACvB,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,kCAAkC;QACrC,YAAY;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAC9B,YAAY,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { PeersIndex } from '../../types/peers/peers-index.js'\nimport { BusinessConnection } from '../../types/premium/business-connection.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\n\n// @available=bot\n/**\n * Get information about the connection of the bot with a business account\n *\n * @param connectionId ID of the business connection\n */\nexport async function getBusinessConnection(\n client: ITelegramClient,\n connectionId: string,\n): Promise<BusinessConnection> {\n const res = await client.call({\n _: 'account.getBotBusinessConnection',\n connectionId,\n })\n\n assertIsUpdatesGroup('account.getBotBusinessConnection', res)\n client.handleClientUpdate(res)\n assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect')\n\n const peers = PeersIndex.from(res)\n\n return new BusinessConnection(res.updates[0].connection, peers)\n}\n"]}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { assertTrue } from '../../../utils/type-assertions.js';
|
|
2
1
|
/**
|
|
3
2
|
* Change user status to offline or online
|
|
4
3
|
*
|
|
5
4
|
* @param offline Whether the user is currently offline
|
|
6
5
|
*/
|
|
7
6
|
export async function setOffline(client, offline = true) {
|
|
8
|
-
|
|
7
|
+
await client.call({
|
|
9
8
|
_: 'account.updateStatus',
|
|
10
9
|
offline,
|
|
11
10
|
});
|
|
12
|
-
assertTrue('account.updateStatus', r);
|
|
13
11
|
}
|
|
14
12
|
//# sourceMappingURL=set-offline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-offline.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/set-offline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-offline.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/set-offline.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAuB,EAAE,OAAO,GAAG,IAAI;IACpE,MAAM,MAAM,CAAC,IAAI,CAAC;QACd,CAAC,EAAE,sBAAsB;QACzB,OAAO;KACV,CAAC,CAAA;AACN,CAAC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\n\n/**\n * Change user status to offline or online\n *\n * @param offline Whether the user is currently offline\n */\nexport async function setOffline(client: ITelegramClient, offline = true): Promise<void> {\n await client.call({\n _: 'account.updateStatus',\n offline,\n })\n}\n"]}
|
|
@@ -82,9 +82,11 @@ export { deleteFolder } from './methods/dialogs/delete-folder.js';
|
|
|
82
82
|
export { editFolder } from './methods/dialogs/edit-folder.js';
|
|
83
83
|
export { findDialogs } from './methods/dialogs/find-dialogs.js';
|
|
84
84
|
export { findFolder } from './methods/dialogs/find-folder.js';
|
|
85
|
+
export { getChatlistPreview } from './methods/dialogs/get-chatlist-preview.js';
|
|
85
86
|
export { getFolders } from './methods/dialogs/get-folders.js';
|
|
86
87
|
export { getPeerDialogs } from './methods/dialogs/get-peer-dialogs.js';
|
|
87
88
|
export { iterDialogs } from './methods/dialogs/iter-dialogs.js';
|
|
89
|
+
export { joinChatlist } from './methods/dialogs/join-chatlist.js';
|
|
88
90
|
export { setFoldersOrder } from './methods/dialogs/set-folders-order.js';
|
|
89
91
|
export { downloadAsBuffer } from './methods/files/download-buffer.js';
|
|
90
92
|
export { downloadAsIterable } from './methods/files/download-iterable.js';
|
package/esm/highlevel/methods.js
CHANGED
|
@@ -82,9 +82,11 @@ export { deleteFolder } from './methods/dialogs/delete-folder.js';
|
|
|
82
82
|
export { editFolder } from './methods/dialogs/edit-folder.js';
|
|
83
83
|
export { findDialogs } from './methods/dialogs/find-dialogs.js';
|
|
84
84
|
export { findFolder } from './methods/dialogs/find-folder.js';
|
|
85
|
+
export { getChatlistPreview } from './methods/dialogs/get-chatlist-preview.js';
|
|
85
86
|
export { getFolders } from './methods/dialogs/get-folders.js';
|
|
86
87
|
export { getPeerDialogs } from './methods/dialogs/get-peer-dialogs.js';
|
|
87
88
|
export { iterDialogs } from './methods/dialogs/iter-dialogs.js';
|
|
89
|
+
export { joinChatlist } from './methods/dialogs/join-chatlist.js';
|
|
88
90
|
export { setFoldersOrder } from './methods/dialogs/set-folders-order.js';
|
|
89
91
|
export { downloadAsBuffer } from './methods/files/download-buffer.js';
|
|
90
92
|
export { downloadAsIterable } from './methods/files/download-iterable.js';
|