@mtcute/core 0.15.3 → 0.16.1

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 (215) hide show
  1. package/cjs/highlevel/base.d.ts +3 -3
  2. package/cjs/highlevel/base.js.map +1 -1
  3. package/cjs/highlevel/client.d.ts +29 -2
  4. package/cjs/highlevel/client.js.map +1 -1
  5. package/cjs/highlevel/methods/chats/delete-user-history.d.ts +5 -0
  6. package/cjs/highlevel/methods/chats/delete-user-history.js +4 -2
  7. package/cjs/highlevel/methods/chats/delete-user-history.js.map +1 -1
  8. package/cjs/highlevel/methods/files/download-iterable.js +1 -1
  9. package/cjs/highlevel/methods/files/download-iterable.js.map +1 -1
  10. package/cjs/highlevel/methods/forums/delete-forum-topic-history.d.ts +7 -1
  11. package/cjs/highlevel/methods/forums/delete-forum-topic-history.js +5 -2
  12. package/cjs/highlevel/methods/forums/delete-forum-topic-history.js.map +1 -1
  13. package/cjs/highlevel/methods/messages/delete-messages.d.ts +5 -0
  14. package/cjs/highlevel/methods/messages/delete-messages.js +4 -2
  15. package/cjs/highlevel/methods/messages/delete-messages.js.map +1 -1
  16. package/cjs/highlevel/methods/messages/read-history.d.ts +5 -0
  17. package/cjs/highlevel/methods/messages/read-history.js +11 -7
  18. package/cjs/highlevel/methods/messages/read-history.js.map +1 -1
  19. package/cjs/highlevel/methods/messages/read-reactions.d.ts +7 -1
  20. package/cjs/highlevel/methods/messages/read-reactions.js +5 -2
  21. package/cjs/highlevel/methods/messages/read-reactions.js.map +1 -1
  22. package/cjs/highlevel/methods/messages/send-common.d.ts +2 -2
  23. package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
  24. package/cjs/highlevel/methods/messages/send-text.js +3 -3
  25. package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
  26. package/cjs/highlevel/methods/messages/unpin-all-messages.d.ts +5 -0
  27. package/cjs/highlevel/methods/messages/unpin-all-messages.js +8 -6
  28. package/cjs/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  29. package/cjs/highlevel/methods/users/resolve-peer-many.js +1 -1
  30. package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  31. package/cjs/highlevel/types/messages/dialog.d.ts +4 -2
  32. package/cjs/highlevel/types/messages/dialog.js +4 -2
  33. package/cjs/highlevel/types/messages/dialog.js.map +1 -1
  34. package/cjs/highlevel/types/messages/message-action.d.ts +15 -1
  35. package/cjs/highlevel/types/messages/message-action.js +10 -0
  36. package/cjs/highlevel/types/messages/message-action.js.map +1 -1
  37. package/cjs/highlevel/types/peers/full-chat.d.ts +2 -0
  38. package/cjs/highlevel/types/peers/full-chat.js +4 -0
  39. package/cjs/highlevel/types/peers/full-chat.js.map +1 -1
  40. package/cjs/highlevel/updates/manager.js +3 -3
  41. package/cjs/highlevel/updates/manager.js.map +1 -1
  42. package/cjs/highlevel/updates/types.d.ts +2 -0
  43. package/cjs/highlevel/updates/types.js.map +1 -1
  44. package/cjs/highlevel/worker/invoker.js +3 -2
  45. package/cjs/highlevel/worker/invoker.js.map +1 -1
  46. package/cjs/highlevel/worker/port.js +4 -3
  47. package/cjs/highlevel/worker/port.js.map +1 -1
  48. package/cjs/highlevel/worker/protocol.d.ts +11 -6
  49. package/cjs/highlevel/worker/protocol.js +69 -0
  50. package/cjs/highlevel/worker/protocol.js.map +1 -1
  51. package/cjs/highlevel/worker/worker.js +12 -8
  52. package/cjs/highlevel/worker/worker.js.map +1 -1
  53. package/cjs/network/client.d.ts +0 -16
  54. package/cjs/network/client.js +0 -2
  55. package/cjs/network/client.js.map +1 -1
  56. package/cjs/network/index.d.ts +2 -1
  57. package/cjs/network/index.js +1 -0
  58. package/cjs/network/index.js.map +1 -1
  59. package/cjs/network/middlewares/bundle.d.ts +3 -0
  60. package/cjs/network/middlewares/bundle.js +20 -0
  61. package/cjs/network/middlewares/bundle.js.map +1 -0
  62. package/cjs/network/middlewares/default.d.ts +8 -0
  63. package/cjs/network/middlewares/default.js +10 -0
  64. package/cjs/network/middlewares/default.js.map +1 -0
  65. package/cjs/network/middlewares/flood-waiter.d.ts +37 -0
  66. package/cjs/network/middlewares/flood-waiter.js +70 -0
  67. package/cjs/network/middlewares/flood-waiter.js.map +1 -0
  68. package/cjs/network/middlewares/index.d.ts +2 -0
  69. package/cjs/network/middlewares/index.js +29 -0
  70. package/cjs/network/middlewares/index.js.map +1 -0
  71. package/cjs/network/middlewares/internal-errors.d.ts +17 -0
  72. package/cjs/network/middlewares/internal-errors.js +41 -0
  73. package/cjs/network/middlewares/internal-errors.js.map +1 -0
  74. package/cjs/network/middlewares/on-error.d.ts +30 -0
  75. package/cjs/network/middlewares/on-error.js +44 -0
  76. package/cjs/network/middlewares/on-error.js.map +1 -0
  77. package/cjs/network/middlewares/on-method.d.ts +39 -0
  78. package/cjs/network/middlewares/on-method.js +45 -0
  79. package/cjs/network/middlewares/on-method.js.map +1 -0
  80. package/cjs/network/mtproto-session.js +1 -1
  81. package/cjs/network/mtproto-session.js.map +1 -1
  82. package/cjs/network/multi-session-connection.js +1 -1
  83. package/cjs/network/multi-session-connection.js.map +1 -1
  84. package/cjs/network/network-manager.d.ts +23 -6
  85. package/cjs/network/network-manager.js +55 -103
  86. package/cjs/network/network-manager.js.map +1 -1
  87. package/cjs/network/persistent-connection.js +5 -5
  88. package/cjs/network/persistent-connection.js.map +1 -1
  89. package/cjs/network/session-connection.js +6 -6
  90. package/cjs/network/session-connection.js.map +1 -1
  91. package/cjs/storage/driver.js +1 -1
  92. package/cjs/storage/driver.js.map +1 -1
  93. package/cjs/storage/storage.js +1 -1
  94. package/cjs/storage/storage.js.map +1 -1
  95. package/cjs/utils/abort-signal.d.ts +1 -0
  96. package/cjs/utils/abort-signal.js +13 -0
  97. package/cjs/utils/abort-signal.js.map +1 -0
  98. package/cjs/utils/composer.d.ts +3 -0
  99. package/cjs/utils/composer.js +22 -0
  100. package/cjs/utils/composer.js.map +1 -0
  101. package/cjs/utils/error-reporting.js +1 -1
  102. package/cjs/utils/error-reporting.js.map +1 -1
  103. package/cjs/utils/index.d.ts +1 -0
  104. package/cjs/utils/index.js +1 -0
  105. package/cjs/utils/index.js.map +1 -1
  106. package/cjs/utils/logger.js +15 -3
  107. package/cjs/utils/logger.js.map +1 -1
  108. package/esm/highlevel/base.d.ts +3 -3
  109. package/esm/highlevel/base.js.map +1 -1
  110. package/esm/highlevel/client.d.ts +29 -2
  111. package/esm/highlevel/client.js.map +1 -1
  112. package/esm/highlevel/methods/chats/delete-user-history.d.ts +5 -0
  113. package/esm/highlevel/methods/chats/delete-user-history.js +4 -2
  114. package/esm/highlevel/methods/chats/delete-user-history.js.map +1 -1
  115. package/esm/highlevel/methods/files/download-iterable.js +1 -1
  116. package/esm/highlevel/methods/files/download-iterable.js.map +1 -1
  117. package/esm/highlevel/methods/forums/delete-forum-topic-history.d.ts +7 -1
  118. package/esm/highlevel/methods/forums/delete-forum-topic-history.js +5 -2
  119. package/esm/highlevel/methods/forums/delete-forum-topic-history.js.map +1 -1
  120. package/esm/highlevel/methods/messages/delete-messages.d.ts +5 -0
  121. package/esm/highlevel/methods/messages/delete-messages.js +4 -2
  122. package/esm/highlevel/methods/messages/delete-messages.js.map +1 -1
  123. package/esm/highlevel/methods/messages/read-history.d.ts +5 -0
  124. package/esm/highlevel/methods/messages/read-history.js +11 -7
  125. package/esm/highlevel/methods/messages/read-history.js.map +1 -1
  126. package/esm/highlevel/methods/messages/read-reactions.d.ts +7 -1
  127. package/esm/highlevel/methods/messages/read-reactions.js +5 -2
  128. package/esm/highlevel/methods/messages/read-reactions.js.map +1 -1
  129. package/esm/highlevel/methods/messages/send-common.d.ts +2 -2
  130. package/esm/highlevel/methods/messages/send-common.js.map +1 -1
  131. package/esm/highlevel/methods/messages/send-text.js +3 -3
  132. package/esm/highlevel/methods/messages/send-text.js.map +1 -1
  133. package/esm/highlevel/methods/messages/unpin-all-messages.d.ts +5 -0
  134. package/esm/highlevel/methods/messages/unpin-all-messages.js +8 -6
  135. package/esm/highlevel/methods/messages/unpin-all-messages.js.map +1 -1
  136. package/esm/highlevel/methods/users/resolve-peer-many.js +1 -1
  137. package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
  138. package/esm/highlevel/types/messages/dialog.d.ts +4 -2
  139. package/esm/highlevel/types/messages/dialog.js +4 -2
  140. package/esm/highlevel/types/messages/dialog.js.map +1 -1
  141. package/esm/highlevel/types/messages/message-action.d.ts +15 -1
  142. package/esm/highlevel/types/messages/message-action.js +10 -0
  143. package/esm/highlevel/types/messages/message-action.js.map +1 -1
  144. package/esm/highlevel/types/peers/full-chat.d.ts +2 -0
  145. package/esm/highlevel/types/peers/full-chat.js +4 -0
  146. package/esm/highlevel/types/peers/full-chat.js.map +1 -1
  147. package/esm/highlevel/updates/manager.js +3 -3
  148. package/esm/highlevel/updates/manager.js.map +1 -1
  149. package/esm/highlevel/updates/types.d.ts +2 -0
  150. package/esm/highlevel/updates/types.js.map +1 -1
  151. package/esm/highlevel/worker/invoker.js +3 -2
  152. package/esm/highlevel/worker/invoker.js.map +1 -1
  153. package/esm/highlevel/worker/port.js +4 -3
  154. package/esm/highlevel/worker/port.js.map +1 -1
  155. package/esm/highlevel/worker/protocol.d.ts +11 -6
  156. package/esm/highlevel/worker/protocol.js +63 -1
  157. package/esm/highlevel/worker/protocol.js.map +1 -1
  158. package/esm/highlevel/worker/worker.js +12 -8
  159. package/esm/highlevel/worker/worker.js.map +1 -1
  160. package/esm/network/client.d.ts +0 -16
  161. package/esm/network/client.js +0 -2
  162. package/esm/network/client.js.map +1 -1
  163. package/esm/network/index.d.ts +2 -1
  164. package/esm/network/index.js +1 -0
  165. package/esm/network/index.js.map +1 -1
  166. package/esm/network/middlewares/bundle.d.ts +3 -0
  167. package/esm/network/middlewares/bundle.js +4 -0
  168. package/esm/network/middlewares/bundle.js.map +1 -0
  169. package/esm/network/middlewares/default.d.ts +8 -0
  170. package/esm/network/middlewares/default.js +6 -0
  171. package/esm/network/middlewares/default.js.map +1 -0
  172. package/esm/network/middlewares/flood-waiter.d.ts +37 -0
  173. package/esm/network/middlewares/flood-waiter.js +66 -0
  174. package/esm/network/middlewares/flood-waiter.js.map +1 -0
  175. package/esm/network/middlewares/index.d.ts +2 -0
  176. package/esm/network/middlewares/index.js +3 -0
  177. package/esm/network/middlewares/index.js.map +1 -0
  178. package/esm/network/middlewares/internal-errors.d.ts +17 -0
  179. package/esm/network/middlewares/internal-errors.js +37 -0
  180. package/esm/network/middlewares/internal-errors.js.map +1 -0
  181. package/esm/network/middlewares/on-error.d.ts +30 -0
  182. package/esm/network/middlewares/on-error.js +40 -0
  183. package/esm/network/middlewares/on-error.js.map +1 -0
  184. package/esm/network/middlewares/on-method.d.ts +39 -0
  185. package/esm/network/middlewares/on-method.js +41 -0
  186. package/esm/network/middlewares/on-method.js.map +1 -0
  187. package/esm/network/mtproto-session.js +1 -1
  188. package/esm/network/mtproto-session.js.map +1 -1
  189. package/esm/network/multi-session-connection.js +1 -1
  190. package/esm/network/multi-session-connection.js.map +1 -1
  191. package/esm/network/network-manager.d.ts +23 -6
  192. package/esm/network/network-manager.js +57 -105
  193. package/esm/network/network-manager.js.map +1 -1
  194. package/esm/network/persistent-connection.js +5 -5
  195. package/esm/network/persistent-connection.js.map +1 -1
  196. package/esm/network/session-connection.js +6 -6
  197. package/esm/network/session-connection.js.map +1 -1
  198. package/esm/storage/driver.js +1 -1
  199. package/esm/storage/driver.js.map +1 -1
  200. package/esm/storage/storage.js +1 -1
  201. package/esm/storage/storage.js.map +1 -1
  202. package/esm/utils/abort-signal.d.ts +1 -0
  203. package/esm/utils/abort-signal.js +9 -0
  204. package/esm/utils/abort-signal.js.map +1 -0
  205. package/esm/utils/composer.d.ts +3 -0
  206. package/esm/utils/composer.js +18 -0
  207. package/esm/utils/composer.js.map +1 -0
  208. package/esm/utils/error-reporting.js +1 -1
  209. package/esm/utils/error-reporting.js.map +1 -1
  210. package/esm/utils/index.d.ts +1 -0
  211. package/esm/utils/index.js +1 -0
  212. package/esm/utils/index.js.map +1 -1
  213. package/esm/utils/logger.js +15 -3
  214. package/esm/utils/logger.js.map +1 -1
  215. package/package.json +4 -4
