@mtcute/core 0.30.2 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/client.cjs +73 -0
  2. package/client.js +73 -0
  3. package/highlevel/client.d.cts +344 -114
  4. package/highlevel/client.d.ts +344 -114
  5. package/highlevel/methods/auth/sign-in-qr.cjs +2 -0
  6. package/highlevel/methods/auth/sign-in-qr.js +2 -0
  7. package/highlevel/methods/auth/sign-in-qr.test.d.cts +1 -0
  8. package/highlevel/methods/auth/sign-in-qr.test.d.ts +1 -0
  9. package/highlevel/methods/chats/join-chat.cjs +1 -1
  10. package/highlevel/methods/chats/join-chat.d.cts +2 -1
  11. package/highlevel/methods/chats/join-chat.d.ts +2 -1
  12. package/highlevel/methods/chats/join-chat.js +1 -1
  13. package/highlevel/methods/chats/transfer-chat-ownership.cjs +6 -17
  14. package/highlevel/methods/chats/transfer-chat-ownership.js +6 -17
  15. package/highlevel/methods/communities/ban-community-participant.cjs +30 -0
  16. package/highlevel/methods/communities/ban-community-participant.d.cts +20 -0
  17. package/highlevel/methods/communities/ban-community-participant.d.ts +20 -0
  18. package/highlevel/methods/communities/ban-community-participant.js +25 -0
  19. package/highlevel/methods/communities/create-community.cjs +29 -0
  20. package/highlevel/methods/communities/create-community.d.cts +22 -0
  21. package/highlevel/methods/communities/create-community.d.ts +22 -0
  22. package/highlevel/methods/communities/create-community.js +24 -0
  23. package/highlevel/methods/communities/get-community-link-requests.cjs +27 -0
  24. package/highlevel/methods/communities/get-community-link-requests.d.cts +17 -0
  25. package/highlevel/methods/communities/get-community-link-requests.d.ts +17 -0
  26. package/highlevel/methods/communities/get-community-link-requests.js +22 -0
  27. package/highlevel/methods/communities/get-community-participant-chats.cjs +24 -0
  28. package/highlevel/methods/communities/get-community-participant-chats.d.cts +17 -0
  29. package/highlevel/methods/communities/get-community-participant-chats.d.ts +17 -0
  30. package/highlevel/methods/communities/get-community-participant-chats.js +19 -0
  31. package/highlevel/methods/communities/get-joined-communities.cjs +21 -0
  32. package/highlevel/methods/communities/get-joined-communities.d.cts +6 -0
  33. package/highlevel/methods/communities/get-joined-communities.d.ts +6 -0
  34. package/highlevel/methods/communities/get-joined-communities.js +16 -0
  35. package/highlevel/methods/communities/hide-community-link-request.cjs +30 -0
  36. package/highlevel/methods/communities/hide-community-link-request.d.cts +22 -0
  37. package/highlevel/methods/communities/hide-community-link-request.d.ts +22 -0
  38. package/highlevel/methods/communities/hide-community-link-request.js +25 -0
  39. package/highlevel/methods/communities/link-community-peer.cjs +32 -0
  40. package/highlevel/methods/communities/link-community-peer.d.cts +22 -0
  41. package/highlevel/methods/communities/link-community-peer.d.ts +22 -0
  42. package/highlevel/methods/communities/link-community-peer.js +27 -0
  43. package/highlevel/methods/communities/toggle-community-collapsed.cjs +18 -0
  44. package/highlevel/methods/communities/toggle-community-collapsed.d.cts +16 -0
  45. package/highlevel/methods/communities/toggle-community-collapsed.d.ts +16 -0
  46. package/highlevel/methods/communities/toggle-community-collapsed.js +13 -0
  47. package/highlevel/methods/ephemeral/delete-ephemeral-message.cjs +20 -0
  48. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.cts +13 -0
  49. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.ts +13 -0
  50. package/highlevel/methods/ephemeral/delete-ephemeral-message.js +15 -0
  51. package/highlevel/methods/ephemeral/edit-ephemeral-message.cjs +33 -0
  52. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.cts +25 -0
  53. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.ts +25 -0
  54. package/highlevel/methods/ephemeral/edit-ephemeral-message.js +28 -0
  55. package/highlevel/methods/ephemeral/find-in-update.cjs +27 -0
  56. package/highlevel/methods/ephemeral/find-in-update.d.cts +8 -0
  57. package/highlevel/methods/ephemeral/find-in-update.d.ts +8 -0
  58. package/highlevel/methods/ephemeral/find-in-update.js +22 -0
  59. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.cjs +31 -0
  60. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.cts +29 -0
  61. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.d.ts +29 -0
  62. package/highlevel/methods/ephemeral/get-ephemeral-callback-answer.js +26 -0
  63. package/highlevel/methods/ephemeral/send-ephemeral-message.cjs +38 -0
  64. package/highlevel/methods/ephemeral/send-ephemeral-message.d.cts +29 -0
  65. package/highlevel/methods/ephemeral/send-ephemeral-message.d.ts +29 -0
  66. package/highlevel/methods/ephemeral/send-ephemeral-message.js +33 -0
  67. package/highlevel/methods/files/download-iterable.cjs +4 -2
  68. package/highlevel/methods/files/download-iterable.js +4 -2
  69. package/highlevel/methods/files/download-iterable.test.d.cts +1 -0
  70. package/highlevel/methods/files/download-iterable.test.d.ts +1 -0
  71. package/highlevel/methods/files/download-stream.cjs +5 -6
  72. package/highlevel/methods/files/download-stream.js +5 -6
  73. package/highlevel/methods/forums/create-forum-topic.d.cts +7 -0
  74. package/highlevel/methods/forums/create-forum-topic.d.ts +7 -0
  75. package/highlevel/methods/forums/delete-forum-topic-history.d.cts +1 -1
  76. package/highlevel/methods/forums/delete-forum-topic-history.d.ts +1 -1
  77. package/highlevel/methods/forums/edit-forum-topic.cjs +1 -1
  78. package/highlevel/methods/forums/edit-forum-topic.d.cts +2 -2
  79. package/highlevel/methods/forums/edit-forum-topic.d.ts +2 -2
  80. package/highlevel/methods/forums/edit-forum-topic.js +1 -1
  81. package/highlevel/methods/forums/get-forum-topics-by-id.cjs +5 -1
  82. package/highlevel/methods/forums/get-forum-topics-by-id.d.cts +9 -1
  83. package/highlevel/methods/forums/get-forum-topics-by-id.d.ts +9 -1
  84. package/highlevel/methods/forums/get-forum-topics-by-id.js +5 -1
  85. package/highlevel/methods/forums/get-forum-topics-by-id.test.d.cts +1 -0
  86. package/highlevel/methods/forums/get-forum-topics-by-id.test.d.ts +1 -0
  87. package/highlevel/methods/forums/get-forum-topics.cjs +1 -1
  88. package/highlevel/methods/forums/get-forum-topics.js +1 -1
  89. package/highlevel/methods/forums/toggle-forum-topic-closed.d.cts +1 -1
  90. package/highlevel/methods/forums/toggle-forum-topic-closed.d.ts +1 -1
  91. package/highlevel/methods/forums/toggle-forum-topic-pinned.d.cts +1 -1
  92. package/highlevel/methods/forums/toggle-forum-topic-pinned.d.ts +1 -1
  93. package/highlevel/methods/forums/toggle-general-topic-hidden.cjs +2 -2
  94. package/highlevel/methods/forums/toggle-general-topic-hidden.js +3 -3
  95. package/highlevel/methods/messages/send-common.d.cts +7 -1
  96. package/highlevel/methods/messages/send-common.d.ts +7 -1
  97. package/highlevel/methods/messages/send-text.cjs +70 -4
  98. package/highlevel/methods/messages/send-text.js +70 -4
  99. package/highlevel/methods/users/resolve-peer.cjs +11 -1
  100. package/highlevel/methods/users/resolve-peer.js +11 -1
  101. package/highlevel/methods.d.cts +16 -0
  102. package/highlevel/methods.d.ts +16 -0
  103. package/highlevel/storage/service/peers.cjs +25 -0
  104. package/highlevel/storage/service/peers.js +25 -0
  105. package/highlevel/storage/service/peers.test.d.cts +1 -0
  106. package/highlevel/storage/service/peers.test.d.ts +1 -0
  107. package/highlevel/types/conversation.cjs +8 -0
  108. package/highlevel/types/conversation.d.cts +1 -0
  109. package/highlevel/types/conversation.d.ts +1 -0
  110. package/highlevel/types/conversation.js +10 -2
  111. package/highlevel/types/conversation.test.d.cts +1 -0
  112. package/highlevel/types/conversation.test.d.ts +1 -0
  113. package/highlevel/types/messages/ephemeral-message.cjs +103 -0
  114. package/highlevel/types/messages/ephemeral-message.d.cts +55 -0
  115. package/highlevel/types/messages/ephemeral-message.d.ts +55 -0
  116. package/highlevel/types/messages/ephemeral-message.js +98 -0
  117. package/highlevel/types/messages/index.d.cts +1 -0
  118. package/highlevel/types/messages/index.d.ts +1 -0
  119. package/highlevel/types/messages/message-action.cjs +6 -0
  120. package/highlevel/types/messages/message-action.d.cts +8 -1
  121. package/highlevel/types/messages/message-action.d.ts +8 -1
  122. package/highlevel/types/messages/message-action.js +6 -0
  123. package/highlevel/types/messages/replied-message.cjs +5 -1
  124. package/highlevel/types/messages/replied-message.d.cts +5 -1
  125. package/highlevel/types/messages/replied-message.d.ts +5 -1
  126. package/highlevel/types/messages/replied-message.js +5 -1
  127. package/highlevel/types/peers/chat.cjs +23 -3
  128. package/highlevel/types/peers/chat.d.cts +8 -3
  129. package/highlevel/types/peers/chat.d.ts +8 -3
  130. package/highlevel/types/peers/chat.js +24 -4
  131. package/highlevel/types/peers/community-peer.cjs +60 -0
  132. package/highlevel/types/peers/community-peer.d.cts +37 -0
  133. package/highlevel/types/peers/community-peer.d.ts +37 -0
  134. package/highlevel/types/peers/community-peer.js +55 -0
  135. package/highlevel/types/peers/full-chat.cjs +20 -5
  136. package/highlevel/types/peers/full-chat.d.cts +5 -0
  137. package/highlevel/types/peers/full-chat.d.ts +5 -0
  138. package/highlevel/types/peers/full-chat.js +20 -5
  139. package/highlevel/types/peers/index.d.cts +1 -0
  140. package/highlevel/types/peers/index.d.ts +1 -0
  141. package/highlevel/types/peers/peer.cjs +2 -0
  142. package/highlevel/types/peers/peer.js +2 -0
  143. package/highlevel/types/peers/user.cjs +6 -0
  144. package/highlevel/types/peers/user.d.cts +2 -0
  145. package/highlevel/types/peers/user.d.ts +2 -0
  146. package/highlevel/types/peers/user.js +6 -0
  147. package/highlevel/types/updates/delete-ephemeral-messages-update.cjs +27 -0
  148. package/highlevel/types/updates/delete-ephemeral-messages-update.d.cts +15 -0
  149. package/highlevel/types/updates/delete-ephemeral-messages-update.d.ts +15 -0
  150. package/highlevel/types/updates/delete-ephemeral-messages-update.js +22 -0
  151. package/highlevel/types/updates/ephemeral-callback-query.cjs +61 -0
  152. package/highlevel/types/updates/ephemeral-callback-query.d.cts +38 -0
  153. package/highlevel/types/updates/ephemeral-callback-query.d.ts +38 -0
  154. package/highlevel/types/updates/ephemeral-callback-query.js +56 -0
  155. package/highlevel/types/updates/index.d.cts +16 -2
  156. package/highlevel/types/updates/index.d.ts +16 -2
  157. package/highlevel/types/updates/parse-update.cjs +12 -1
  158. package/highlevel/types/updates/parse-update.js +12 -1
  159. package/highlevel/updates/manager.cjs +31 -13
  160. package/highlevel/updates/manager.d.cts +1 -0
  161. package/highlevel/updates/manager.d.ts +1 -0
  162. package/highlevel/updates/manager.js +31 -13
  163. package/highlevel/updates/manager.test.d.cts +1 -0
  164. package/highlevel/updates/manager.test.d.ts +1 -0
  165. package/highlevel/utils/stream-utils.cjs +8 -4
  166. package/highlevel/utils/stream-utils.js +8 -4
  167. package/highlevel/utils/stream-utils.test.d.cts +1 -0
  168. package/highlevel/utils/stream-utils.test.d.ts +1 -0
  169. package/highlevel/utils/walk-page-blocks.cjs +4 -0
  170. package/highlevel/utils/walk-page-blocks.js +4 -0
  171. package/index.cjs +10 -0
  172. package/index.js +11 -1
  173. package/methods.cjs +27 -0
  174. package/methods.js +27 -0
  175. package/network/client.cjs +4 -3
  176. package/network/client.d.cts +1 -0
  177. package/network/client.d.ts +1 -0
  178. package/network/client.js +4 -3
  179. package/network/middlewares/flood-waiter.cjs +2 -2
  180. package/network/middlewares/flood-waiter.js +2 -2
  181. package/network/middlewares/internal-errors.cjs +1 -1
  182. package/network/middlewares/internal-errors.js +1 -1
  183. package/network/middlewares/media-throttle.cjs +1 -1
  184. package/network/middlewares/media-throttle.js +1 -1
  185. package/network/mtproxy/index.cjs +4 -3
  186. package/network/mtproxy/index.d.cts +2 -2
  187. package/network/mtproxy/index.d.ts +2 -2
  188. package/network/mtproxy/index.js +4 -3
  189. package/network/network-manager.cjs +44 -16
  190. package/network/network-manager.d.cts +10 -3
  191. package/network/network-manager.d.ts +10 -3
  192. package/network/network-manager.js +45 -17
  193. package/network/network-manager.test.d.cts +1 -0
  194. package/network/network-manager.test.d.ts +1 -0
  195. package/network/persistent-connection.cjs +10 -2
  196. package/network/persistent-connection.js +10 -2
  197. package/network/session-connection.cjs +3 -0
  198. package/network/session-connection.js +3 -0
  199. package/network/transports/abstract.cjs +16 -0
  200. package/network/transports/abstract.d.cts +8 -2
  201. package/network/transports/abstract.d.ts +8 -2
  202. package/network/transports/abstract.js +17 -1
  203. package/network/transports/obfuscated.cjs +3 -1
  204. package/network/transports/obfuscated.js +3 -1
  205. package/package.json +6 -6
  206. package/tl/api-schema.json +1 -1
  207. package/tl/binary/reader.cjs +90 -15
  208. package/tl/binary/reader.js +90 -15
  209. package/tl/binary/writer.cjs +385 -80
  210. package/tl/binary/writer.js +385 -80
  211. package/tl/compat/reader.cjs +11 -0
  212. package/tl/compat/reader.js +11 -0
  213. package/tl/index.d.cts +12380 -4272
  214. package/tl/index.d.ts +12380 -4272
  215. package/tl/inner-tl.cjs +70 -20
  216. package/tl/inner-tl.js +70 -20
  217. package/tl/raw-errors.json +1 -1
  218. package/utils/abort-signal.cjs +1 -12
  219. package/utils/abort-signal.js +1 -12
  220. package/utils/abort-signal.test.d.cts +1 -0
  221. package/utils/abort-signal.test.d.ts +1 -0
  222. package/utils/binary/compat.cjs +14 -0
  223. package/utils/binary/compat.js +14 -0
  224. package/utils/early-timer.cjs +3 -11
  225. package/utils/early-timer.js +3 -11
  226. package/utils/early-timer.test.d.cts +1 -0
  227. package/utils/early-timer.test.d.ts +1 -0
  228. package/utils/function-utils.cjs +9 -4
  229. package/utils/function-utils.js +9 -4
  230. package/utils/links/bots.cjs +3 -0
  231. package/utils/links/bots.js +3 -0
  232. package/utils/peer-utils.cjs +8 -0
  233. package/utils/peer-utils.js +8 -0
