@mtcute/core 0.12.2 → 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.
Files changed (151) hide show
  1. package/cjs/highlevel/client.d.ts +83 -2
  2. package/cjs/highlevel/client.js +20 -1
  3. package/cjs/highlevel/client.js.map +1 -1
  4. package/cjs/highlevel/methods/_imports.js.map +1 -1
  5. package/cjs/highlevel/methods/_init.js +1 -1
  6. package/cjs/highlevel/methods/_init.js.map +1 -1
  7. package/cjs/highlevel/methods/bots/get-callback-answer.d.ts +11 -0
  8. package/cjs/highlevel/methods/bots/get-callback-answer.js +10 -2
  9. package/cjs/highlevel/methods/bots/get-callback-answer.js.map +1 -1
  10. package/cjs/highlevel/methods/chats/archive-chats.js +2 -1
  11. package/cjs/highlevel/methods/chats/archive-chats.js.map +1 -1
  12. package/cjs/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
  13. package/cjs/highlevel/methods/dialogs/find-dialogs.js +88 -0
  14. package/cjs/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
  15. package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
  16. package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
  17. package/cjs/highlevel/methods/dialogs/iter-dialogs.js +3 -1
  18. package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
  19. package/cjs/highlevel/methods/messages/_business-connection.d.ts +2 -1
  20. package/cjs/highlevel/methods/messages/_business-connection.js.map +1 -1
  21. package/cjs/highlevel/methods/messages/get-available-effects.d.ts +6 -0
  22. package/cjs/highlevel/methods/messages/get-available-effects.js +26 -0
  23. package/cjs/highlevel/methods/messages/get-available-effects.js.map +1 -0
  24. package/cjs/highlevel/methods/messages/get-fact-check.d.ts +11 -0
  25. package/cjs/highlevel/methods/messages/get-fact-check.js +27 -0
  26. package/cjs/highlevel/methods/messages/get-fact-check.js.map +1 -0
  27. package/cjs/highlevel/methods/messages/search-hashtag.d.ts +44 -0
  28. package/cjs/highlevel/methods/messages/search-hashtag.js +75 -0
  29. package/cjs/highlevel/methods/messages/search-hashtag.js.map +1 -0
  30. package/cjs/highlevel/methods/messages/send-common.d.ts +5 -0
  31. package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
  32. package/cjs/highlevel/methods/messages/send-media-group.js +1 -0
  33. package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
  34. package/cjs/highlevel/methods/messages/send-media.js +1 -0
  35. package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
  36. package/cjs/highlevel/methods/messages/send-text.js +1 -0
  37. package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
  38. package/cjs/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
  39. package/cjs/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
  40. package/cjs/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
  41. package/cjs/highlevel/methods/users/resolve-peer-many.js +22 -6
  42. package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  43. package/cjs/highlevel/methods/users/resolve-peer.js +30 -11
  44. package/cjs/highlevel/methods/users/resolve-peer.js.map +1 -1
  45. package/cjs/highlevel/methods.d.ts +6 -0
  46. package/cjs/highlevel/methods.js +15 -4
  47. package/cjs/highlevel/methods.js.map +1 -1
  48. package/cjs/highlevel/types/conversation.js +1 -1
  49. package/cjs/highlevel/types/conversation.js.map +1 -1
  50. package/cjs/highlevel/types/messages/dialog.d.ts +2 -2
  51. package/cjs/highlevel/types/messages/dialog.js +2 -3
  52. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  53. package/cjs/highlevel/types/messages/fact-check.d.ts +30 -0
  54. package/cjs/highlevel/types/messages/fact-check.js +56 -0
  55. package/cjs/highlevel/types/messages/fact-check.js.map +1 -0
  56. package/cjs/highlevel/types/messages/index.d.ts +2 -0
  57. package/cjs/highlevel/types/messages/index.js +2 -0
  58. package/cjs/highlevel/types/messages/index.js.map +1 -1
  59. package/cjs/highlevel/types/messages/message-effect.d.ts +20 -0
  60. package/cjs/highlevel/types/messages/message-effect.js +69 -0
  61. package/cjs/highlevel/types/messages/message-effect.js.map +1 -0
  62. package/cjs/highlevel/types/messages/message-entity.d.ts +4 -1
  63. package/cjs/highlevel/types/messages/message-entity.js +1 -1
  64. package/cjs/highlevel/types/messages/message-entity.js.map +1 -1
  65. package/cjs/highlevel/types/messages/message.d.ts +12 -0
  66. package/cjs/highlevel/types/messages/message.js +23 -0
  67. package/cjs/highlevel/types/messages/message.js.map +1 -1
  68. package/cjs/network/client.d.ts +1 -2
  69. package/cjs/network/client.js +3 -3
  70. package/cjs/network/client.js.map +1 -1
  71. package/cjs/network/network-manager.js +1 -1
  72. package/cjs/network/session-connection.js +1 -1
  73. package/cjs/network/session-connection.js.map +1 -1
  74. package/cjs/platform.js +3 -7
  75. package/cjs/platform.js.map +1 -1
  76. package/esm/highlevel/client.d.ts +83 -2
  77. package/esm/highlevel/client.js +20 -1
  78. package/esm/highlevel/client.js.map +1 -1
  79. package/esm/highlevel/methods/_imports.js.map +1 -1
  80. package/esm/highlevel/methods/_init.js +1 -1
  81. package/esm/highlevel/methods/_init.js.map +1 -1
  82. package/esm/highlevel/methods/bots/get-callback-answer.d.ts +11 -0
  83. package/esm/highlevel/methods/bots/get-callback-answer.js +10 -2
  84. package/esm/highlevel/methods/bots/get-callback-answer.js.map +1 -1
  85. package/esm/highlevel/methods/chats/archive-chats.js +2 -1
  86. package/esm/highlevel/methods/chats/archive-chats.js.map +1 -1
  87. package/esm/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
  88. package/esm/highlevel/methods/dialogs/find-dialogs.js +84 -0
  89. package/esm/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
  90. package/esm/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
  91. package/esm/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
  92. package/esm/highlevel/methods/dialogs/iter-dialogs.js +3 -1
  93. package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
  94. package/esm/highlevel/methods/messages/_business-connection.d.ts +2 -1
  95. package/esm/highlevel/methods/messages/_business-connection.js.map +1 -1
  96. package/esm/highlevel/methods/messages/get-available-effects.d.ts +6 -0
  97. package/esm/highlevel/methods/messages/get-available-effects.js +22 -0
  98. package/esm/highlevel/methods/messages/get-available-effects.js.map +1 -0
  99. package/esm/highlevel/methods/messages/get-fact-check.d.ts +11 -0
  100. package/esm/highlevel/methods/messages/get-fact-check.js +23 -0
  101. package/esm/highlevel/methods/messages/get-fact-check.js.map +1 -0
  102. package/esm/highlevel/methods/messages/search-hashtag.d.ts +44 -0
  103. package/esm/highlevel/methods/messages/search-hashtag.js +70 -0
  104. package/esm/highlevel/methods/messages/search-hashtag.js.map +1 -0
  105. package/esm/highlevel/methods/messages/send-common.d.ts +5 -0
  106. package/esm/highlevel/methods/messages/send-common.js.map +1 -1
  107. package/esm/highlevel/methods/messages/send-media-group.js +1 -0
  108. package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
  109. package/esm/highlevel/methods/messages/send-media.js +1 -0
  110. package/esm/highlevel/methods/messages/send-media.js.map +1 -1
  111. package/esm/highlevel/methods/messages/send-text.js +1 -0
  112. package/esm/highlevel/methods/messages/send-text.js.map +1 -1
  113. package/esm/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
  114. package/esm/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
  115. package/esm/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
  116. package/esm/highlevel/methods/users/resolve-peer-many.js +22 -6
  117. package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  118. package/esm/highlevel/methods/users/resolve-peer.js +30 -11
  119. package/esm/highlevel/methods/users/resolve-peer.js.map +1 -1
  120. package/esm/highlevel/methods.d.ts +6 -0
  121. package/esm/highlevel/methods.js +5 -0
  122. package/esm/highlevel/methods.js.map +1 -1
  123. package/esm/highlevel/types/conversation.js +1 -1
  124. package/esm/highlevel/types/conversation.js.map +1 -1
  125. package/esm/highlevel/types/messages/dialog.d.ts +2 -2
  126. package/esm/highlevel/types/messages/dialog.js +2 -3
  127. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  128. package/esm/highlevel/types/messages/fact-check.d.ts +30 -0
  129. package/esm/highlevel/types/messages/fact-check.js +53 -0
  130. package/esm/highlevel/types/messages/fact-check.js.map +1 -0
  131. package/esm/highlevel/types/messages/index.d.ts +2 -0
  132. package/esm/highlevel/types/messages/index.js +2 -0
  133. package/esm/highlevel/types/messages/index.js.map +1 -1
  134. package/esm/highlevel/types/messages/message-effect.d.ts +20 -0
  135. package/esm/highlevel/types/messages/message-effect.js +66 -0
  136. package/esm/highlevel/types/messages/message-effect.js.map +1 -0
  137. package/esm/highlevel/types/messages/message-entity.d.ts +4 -1
  138. package/esm/highlevel/types/messages/message-entity.js +1 -1
  139. package/esm/highlevel/types/messages/message-entity.js.map +1 -1
  140. package/esm/highlevel/types/messages/message.d.ts +12 -0
  141. package/esm/highlevel/types/messages/message.js +23 -0
  142. package/esm/highlevel/types/messages/message.js.map +1 -1
  143. package/esm/network/client.d.ts +1 -2
  144. package/esm/network/client.js +3 -3
  145. package/esm/network/client.js.map +1 -1
  146. package/esm/network/network-manager.js +1 -1
  147. package/esm/network/session-connection.js +1 -1
  148. package/esm/network/session-connection.js.map +1 -1
  149. package/esm/platform.js +3 -7
  150. package/esm/platform.js.map +1 -1
  151. 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"]}