@@ -8,4 +8,9 @@ export declare function deleteUserHistory(client: ITelegramClient, params: {
8
8
  chatId: InputPeerLike;
9
9
  /** User/channel ID whose messages to delete */
10
10
  participantId: InputPeerLike;
11
+ /**
12
+ * Whether to dispatch the updates that will be generated by this call.
13
+ * Doesn't follow `disableNoDispatch`
14
+ */
15
+ shouldDispatch?: true;
11
16
  }): Promise<void>;
@@ -7,7 +7,7 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
7
7
  * Delete all messages of a user (or channel) in a supergroup
8
8
  */
9
9
  async function deleteUserHistory(client, params) {
10
- const { chatId, participantId } = params;
10
+ const { chatId, participantId, shouldDispatch } = params;
11
11
  const channel = await (0, resolve_peer_js_1.resolveChannel)(client, chatId);
12
12
  const peer = await (0, resolve_peer_js_1.resolvePeer)(client, participantId);
13
13
  const res = await client.call({
@@ -15,7 +15,9 @@ async function deleteUserHistory(client, params) {
15
15
  channel,
16
16
  participant: peer,
17
17
  });
18
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, channel.channelId));
18
+ if (!shouldDispatch) {
19
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, channel.channelId));
20
+ }
19
21
  }
20
22
  exports.deleteUserHistory = deleteUserHistory;
21
23
  //# sourceMappingURL=delete-user-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-user-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/delete-user-history.ts"],"names":[],"mappings":";;;AAIA,qDAA0D;AAC1D,8DAAsE;AAEtE;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACnC,MAAuB,EACvB,MAKC;IAED,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAExC,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAc,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpD,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAErD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,mCAAmC;QACtC,OAAO;QACP,WAAW,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAG,OAA8B,CAAC,SAAS,CAAC,CAAC,CAAA;AAClH,CAAC;AAtBD,8CAsBC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolveChannel, resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Delete all messages of a user (or channel) in a supergroup\n */\nexport async function deleteUserHistory(\n client: ITelegramClient,\n params: {\n /** Chat ID */\n chatId: InputPeerLike\n /** User/channel ID whose messages to delete */\n participantId: InputPeerLike\n },\n): Promise<void> {\n const { chatId, participantId } = params\n\n const channel = await resolveChannel(client, chatId)\n\n const peer = await resolvePeer(client, participantId)\n\n const res = await client.call({\n _: 'channels.deleteParticipantHistory',\n channel,\n participant: peer,\n })\n\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, (channel as tl.RawInputChannel).channelId))\n}\n"]}
1
+ {"version":3,"file":"delete-user-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/chats/delete-user-history.ts"],"names":[],"mappings":";;;AAIA,qDAA0D;AAC1D,8DAAsE;AAEtE;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACnC,MAAuB,EACvB,MAWC;IAED,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,MAAM,CAAA;IAExD,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAc,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEpD,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAErD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,mCAAmC;QACtC,OAAO;QACP,WAAW,EAAE,IAAI;KACpB,CAAC,CAAA;IAEF,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAG,OAA8B,CAAC,SAAS,CAAC,CAAC,CAAA;IAClH,CAAC;AACL,CAAC;AA9BD,8CA8BC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolveChannel, resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Delete all messages of a user (or channel) in a supergroup\n */\nexport async function deleteUserHistory(\n client: ITelegramClient,\n params: {\n /** Chat ID */\n chatId: InputPeerLike\n /** User/channel ID whose messages to delete */\n participantId: InputPeerLike\n\n /**\n * Whether to dispatch the updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n },\n): Promise<void> {\n const { chatId, participantId, shouldDispatch } = params\n\n const channel = await resolveChannel(client, chatId)\n\n const peer = await resolvePeer(client, participantId)\n\n const res = await client.call({\n _: 'channels.deleteParticipantHistory',\n channel,\n participant: peer,\n })\n\n if (!shouldDispatch) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, (channel as tl.RawInputChannel).channelId))\n }\n}\n"]}
@@ -145,7 +145,7 @@ async function* downloadAsIterable(client, input, params) {
145
145
  let error = undefined;
146
146
  void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))