@@ -11,6 +11,49 @@ import { _findMessageInUpdate } from "./find-in-update.js";
11
11
  import { _processCommonSendParameters } from "./send-common.js";
12
12
  import { _convertToTl } from "../../types/bots/keyboards/factories.js";
13
13
  import { PeersIndex } from "../../types/peers/peers-index.js";
14
+ function _inputReplyToToHeader(replyTo, peer) {
15
+ if (!replyTo) return [void 0, void 0];
16
+ switch (replyTo._) {
17
+ case "inputReplyToMessage": {
18
+ const replyToPeerId = replyTo.replyToPeerId && getMarkedPeerId(replyTo.replyToPeerId) !== getMarkedPeerId(peer) ? inputPeerToPeer(replyTo.replyToPeerId) : void 0;
19
+ return [
20
+ {
21
+ _: "messageReplyHeader",
22
+ replyToMsgId: replyTo.replyToMsgId,
23
+ replyToPeerId,
24
+ replyToTopId: replyTo.topMsgId,
25
+ quote: replyTo.quoteText !== void 0 ? true : void 0,
26
+ quoteText: replyTo.quoteText,
27
+ quoteEntities: replyTo.quoteEntities,
28
+ quoteOffset: replyTo.quoteOffset,
29
+ todoItemId: replyTo.todoItemId,
30
+ pollOption: replyTo.pollOption
31
+ },
32
+ replyTo.monoforumPeerId ? inputPeerToPeer(replyTo.monoforumPeerId) : void 0
33
+ ];
34
+ }
35
+ case "inputReplyToStory":
36
+ return [
37
+ {
38
+ _: "messageReplyStoryHeader",
39
+ peer: inputPeerToPeer(replyTo.peer),
40
+ storyId: replyTo.storyId
41
+ },
42
+ void 0
43
+ ];
44
+ case "inputReplyToMonoForum":
45
+ return [void 0, inputPeerToPeer(replyTo.monoforumPeerId)];
46
+ case "inputReplyToEphemeralMessage":
47
+ return [
48
+ {
49
+ _: "messageReplyHeader",
50
+ replyToEphemeral: true,
51
+ replyToMsgId: replyTo.id
52
+ },
53
+ void 0
54
+ ];
55
+ }
56
+ }
14
57
  async function sendText(client, chatId, text, params) {
15
58
  if (!params) params = {};
16
59
  const [message, entities] = await _normalizeInputText(client, text);
@@ -21,6 +64,7 @@ async function sendText(client, chatId, text, params) {
21
64
  params
22
65
  );
23
66
  const randomId = params.randomId ?? randomLong();
67
+ const sendAs = params.sendAs ? await resolvePeer(client, params.sendAs) : void 0;
24
68
  const res = await client.call(
25
69
  {
26
70
  _: "messages.sendMessage",
@@ -35,7 +79,7 @@ async function sendText(client, chatId, text, params) {
35
79
  entities,
36
80
  clearDraft: params.clearDraft,
37
81
  noforwards: params.forbidForwards,
38
- sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : void 0,
82
+ sendAs,
39
83
  invertMedia: params.invertMedia,
40
84
  quickReplyShortcut,
41
85
  effect: params.effect,
@@ -49,16 +93,25 @@ async function sendText(client, chatId, text, params) {
49
93
  }
50
94
  );
51
95
  if (res._ === "updateShortSentMessage") {
96
+ const [replyToHeader, savedPeerId] = _inputReplyToToHeader(replyTo, peer);
52
97
  const msg2 = {
53
98
  _: "message",
54
99
  id: res.id,
55
100
  peerId: inputPeerToPeer(peer),
56
- fromId: { _: "peerUser", userId: client.storage.self.getCached().userId },
101
+ fromId: sendAs ? inputPeerToPeer(sendAs) : { _: "peerUser", userId: client.storage.self.getCached().userId },
102
+ savedPeerId,
103
+ replyTo: replyToHeader,
57
104
  message,
58
105
  date: res.date,
59
106
  out: res.out,
107
+ silent: params.silent,
108
+ noforwards: params.forbidForwards,
109
+ invertMedia: params.invertMedia,
110
+ effect: params.effect,
60
111
  replyMarkup,
61
- entities: res.entities
112
+ media: res.media,
113
+ entities: res.entities,
114
+ ttlPeriod: res.ttlPeriod
62
115
  };
63
116
  if (!params.shouldDispatch) {
64
117
  client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount));
@@ -92,7 +145,20 @@ async function sendText(client, chatId, text, params) {
92
145
  );
93
146
  }
94
147
  };
95
- await Promise.all([fetchPeer(peer), fetchPeer(msg2.fromId)]);
148
+ const peersToFetch = [peer, msg2.fromId];
149
+ if (savedPeerId) peersToFetch.push(savedPeerId);
150
+ if (replyToHeader?._ === "messageReplyHeader" && replyToHeader.replyToPeerId) {
151
+ peersToFetch.push(replyToHeader.replyToPeerId);
152
+ } else if (replyToHeader?._ === "messageReplyStoryHeader") {
153
+ peersToFetch.push(replyToHeader.peer);
154
+ }
155
+ await Promise.all(peersToFetch.map(fetchPeer));
156
+ if (replyToHeader?._ === "messageReplyHeader" && replyToHeader.replyToTopId && replyToHeader.replyToTopId !== 1 && msg2.peerId._ === "peerChannel") {
157
+ const chat = peers.chats.get(msg2.peerId.channelId);
158
+ if (chat?._ === "channel" && chat.forum) {
159
+ replyToHeader.forumTopic = true;
160
+ }
161
+ }
96
162
  const ret = new Message$2(msg2, peers);
97
163
  return ret;
98
164
  }