@@ -30,7 +30,7 @@ function _initializeClient(opts) {
30
30
  this._client.onUpdate((0, parsed_js_1.makeParsedUpdateHandler)({
31
31
  messageGroupingInterval,
32
32
  onUpdate: (update) => {
33
- if (conversation_js_1.Conversation.handleUpdate(this._client, update) && skipConversationUpdates)
33
+ if (conversation_js_1.Conversation.handleUpdate(this, update) && skipConversationUpdates)
34
34
  return;
35
35
  this.emit('update', update);
36
36
  this.emit(update.name, update.data);
@@ -1 +1 @@
1
- {"version":3,"file":"_init.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_init.ts"],"names":[],"mappings":";AAAA,sDAAsD;;AAEtD,QAAQ;AACR,mDAAsE;AACtE,wCAA0E;AAK1E,QAAQ;AACR,8DAAuD;AACvD,QAAQ;AACR,oDAAyF;AAmCzF,cAAc;AACd,gBAAgB;AAChB,SAAS,iBAAiB,CAAuB,IAA2B;IACxE,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IAC9B,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvF,MAAM,IAAI,6BAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,4BAAkB,CAAC,IAAiC,CAAC,CAAA;IAC5E,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAEnC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAA;QACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;QAEtD,IAAI,CAAC,OAAO,CAAC,QAAQ,CACjB,IAAA,mCAAuB,EAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,8BAAY,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,uBAAuB;oBAAE,OAAM;gBAEtF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACvC,CAAC;YACD,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1C,CAAC;SACJ,CAAC,CACL,CAAA;IACL,CAAC;AACL,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { MtUnsupportedError, PartialOnly } from '../../types/index.js'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\nimport { TelegramClient } from '../client.js'\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport { ITelegramStorageProvider } from '../storage/provider.js'\n// @copy\nimport { Conversation } from '../types/conversation.js'\n// @copy\nimport { makeParsedUpdateHandler, ParsedUpdateHandlerParams } from '../updates/parsed.js'\n\n// @copy\ntype TelegramClientOptions = (\n | (PartialOnly<Omit<BaseTelegramClientOptions, 'storage'>, 'transport' | 'crypto'> & {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for the default platform-specific storage provider to use.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n })\n | { client: ITelegramClient }\n) & {\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n updates?: Omit<ParsedUpdateHandlerParams, 'onUpdate'>\n /**\n * If `true`, the updates that were handled by some {@link Conversation}\n * will not be dispatched any further.\n *\n * @default true\n */\n skipConversationUpdates?: boolean\n}\n\n// @initialize\n/** @internal */\nfunction _initializeClient(this: TelegramClient, opts: TelegramClientOptions) {\n if ('client' in opts) {\n this._client = opts.client\n } else {\n if (!opts.storage || typeof opts.storage === 'string' || !opts.transport || !opts.crypto) {\n throw new MtUnsupportedError(\n 'You need to explicitly provide storage, transport and crypto for @mtcute/core',\n )\n }\n\n this._client = new BaseTelegramClient(opts as BaseTelegramClientOptions)\n }\n\n // @ts-expect-error codegen\n this.log = this._client.log\n // @ts-expect-error codegen\n this.storage = this._client.storage\n\n if (!opts.disableUpdates) {\n const skipConversationUpdates = opts.skipConversationUpdates ?? true\n const { messageGroupingInterval } = opts.updates ?? {}\n\n this._client.onUpdate(\n makeParsedUpdateHandler({\n messageGroupingInterval,\n onUpdate: (update) => {\n if (Conversation.handleUpdate(this._client, update) && skipConversationUpdates) return\n\n this.emit('update', update)\n this.emit(update.name, update.data)\n },\n onRawUpdate: (update, peers) => {\n this.emit('raw_update', update, peers)\n },\n }),\n )\n }\n}\n"]}
1
+ {"version":3,"file":"_init.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_init.ts"],"names":[],"mappings":";AAAA,sDAAsD;;AAEtD,QAAQ;AACR,mDAAsE;AACtE,wCAA0E;AAK1E,QAAQ;AACR,8DAAuD;AACvD,QAAQ;AACR,oDAAyF;AAmCzF,cAAc;AACd,gBAAgB;AAChB,SAAS,iBAAiB,CAAuB,IAA2B;IACxE,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IAC9B,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvF,MAAM,IAAI,6BAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,4BAAkB,CAAC,IAAiC,CAAC,CAAA;IAC5E,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAEnC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAA;QACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;QAEtD,IAAI,CAAC,OAAO,CAAC,QAAQ,CACjB,IAAA,mCAAuB,EAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,8BAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,uBAAuB;oBAAE,OAAM;gBAE9E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACvC,CAAC;YACD,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1C,CAAC;SACJ,CAAC,CACL,CAAA;IACL,CAAC;AACL,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { MtUnsupportedError, PartialOnly } from '../../types/index.js'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\nimport { TelegramClient } from '../client.js'\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport { ITelegramStorageProvider } from '../storage/provider.js'\n// @copy\nimport { Conversation } from '../types/conversation.js'\n// @copy\nimport { makeParsedUpdateHandler, ParsedUpdateHandlerParams } from '../updates/parsed.js'\n\n// @copy\ntype TelegramClientOptions = (\n | (PartialOnly<Omit<BaseTelegramClientOptions, 'storage'>, 'transport' | 'crypto'> & {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for the default platform-specific storage provider to use.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n })\n | { client: ITelegramClient }\n) & {\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n updates?: Omit<ParsedUpdateHandlerParams, 'onUpdate'>\n /**\n * If `true`, the updates that were handled by some {@link Conversation}\n * will not be dispatched any further.\n *\n * @default true\n */\n skipConversationUpdates?: boolean\n}\n\n// @initialize\n/** @internal */\nfunction _initializeClient(this: TelegramClient, opts: TelegramClientOptions) {\n if ('client' in opts) {\n this._client = opts.client\n } else {\n if (!opts.storage || typeof opts.storage === 'string' || !opts.transport || !opts.crypto) {\n throw new MtUnsupportedError(\n 'You need to explicitly provide storage, transport and crypto for @mtcute/core',\n )\n }\n\n this._client = new BaseTelegramClient(opts as BaseTelegramClientOptions)\n }\n\n // @ts-expect-error codegen\n this.log = this._client.log\n // @ts-expect-error codegen\n this.storage = this._client.storage\n\n if (!opts.disableUpdates) {\n const skipConversationUpdates = opts.skipConversationUpdates ?? true\n const { messageGroupingInterval } = opts.updates ?? {}\n\n this._client.onUpdate(\n makeParsedUpdateHandler({\n messageGroupingInterval,\n onUpdate: (update) => {\n if (Conversation.handleUpdate(this, update) && skipConversationUpdates) return\n\n this.emit('update', update)\n this.emit(update.name, update.data)\n },\n onRawUpdate: (update, peers) => {\n this.emit('raw_update', update, peers)\n },\n }),\n )\n }\n}\n"]}
@@ -16,6 +16,17 @@ export declare function getCallbackAnswer(client: ITelegramClient, params: Input
16
16
  * @default `10000` (10 sec)
17
17
  */
18
18
  timeout?: number;
19
+ /**
20
+ * Whether to "fire and forget" this request,
21
+ * in which case the promise will resolve as soon
22
+ * as the request is sent with an empty response.
23
+ *
24
+ * Useful for interacting with bots that don't correctly
25
+ * answer to callback queries and the request always times out.
26
+ *
27
+ * **Note**: any errors will be silently ignored.
28
+ */
29
+ fireAndForget?: boolean;
19
30
  /**
20
31
  * Whether this is a "play game" button
21
32
  */
@@ -12,13 +12,13 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
12
12
  */
13
13
  async function getCallbackAnswer(client, params) {
14
14
  const { chatId, message } = (0, index_js_1.normalizeInputMessageId)(params);
15
- const { data, game, timeout = 10000 } = params;
15
+ const { data, game, timeout = 10000, fireAndForget } = params;
16
16
  let password = undefined;
17
17
  if (params?.password) {
18
18
  const pwd = await client.call({ _: 'account.getPassword' });
19
19
  password = await client.computeSrpParams(pwd, params.password);
20
20
  }
21
- return await client.call({
21
+ const promise = client.call({
22
22
  _: 'messages.getBotCallbackAnswer',
23
23
  peer: await (0, resolve_peer_js_1.resolvePeer)(client, chatId),
24
24
  msgId: message,
@@ -26,6 +26,14 @@ async function getCallbackAnswer(client, params) {
26
26
  password,
27
27
  game: game,
28
28
  }, { timeout, throw503: true });
29
+ if (fireAndForget) {
30
+ promise.catch(() => { });
31
+ return {
32
+ _: 'messages.botCallbackAnswer',
33
+ cacheTime: 0,
34
+ };
35
+ }
36
+ return promise;
29
37
  }
30
38
  exports.getCallbackAnswer = getCallbackAnswer;
31
39
  //# sourceMappingURL=get-callback-answer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-callback-answer.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/bots/get-callback-answer.ts"],"names":[],"mappings":";;;AAEA,sDAAkD;AAElD,mDAA8E;AAC9E,8DAAsD;AAEtD;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CACnC,MAAuB,EACvB,MAuBC;IAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,kCAAuB,EAAC,MAAM,CAAC,CAAA;IAC3D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IAE9C,IAAI,QAAQ,GAA6C,SAAS,CAAA;IAElE,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAA;QAC3D,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClE,CAAC;IAED,OAAO,MAAM,MAAM,CAAC,IAAI,CACpB;QACI,CAAC,EAAE,+BAA+B;QAClC,IAAI,EAAE,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC;QACvC,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,yBAAW,GAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACtE,QAAQ;QACR,IAAI,EAAE,IAAI;KACb,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAC9B,CAAA;AACL,CAAC;AAhDD,8CAgDC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputMessageId, normalizeInputMessageId } from '../../types/index.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Request a callback answer from a bot,\n * i.e. click an inline button that contains data.\n *\n * @param params\n */\nexport async function getCallbackAnswer(\n client: ITelegramClient,\n params: InputMessageId & {\n /** Data contained in the button */\n data: string | Uint8Array\n\n /**\n * Timeout for the query in ms.\n *\n * @default `10000` (10 sec)\n */\n timeout?: number\n\n /**\n * Whether this is a \"play game\" button\n */\n game?: boolean\n\n /**\n * If the button requires password entry, your 2FA password.\n *\n * Your password is never exposed to the bot,\n * it is checked by Telegram.\n */\n password?: string\n },\n): Promise<tl.messages.TypeBotCallbackAnswer> {\n const { chatId, message } = normalizeInputMessageId(params)\n const { data, game, timeout = 10000 } = params\n\n let password: tl.TypeInputCheckPasswordSRP | undefined = undefined\n\n if (params?.password) {\n const pwd = await client.call({ _: 'account.getPassword' })\n password = await client.computeSrpParams(pwd, params.password)\n }\n\n return await client.call(\n {\n _: 'messages.getBotCallbackAnswer',\n peer: await resolvePeer(client, chatId),\n msgId: message,\n data: typeof data === 'string' ? getPlatform().utf8Encode(data) : data,\n password,\n game: game,\n },\n { timeout, throw503: true },\n )\n}\n"]}
1
+ {"version":3,"file":"get-callback-answer.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/bots/get-callback-answer.ts"],"names":[],"mappings":";;;AAEA,sDAAkD;AAElD,mDAA8E;AAC9E,8DAAsD;AAEtD;;;;;GAKG;AACI,KAAK,UAAU,iBAAiB,CACnC,MAAuB,EACvB,MAmCC;IAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,kCAAuB,EAAC,MAAM,CAAC,CAAA;IAC3D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAE7D,IAAI,QAAQ,GAA6C,SAAS,CAAA;IAElE,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAA;QAC3D,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACvB;QACI,CAAC,EAAE,+BAA+B;QAClC,IAAI,EAAE,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC;QACvC,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,yBAAW,GAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACtE,QAAQ;QACR,IAAI,EAAE,IAAI;KACb,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAC9B,CAAA;IAED,IAAI,aAAa,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAEvB,OAAO;YACH,CAAC,EAAE,4BAA4B;YAC/B,SAAS,EAAE,CAAC;SACf,CAAA;IACL,CAAC;IAED,OAAO,OAAO,CAAA;AAClB,CAAC;AAvED,8CAuEC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputMessageId, normalizeInputMessageId } from '../../types/index.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Request a callback answer from a bot,\n * i.e. click an inline button that contains data.\n *\n * @param params\n */\nexport async function getCallbackAnswer(\n client: ITelegramClient,\n params: InputMessageId & {\n /** Data contained in the button */\n data: string | Uint8Array\n\n /**\n * Timeout for the query in ms.\n *\n * @default `10000` (10 sec)\n */\n timeout?: number\n\n /**\n * Whether to \"fire and forget\" this request,\n * in which case the promise will resolve as soon\n * as the request is sent with an empty response.\n *\n * Useful for interacting with bots that don't correctly\n * answer to callback queries and the request always times out.\n *\n * **Note**: any errors will be silently ignored.\n */\n fireAndForget?: boolean\n\n /**\n * Whether this is a \"play game\" button\n */\n game?: boolean\n\n /**\n * If the button requires password entry, your 2FA password.\n *\n * Your password is never exposed to the bot,\n * it is checked by Telegram.\n */\n password?: string\n },\n): Promise<tl.messages.TypeBotCallbackAnswer> {\n const { chatId, message } = normalizeInputMessageId(params)\n const { data, game, timeout = 10000, fireAndForget } = params\n\n let password: tl.TypeInputCheckPasswordSRP | undefined = undefined\n\n if (params?.password) {\n const pwd = await client.call({ _: 'account.getPassword' })\n password = await client.computeSrpParams(pwd, params.password)\n }\n\n const promise = client.call(\n {\n _: 'messages.getBotCallbackAnswer',\n peer: await resolvePeer(client, chatId),\n msgId: message,\n data: typeof data === 'string' ? getPlatform().utf8Encode(data) : data,\n password,\n game: game,\n },\n { timeout, throw503: true },\n )\n\n if (fireAndForget) {\n promise.catch(() => {})\n\n return {\n _: 'messages.botCallbackAnswer',\n cacheTime: 0,\n }\n }\n\n return promise\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.archiveChats = void 0;
4
+ const type_assertions_js_1 = require("../../../utils/type-assertions.js");
4
5
  const resolve_peer_many_js_1 = require("../users/resolve-peer-many.js");
5
6
  /**
6
7
  * Archive one or more chats
@@ -13,7 +14,7 @@ async function archiveChats(client, chats) {
13
14
  const resolvedPeers = await (0, resolve_peer_many_js_1.resolvePeerMany)(client, chats);
14
15
  const updates = await client.call({
15
16
  _: 'folders.editPeerFolders',
16
- folderPeers: resolvedPeers.map((peer) => ({
17
+ folderPeers: resolvedPeers.filter(type_assertions_js_1.isPresent).map((peer) => ({
17
18
  _: 'inputFolderPeer',
18
19
  peer,
19
20
  folderId: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"archive-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/archive-chats.ts"],"names":[],"mappings":";;;AAGA,wEAA+D;AAE/D;;;;GAIG;AACI,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,IAAA,sCAAe,EAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC,EAAE,yBAAyB;QAC5B,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtC,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;AAdD,oCAcC","sourcesContent":["import { MaybeArray } from '../../../types/utils.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.map((peer) => ({\n _: 'inputFolderPeer',\n peer,\n folderId: 1,\n })),\n })\n client.handleClientUpdate(updates)\n}\n"]}
1
+ {"version":3,"file":"archive-chats.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/archive-chats.ts"],"names":[],"mappings":";;;AACA,0EAA6D;AAG7D,wEAA+D;AAE/D;;;;GAIG;AACI,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,IAAA,sCAAe,EAAC,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,8BAAS,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;AAdD,oCAcC","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,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findDialogs = void 0;
4
+ const errors_js_1 = require("../../types/errors.js");
5
+ const resolve_peer_many_js_1 = require("../users/resolve-peer-many.js");
6
+ const get_peer_dialogs_js_1 = require("./get-peer-dialogs.js");
7
+ const iter_dialogs_js_1 = require("./iter-dialogs.js");
8
+ // @available=user
9
+ /**
10
+ * Try to find a dialog (dialogs) with a given peer (peers) by their ID, username or phone number.
11
+ *
12
+ * This might be an expensive call, as it will potentially iterate over all
13
+ * dialogs to find the one with the given peer
14
+ *
15
+ * @throws {MtPeerNotFoundError} If a dialog with any of the given peers was not found
16
+ */
17
+ async function findDialogs(client, peers) {
18
+ if (!Array.isArray(peers))
19
+ peers = [peers];
20
+ const resolved = await (0, resolve_peer_many_js_1.resolvePeerMany)(client, peers);
21
+ // now we need to split `peers` into two parts: ids that we could resolve and those we couldn't
22
+ // those that we couldn't we'll iterate over all dialogs and try to find them by username/id
23
+ // those that we could we'll use getPeerDialogs
24
+ // id -> idx
25
+ const notFoundIds = new Map();
26
+ // username -> idx
27
+ const notFoundUsernames = new Map();
28
+ let notFoundCount = 0;
29
+ const foundInputPeers = [];
30
+ const foundIdxToOriginalIdx = new Map();
31
+ for (let i = 0; i < peers.length; i++) {
32
+ const input = peers[i];
33
+ const resolvedPeer = resolved[i];
34
+ if (!resolvedPeer) {
35
+ if (typeof input === 'number') {
36
+ notFoundIds.set(input, i);
37
+ }
38
+ else {
39
+ notFoundUsernames.set(input, i);
40
+ }
41
+ notFoundCount += 1;
42
+ continue;
43
+ }
44
+ foundInputPeers.push(resolvedPeer);
45
+ foundIdxToOriginalIdx.set(foundInputPeers.length - 1, i);
46
+ }
47
+ const dialogs = await (0, get_peer_dialogs_js_1.getPeerDialogs)(client, foundInputPeers);
48
+ if (foundInputPeers.length === peers.length) {
49
+ return dialogs;
50
+ }
51
+ const ret = new Array(peers.length);
52
+ // populate found dialogs
53
+ for (const [idx, origIdx] of foundIdxToOriginalIdx) {
54
+ ret[origIdx] = dialogs[idx];
55
+ }
56
+ // now we need to iterate over all dialogs and try to find the rest
57
+ for await (const dialog of (0, iter_dialogs_js_1.iterDialogs)(client, {
58
+ archived: 'keep',
59
+ })) {
60
+ const chat = dialog.chat;
61
+ const idxById = notFoundIds.get(chat.id);
62
+ if (idxById !== undefined) {
63
+ ret[idxById] = dialog;
64
+ notFoundIds.delete(chat.id);
65
+ notFoundCount -= 1;
66
+ }
67
+ if (notFoundCount === 0)
68
+ break;
69
+ if (!chat.username)
70
+ continue;
71
+ const idxByUsername = notFoundUsernames.get(chat.username);
72
+ if (idxByUsername !== undefined) {
73
+ ret[idxByUsername] = dialog;
74
+ notFoundUsernames.delete(chat.username);
75
+ notFoundCount -= 1;
76
+ }
77
+ if (notFoundCount === 0)
78
+ break;
79
+ }
80
+ // if we still have some dialogs that we couldn't find, fail
81
+ if (notFoundCount > 0) {
82
+ const notFound = [...notFoundIds.keys(), ...notFoundUsernames.keys()];
83
+ throw new errors_js_1.MtPeerNotFoundError(`Could not find dialogs with peers: ${notFound.join(', ')}`);
84
+ }
85
+ return ret;
86
+ }
87
+ exports.findDialogs = findDialogs;
88
+ //# 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,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPeerDialogs = void 0;
4
+ const type_assertions_js_1 = require("../../../utils/type-assertions.js");
4
5
  const dialog_js_1 = require("../../types/messages/dialog.js");
5
6
  const resolve_peer_many_js_1 = require("../users/resolve-peer-many.js");
6
7
  /**
@@ -13,7 +14,7 @@ async function getPeerDialogs(client, peers) {
13
14
  peers = [peers];
14
15
  const res = await client.call({
15
16
  _: 'messages.getPeerDialogs',
16
- peers: await (0, resolve_peer_many_js_1.resolvePeerMany)(client, peers).then((peers) => peers.map((it) => ({
17
+ peers: await (0, resolve_peer_many_js_1.resolvePeerMany)(client, peers).then((peers) => peers.filter(type_assertions_js_1.isPresent).map((it) => ({
17
18
  _: 'inputDialogPeer',
18
19
  peer: it,
19
20
  }))),
@@ -1 +1 @@
1
- {"version":3,"file":"get-peer-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/get-peer-dialogs.ts"],"names":[],"mappings":";;;AAEA,8DAAuD;AAEvD,wEAA+D;AAE/D;;;;GAIG;AACI,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,IAAA,sCAAe,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACvD,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACf,CAAC,EAAE,iBAAiB;YACpB,IAAI,EAAE,EAAE;SACX,CAAC,CAAC,CACN;KACJ,CAAC,CAAA;IAEF,OAAO,kBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC;AAdD,wCAcC","sourcesContent":["import { MaybeArray } from '../../../types/utils.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.map((it) => ({\n _: 'inputDialogPeer',\n peer: it,\n })),\n ),\n })\n\n return Dialog.parseTlDialogs(res)\n}\n"]}
1
+ {"version":3,"file":"get-peer-dialogs.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/dialogs/get-peer-dialogs.ts"],"names":[],"mappings":";;;AACA,0EAA6D;AAE7D,8DAAuD;AAEvD,wEAA+D;AAE/D;;;;GAIG;AACI,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,IAAA,sCAAe,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACvD,KAAK,CAAC,MAAM,CAAC,8BAAS,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,kBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC;AAdD,wCAcC","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"]}
@@ -134,7 +134,9 @@ async function* iterDialogs(client, params) {
134
134
  const last = dialogs[dialogs.length - 1];
135
135
  offsetPeer = last.chat.inputPeer;
136
136
  offsetId = last.raw.topMessage;
137
- offsetDate = last.lastMessage.raw.date;
137
+ if (last.lastMessage) {
138
+ offsetDate = last.lastMessage.raw.date;
139
+ }
138
140
  for (const d of dialogs) {
139
141
  if (filterFolder && !filterFolder(d))
140
142
  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":";;;AAGA,0DAAkD;AAElD,sFAA6E;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,mBAAM,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC,aAAa,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,kBAAkB;AAClB;;GAEG;AACI,KAAK,UAAU,kCAAkC,CACpD,MAAuB,EACvB,oBAAwC,EACxC,OAAU,EACV,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,IAAA,kDAAqB,EAAC,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;AAjCD,gFAiCC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { RpcCallOptions } from '../../../network/network-manager.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: T,\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"]}
1
+ {"version":3,"file":"_business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/_business-connection.ts"],"names":[],"mappings":";;;AAIA,0DAAkD;AAElD,sFAA6E;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,mBAAM,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC,aAAa,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,kBAAkB;AAClB;;GAEG;AACI,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,IAAA,kDAAqB,EAAC,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;AAjCD,gFAiCC","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,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAvailableMessageEffects = void 0;
4
+ const long_utils_js_1 = require("../../../utils/long-utils.js");
5
+ const type_assertions_js_1 = require("../../../utils/type-assertions.js");
6
+ const index_js_1 = require("../../types/index.js");
7
+ // @available=user
8
+ /**
9
+ * Get a list of available message effects
10
+ */
11
+ async function getAvailableMessageEffects(client) {
12
+ const res = await client.call({
13
+ _: 'messages.getAvailableEffects',
14
+ hash: 0,
15
+ });
16
+ (0, type_assertions_js_1.assertTypeIsNot)('getAvailableMessageEffects', res, 'messages.availableEffectsNotModified');
17
+ const documentsMap = new long_utils_js_1.LongMap();
18
+ for (const doc of res.documents) {
19
+ if (doc._ !== 'document')
20
+ continue;
21
+ documentsMap.set(doc.id, doc);
22
+ }
23
+ return res.effects.map((effect) => new index_js_1.MessageEffect(effect, documentsMap));
24
+ }
25
+ exports.getAvailableMessageEffects = getAvailableMessageEffects;
26
+ //# 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,gEAAsD;AACtD,0EAAmE;AAEnE,mDAAoD;AAEpD,kBAAkB;AAClB;;GAEG;AACI,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,IAAA,oCAAe,EAAC,4BAA4B,EAAE,GAAG,EAAE,sCAAsC,CAAC,CAAA;IAE1F,MAAM,YAAY,GAAG,IAAI,uBAAO,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,wBAAa,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;AAC/E,CAAC;AAhBD,gEAgBC","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,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFactCheck = void 0;
4
+ const fact_check_js_1 = require("../../types/messages/fact-check.js");
5
+ const resolve_peer_js_1 = require("../users/resolve-peer.js");
6
+ // @available=user
7
+ /**
8
+ * Get fact check information for one or more messages in a chat
9
+ *
10
+ * @param chatId Chat where the messages are located
11
+ * @param msgIds One or more message IDs
12
+ */
13
+ async function getFactCheck(client, chatId, msgIds) {
14
+ const res = await client.call({
15
+ _: 'messages.getFactCheck',
16
+ peer: await (0, resolve_peer_js_1.resolvePeer)(client, chatId),
17
+ msgId: Array.isArray(msgIds) ? msgIds : [msgIds],
18
+ });
19
+ return res.map((x) => {
20
+ if (x.hash.isZero()) {
21
+ return null;
22
+ }
23
+ return new fact_check_js_1.FactCheck(x);
24
+ });
25
+ }
26
+ exports.getFactCheck = getFactCheck;
27
+ //# 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,sEAA8D;AAC9D,8DAAsD;AAEtD,kBAAkB;AAClB;;;;;GAKG;AACI,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,IAAA,6BAAW,EAAC,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,yBAAS,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;AACN,CAAC;AAlBD,oCAkBC","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,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.iterSearchHashtag = exports.searchHashtag = void 0;
4
+ const type_assertions_js_1 = require("../../../utils/type-assertions.js");
5
+ const index_js_1 = require("../../types/index.js");
6
+ const misc_utils_js_1 = require("../../utils/misc-utils.js");
7
+ const defaultOffset = {
8
+ rate: 0,
9
+ peer: { _: 'inputPeerEmpty' },
10
+ id: 0,
11
+ };
12
+ // @available=user
13
+ /**
14
+ * Perform a global hashtag search, across the entire Telegram
15
+ *
16
+ * @param hashtag Hashtag to search for
17
+ * @param params Additional parameters
18
+ */
19
+ async function searchHashtag(client, hashtag, params) {
20
+ const { offset: { rate: offsetRate, peer: offsetPeer, id: offsetId } = defaultOffset, limit = 100 } = params ?? {};
21
+ const res = await client.call({
22
+ _: 'channels.searchPosts',
23
+ hashtag,
24
+ offsetId,
25
+ offsetRate,
26
+ offsetPeer,
27
+ limit,
28
+ });
29
+ (0, type_assertions_js_1.assertTypeIsNot)('searchHashtag', res, 'messages.messagesNotModified');
30
+ const peers = index_js_1.PeersIndex.from(res);
31
+ const msgs = res.messages.filter((msg) => msg._ !== 'messageEmpty').map((msg) => new index_js_1.Message(msg, peers));
32
+ const last = msgs[msgs.length - 1];
33
+ const next = last ?
34
+ {
35
+ rate: res.nextRate ?? last.raw.date,
36
+ peer: last.chat.inputPeer,
37
+ id: last.id,
38
+ } :
39
+ undefined;
40
+ return (0, misc_utils_js_1.makeArrayPaginated)(msgs, res.count ?? msgs.length, next);
41
+ }
42
+ exports.searchHashtag = searchHashtag;
43
+ /**
44
+ * Perform a global hashtag search, across the entire Telegram
45
+ *
46
+ * Iterable version of {@link searchHashtag}
47
+ *
48
+ * @param hashtag Hashtag to search for
49
+ * @param params Additional parameters
50
+ */
51
+ async function* iterSearchHashtag(client, hashtag, params) {
52
+ if (!params)
53
+ params = {};
54
+ const { limit = Infinity, chunkSize = 100 } = params;
55
+ let { offset } = params;
56
+ let current = 0;
57
+ for (;;) {
58
+ const res = await searchHashtag(client, hashtag, {
59
+ offset,
60
+ limit: Math.min(chunkSize, limit - current),
61
+ });
62
+ if (!res.length)
63
+ return;
64
+ for (const msg of res) {
65
+ yield msg;
66
+ if (++current >= limit)
67
+ return;
68
+ }
69
+ if (!res.next)
70
+ return;
71
+ offset = res.next;
72
+ }
73
+ }
74
+ exports.iterSearchHashtag = iterSearchHashtag;
75
+ //# sourceMappingURL=search-hashtag.js.map