147
147
  .catch((e) => {
148
- client.log.debug('download workers errored: %s', e.message);
148
+ client.log.debug('download workers errored: %e', e);
149
149
  error = e;
150
150
  aborted = true; // not really aborted, but we dont want to download more chunks
151
151
  nextChunkCv.notify();
@@ -1 +1 @@
1
- {"version":3,"file":"download-iterable.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/files/download-iterable.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionKind } from '../../../network/network-manager.js'\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtUnsupportedError } from '../../../types/errors.js'\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { FileDownloadLocation, FileDownloadParameters, FileLocation } from '../../types/index.js'\nimport { fileIdToInputFileLocation, fileIdToInputWebFileLocation } from '../../utils/convert-file-id.js'\nimport { determinePartSize } from '../../utils/file-utils.js'\n\n// small files (less than 128 kb) are downloaded using the \"downloadSmall\" pool\n// furthermore, if the file is small and is located on our main DC, it will be downloaded\n// using the current main connection\nconst SMALL_FILE_MAX_SIZE = 131072\nconst REQUESTS_PER_CONNECTION = 3 // some arbitrary magic value that seems to work best\n\n/**\n * Download a file and return it as an iterable, which yields file contents\n * in chunks of a given size. Order of the chunks is guaranteed to be\n * consecutive.\n *\n * @param params Download parameters\n */\nexport async function* downloadAsIterable(\n client: ITelegramClient,\n input: FileDownloadLocation,\n params?: FileDownloadParameters,\n): AsyncIterableIterator<Uint8Array> {\n const offset = params?.offset ?? 0\n\n if (offset % 4096 !== 0) {\n throw new MtArgumentError(`Invalid offset: ${offset}. Must be divisible by 4096`)\n }\n\n let dcId = params?.dcId\n let fileSize = params?.fileSize\n\n const abortSignal = params?.abortSignal\n let aborted = false\n\n let location: tl.TypeInputFileLocation | tl.TypeInputWebFileLocation\n if (input instanceof FileLocation) {\n let locationInner = input.location\n\n if (typeof locationInner === 'function') {\n locationInner = locationInner()\n }\n\n if (ArrayBuffer.isView(locationInner)) {\n yield locationInner\n\n return\n }\n if (!dcId) dcId = input.dcId\n if (!fileSize) fileSize = input.fileSize\n location = locationInner\n } else if (typeof input === 'string') {\n const parsed = parseFileId(getPlatform(), input)\n\n if (parsed.location._ === 'web') {\n location = fileIdToInputWebFileLocation(parsed)\n } else {\n location = fileIdToInputFileLocation(parsed)\n }\n } else location = input\n\n const isWeb = tl.isAnyInputWebFileLocation(location)\n\n // we will receive a FileMigrateError in case this is invalid\n const primaryDcId = await client.getPrimaryDcId()\n if (!dcId) dcId = primaryDcId\n\n const partSizeKb = params?.partSize ?? (fileSize ? determinePartSize(fileSize) : 64)\n\n if (partSizeKb % 4 !== 0) {\n throw new MtArgumentError(`Invalid part size: ${partSizeKb}. Must be divisible by 4.`)\n }\n\n const chunkSize = partSizeKb * 1024\n\n let limitBytes = params?.limit ?? fileSize ?? Infinity\n if (limitBytes === 0) return\n\n let numChunks = limitBytes === Infinity ? Infinity : ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n\n let nextChunkIdx = 0\n let nextWorkerChunkIdx = 0\n const nextChunkCv = new ConditionVariable()\n const buffer: Record<number, Uint8Array> = {}\n\n const isSmall = fileSize && fileSize <= SMALL_FILE_MAX_SIZE\n let connectionKind: ConnectionKind\n\n if (isSmall) {\n connectionKind = dcId === primaryDcId ? 'main' : 'downloadSmall'\n } else {\n connectionKind = 'download'\n }\n const poolSize = await client.getPoolSize(connectionKind, dcId)\n\n client.log.debug(\n 'Downloading file of size %d from dc %d using %s connection pool (pool size: %d)',\n limitBytes,\n dcId,\n connectionKind,\n poolSize,\n )\n\n const downloadChunk = async (chunk = nextWorkerChunkIdx++): Promise<void> => {\n let result: tl.RpcCallReturn['upload.getFile'] | tl.RpcCallReturn['upload.getWebFile']\n\n if (aborted) {\n return\n }\n\n try {\n result = await client.call(\n {\n _: isWeb ? 'upload.getWebFile' : 'upload.getFile',\n // eslint-disable-next-line\n location: location as any,\n offset: chunkSize * chunk,\n limit: chunkSize,\n },\n {\n dcId,\n kind: connectionKind,\n maxRetryCount: Infinity, // retry until explicitly aborted (or finished)\n abortSignal,\n },\n )\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'AbortError') return\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('FILE_MIGRATE_%d')) {\n dcId = e.newDc\n\n return downloadChunk(chunk)\n } else if (e.is('FILEREF_UPGRADE_NEEDED')) {\n // todo: implement someday\n // see: https://github.com/LonamiWebs/Telethon/blob/0e8bd8248cc649637b7c392616887c50986427a0/telethon/client/downloads.py#L99\n throw new MtUnsupportedError('File ref expired!')\n } else throw e\n }\n\n if (result._ === 'upload.fileCdnRedirect') {\n // we shouldnt receive them since cdnSupported is not set in the getFile request.\n // also, i couldnt find any media that would be downloaded from cdn, so even if\n // i implemented that, i wouldnt be able to test that, so :shrug:\n throw new MtUnsupportedError('Received CDN redirect, which is not supported (yet)')\n }\n\n if (aborted) {\n return\n }\n\n if (result._ === 'upload.webFile' && result.size && limitBytes === Infinity) {\n limitBytes = result.size\n numChunks = ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n }\n\n buffer[chunk] = result.bytes\n\n if (chunk === nextChunkIdx) {\n nextChunkCv.notify()\n }\n\n if (nextWorkerChunkIdx < numChunks && result.bytes.length === chunkSize) {\n return downloadChunk()\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))\n .catch((e) => {\n client.log.debug('download workers errored: %s', e.message)\n error = e\n aborted = true // not really aborted, but we dont want to download more chunks\n nextChunkCv.notify()\n })\n .then(() => {\n client.log.debug('download workers finished')\n })\n\n // to avoid MaxListenersExceededWarning we do this instead\n // already sent requests can go to hell (they will get ignored)\n abortSignal?.addEventListener('abort', () => {\n client.log.debug('download aborted')\n error = abortSignal.reason\n aborted = true\n nextChunkCv.notify()\n })\n\n let position = offset\n\n while (position < limitBytes) {\n await nextChunkCv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextChunkIdx in buffer) {\n const buf = buffer[nextChunkIdx]\n delete buffer[nextChunkIdx]\n\n position += buf.length\n\n params?.progressCallback?.(position, limitBytes)\n\n yield buf\n\n nextChunkIdx++\n\n if (buf.length < chunkSize) {\n // we received the last chunk\n return\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"download-iterable.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/files/download-iterable.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseFileId } from '@mtcute/file-id'\nimport { tl } from '@mtcute/tl'\n\nimport { ConnectionKind } from '../../../network/network-manager.js'\nimport { getPlatform } from '../../../platform.js'\nimport { MtArgumentError, MtUnsupportedError } from '../../../types/errors.js'\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { FileDownloadLocation, FileDownloadParameters, FileLocation } from '../../types/index.js'\nimport { fileIdToInputFileLocation, fileIdToInputWebFileLocation } from '../../utils/convert-file-id.js'\nimport { determinePartSize } from '../../utils/file-utils.js'\n\n// small files (less than 128 kb) are downloaded using the \"downloadSmall\" pool\n// furthermore, if the file is small and is located on our main DC, it will be downloaded\n// using the current main connection\nconst SMALL_FILE_MAX_SIZE = 131072\nconst REQUESTS_PER_CONNECTION = 3 // some arbitrary magic value that seems to work best\n\n/**\n * Download a file and return it as an iterable, which yields file contents\n * in chunks of a given size. Order of the chunks is guaranteed to be\n * consecutive.\n *\n * @param params Download parameters\n */\nexport async function* downloadAsIterable(\n client: ITelegramClient,\n input: FileDownloadLocation,\n params?: FileDownloadParameters,\n): AsyncIterableIterator<Uint8Array> {\n const offset = params?.offset ?? 0\n\n if (offset % 4096 !== 0) {\n throw new MtArgumentError(`Invalid offset: ${offset}. Must be divisible by 4096`)\n }\n\n let dcId = params?.dcId\n let fileSize = params?.fileSize\n\n const abortSignal = params?.abortSignal\n let aborted = false\n\n let location: tl.TypeInputFileLocation | tl.TypeInputWebFileLocation\n if (input instanceof FileLocation) {\n let locationInner = input.location\n\n if (typeof locationInner === 'function') {\n locationInner = locationInner()\n }\n\n if (ArrayBuffer.isView(locationInner)) {\n yield locationInner\n\n return\n }\n if (!dcId) dcId = input.dcId\n if (!fileSize) fileSize = input.fileSize\n location = locationInner\n } else if (typeof input === 'string') {\n const parsed = parseFileId(getPlatform(), input)\n\n if (parsed.location._ === 'web') {\n location = fileIdToInputWebFileLocation(parsed)\n } else {\n location = fileIdToInputFileLocation(parsed)\n }\n } else location = input\n\n const isWeb = tl.isAnyInputWebFileLocation(location)\n\n // we will receive a FileMigrateError in case this is invalid\n const primaryDcId = await client.getPrimaryDcId()\n if (!dcId) dcId = primaryDcId\n\n const partSizeKb = params?.partSize ?? (fileSize ? determinePartSize(fileSize) : 64)\n\n if (partSizeKb % 4 !== 0) {\n throw new MtArgumentError(`Invalid part size: ${partSizeKb}. Must be divisible by 4.`)\n }\n\n const chunkSize = partSizeKb * 1024\n\n let limitBytes = params?.limit ?? fileSize ?? Infinity\n if (limitBytes === 0) return\n\n let numChunks = limitBytes === Infinity ? Infinity : ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n\n let nextChunkIdx = 0\n let nextWorkerChunkIdx = 0\n const nextChunkCv = new ConditionVariable()\n const buffer: Record<number, Uint8Array> = {}\n\n const isSmall = fileSize && fileSize <= SMALL_FILE_MAX_SIZE\n let connectionKind: ConnectionKind\n\n if (isSmall) {\n connectionKind = dcId === primaryDcId ? 'main' : 'downloadSmall'\n } else {\n connectionKind = 'download'\n }\n const poolSize = await client.getPoolSize(connectionKind, dcId)\n\n client.log.debug(\n 'Downloading file of size %d from dc %d using %s connection pool (pool size: %d)',\n limitBytes,\n dcId,\n connectionKind,\n poolSize,\n )\n\n const downloadChunk = async (chunk = nextWorkerChunkIdx++): Promise<void> => {\n let result: tl.RpcCallReturn['upload.getFile'] | tl.RpcCallReturn['upload.getWebFile']\n\n if (aborted) {\n return\n }\n\n try {\n result = await client.call(\n {\n _: isWeb ? 'upload.getWebFile' : 'upload.getFile',\n // eslint-disable-next-line\n location: location as any,\n offset: chunkSize * chunk,\n limit: chunkSize,\n },\n {\n dcId,\n kind: connectionKind,\n maxRetryCount: Infinity, // retry until explicitly aborted (or finished)\n abortSignal,\n },\n )\n } catch (e: unknown) {\n if (e instanceof DOMException && e.name === 'AbortError') return\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('FILE_MIGRATE_%d')) {\n dcId = e.newDc\n\n return downloadChunk(chunk)\n } else if (e.is('FILEREF_UPGRADE_NEEDED')) {\n // todo: implement someday\n // see: https://github.com/LonamiWebs/Telethon/blob/0e8bd8248cc649637b7c392616887c50986427a0/telethon/client/downloads.py#L99\n throw new MtUnsupportedError('File ref expired!')\n } else throw e\n }\n\n if (result._ === 'upload.fileCdnRedirect') {\n // we shouldnt receive them since cdnSupported is not set in the getFile request.\n // also, i couldnt find any media that would be downloaded from cdn, so even if\n // i implemented that, i wouldnt be able to test that, so :shrug:\n throw new MtUnsupportedError('Received CDN redirect, which is not supported (yet)')\n }\n\n if (aborted) {\n return\n }\n\n if (result._ === 'upload.webFile' && result.size && limitBytes === Infinity) {\n limitBytes = result.size\n numChunks = ~~((limitBytes + chunkSize - offset - 1) / chunkSize)\n }\n\n buffer[chunk] = result.bytes\n\n if (chunk === nextChunkIdx) {\n nextChunkCv.notify()\n }\n\n if (nextWorkerChunkIdx < numChunks && result.bytes.length === chunkSize) {\n return downloadChunk()\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: Math.min(poolSize * REQUESTS_PER_CONNECTION, numChunks) }, downloadChunk))\n .catch((e) => {\n client.log.debug('download workers errored: %e', e)\n error = e\n aborted = true // not really aborted, but we dont want to download more chunks\n nextChunkCv.notify()\n })\n .then(() => {\n client.log.debug('download workers finished')\n })\n\n // to avoid MaxListenersExceededWarning we do this instead\n // already sent requests can go to hell (they will get ignored)\n abortSignal?.addEventListener('abort', () => {\n client.log.debug('download aborted')\n error = abortSignal.reason\n aborted = true\n nextChunkCv.notify()\n })\n\n let position = offset\n\n while (position < limitBytes) {\n await nextChunkCv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextChunkIdx in buffer) {\n const buf = buffer[nextChunkIdx]\n delete buffer[nextChunkIdx]\n\n position += buf.length\n\n params?.progressCallback?.(position, limitBytes)\n\n yield buf\n\n nextChunkIdx++\n\n if (buf.length < chunkSize) {\n // we received the last chunk\n return\n }\n }\n }\n}\n"]}
@@ -6,4 +6,10 @@ import type { ForumTopic, InputPeerLike } from '../../types/index.js';
6
6
  * @param chat Chat or user ID, username, phone number, `"me"` or `"self"`
7
7
  * @param topicId ID of the topic (i.e. its top message ID)
8
8
  */
9
- export declare function deleteForumTopicHistory(client: ITelegramClient, chat: InputPeerLike, topicId: number | ForumTopic): Promise<void>;
9
+ export declare function deleteForumTopicHistory(client: ITelegramClient, chat: InputPeerLike, topicId: number | ForumTopic, params?: {
10
+ /**
11
+ * Whether to dispatch updates that will be generated by this call.
12
+ * Doesn't follow `disableNoDispatch`
13
+ */
14
+ shouldDispatch?: true;
15
+ }): Promise<void>;
@@ -10,7 +10,8 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
10
10
  * @param chat Chat or user ID, username, phone number, `"me"` or `"self"`
11
11
  * @param topicId ID of the topic (i.e. its top message ID)
12
12
  */
13
- async function deleteForumTopicHistory(client, chat, topicId) {
13
+ async function deleteForumTopicHistory(client, chat, topicId, params) {
14
+ const { shouldDispatch } = params ?? {};
14
15
  const channel = await (0, resolve_peer_js_1.resolveChannel)(client, chat);
15
16
  (0, type_assertions_js_1.assertTypeIsNot)('deleteForumTopicHistory', channel, 'inputChannelEmpty');
16
17
  const res = await client.call({
@@ -18,7 +19,9 @@ async function deleteForumTopicHistory(client, chat, topicId) {
18
19
  channel,
19
20
  topMsgId: typeof topicId === 'number' ? topicId : topicId.id,
20
21
  });
21
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, channel.channelId));
22
+ if (!shouldDispatch) {
23
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, channel.channelId));
24
+ }
22
25
  }