@@ -107,7 +107,17 @@ async function resolvePeer(client, peerId, force = false) {
107
107
  };
108
108
  }
109
109
  } catch (e) {
110
- if (!innerTl.RpcError.is(e, "CHANNEL_INVALID")) throw e;
110
+ if (innerTl.RpcError.is(e, "COMMUNITY_ID_INVALID")) {
111
+ if (client.storage.self.getCached(true)?.isBot) {
112
+ return {
113
+ _: "inputPeerChannel",
114
+ channelId: bareId,
115
+ accessHash: Long.ZERO
116
+ };
117
+ }
118
+ } else if (!innerTl.RpcError.is(e, "CHANNEL_INVALID")) {
119
+ throw e;
120
+ }
111
121
  }
112
122
  break;
113
123
  }
@@ -100,7 +100,17 @@ async function resolvePeer(client, peerId, force = false) {
100
100
  };
101
101
  }
102
102
  } catch (e) {
103
- if (!RpcError.is(e, "CHANNEL_INVALID")) throw e;
103
+ if (RpcError.is(e, "COMMUNITY_ID_INVALID")) {
104
+ if (client.storage.self.getCached(true)?.isBot) {
105
+ return {
106
+ _: "inputPeerChannel",
107
+ channelId: bareId,
108
+ accessHash: Long.ZERO
109
+ };
110
+ }
111
+ } else if (!RpcError.is(e, "CHANNEL_INVALID")) {
112
+ throw e;
113
+ }
104
114
  }