23
26
  exports.deleteForumTopicHistory = deleteForumTopicHistory;
24
27
  //# sourceMappingURL=delete-forum-topic-history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-forum-topic-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/forums/delete-forum-topic-history.ts"],"names":[],"mappings":";;;AAAA,0EAAmE;AAGnE,qDAA0D;AAC1D,8DAAyD;AAEzD;;;;;GAKG;AACI,KAAK,UAAU,uBAAuB,CACzC,MAAuB,EACvB,IAAmB,EACnB,OAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAc,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,IAAA,oCAAe,EAAC,yBAAyB,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAA;IAExE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,6BAA6B;QAChC,OAAO;QACP,QAAQ,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;KAC/D,CAAC,CAAA;IAEF,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;AAC1F,CAAC;AAfD,0DAeC","sourcesContent":["import { assertTypeIsNot } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport type { ForumTopic, InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolveChannel } from '../users/resolve-peer.js'\n\n/**\n * Delete a forum topic and all its history\n *\n * @param chat Chat or user ID, username, phone number, `\"me\"` or `\"self\"`\n * @param topicId ID of the topic (i.e. its top message ID)\n */\nexport async function deleteForumTopicHistory(\n client: ITelegramClient,\n chat: InputPeerLike,\n topicId: number | ForumTopic,\n): Promise<void> {\n const channel = await resolveChannel(client, chat)\n assertTypeIsNot('deleteForumTopicHistory', channel, 'inputChannelEmpty')\n\n const res = await client.call({\n _: 'channels.deleteTopicHistory',\n channel,\n topMsgId: typeof topicId === 'number' ? topicId : topicId.id,\n })\n\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, channel.channelId))\n}\n"]}
1
+ {"version":3,"file":"delete-forum-topic-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/forums/delete-forum-topic-history.ts"],"names":[],"mappings":";;;AAAA,0EAAmE;AAGnE,qDAA0D;AAC1D,8DAAyD;AAEzD;;;;;GAKG;AACI,KAAK,UAAU,uBAAuB,CACzC,MAAuB,EACvB,IAAmB,EACnB,OAA4B,EAC5B,MAMC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,MAAM,IAAA,gCAAc,EAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,IAAA,oCAAe,EAAC,yBAAyB,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAA;IAExE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,6BAA6B;QAChC,OAAO;QACP,QAAQ,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;KAC/D,CAAC,CAAA;IAEF,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1F,CAAC;AACL,CAAC;AA1BD,0DA0BC","sourcesContent":["import { assertTypeIsNot } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport type { ForumTopic, InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolveChannel } from '../users/resolve-peer.js'\n\n/**\n * Delete a forum topic and all its history\n *\n * @param chat Chat or user ID, username, phone number, `\"me\"` or `\"self\"`\n * @param topicId ID of the topic (i.e. its top message ID)\n */\nexport async function deleteForumTopicHistory(\n client: ITelegramClient,\n chat: InputPeerLike,\n topicId: number | ForumTopic,\n params?: {\n /**\n * Whether to dispatch updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n },\n): Promise<void> {\n const { shouldDispatch } = params ?? {}\n\n const channel = await resolveChannel(client, chat)\n assertTypeIsNot('deleteForumTopicHistory', channel, 'inputChannelEmpty')\n\n const res = await client.call({\n _: 'channels.deleteTopicHistory',\n channel,\n topMsgId: typeof topicId === 'number' ? topicId : topicId.id,\n })\n\n if (!shouldDispatch) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, channel.channelId))\n }\n}\n"]}
@@ -8,6 +8,11 @@ export interface DeleteMessagesParams {
8
8
  * @default true
9
9
  */
10
10
  revoke?: boolean;
11
+ /**
12
+ * Whether to dispatch updates that will be generated by this call.
13
+ * Doesn't follow `disableNoDispatch`
14
+ */
15
+ shouldDispatch?: true;
11
16
  }
12
17
  /**
13
18
  * Delete messages by their IDs
@@ -12,7 +12,7 @@ const delete_scheduled_messages_js_1 = require("./delete-scheduled-messages.js")
12
12
  * @param ids Message(s) ID(s) to delete.
13
13
  */
14
14
  async function deleteMessagesById(client, chatId, ids, params) {
15
- const { revoke = true } = params ?? {};
15
+ const { revoke = true, shouldDispatch } = params ?? {};
16
16
  const peer = await (0, resolve_peer_js_1.resolvePeer)(client, chatId);
17
17
  let upd;
18
18
  if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
@@ -32,7 +32,9 @@ async function deleteMessagesById(client, chatId, ids, params) {
32
32
  });
33
33
  upd = (0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount);
34
34
  }
35
- client.handleClientUpdate(upd);
35
+ if (!shouldDispatch) {
36
+ client.handleClientUpdate(upd);
37
+ }
36
38
  }
37
39
  exports.deleteMessagesById = deleteMessagesById;
38
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"delete-messages.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/delete-messages.ts"],"names":[],"mappings":";;;AAIA,qDAA0D;AAC1D,6DAA8E;AAC9E,8DAAsD;AACtD,iFAAwE;AAaxE;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CACpC,MAAuB,EACvB,MAAqB,EACrB,GAAa,EACb,MAA6B;IAE7B,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEtC,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,GAAG,CAAA;IAEP,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAA,8BAAc,EAAC,IAAI,CAAC,CAAA;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,yBAAyB;YAC5B,OAAO;YACP,EAAE,EAAE,GAAG;SACV,CAAC,CAAA;QACF,GAAG,GAAG,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IAClE,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,yBAAyB;YAC5B,EAAE,EAAE,GAAG;YACP,MAAM;SACT,CAAC,CAAA;QACF,GAAG,GAAG,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC;AA9BD,gDA8BC;AAED;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAChC,MAAuB,EACvB,QAAmB,EACnB,MAA6B;IAE7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwC,CAAA;IAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAwC,CAAA;IAEvE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAA;QAEtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAA;QAClD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,MAAM,IAAA,sDAAuB,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;AACL,CAAC;AA5BD,wCA4BC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike, Message } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel, toInputChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { deleteScheduledMessages } from './delete-scheduled-messages.js'\n\n// @exported\nexport interface DeleteMessagesParams {\n /**\n * Whether to \"revoke\" (i.e. delete for both sides).\n * Only used for chats and private chats.\n *\n * @default true\n */\n revoke?: boolean\n}\n\n/**\n * Delete messages by their IDs\n *\n * @param chatId Chat's marked ID, its username, phone or `\"me\"` or `\"self\"`.\n * @param ids Message(s) ID(s) to delete.\n */\nexport async function deleteMessagesById(\n client: ITelegramClient,\n chatId: InputPeerLike,\n ids: number[],\n params?: DeleteMessagesParams,\n): Promise<void> {\n const { revoke = true } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n let upd\n\n if (isInputPeerChannel(peer)) {\n const channel = toInputChannel(peer)\n const res = await client.call({\n _: 'channels.deleteMessages',\n channel,\n id: ids,\n })\n upd = createDummyUpdate(res.pts, res.ptsCount, peer.channelId)\n } else {\n const res = await client.call({\n _: 'messages.deleteMessages',\n id: ids,\n revoke,\n })\n upd = createDummyUpdate(res.pts, res.ptsCount)\n }\n\n client.handleClientUpdate(upd)\n}\n\n/**\n * Delete one or more {@link Message}\n *\n * @param messages Message(s) to delete\n */\nexport async function deleteMessages(\n client: ITelegramClient,\n messages: Message[],\n params?: DeleteMessagesParams,\n): Promise<void> {\n if (messages.length === 1) {\n return deleteMessagesById(client, messages[0].chat.inputPeer, [messages[0].id], params)\n }\n\n const byChat = new Map<number, [tl.TypeInputPeer, number[]]>()\n const byChatScheduled = new Map<number, [tl.TypeInputPeer, number[]]>()\n\n for (const msg of messages) {\n const map = msg.isScheduled ? byChatScheduled : byChat\n\n if (!map.has(msg.chat.id)) {\n map.set(msg.chat.id, [msg.chat.inputPeer, []])\n }\n map.get(msg.chat.id)![1].push(msg.id)\n }\n\n for (const [peer, ids] of byChat.values()) {\n await deleteMessagesById(client, peer, ids, params)\n }\n\n for (const [peer, ids] of byChatScheduled.values()) {\n await deleteScheduledMessages(client, peer, ids)\n }\n}\n"]}
1
+ {"version":3,"file":"delete-messages.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/delete-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike, Message } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel, toInputChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { deleteScheduledMessages } from './delete-scheduled-messages.js'\n\n// @exported\nexport interface DeleteMessagesParams {\n /**\n * Whether to \"revoke\" (i.e. delete for both sides).\n * Only used for chats and private chats.\n *\n * @default true\n */\n revoke?: boolean\n\n /**\n * Whether to dispatch updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n}\n\n/**\n * Delete messages by their IDs\n *\n * @param chatId Chat's marked ID, its username, phone or `\"me\"` or `\"self\"`.\n * @param ids Message(s) ID(s) to delete.\n */\nexport async function deleteMessagesById(\n client: ITelegramClient,\n chatId: InputPeerLike,\n ids: number[],\n params?: DeleteMessagesParams,\n): Promise<void> {\n const { revoke = true, shouldDispatch } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n let upd\n\n if (isInputPeerChannel(peer)) {\n const channel = toInputChannel(peer)\n const res = await client.call({\n _: 'channels.deleteMessages',\n channel,\n id: ids,\n })\n upd = createDummyUpdate(res.pts, res.ptsCount, peer.channelId)\n } else {\n const res = await client.call({\n _: 'messages.deleteMessages',\n id: ids,\n revoke,\n })\n upd = createDummyUpdate(res.pts, res.ptsCount)\n }\n\n if (!shouldDispatch) {\n client.handleClientUpdate(upd)\n }\n}\n\n/**\n * Delete one or more {@link Message}\n *\n * @param messages Message(s) to delete\n */\nexport async function deleteMessages(\n client: ITelegramClient,\n messages: Message[],\n params?: DeleteMessagesParams,\n): Promise<void> {\n if (messages.length === 1) {\n return deleteMessagesById(client, messages[0].chat.inputPeer, [messages[0].id], params)\n }\n\n const byChat = new Map<number, [tl.TypeInputPeer, number[]]>()\n const byChatScheduled = new Map<number, [tl.TypeInputPeer, number[]]>()\n\n for (const msg of messages) {\n const map = msg.isScheduled ? byChatScheduled : byChat\n\n if (!map.has(msg.chat.id)) {\n map.set(msg.chat.id, [msg.chat.inputPeer, []])\n }\n map.get(msg.chat.id)![1].push(msg.id)\n }\n\n for (const [peer, ids] of byChat.values()) {\n await deleteMessagesById(client, peer, ids, params)\n }\n\n for (const [peer, ids] of byChatScheduled.values()) {\n await deleteScheduledMessages(client, peer, ids)\n }\n}\n"]}
@@ -16,4 +16,9 @@ export declare function readHistory(client: ITelegramClient, chatId: InputPeerLi
16
16
  * Whether to also clear all mentions in the chat
17
17
  */
18
18
  clearMentions?: boolean;
19
+ /**
20
+ * Whether to dispatch updates that will be generated by this call.
21
+ * Doesn't follow `disableNoDispatch`
22
+ */
23
+ shouldDispatch?: true;
19
24
  }): Promise<void>;
@@ -11,18 +11,20 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
11
11
  * @param chatId Chat ID
12
12
  */
13
13
  async function readHistory(client, chatId, params) {
14
- const { maxId = 0, clearMentions } = params ?? {};
14
+ const { maxId = 0, clearMentions, shouldDispatch } = params ?? {};
15
15
  const peer = await (0, resolve_peer_js_1.resolvePeer)(client, chatId);
16
16
  if (clearMentions) {
17
17
  const res = await client.call({
18
18
  _: 'messages.readMentions',
19
19
  peer,
20
20
  });
21
- if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
22
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, peer.channelId));
23
- }
24
- else {
25
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
21
+ if (!shouldDispatch) {
22
+ if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
23
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, peer.channelId));
24
+ }
25
+ else {
26
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
27
+ }
26
28
  }
27
29
  }
28
30
  if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
@@ -39,7 +41,9 @@ async function readHistory(client, chatId, params) {
39
41
  peer,
40
42
  maxId,
41
43
  });
42
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
44
+ if (!shouldDispatch) {
45
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
46
+ }
43
47
  }
44
48
  }
45
49
  exports.readHistory = readHistory;
@@ -1 +1 @@
1
- {"version":3,"file":"read-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/read-history.ts"],"names":[],"mappings":";;;AAAA,0EAA8D;AAG9D,qDAA0D;AAC1D,6DAA8E;AAC9E,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC7B,MAAuB,EACvB,MAAqB,EACrB,MAYC;IAED,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEjD,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,aAAa,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,uBAAuB;YAC1B,IAAI;SACP,CAAC,CAAA;QAEF,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QACvF,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACvE,CAAC;IACL,CAAC;IAED,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YACxB,CAAC,EAAE,sBAAsB;YACzB,OAAO,EAAE,IAAA,8BAAc,EAAC,IAAI,CAAC;YAC7B,KAAK;SACR,CAAC,CAAA;QAEF,IAAA,+BAAU,EAAC,sBAAsB,EAAE,CAAC,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,sBAAsB;YACzB,IAAI;YACJ,KAAK;SACR,CAAC,CAAA;QACF,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvE,CAAC;AACL,CAAC;AAlDD,kCAkDC","sourcesContent":["import { assertTrue } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel, toInputChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Mark chat history as read.\n *\n * @param chatId Chat ID\n */\nexport async function readHistory(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params?: {\n /**\n * Message up until which to read history\n *\n * @default 0, i.e. read everything\n */\n maxId?: number\n\n /**\n * Whether to also clear all mentions in the chat\n */\n clearMentions?: boolean\n },\n): Promise<void> {\n const { maxId = 0, clearMentions } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n if (clearMentions) {\n const res = await client.call({\n _: 'messages.readMentions',\n peer,\n })\n\n if (isInputPeerChannel(peer)) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, peer.channelId))\n } else {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n }\n\n if (isInputPeerChannel(peer)) {\n const r = await client.call({\n _: 'channels.readHistory',\n channel: toInputChannel(peer),\n maxId,\n })\n\n assertTrue('channels.readHistory', r)\n } else {\n const res = await client.call({\n _: 'messages.readHistory',\n peer,\n maxId,\n })\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n}\n"]}
1
+ {"version":3,"file":"read-history.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/read-history.ts"],"names":[],"mappings":";;;AAAA,0EAA8D;AAG9D,qDAA0D;AAC1D,6DAA8E;AAC9E,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC7B,MAAuB,EACvB,MAAqB,EACrB,MAkBC;IAED,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEjE,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,aAAa,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,uBAAuB;YAC1B,IAAI;SACP,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACvF,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;YACvE,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YACxB,CAAC,EAAE,sBAAsB;YACzB,OAAO,EAAE,IAAA,8BAAc,EAAC,IAAI,CAAC;YAC7B,KAAK;SACR,CAAC,CAAA;QAEF,IAAA,+BAAU,EAAC,sBAAsB,EAAE,CAAC,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,sBAAsB;YACzB,IAAI;YACJ,KAAK;SACR,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACvE,CAAC;IACL,CAAC;AACL,CAAC;AA7DD,kCA6DC","sourcesContent":["import { assertTrue } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel, toInputChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Mark chat history as read.\n *\n * @param chatId Chat ID\n */\nexport async function readHistory(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params?: {\n /**\n * Message up until which to read history\n *\n * @default 0, i.e. read everything\n */\n maxId?: number\n\n /**\n * Whether to also clear all mentions in the chat\n */\n clearMentions?: boolean\n\n /**\n * Whether to dispatch updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n },\n): Promise<void> {\n const { maxId = 0, clearMentions, shouldDispatch } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n if (clearMentions) {\n const res = await client.call({\n _: 'messages.readMentions',\n peer,\n })\n\n if (!shouldDispatch) {\n if (isInputPeerChannel(peer)) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, peer.channelId))\n } else {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n }\n }\n\n if (isInputPeerChannel(peer)) {\n const r = await client.call({\n _: 'channels.readHistory',\n channel: toInputChannel(peer),\n maxId,\n })\n\n assertTrue('channels.readHistory', r)\n } else {\n const res = await client.call({\n _: 'messages.readHistory',\n peer,\n maxId,\n })\n\n if (!shouldDispatch) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n }\n}\n"]}
@@ -5,4 +5,10 @@ import { InputPeerLike } from '../../types/index.js';
5
5
  *
6
6
  * @param chatId Chat ID
7
7
  */
8
- export declare function readReactions(client: ITelegramClient, chatId: InputPeerLike): Promise<void>;
8
+ export declare function readReactions(client: ITelegramClient, chatId: InputPeerLike, params?: {
9
+ /**
10
+ * Whether to dispatch updates that will be generated by this call.
11
+ * Doesn't follow `disableNoDispatch`
12
+ */
13
+ shouldDispatch?: true;
14
+ }): Promise<void>;
@@ -8,12 +8,15 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
8
8
  *
9
9
  * @param chatId Chat ID
10
10
  */