105
115
  break;
106
116
  }
@@ -89,6 +89,18 @@ export { toggleJoinToSend } from './methods/chats/toggle-join-to-send.js';
89
89
  export { transferChatOwnership } from './methods/chats/transfer-chat-ownership.js';
90
90
  export { unarchiveChats } from './methods/chats/unarchive-chats.js';
91
91
  export { unbanChatMember } from './methods/chats/unban-chat-member.js';
92
+ export { banCommunityParticipant } from './methods/communities/ban-community-participant.js';
93
+ export { unbanCommunityParticipant } from './methods/communities/ban-community-participant.js';
94
+ export { createCommunity } from './methods/communities/create-community.js';
95
+ export { getCommunityLinkRequests } from './methods/communities/get-community-link-requests.js';
96
+ export { getCommunityParticipantChats } from './methods/communities/get-community-participant-chats.js';
97
+ export type { CommunityParticipantChats } from './methods/communities/get-community-participant-chats.js';
98
+ export { getJoinedCommunities } from './methods/communities/get-joined-communities.js';
99
+ export { hideCommunityLinkRequest } from './methods/communities/hide-community-link-request.js';
100
+ export { hideAllCommunityLinkRequests } from './methods/communities/hide-community-link-request.js';
101
+ export { linkCommunityPeer } from './methods/communities/link-community-peer.js';
102
+ export { unlinkCommunityPeer } from './methods/communities/link-community-peer.js';
103
+ export { toggleCommunityCollapsed } from './methods/communities/toggle-community-collapsed.js';
92
104
  export { addContact } from './methods/contacts/add-contact.js';