11
- async function readReactions(client, chatId) {
11
+ async function readReactions(client, chatId, params) {
12
+ const { shouldDispatch } = params ?? {};
12
13
  const res = await client.call({
13
14
  _: 'messages.readReactions',
14
15
  peer: await (0, resolve_peer_js_1.resolvePeer)(client, chatId),
15
16
  });
16
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
17
+ if (!shouldDispatch) {
18
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
19
+ }
17
20
  }
18
21
  exports.readReactions = readReactions;
19
22
  //# sourceMappingURL=read-reactions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-reactions.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/read-reactions.ts"],"names":[],"mappings":";;;AAEA,qDAA0D;AAC1D,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,MAAuB,EAAE,MAAqB;IAC9E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,wBAAwB;QAC3B,IAAI,EAAE,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAA;IACF,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;AACvE,CAAC;AAND,sCAMC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Mark all reactions in chat as read.\n *\n * @param chatId Chat ID\n */\nexport async function readReactions(client: ITelegramClient, chatId: InputPeerLike): Promise<void> {\n const res = await client.call({\n _: 'messages.readReactions',\n peer: await resolvePeer(client, chatId),\n })\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n}\n"]}
1
+ {"version":3,"file":"read-reactions.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/read-reactions.ts"],"names":[],"mappings":";;;AAEA,qDAA0D;AAC1D,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAC/B,MAAuB,EACvB,MAAqB,EACrB,MAMC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,wBAAwB;QAC3B,IAAI,EAAE,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAA;IAEF,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvE,CAAC;AACL,CAAC;AApBD,sCAoBC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Mark all reactions in chat as read.\n *\n * @param chatId Chat ID\n */\nexport async function readReactions(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params?: {\n /**\n * Whether to dispatch updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n },\n): Promise<void> {\n const { shouldDispatch } = params ?? {}\n const res = await client.call({\n _: 'messages.readReactions',\n peer: await resolvePeer(client, chatId),\n })\n\n if (!shouldDispatch) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n}\n"]}
@@ -83,8 +83,8 @@ export interface CommonSendParams {
83
83
  */
84
84
  quickReply?: number | string;
85
85
  /**
86
- * Whether to dispatch the returned message
87
- * to the client's update handler.
86
+ * Whether to dispatch the returned message to the client's update handler.
87
+ * Doesn't follow `disableNoDispatch`
88
88
  */
89
89
  shouldDispatch?: true;
90
90
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":";;;AAEA,wDAA0D;AAC1D,gEAA8D;AAE9D,qDAA8D;AAI9D,mDAAwE;AACxE,qDAAqD;AAErD,8DAAsD;AACtD,2EAAmE;AACnE,uDAA+C;AAkH/C;;;GAGG;AACH,SAAgB,4BAA4B,CACxC,QAAqC;IAErC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAE/B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACH,CAAC,EAAE,2BAA2B;YAC9B,UAAU,EAAE,QAAQ;SACvB,CAAA;IACL,CAAC;IAED,OAAO;QACH,CAAC,EAAE,yBAAyB;QAC5B,QAAQ;KACX,CAAA;AACL,CAAC;AAhBD,oEAgBC;AAED;;;GAGG;AACI,KAAK,UAAU,4BAA4B,CAC9C,MAAuB,EACvB,MAAqB,EACrB,MAAwB;IAExB,IAAI,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5C,IAAI,OAAO,GAAG,IAAA,6BAAkB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAA;IAEnG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,IAAA,iDAAqB,EAAC,MAAM,EAAE,IAAI,EAAE,IAAA,6BAAkB,EAAC,MAAM,CAAC,SAAS,CAAE,CAAC,CAAA;IACtG,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,2BAAe,CAAC,4CAA4C,CAAC,CAAA;QAC3E,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,kCAAsB,CAAC,IAAA,+BAAe,EAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QACnF,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,2BAAe,CAAC,4DAA4D,CAAC,CAAA;IAC3F,CAAC;IAED,IAAI,SAAS,GAAoC,SAAS,CAAA;IAE1D,IAAI,OAAO,EAAE,CAAC;QACV,SAAS,GAAG;YACR,CAAC,EAAE,qBAAqB;YACxB,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,WAAW;YAC1B,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI;YAC7B,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,QAAkC;YAC/D,WAAW,EAAE,MAAM,CAAC,WAAW;SAClC,CAAA;IACL,CAAC;SAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC7B,SAAS,GAAG;YACR,CAAC,EAAE,mBAAmB;YACtB,OAAO,EAAE,MAAM,CAAC,YAAY;YAC5B,IAAI;SACP,CAAA;IACL,CAAC;IAED,IAAI,YAAY,GAAuB,SAAS,CAAA;IAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,YAAY,GAAG,UAAU,CAAA;IAC7B,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,YAAY,GAAG,IAAA,wBAAa,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAED,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,SAAS;QAClB,YAAY;QACZ,kBAAkB,EAAE,4BAA4B,CAAC,MAAM,CAAC,UAAU,CAAC;QACnE,OAAO,EAAE,IAAA,6BAAe,EAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;KACjD,CAAA;AACL,CAAC;AAhED,oEAgEC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../../types/errors.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtMessageNotFoundError } from '../../types/errors.js'\nimport { Message } from '../../types/messages/message.js'\nimport { TextWithEntities } from '../../types/misc/entities.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { normalizeDate, normalizeMessageId } from '../../utils/index.js'\nimport { _getPeerChainId } from '../misc/chain-id.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { getMessages } from './get-messages.js'\n\n// @exported\nexport interface CommonSendParams {\n /**\n * Message to reply to. Either a message object or message ID.\n *\n * For forums - can also be an ID of the topic (i.e. its top message ID)\n *\n * Can also be a message from another chat, in which case a quote will be sent.\n */\n replyTo?: number | Message\n\n /**\n * Whether to throw an error if {@link replyTo}\n * message does not exist.\n *\n * If that message was not found, `NotFoundError` is thrown,\n * with `text` set to `MESSAGE_NOT_FOUND`.\n *\n * Incurs an additional request, so only use when really needed.\n *\n * @default `false`\n */\n mustReply?: boolean\n\n /**\n * Message to comment to. Either a message object or message ID.\n *\n * This overwrites `replyTo` if it was passed\n */\n commentTo?: number | Message\n\n /**\n * Story to reply to.\n *\n * Must be the story sent by the peer you are sending the message to.\n *\n * Can't be used together with {@link replyTo} or {@link commentTo}.\n */\n replyToStory?: number\n\n /**\n * Quoted text. Must be exactly contained in the message\n * being quoted to be accepted by the server (as well as entities)\n */\n quote?: TextWithEntities\n\n /**\n * Offset of the start of the quote in the message.\n */\n quoteOffset?: number\n\n /**\n * Whether to send this message silently.\n */\n silent?: boolean\n\n /**\n * If set, the message will be scheduled to this date.\n * When passing a number, a UNIX time in ms is expected.\n *\n * You can also pass `online` - this will send the message\n * once the peer is online. Note that this requires that\n * peer's online status to be visible to you.\n */\n schedule?: Date | number | 'online'\n\n /**\n * Whether to clear draft after sending this message.\n *\n * @default `false`\n */\n clearDraft?: boolean\n\n /**\n * Whether to disallow further forwards of this message.\n *\n * Only for bots, works even if the target chat does not\n * have content protection.\n */\n forbidForwards?: boolean\n\n /**\n * Peer to use when sending the message.\n */\n sendAs?: InputPeerLike\n\n /**\n * If passed, instead of sending the message, it will be saved into the\n * given quick reply shortcut (either its ID or its shortcut string).\n */\n quickReply?: number | string\n\n /**\n * Whether to dispatch the returned message\n * to the client's update handler.\n */\n shouldDispatch?: true\n\n /**\n * Unique identifier of the business connection on behalf of which\n * the message will be sent\n */\n businessConnectionId?: string\n\n /**\n * ID of a message effect to use when sending the message\n * (see {@link TelegramClient.getAvailableMessageEffects})\n */\n effect?: tl.Long\n // todo: once we have a caching layer, we can accept an emoji here\n}\n\n/**\n * @internal\n * @noemit\n */\nexport function _normalizeQuickReplyShortcut(\n shortcut: number | string | undefined,\n): tl.TypeInputQuickReplyShortcut | undefined {\n if (!shortcut) return undefined\n\n if (typeof shortcut === 'number') {\n return {\n _: 'inputQuickReplyShortcutId',\n shortcutId: shortcut,\n }\n }\n\n return {\n _: 'inputQuickReplyShortcut',\n shortcut,\n }\n}\n\n/**\n * @internal\n * @noemit\n */\nexport async function _processCommonSendParameters(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params: CommonSendParams,\n) {\n let peer = await resolvePeer(client, chatId)\n\n let replyTo = normalizeMessageId(params.replyTo)\n const replyToPeer = typeof params.replyTo === 'number' ? undefined : params.replyTo?.chat.inputPeer\n\n if (params.commentTo) {\n [peer, replyTo] = await _getDiscussionMessage(client, peer, normalizeMessageId(params.commentTo)!)\n }\n\n if (params.mustReply) {\n if (!replyTo) {\n throw new MtArgumentError('mustReply used, but replyTo was not passed')\n }\n\n const msg = await getMessages(client, peer, replyTo)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(peer), replyTo, 'to reply to')\n }\n }\n\n if (params.replyToStory && replyTo) {\n throw new MtArgumentError('replyTo/commentTo and replyToStory cannot be used together')\n }\n\n let tlReplyTo: tl.TypeInputReplyTo | undefined = undefined\n\n if (replyTo) {\n tlReplyTo = {\n _: 'inputReplyToMessage',\n replyToMsgId: replyTo,\n replyToPeerId: replyToPeer,\n quoteText: params.quote?.text,\n quoteEntities: params.quote?.entities as tl.TypeMessageEntity[],\n quoteOffset: params.quoteOffset,\n }\n } else if (params.replyToStory) {\n tlReplyTo = {\n _: 'inputReplyToStory',\n storyId: params.replyToStory,\n peer,\n }\n }\n\n let scheduleDate: number | undefined = undefined\n\n if (params.schedule === 'online') {\n scheduleDate = 0x7ffffffe\n } else if (params.schedule) {\n scheduleDate = normalizeDate(params.schedule)\n }\n\n return {\n peer,\n replyTo: tlReplyTo,\n scheduleDate,\n quickReplyShortcut: _normalizeQuickReplyShortcut(params.quickReply),\n chainId: _getPeerChainId(client, peer, 'send'),\n }\n}\n"]}
1
+ {"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../../types/errors.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtMessageNotFoundError } from '../../types/errors.js'\nimport { Message } from '../../types/messages/message.js'\nimport { TextWithEntities } from '../../types/misc/entities.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { normalizeDate, normalizeMessageId } from '../../utils/index.js'\nimport { _getPeerChainId } from '../misc/chain-id.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { getMessages } from './get-messages.js'\n\n// @exported\nexport interface CommonSendParams {\n /**\n * Message to reply to. Either a message object or message ID.\n *\n * For forums - can also be an ID of the topic (i.e. its top message ID)\n *\n * Can also be a message from another chat, in which case a quote will be sent.\n */\n replyTo?: number | Message\n\n /**\n * Whether to throw an error if {@link replyTo}\n * message does not exist.\n *\n * If that message was not found, `NotFoundError` is thrown,\n * with `text` set to `MESSAGE_NOT_FOUND`.\n *\n * Incurs an additional request, so only use when really needed.\n *\n * @default `false`\n */\n mustReply?: boolean\n\n /**\n * Message to comment to. Either a message object or message ID.\n *\n * This overwrites `replyTo` if it was passed\n */\n commentTo?: number | Message\n\n /**\n * Story to reply to.\n *\n * Must be the story sent by the peer you are sending the message to.\n *\n * Can't be used together with {@link replyTo} or {@link commentTo}.\n */\n replyToStory?: number\n\n /**\n * Quoted text. Must be exactly contained in the message\n * being quoted to be accepted by the server (as well as entities)\n */\n quote?: TextWithEntities\n\n /**\n * Offset of the start of the quote in the message.\n */\n quoteOffset?: number\n\n /**\n * Whether to send this message silently.\n */\n silent?: boolean\n\n /**\n * If set, the message will be scheduled to this date.\n * When passing a number, a UNIX time in ms is expected.\n *\n * You can also pass `online` - this will send the message\n * once the peer is online. Note that this requires that\n * peer's online status to be visible to you.\n */\n schedule?: Date | number | 'online'\n\n /**\n * Whether to clear draft after sending this message.\n *\n * @default `false`\n */\n clearDraft?: boolean\n\n /**\n * Whether to disallow further forwards of this message.\n *\n * Only for bots, works even if the target chat does not\n * have content protection.\n */\n forbidForwards?: boolean\n\n /**\n * Peer to use when sending the message.\n */\n sendAs?: InputPeerLike\n\n /**\n * If passed, instead of sending the message, it will be saved into the\n * given quick reply shortcut (either its ID or its shortcut string).\n */\n quickReply?: number | string\n\n /**\n * Whether to dispatch the returned message to the client's update handler.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n\n /**\n * Unique identifier of the business connection on behalf of which\n * the message will be sent\n */\n businessConnectionId?: string\n\n /**\n * ID of a message effect to use when sending the message\n * (see {@link TelegramClient.getAvailableMessageEffects})\n */\n effect?: tl.Long\n // todo: once we have a caching layer, we can accept an emoji here\n}\n\n/**\n * @internal\n * @noemit\n */\nexport function _normalizeQuickReplyShortcut(\n shortcut: number | string | undefined,\n): tl.TypeInputQuickReplyShortcut | undefined {\n if (!shortcut) return undefined\n\n if (typeof shortcut === 'number') {\n return {\n _: 'inputQuickReplyShortcutId',\n shortcutId: shortcut,\n }\n }\n\n return {\n _: 'inputQuickReplyShortcut',\n shortcut,\n }\n}\n\n/**\n * @internal\n * @noemit\n */\nexport async function _processCommonSendParameters(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params: CommonSendParams,\n) {\n let peer = await resolvePeer(client, chatId)\n\n let replyTo = normalizeMessageId(params.replyTo)\n const replyToPeer = typeof params.replyTo === 'number' ? undefined : params.replyTo?.chat.inputPeer\n\n if (params.commentTo) {\n [peer, replyTo] = await _getDiscussionMessage(client, peer, normalizeMessageId(params.commentTo)!)\n }\n\n if (params.mustReply) {\n if (!replyTo) {\n throw new MtArgumentError('mustReply used, but replyTo was not passed')\n }\n\n const msg = await getMessages(client, peer, replyTo)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(peer), replyTo, 'to reply to')\n }\n }\n\n if (params.replyToStory && replyTo) {\n throw new MtArgumentError('replyTo/commentTo and replyToStory cannot be used together')\n }\n\n let tlReplyTo: tl.TypeInputReplyTo | undefined = undefined\n\n if (replyTo) {\n tlReplyTo = {\n _: 'inputReplyToMessage',\n replyToMsgId: replyTo,\n replyToPeerId: replyToPeer,\n quoteText: params.quote?.text,\n quoteEntities: params.quote?.entities as tl.TypeMessageEntity[],\n quoteOffset: params.quoteOffset,\n }\n } else if (params.replyToStory) {\n tlReplyTo = {\n _: 'inputReplyToStory',\n storyId: params.replyToStory,\n peer,\n }\n }\n\n let scheduleDate: number | undefined = undefined\n\n if (params.schedule === 'online') {\n scheduleDate = 0x7ffffffe\n } else if (params.schedule) {\n scheduleDate = normalizeDate(params.schedule)\n }\n\n return {\n peer,\n replyTo: tlReplyTo,\n scheduleDate,\n quickReplyShortcut: _normalizeQuickReplyShortcut(params.quickReply),\n chainId: _getPeerChainId(client, peer, 'send'),\n }\n}\n"]}
@@ -60,9 +60,9 @@ async function sendText(client, chatId, text, params) {
60
60
  replyMarkup,
61
61
  entities: res.entities,
62
62
  };