93
105
  export { deleteContacts } from './methods/contacts/delete-contacts.js';
94
106
  export { getContacts } from './methods/contacts/get-contacts.js';
@@ -105,6 +117,10 @@ export { getPeerDialogs } from './methods/dialogs/get-peer-dialogs.js';
105
117
  export { iterDialogs } from './methods/dialogs/iter-dialogs.js';
106
118
  export { joinChatlist } from './methods/dialogs/join-chatlist.js';
107
119
  export { setFoldersOrder } from './methods/dialogs/set-folders-order.js';
120
+ export { deleteEphemeralMessage } from './methods/ephemeral/delete-ephemeral-message.js';
121
+ export { editEphemeralMessage } from './methods/ephemeral/edit-ephemeral-message.js';
122
+ export { getEphemeralCallbackAnswer } from './methods/ephemeral/get-ephemeral-callback-answer.js';
123
+ export { sendEphemeralMessage } from './methods/ephemeral/send-ephemeral-message.js';
108
124
  export { downloadAsBuffer } from './methods/files/download-buffer.js';
109
125
  export { downloadChunk } from './methods/files/download-chunk.js';
110
126
  export { _normalizeFileDownloadLocation } from './methods/files/download-iterable.js';
@@ -89,6 +89,18 @@ export { toggleJoinToSend } from './methods/chats/toggle-join-to-send.js';
89
89
  export { transferChatOwnership } from './methods/chats/transfer-chat-ownership.js';
90
90
  export { unarchiveChats } from './methods/chats/unarchive-chats.js';
91
91
  export { unbanChatMember } from './methods/chats/unban-chat-member.js';
92
+ export { banCommunityParticipant } from './methods/communities/ban-community-participant.js';
93
+ export { unbanCommunityParticipant } from './methods/communities/ban-community-participant.js';
94
+ export { createCommunity } from './methods/communities/create-community.js';
95
+ export { getCommunityLinkRequests } from './methods/communities/get-community-link-requests.js';
96
+ export { getCommunityParticipantChats } from './methods/communities/get-community-participant-chats.js';
97
+ export type { CommunityParticipantChats } from './methods/communities/get-community-participant-chats.js';
98
+ export { getJoinedCommunities } from './methods/communities/get-joined-communities.js';
99
+ export { hideCommunityLinkRequest } from './methods/communities/hide-community-link-request.js';
100
+ export { hideAllCommunityLinkRequests } from './methods/communities/hide-community-link-request.js';
101
+ export { linkCommunityPeer } from './methods/communities/link-community-peer.js';
102
+ export { unlinkCommunityPeer } from './methods/communities/link-community-peer.js';
103
+ export { toggleCommunityCollapsed } from './methods/communities/toggle-community-collapsed.js';
92
104
  export { addContact } from './methods/contacts/add-contact.js';
93
105
  export { deleteContacts } from './methods/contacts/delete-contacts.js';
94
106
  export { getContacts } from './methods/contacts/get-contacts.js';
@@ -105,6 +117,10 @@ export { getPeerDialogs } from './methods/dialogs/get-peer-dialogs.js';
105
117
  export { iterDialogs } from './methods/dialogs/iter-dialogs.js';
106
118
  export { joinChatlist } from './methods/dialogs/join-chatlist.js';