63
- // is this needed?
64
- // this._date = res.date
65
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
63
+ if (!params.shouldDispatch) {
64
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
65
+ }
66
66
  const peers = new index_js_2.PeersIndex();
67
67
  const fetchPeer = async (peer) => {
68
68
  const id = (0, peer_utils_js_1.getMarkedPeerId)(peer);
@@ -1 +1 @@
1
- {"version":3,"file":"send-text.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-text.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../../../types/errors.js'\nimport { randomLong } from '../../../utils/long-utils.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { BotKeyboard, ReplyMarkup } from '../../types/bots/keyboards/index.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputText } from '../../types/misc/entities.js'\nimport { InputPeerLike, PeersIndex } from '../../types/peers/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { inputPeerToPeer } from '../../utils/peer-utils.js'\nimport { _getRawPeerBatched } from '../chats/batched-queries.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _findMessageInUpdate } from './find-in-update.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a text message\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param text Text of the message\n * @param params Additional sending parameters\n */\nexport async function sendText(\n client: ITelegramClient,\n chatId: InputPeerLike,\n text: InputText,\n params?: CommonSendParams & {\n /**\n * For bots: inline or reply markup or an instruction\n * to hide a reply keyboard or to force a reply.\n */\n replyMarkup?: ReplyMarkup\n\n /**\n * Whether to disable links preview in this message\n */\n disableWebPreview?: boolean\n\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invertMedia?: boolean\n },\n): Promise<Message> {\n if (!params) params = {}\n\n const [message, entities] = await _normalizeInputText(client, text)\n\n const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup)\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const randomId = randomLong()\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMessage',\n peer,\n noWebpage: params.disableWebPreview,\n silent: params.silent,\n replyTo,\n randomId,\n scheduleDate,\n replyMarkup,\n message,\n entities,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invertMedia,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n if (res._ === 'updateShortSentMessage') {\n // todo extract this to updates manager?\n const msg: tl.RawMessage = {\n _: 'message',\n id: res.id,\n peerId: inputPeerToPeer(peer),\n fromId: { _: 'peerUser', userId: client.storage.self.getCached()!.userId },\n message,\n date: res.date,\n out: res.out,\n replyMarkup,\n entities: res.entities,\n }\n\n // is this needed?\n // this._date = res.date\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n\n const peers = new PeersIndex()\n\n const fetchPeer = async (peer: tl.TypePeer | tl.TypeInputPeer): Promise<void> => {\n const id = getMarkedPeerId(peer)\n\n let cached = await client.storage.peers.getCompleteById(id)\n\n if (!cached) {\n cached = await _getRawPeerBatched(client, await resolvePeer(client, peer))\n }\n\n if (!cached) {\n throw new MtTypeAssertionError('sendText (@ getFullPeerById)', 'user | chat', 'null')\n }\n\n switch (cached._) {\n case 'user':\n peers.users.set(cached.id, cached)\n break\n case 'chat':\n case 'chatForbidden':\n case 'channel':\n case 'channelForbidden':\n peers.chats.set(cached.id, cached)\n break\n default:\n throw new MtTypeAssertionError(\n 'sendText (@ users.getUsers)',\n 'user | chat | channel', // not very accurate, but good enough\n cached._,\n )\n }\n }\n\n await Promise.all([fetchPeer(peer), fetchPeer(msg.fromId!)])\n\n const ret = new Message(msg, peers)\n\n return ret\n }\n\n const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId)\n\n return msg\n}\n"]}
1
+ {"version":3,"file":"send-text.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-text.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../../../types/errors.js'\nimport { randomLong } from '../../../utils/long-utils.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { BotKeyboard, ReplyMarkup } from '../../types/bots/keyboards/index.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputText } from '../../types/misc/entities.js'\nimport { InputPeerLike, PeersIndex } from '../../types/peers/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { inputPeerToPeer } from '../../utils/peer-utils.js'\nimport { _getRawPeerBatched } from '../chats/batched-queries.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _findMessageInUpdate } from './find-in-update.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a text message\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param text Text of the message\n * @param params Additional sending parameters\n */\nexport async function sendText(\n client: ITelegramClient,\n chatId: InputPeerLike,\n text: InputText,\n params?: CommonSendParams & {\n /**\n * For bots: inline or reply markup or an instruction\n * to hide a reply keyboard or to force a reply.\n */\n replyMarkup?: ReplyMarkup\n\n /**\n * Whether to disable links preview in this message\n */\n disableWebPreview?: boolean\n\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invertMedia?: boolean\n },\n): Promise<Message> {\n if (!params) params = {}\n\n const [message, entities] = await _normalizeInputText(client, text)\n\n const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup)\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const randomId = randomLong()\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMessage',\n peer,\n noWebpage: params.disableWebPreview,\n silent: params.silent,\n replyTo,\n randomId,\n scheduleDate,\n replyMarkup,\n message,\n entities,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invertMedia,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n if (res._ === 'updateShortSentMessage') {\n // todo extract this to updates manager?\n const msg: tl.RawMessage = {\n _: 'message',\n id: res.id,\n peerId: inputPeerToPeer(peer),\n fromId: { _: 'peerUser', userId: client.storage.self.getCached()!.userId },\n message,\n date: res.date,\n out: res.out,\n replyMarkup,\n entities: res.entities,\n }\n\n if (!params.shouldDispatch) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n\n const peers = new PeersIndex()\n\n const fetchPeer = async (peer: tl.TypePeer | tl.TypeInputPeer): Promise<void> => {\n const id = getMarkedPeerId(peer)\n\n let cached = await client.storage.peers.getCompleteById(id)\n\n if (!cached) {\n cached = await _getRawPeerBatched(client, await resolvePeer(client, peer))\n }\n\n if (!cached) {\n throw new MtTypeAssertionError('sendText (@ getFullPeerById)', 'user | chat', 'null')\n }\n\n switch (cached._) {\n case 'user':\n peers.users.set(cached.id, cached)\n break\n case 'chat':\n case 'chatForbidden':\n case 'channel':\n case 'channelForbidden':\n peers.chats.set(cached.id, cached)\n break\n default:\n throw new MtTypeAssertionError(\n 'sendText (@ users.getUsers)',\n 'user | chat | channel', // not very accurate, but good enough\n cached._,\n )\n }\n }\n\n await Promise.all([fetchPeer(peer), fetchPeer(msg.fromId!)])\n\n const ret = new Message(msg, peers)\n\n return ret\n }\n\n const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId)\n\n return msg\n}\n"]}
@@ -10,4 +10,9 @@ export declare function unpinAllMessages(client: ITelegramClient, chatId: InputP
10
10
  * For forums - unpin only messages from the given topic
11
11
  */
12
12
  topicId?: number;
13
+ /**
14
+ * Whether to dispatch updates that will be generated by this call.
15
+ * Doesn't follow `disableNoDispatch`
16
+ */
17
+ shouldDispatch?: true;
13
18
  }): Promise<void>;
@@ -10,18 +10,20 @@ const resolve_peer_js_1 = require("../users/resolve-peer.js");
10
10
  * @param chatId Chat or user ID
11
11
  */
12
12
  async function unpinAllMessages(client, chatId, params) {
13
- const { topicId } = params ?? {};
13
+ const { topicId, shouldDispatch } = params ?? {};
14
14
  const peer = await (0, resolve_peer_js_1.resolvePeer)(client, chatId);
15
15
  const res = await client.call({
16
16
  _: 'messages.unpinAllMessages',
17
17
  peer,
18
18
  topMsgId: topicId,
19
19
  });
20
- if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
21
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, peer.channelId));
22
- }
23
- else {
24
- client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
20
+ if (!shouldDispatch) {
21
+ if ((0, peer_utils_js_1.isInputPeerChannel)(peer)) {
22
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount, peer.channelId));
23
+ }
24
+ else {
25
+ client.handleClientUpdate((0, utils_js_1.createDummyUpdate)(res.pts, res.ptsCount));
26
+ }
25
27
  }
26
28
  }
27
29
  exports.unpinAllMessages = unpinAllMessages;
@@ -1 +1 @@
1
- {"version":3,"file":"unpin-all-messages.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/unpin-all-messages.ts"],"names":[],"mappings":";;;AAEA,qDAA0D;AAC1D,6DAA8D;AAC9D,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAClC,MAAuB,EACvB,MAAqB,EACrB,MAKC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEhC,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,2BAA2B;QAC9B,IAAI;QACJ,QAAQ,EAAE,OAAO;KACpB,CAAC,CAAA;IAEF,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvE,CAAC;AACL,CAAC;AAzBD,4CAyBC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Unpin all pinned messages in a chat.\n *\n * @param chatId Chat or user ID\n */\nexport async function unpinAllMessages(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params?: {\n /**\n * For forums - unpin only messages from the given topic\n */\n topicId?: number\n },\n): Promise<void> {\n const { topicId } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n const res = await client.call({\n _: 'messages.unpinAllMessages',\n peer,\n topMsgId: topicId,\n })\n\n if (isInputPeerChannel(peer)) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, peer.channelId))\n } else {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n}\n"]}
1
+ {"version":3,"file":"unpin-all-messages.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/unpin-all-messages.ts"],"names":[],"mappings":";;;AAEA,qDAA0D;AAC1D,6DAA8D;AAC9D,8DAAsD;AAEtD;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAClC,MAAuB,EACvB,MAAqB,EACrB,MAWC;IAED,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEhD,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,2BAA2B;QAC9B,IAAI;QACJ,QAAQ,EAAE,OAAO;KACpB,CAAC,CAAA;IAEF,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,IAAI,IAAA,kCAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QACvF,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,kBAAkB,CAAC,IAAA,4BAAiB,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACvE,CAAC;IACL,CAAC;AACL,CAAC;AAjCD,4CAiCC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { InputPeerLike } from '../../types/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { isInputPeerChannel } from '../../utils/peer-utils.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\n\n/**\n * Unpin all pinned messages in a chat.\n *\n * @param chatId Chat or user ID\n */\nexport async function unpinAllMessages(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params?: {\n /**\n * For forums - unpin only messages from the given topic\n */\n topicId?: number\n\n /**\n * Whether to dispatch updates that will be generated by this call.\n * Doesn't follow `disableNoDispatch`\n */\n shouldDispatch?: true\n },\n): Promise<void> {\n const { topicId, shouldDispatch } = params ?? {}\n\n const peer = await resolvePeer(client, chatId)\n\n const res = await client.call({\n _: 'messages.unpinAllMessages',\n peer,\n topMsgId: topicId,\n })\n\n if (!shouldDispatch) {\n if (isInputPeerChannel(peer)) {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount, peer.channelId))\n } else {\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n }\n }\n}\n"]}
@@ -55,7 +55,7 @@ async function resolvePeerMany(client, peerIds, normalizer) {
55
55
  };
56
56
  let error = undefined;
57
57
  void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {
58
- client.log.debug('resolvePeerMany errored: %s', e.message);
58
+ client.log.debug('resolvePeerMany errored: %e', e);
59
59
  error = e;
60
60
  cv.notify();
61
61
  });
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeer } from './resolve-peer.js'\n\n/**\n * Get multiple `InputPeer`s at once,\n * while also normalizing and removing\n * peers that can't be normalized to that type.\n *\n * If a peer was not found, it will be skipped.\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n * @param normalizer Normalization function\n */\nexport async function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel>(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer: (obj: tl.TypeInputPeer) => T | null,\n): Promise<T[]>\n\n/**\n * Get multiple `InputPeer`s at once.\n *\n * If a peer was not found, `null` will be returned instead\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n): Promise<(tl.TypeInputPeer | null)[]>\n\n/**\n * @internal\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null,\n): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> {\n const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = []\n\n const limit = 8\n\n if (peerIds.length < limit) {\n // no point in using async pool for <limit peers\n const res = await Promise.all(\n peerIds.map((it) =>\n resolvePeer(client, it).catch((e) => {\n if (e instanceof MtPeerNotFoundError) {\n return null\n }\n throw e\n }),\n ),\n )\n\n if (!normalizer) return res\n\n for (const value of res) {\n if (!value) continue\n const norm = normalizer(value)\n\n if (norm) {\n ret.push(norm)\n }\n }\n\n return ret\n }\n\n const cv = new ConditionVariable()\n const buffer: Record<number, tl.TypeInputPeer | null> = {}\n\n let nextIdx = 0\n let nextWorkerIdx = 0\n\n const fetchNext = async (idx = nextWorkerIdx++): Promise<void> => {\n try {\n const result = await resolvePeer(client, peerIds[idx])\n buffer[idx] = result\n } catch (e) {\n if (e instanceof MtPeerNotFoundError) {\n buffer[idx] = null\n } else throw e\n }\n\n if (nextIdx === idx) {\n cv.notify()\n }\n\n if (nextWorkerIdx < peerIds.length) {\n await fetchNext(nextWorkerIdx++)\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {\n client.log.debug('resolvePeerMany errored: %s', e.message)\n error = e\n cv.notify()\n })\n\n while (nextIdx < peerIds.length) {\n await cv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextIdx in buffer) {\n const buf = buffer[nextIdx]\n delete buffer[nextIdx]\n\n nextIdx++\n\n if (!normalizer) {\n ret.push(buf)\n continue\n }\n\n if (buf !== null) {\n const norm = normalizer(buf)\n\n if (norm) {\n ret.push(norm)\n }\n }\n }\n }\n\n return ret\n}\n"]}
1
+ {"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeer } from './resolve-peer.js'\n\n/**\n * Get multiple `InputPeer`s at once,\n * while also normalizing and removing\n * peers that can't be normalized to that type.\n *\n * If a peer was not found, it will be skipped.\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n * @param normalizer Normalization function\n */\nexport async function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel>(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer: (obj: tl.TypeInputPeer) => T | null,\n): Promise<T[]>\n\n/**\n * Get multiple `InputPeer`s at once.\n *\n * If a peer was not found, `null` will be returned instead\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n): Promise<(tl.TypeInputPeer | null)[]>\n\n/**\n * @internal\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null,\n): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> {\n const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = []\n\n const limit = 8\n\n if (peerIds.length < limit) {\n // no point in using async pool for <limit peers\n const res = await Promise.all(\n peerIds.map((it) =>\n resolvePeer(client, it).catch((e) => {\n if (e instanceof MtPeerNotFoundError) {\n return null\n }\n throw e\n }),\n ),\n )\n\n if (!normalizer) return res\n\n for (const value of res) {\n if (!value) continue\n const norm = normalizer(value)\n\n if (norm) {\n ret.push(norm)\n }\n }\n\n return ret\n }\n\n const cv = new ConditionVariable()\n const buffer: Record<number, tl.TypeInputPeer | null> = {}\n\n let nextIdx = 0\n let nextWorkerIdx = 0\n\n const fetchNext = async (idx = nextWorkerIdx++): Promise<void> => {\n try {\n const result = await resolvePeer(client, peerIds[idx])\n buffer[idx] = result\n } catch (e) {\n if (e instanceof MtPeerNotFoundError) {\n buffer[idx] = null\n } else throw e\n }\n\n if (nextIdx === idx) {\n cv.notify()\n }\n\n if (nextWorkerIdx < peerIds.length) {\n await fetchNext(nextWorkerIdx++)\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {\n client.log.debug('resolvePeerMany errored: %e', e)\n error = e\n cv.notify()\n })\n\n while (nextIdx < peerIds.length) {\n await cv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextIdx in buffer) {\n const buf = buffer[nextIdx]\n delete buffer[nextIdx]\n\n nextIdx++\n\n if (!normalizer) {\n ret.push(buf)\n continue\n }\n\n if (buf !== null) {\n const norm = normalizer(buf)\n\n if (norm) {\n ret.push(norm)\n }\n }\n }\n }\n\n return ret\n}\n"]}
@@ -58,9 +58,11 @@ export declare class Dialog {
58
58
  */
59
59
  get isUnread(): boolean;
60
60
  /**
61
- * Whether this dialog is muted
61
+ * Whether this dialog is muted.
62
+ *
63
+ * If `null`, the default account-level setting should be used.
62
64
  */
63
- get isMuted(): boolean;
65
+ get isMuted(): boolean | null;
64
66
  /**
65
67
  * Whether this dialog is archived
66
68
  */
@@ -153,10 +153,12 @@ class Dialog {
153
153
  return this.raw.unreadMark || this.raw.unreadCount > 1;
154
154
  }
155
155
  /**
156
- * Whether this dialog is muted
156
+ * Whether this dialog is muted.
157
+ *
158
+ * If `null`, the default account-level setting should be used.
157
159
  */
158
160
  get isMuted() {
159
- return this.raw.notifySettings.silent;
161
+ return this.raw.notifySettings.silent ?? null;
160
162
  }
161
163
  /**
162
164
  * Whether this dialog is archived