107
119
  export { setFoldersOrder } from './methods/dialogs/set-folders-order.js';
120
+ export { deleteEphemeralMessage } from './methods/ephemeral/delete-ephemeral-message.js';
121
+ export { editEphemeralMessage } from './methods/ephemeral/edit-ephemeral-message.js';
122
+ export { getEphemeralCallbackAnswer } from './methods/ephemeral/get-ephemeral-callback-answer.js';
123
+ export { sendEphemeralMessage } from './methods/ephemeral/send-ephemeral-message.js';
108
124
  export { downloadAsBuffer } from './methods/files/download-buffer.js';
109
125
  export { downloadChunk } from './methods/files/download-chunk.js';
110
126
  export { _normalizeFileDownloadLocation } from './methods/files/download-iterable.js';
@@ -129,6 +129,23 @@ class PeersService extends base.BaseService {
129
129
  accessHash = peer.accessHash;
130
130
  break;
131
131
  }
132
+ case "community":
133
+ case "communityForbidden": {
134
+ if (!peer.accessHash) {
135
+ this._log.warn("received community without access hash: %j", peer);
136
+ return;
137
+ }
138
+ dto = {
139
+ id: peerUtils.toggleChannelIdMark(peer.id),
140
+ accessHash: longUtils.longToFastString(peer.accessHash),
141
+ isMin: peer._ === "community" ? peer.min : false,
142
+ usernames: [],
143
+ updated: Date.now(),
144
+ complete: this._serializeTl(peer)
145
+ };
146
+ accessHash = peer.accessHash;
147
+ break;
148
+ }
132
149
  default:
133
150
  return;
134
151
  }
@@ -163,6 +180,13 @@ class PeersService extends base.BaseService {
163
180
  verified: peer.verified,
164
181
  defaultBannedRights: peer.defaultBannedRights
165
182
  };
183
+ } else if (existing._ === "community" && peer._ === "community") {
184
+ newComplete = {
185
+ ...existing,
186
+ title: peer.title,
187
+ photo: peer.photo,
188
+ defaultBannedRights: peer.defaultBannedRights
189
+ };
166
190
  } else if (existing._ === "user" && peer._ === "user") {
167
191
  newComplete = {
168
192
  ...existing,
@@ -216,6 +240,7 @@ class PeersService extends base.BaseService {
216
240
  await this._refs.deleteByPeer(peer.id);
217
241
  }
218
242
  async _writePending() {
243
+ this._pendingWritesTimer = null;
219
244
  try {
220
245
  await utils.asyncPool(this._pendingWrites.values(), async (dto) => {
221
246
  await this._peers.store(dto);
@@ -122,6 +122,23 @@ class PeersService extends BaseService {
122
122
  accessHash = peer.accessHash;
123
123
  break;
124
124
  }
125
+ case "community":
126
+ case "communityForbidden": {
127
+ if (!peer.accessHash) {
128
+ this._log.warn("received community without access hash: %j", peer);
129
+ return;
130
+ }
131
+ dto = {
132
+ id: toggleChannelIdMark(peer.id),
133
+ accessHash: longToFastString(peer.accessHash),
134
+ isMin: peer._ === "community" ? peer.min : false,
135
+ usernames: [],
136
+ updated: Date.now(),
137
+ complete: this._serializeTl(peer)
138
+ };
139
+ accessHash = peer.accessHash;
140
+ break;
141
+ }
125
142
  default:
126
143
  return;
127
144
  }
@@ -156,6 +173,13 @@ class PeersService extends BaseService {
156
173
  verified: peer.verified,
157
174
  defaultBannedRights: peer.defaultBannedRights
158
175
  };
176
+ } else if (existing._ === "community" && peer._ === "community") {
177
+ newComplete = {
178
+ ...existing,
179
+ title: peer.title,
180
+ photo: peer.photo,
181
+ defaultBannedRights: peer.defaultBannedRights
182
+ };
159
183
  } else if (existing._ === "user" && peer._ === "user") {
160
184
  newComplete = {
161
185
  ...existing,
@@ -209,6 +233,7 @@ class PeersService extends BaseService {
209
233
  await this._refs.deleteByPeer(peer.id);
210
234
  }
211
235
  async _writePending() {
236
+ this._pendingWritesTimer = null;
212
237
  try {
213
238
  await asyncPool(this._pendingWrites.values(), async (dto) => {
214
239
  await this._peers.store(dto);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -145,6 +145,10 @@ class Conversation {
145
145
  state.pendingConversations.delete(this._chatId);
146
146
  }
147
147
  state.hasConversations = Boolean(state.pendingConversations.size);
148
+ const error = new errors.MtcuteError("Conversation stopped");
149
+ for (const it of this._queuedNewMessage) this._rejectPending(it, error);
150
+ for (const it of this._pendingEditMessage.values()) this._rejectPending(it, error);
151
+ for (const it of this._pendingRead.values()) this._rejectPending(it, error);
148
152
  this._queuedNewMessage.clear();
149
153
  this._pendingNewMessages.clear();
150
154
  this._pendingEditMessage.clear();
@@ -152,6 +156,10 @@ class Conversation {
152
156
  this._pendingRead.clear();
153
157
  this._started = false;
154
158
  }
159
+ _rejectPending(it, error) {
160
+ if (it.timeout) utils.timers.clearTimeout(it.timeout);
161
+ it.promise.reject(error);
162
+ }
155
163
  _recordMessage(msg, incoming = false) {
156
164
  this._lastMessage = msg.id;
157
165
  if (incoming) this._lastReceivedMessage = msg.id;
@@ -65,6 +65,7 @@ export declare class Conversation {
65
65
  * Stop the conversation
66
66
  */
67
67
  stop(): void;
68
+ private _rejectPending;
68
69
  private _recordMessage;
69
70
  /**
70
71
  * Send a text message to this conversation.
@@ -65,6 +65,7 @@ export declare class Conversation {
65
65
  * Stop the conversation
66
66
  */
67
67
  stop(): void;
68
+ private _rejectPending;
68
69
  private _recordMessage;
69
70
  /**
70
71
  * Send a text message to this conversation.
@@ -1,5 +1,5 @@
1
- import { Deque, AsyncLock, Deferred, timers, unknownToError } from "@fuman/utils";
2
- import { MtArgumentError, MtTimeoutError } from "../../types/errors.js";
1
+ import { Deque, AsyncLock, timers, Deferred, unknownToError } from "@fuman/utils";
2
+ import { MtArgumentError, MtcuteError, MtTimeoutError } from "../../types/errors.js";
3
3
  import { getMarkedPeerId } from "../../utils/peer-utils.js";
4
4
  import { getPeerDialogs } from "../methods/dialogs/get-peer-dialogs.js";
5
5
  import { readHistory } from "../methods/messages/read-history.js";
@@ -138,6 +138,10 @@ class Conversation {
138
138
  state.pendingConversations.delete(this._chatId);
139
139
  }
140
140
  state.hasConversations = Boolean(state.pendingConversations.size);
141
+ const error = new MtcuteError("Conversation stopped");
142
+ for (const it of this._queuedNewMessage) this._rejectPending(it, error);
143
+ for (const it of this._pendingEditMessage.values()) this._rejectPending(it, error);
144
+ for (const it of this._pendingRead.values()) this._rejectPending(it, error);
141
145
  this._queuedNewMessage.clear();
142
146
  this._pendingNewMessages.clear();
143
147
  this._pendingEditMessage.clear();
@@ -145,6 +149,10 @@ class Conversation {
145
149
  this._pendingRead.clear();
146
150
  this._started = false;
147
151
  }
152
+ _rejectPending(it, error) {
153
+ if (it.timeout) timers.clearTimeout(it.timeout);
154
+ it.promise.reject(error);
155
+ }
148
156
  _recordMessage(msg, incoming = false) {
149
157
  this._lastMessage = msg.id;
150
158
  if (incoming) this._lastReceivedMessage = msg.id;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,103 @@
1
+ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
2
+ globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
3
+ console.warn("[@mtcute/core] CommonJS bundles are deprecated. They will be removed completely in one of the upcoming releases. No support is provided for CommonJS users. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
4
+ console.warn("[@mtcute/core] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
5
+ }
6
+ "use strict";
7
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const memoize = require("../../utils/memoize.cjs");
9
+ const peer = require("../peers/peer.cjs");
10
+ const user = require("../peers/user.cjs");
11
+ const messageEntity = require("./message-entity.cjs");
12
+ const messageMedia = require("./message-media.cjs");
13
+ const inspectable = require("../../utils/inspectable.cjs");
14
+ class EphemeralMessage {
15
+ constructor(raw, _peers) {
16
+ this.raw = raw;
17
+ this._peers = _peers;
18
+ }
19
+ /** ID of this message (unique within the chat and receiver) */
20
+ get id() {
21
+ return this.raw.id;
22
+ }
23
+ /** Whether this message is outgoing */
24
+ get isOutgoing() {
25
+ return this.raw.out;
26
+ }
27
+ /** Sender of this message (usually the bot) */
28
+ get sender() {
29
+ return peer.parsePeer(this.raw.fromId, this._peers);
30
+ }
31
+ /** Chat where this message was sent */
32
+ get chat() {
33
+ return peer.parsePeer(this.raw.peerId, this._peers);
34
+ }
35
+ /** ID of the user this message is visible to */
36
+ get receiverId() {
37
+ return this.raw.receiverId;
38
+ }
39
+ /**
40
+ * User this message is visible to.
41
+ *
42
+ * Might not be available in some cases (e.g. in the message
43
+ * returned from {@link TelegramClient.sendEphemeralMessage},
44
+ * since the server does not send the receiver entity there) —
45
+ * use {@link receiverId} instead.
46
+ */
47
+ get receiver() {
48
+ const user$1 = this._peers.users.get(this.raw.receiverId);
49
+ if (!user$1 || user$1._ === "userEmpty") return null;
50
+ return new user.User(user$1);
51
+ }
52
+ /** ID of the topic this message was sent to, if any */
53
+ get topicId() {
54
+ return this.raw.topMsgId ?? null;
55
+ }
56
+ /** Date when this message was sent */
57
+ get date() {
58
+ return new Date(this.raw.date * 1e3);
59
+ }
60
+ /** Message text */
61
+ get text() {
62
+ return this.raw.message;
63
+ }
64
+ /** Message text/caption entities (may be empty) */
65
+ get entities() {
66
+ const entities = [];
67
+ if (this.raw.entities?.length) {
68
+ for (const ent of this.raw.entities) {
69
+ entities.push(new messageEntity.MessageEntity(ent, this.raw.message));
70
+ }
71
+ }
72
+ return entities;
73
+ }
74
+ get textWithEntities() {
75
+ return {
76
+ text: this.raw.message,
77
+ entities: this.raw.entities
78
+ };
79
+ }
80
+ /**
81
+ * Message media. `null` for text-only messages
82
+ * and for unsupported media types.
83
+ *
84
+ * For unsupported media types, use `.raw.media` directly.
85
+ */
86
+ get media() {
87
+ if (!this.raw.media || this.raw.media._ === "messageMediaEmpty") {
88
+ return null;
89
+ }
90
+ return messageMedia._messageMediaFromTl(this._peers, this.raw.media);
91
+ }
92
+ /** Reply markup attached to this message, if any */
93
+ get replyMarkup() {
94
+ return this.raw.replyMarkup ?? null;
95
+ }
96
+ /** Information about the message this message is a reply to, if any */
97
+ get replyTo() {
98
+ return this.raw.replyTo ?? null;
99
+ }
100
+ }
101
+ const EphemeralMessage$1 = /* @__PURE__ */ memoize.memoizeGetters(EphemeralMessage, ["sender", "chat", "receiver", "entities", "media"]);
102
+ const EphemeralMessage$2 = /* @__PURE__ */ inspectable.makeInspectable(EphemeralMessage$1);
103
+ exports.EphemeralMessage = EphemeralMessage$2;
@@ -0,0 +1,55 @@
1
+ import { tl } from '../../../tl/index.js';
2
+ import { TextWithEntities } from '../misc/index.js';
3
+ import { Peer } from '../peers/peer.js';
4
+ import { PeersIndex } from '../peers/peers-index.js';
5
+ import { MessageMedia } from './message-media.js';
6
+ import { User } from '../peers/user.js';
7
+ import { MessageEntity } from './message-entity.js';
8
+ /**
9
+ * An ephemeral message — a message sent by a bot that is only visible
10
+ * to a single user in a chat and is not persisted in the chat history.
11
+ */
12
+ export declare class EphemeralMessage {
13
+ readonly raw: tl.RawEphemeralMessage;
14
+ readonly _peers: PeersIndex;
15
+ constructor(raw: tl.RawEphemeralMessage, _peers: PeersIndex);
16
+ /** ID of this message (unique within the chat and receiver) */
17
+ get id(): number;
18
+ /** Whether this message is outgoing */
19
+ get isOutgoing(): boolean;
20
+ /** Sender of this message (usually the bot) */
21
+ get sender(): Peer;
22
+ /** Chat where this message was sent */
23
+ get chat(): Peer;
24
+ /** ID of the user this message is visible to */
25
+ get receiverId(): number;
26
+ /**
27
+ * User this message is visible to.
28
+ *
29
+ * Might not be available in some cases (e.g. in the message
30
+ * returned from {@link TelegramClient.sendEphemeralMessage},
31
+ * since the server does not send the receiver entity there) —
32
+ * use {@link receiverId} instead.
33
+ */
34
+ get receiver(): User | null;
35
+ /** ID of the topic this message was sent to, if any */
36
+ get topicId(): number | null;
37
+ /** Date when this message was sent */
38
+ get date(): Date;
39
+ /** Message text */
40
+ get text(): string;
41
+ /** Message text/caption entities (may be empty) */
42
+ get entities(): ReadonlyArray<MessageEntity>;
43
+ get textWithEntities(): TextWithEntities;
44
+ /**
45
+ * Message media. `null` for text-only messages
46
+ * and for unsupported media types.
47
+ *
48
+ * For unsupported media types, use `.raw.media` directly.
49
+ */
50
+ get media(): MessageMedia;
51
+ /** Reply markup attached to this message, if any */
52
+ get replyMarkup(): tl.TypeReplyMarkup | null;
53
+ /** Information about the message this message is a reply to, if any */
54
+ get replyTo(): tl.TypeMessageReplyHeader | null;
55
+ }
@@ -0,0 +1,55 @@
1
+ import { tl } from '../../../tl/index.js';
2
+ import { TextWithEntities } from '../misc/index.js';
3
+ import { Peer } from '../peers/peer.js';
4
+ import { PeersIndex } from '../peers/peers-index.js';
5
+ import { MessageMedia } from './message-media.js';
6
+ import { User } from '../peers/user.js';
7
+ import { MessageEntity } from './message-entity.js';
8
+ /**
9
+ * An ephemeral message — a message sent by a bot that is only visible
10
+ * to a single user in a chat and is not persisted in the chat history.
11
+ */
12
+ export declare class EphemeralMessage {
13
+ readonly raw: tl.RawEphemeralMessage;
14
+ readonly _peers: PeersIndex;
15
+ constructor(raw: tl.RawEphemeralMessage, _peers: PeersIndex);
16
+ /** ID of this message (unique within the chat and receiver) */
17
+ get id(): number;
18
+ /** Whether this message is outgoing */
19
+ get isOutgoing(): boolean;
20
+ /** Sender of this message (usually the bot) */
21
+ get sender(): Peer;
22
+ /** Chat where this message was sent */
23
+ get chat(): Peer;
24
+ /** ID of the user this message is visible to */
25
+ get receiverId(): number;
26
+ /**
27
+ * User this message is visible to.
28
+ *
29
+ * Might not be available in some cases (e.g. in the message
30
+ * returned from {@link TelegramClient.sendEphemeralMessage},
31
+ * since the server does not send the receiver entity there) —
32
+ * use {@link receiverId} instead.
33
+ */
34
+ get receiver(): User | null;
35
+ /** ID of the topic this message was sent to, if any */
36
+ get topicId(): number | null;
37
+ /** Date when this message was sent */
38
+ get date(): Date;
39
+ /** Message text */
40
+ get text(): string;
41
+ /** Message text/caption entities (may be empty) */
42
+ get entities(): ReadonlyArray<MessageEntity>;
43
+ get textWithEntities(): TextWithEntities;
44
+ /**
45
+ * Message media. `null` for text-only messages
46
+ * and for unsupported media types.
47
+ *
48
+ * For unsupported media types, use `.raw.media` directly.
49
+ */
50
+ get media(): MessageMedia;
51
+ /** Reply markup attached to this message, if any */
52
+ get replyMarkup(): tl.TypeReplyMarkup | null;
53
+ /** Information about the message this message is a reply to, if any */
54
+ get replyTo(): tl.TypeMessageReplyHeader | null;
55
+ }