@mtcute/core 0.31.0 → 0.32.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 (148) hide show
  1. package/client.cjs +12 -0
  2. package/client.js +12 -0
  3. package/highlevel/client.d.cts +74 -9
  4. package/highlevel/client.d.ts +74 -9
  5. package/highlevel/methods/chats/build-peers-index.cjs +45 -0
  6. package/highlevel/methods/chats/build-peers-index.d.cts +13 -0
  7. package/highlevel/methods/chats/build-peers-index.d.ts +13 -0
  8. package/highlevel/methods/chats/build-peers-index.js +40 -0
  9. package/highlevel/methods/ephemeral/delete-all-welcome-messages.cjs +17 -0
  10. package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.cts +8 -0
  11. package/highlevel/methods/ephemeral/delete-all-welcome-messages.d.ts +8 -0
  12. package/highlevel/methods/ephemeral/delete-all-welcome-messages.js +12 -0
  13. package/highlevel/methods/ephemeral/delete-ephemeral-message.cjs +1 -1
  14. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.cts +2 -2
  15. package/highlevel/methods/ephemeral/delete-ephemeral-message.d.ts +2 -2
  16. package/highlevel/methods/ephemeral/delete-ephemeral-message.js +1 -1
  17. package/highlevel/methods/ephemeral/delete-welcome-message.cjs +18 -0
  18. package/highlevel/methods/ephemeral/delete-welcome-message.d.cts +9 -0
  19. package/highlevel/methods/ephemeral/delete-welcome-message.d.ts +9 -0
  20. package/highlevel/methods/ephemeral/delete-welcome-message.js +13 -0
  21. package/highlevel/methods/ephemeral/edit-ephemeral-message.cjs +11 -3
  22. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.cts +16 -2
  23. package/highlevel/methods/ephemeral/edit-ephemeral-message.d.ts +16 -2
  24. package/highlevel/methods/ephemeral/edit-ephemeral-message.js +11 -3
  25. package/highlevel/methods/ephemeral/get-welcome-messages.cjs +29 -0
  26. package/highlevel/methods/ephemeral/get-welcome-messages.d.cts +8 -0
  27. package/highlevel/methods/ephemeral/get-welcome-messages.d.ts +8 -0
  28. package/highlevel/methods/ephemeral/get-welcome-messages.js +24 -0
  29. package/highlevel/methods/ephemeral/send-ephemeral-message.cjs +13 -3
  30. package/highlevel/methods/ephemeral/send-ephemeral-message.d.cts +20 -2
  31. package/highlevel/methods/ephemeral/send-ephemeral-message.d.ts +20 -2
  32. package/highlevel/methods/ephemeral/send-ephemeral-message.js +13 -3
  33. package/highlevel/methods/files/download-iterable.cjs +3 -0
  34. package/highlevel/methods/files/download-iterable.js +3 -0
  35. package/highlevel/methods/files/normalize-input-media.cjs +25 -4
  36. package/highlevel/methods/files/normalize-input-media.js +25 -4
  37. package/highlevel/methods/forums/edit-forum-topic.cjs +1 -1
  38. package/highlevel/methods/forums/edit-forum-topic.js +1 -1
  39. package/highlevel/methods/forums/toggle-forum-topic-closed.cjs +1 -1
  40. package/highlevel/methods/forums/toggle-forum-topic-closed.js +1 -1
  41. package/highlevel/methods/forums/toggle-general-topic-hidden.cjs +1 -1
  42. package/highlevel/methods/forums/toggle-general-topic-hidden.js +1 -1
  43. package/highlevel/methods/gifts/buy-resale-gift.cjs +5 -2
  44. package/highlevel/methods/gifts/buy-resale-gift.d.cts +11 -1
  45. package/highlevel/methods/gifts/buy-resale-gift.d.ts +11 -1
  46. package/highlevel/methods/gifts/buy-resale-gift.js +5 -2
  47. package/highlevel/methods/messages/forward-messages.cjs +1 -0
  48. package/highlevel/methods/messages/forward-messages.d.cts +2 -0
  49. package/highlevel/methods/messages/forward-messages.d.ts +2 -0
  50. package/highlevel/methods/messages/forward-messages.js +1 -0
  51. package/highlevel/methods/messages/normalize-rich-message.cjs +3 -0
  52. package/highlevel/methods/messages/normalize-rich-message.js +3 -0
  53. package/highlevel/methods/messages/send-text.cjs +2 -33
  54. package/highlevel/methods/messages/send-text.js +2 -33
  55. package/highlevel/methods/messages/send-typing.d.cts +3 -3
  56. package/highlevel/methods/messages/send-typing.d.ts +3 -3
  57. package/highlevel/methods/messages/set-typing.cjs +1 -1
  58. package/highlevel/methods/messages/set-typing.d.cts +2 -2
  59. package/highlevel/methods/messages/set-typing.d.ts +2 -2
  60. package/highlevel/methods/messages/set-typing.js +1 -1
  61. package/highlevel/methods.d.cts +3 -0
  62. package/highlevel/methods.d.ts +3 -0
  63. package/highlevel/types/bots/keyboards/builder.cjs +5 -5
  64. package/highlevel/types/bots/keyboards/builder.d.cts +8 -9
  65. package/highlevel/types/bots/keyboards/builder.d.ts +8 -9
  66. package/highlevel/types/bots/keyboards/builder.js +5 -5
  67. package/highlevel/types/bots/keyboards/factories.cjs +51 -103
  68. package/highlevel/types/bots/keyboards/factories.d.cts +58 -89
  69. package/highlevel/types/bots/keyboards/factories.d.ts +58 -89
  70. package/highlevel/types/bots/keyboards/factories.js +51 -103
  71. package/highlevel/types/bots/keyboards/index.d.cts +3 -3
  72. package/highlevel/types/bots/keyboards/index.d.ts +3 -3
  73. package/highlevel/types/bots/keyboards/normalize.cjs +131 -0
  74. package/highlevel/types/bots/keyboards/normalize.d.cts +10 -0
  75. package/highlevel/types/bots/keyboards/normalize.d.ts +10 -0
  76. package/highlevel/types/bots/keyboards/normalize.js +126 -0
  77. package/highlevel/types/bots/keyboards/types.d.cts +160 -4
  78. package/highlevel/types/bots/keyboards/types.d.ts +160 -4
  79. package/highlevel/types/messages/dialog.cjs +8 -1
  80. package/highlevel/types/messages/dialog.d.cts +3 -0
  81. package/highlevel/types/messages/dialog.d.ts +3 -0
  82. package/highlevel/types/messages/dialog.js +8 -1
  83. package/highlevel/types/messages/dialog.test.d.cts +1 -0
  84. package/highlevel/types/messages/dialog.test.d.ts +1 -0
  85. package/highlevel/types/messages/ephemeral-message.cjs +35 -3
  86. package/highlevel/types/messages/ephemeral-message.d.cts +22 -2
  87. package/highlevel/types/messages/ephemeral-message.d.ts +22 -2
  88. package/highlevel/types/messages/ephemeral-message.js +35 -3
  89. package/highlevel/types/messages/message-action.cjs +8 -1
  90. package/highlevel/types/messages/message-action.d.cts +11 -1
  91. package/highlevel/types/messages/message-action.d.ts +11 -1
  92. package/highlevel/types/messages/message-action.js +8 -1
  93. package/highlevel/types/messages/message.cjs +7 -2
  94. package/highlevel/types/messages/message.d.cts +2 -2
  95. package/highlevel/types/messages/message.d.ts +2 -2
  96. package/highlevel/types/messages/message.js +8 -3
  97. package/highlevel/types/messages/rich/inner.cjs +37 -0
  98. package/highlevel/types/messages/rich/inner.d.cts +19 -0
  99. package/highlevel/types/messages/rich/inner.d.ts +19 -0
  100. package/highlevel/types/messages/rich/inner.js +37 -0
  101. package/highlevel/types/peers/full-chat.cjs +4 -0
  102. package/highlevel/types/peers/full-chat.d.cts +2 -0
  103. package/highlevel/types/peers/full-chat.d.ts +2 -0
  104. package/highlevel/types/peers/full-chat.js +4 -0
  105. package/highlevel/types/peers/typing-status.d.cts +4 -1
  106. package/highlevel/types/peers/typing-status.d.ts +4 -1
  107. package/highlevel/types/updates/ephemeral-callback-query.cjs +10 -2
  108. package/highlevel/types/updates/ephemeral-callback-query.d.cts +8 -2
  109. package/highlevel/types/updates/ephemeral-callback-query.d.ts +8 -2
  110. package/highlevel/types/updates/ephemeral-callback-query.js +10 -2
  111. package/highlevel/types/updates/user-typing-update.cjs +18 -0
  112. package/highlevel/types/updates/user-typing-update.d.cts +9 -0
  113. package/highlevel/types/updates/user-typing-update.d.ts +9 -0
  114. package/highlevel/types/updates/user-typing-update.js +18 -0
  115. package/highlevel/updates/manager.cjs +40 -28
  116. package/highlevel/updates/manager.js +40 -28
  117. package/highlevel/utils/walk-page-blocks.cjs +5 -0
  118. package/highlevel/utils/walk-page-blocks.js +5 -0
  119. package/methods.cjs +6 -0
  120. package/methods.js +6 -0
  121. package/network/mtproto-session.cjs +9 -2
  122. package/network/mtproto-session.d.cts +3 -1
  123. package/network/mtproto-session.d.ts +3 -1
  124. package/network/mtproto-session.js +9 -2
  125. package/network/network-manager.cjs +1 -1
  126. package/network/network-manager.js +1 -1
  127. package/network/session-connection.cjs +12 -6
  128. package/network/session-connection.js +12 -6
  129. package/network/session-connection.test.d.cts +1 -0
  130. package/network/session-connection.test.d.ts +1 -0
  131. package/package.json +3 -3
  132. package/tl/api-schema.json +1 -1
  133. package/tl/binary/reader.cjs +136 -93
  134. package/tl/binary/reader.js +136 -93
  135. package/tl/binary/writer.cjs +318 -207
  136. package/tl/binary/writer.js +318 -207
  137. package/tl/compat/reader.cjs +82 -0
  138. package/tl/compat/reader.js +82 -0
  139. package/tl/index.d.cts +377 -718
  140. package/tl/index.d.ts +377 -718
  141. package/tl/inner-tl.cjs +23 -7
  142. package/tl/inner-tl.js +23 -7
  143. package/tl/rpc-error.test.d.cts +1 -0
  144. package/tl/rpc-error.test.d.ts +1 -0
  145. package/utils/binary/compat.cjs +175 -29
  146. package/utils/binary/compat.js +175 -29
  147. package/utils/links/bots.cjs +9 -4
  148. package/utils/links/bots.js +9 -4
@@ -17,9 +17,17 @@ class EphemeralCallbackQuery {
17
17
  get user() {
18
18
  return new User$2(this._peers.user(this.raw.userId));
19
19
  }
20
- /** Chat where the originating ephemeral message was sent */
20
+ /**
21
+ * Chat where the originating ephemeral message was sent.
22
+ *
23
+ * `null` if not available (see {@link chatInstance})
24
+ */
21
25
  get chat() {
22
- return parsePeer(this.raw.peer, this._peers);
26
+ return this.raw.peer ? parsePeer(this.raw.peer, this._peers) : null;
27
+ }
28
+ /** Identifier uniquely corresponding to the chat the message was sent to, if any */
29
+ get chatInstance() {
30
+ return this.raw.chatInstance ?? null;
23
31
  }
24
32
  /** Identifier of the ephemeral message containing the button which was clicked */
25
33
  get messageId() {
@@ -102,10 +102,28 @@ class UserTypingUpdate {
102
102
  return "interaction";
103
103
  case "sendMessageEmojiInteractionSeen":
104
104
  return "interaction_seen";
105
+ case "sendMessageStopDraftAction":
106
+ return "stop_draft";
105
107
  default:
106
108
  utils.assertNever(this.raw.action);
107
109
  }
108
110
  }
111
+ /**
112
+ * ID of the draft this update is related to, if any
113
+ * (i.e. the status is `typing` for a draft action, or `stop_draft`)
114
+ */
115
+ get draftId() {
116
+ const action = this.raw.action;
117
+ return "randomId" in action ? action.randomId : null;
118
+ }
119
+ /** Whether the ongoing draft streaming may be stopped by the user */
120
+ get canStopDraft() {
121
+ return "canStop" in this.raw.action ? this.raw.action.canStop : false;
122
+ }
123
+ /** Whether the draft should be kept once the user stops the streaming */
124
+ get keepDraftOnStop() {
125
+ return "keepOnStop" in this.raw.action ? this.raw.action.keepOnStop : false;
126
+ }
109
127
  }
110
128
  const UserTypingUpdate$1 = /* @__PURE__ */ inspectable.makeInspectable(UserTypingUpdate);
111
129
  exports.UserTypingUpdate = UserTypingUpdate$1;
@@ -30,4 +30,13 @@ export declare class UserTypingUpdate {
30
30
  * Current typing status
31
31
  */
32
32
  get status(): TypingStatus;
33
+ /**
34
+ * ID of the draft this update is related to, if any
35
+ * (i.e. the status is `typing` for a draft action, or `stop_draft`)
36
+ */
37
+ get draftId(): tl.Long | null;
38
+ /** Whether the ongoing draft streaming may be stopped by the user */
39
+ get canStopDraft(): boolean;
40
+ /** Whether the draft should be kept once the user stops the streaming */
41
+ get keepDraftOnStop(): boolean;
33
42
  }
@@ -30,4 +30,13 @@ export declare class UserTypingUpdate {
30
30
  * Current typing status
31
31
  */
32
32
  get status(): TypingStatus;
33
+ /**
34
+ * ID of the draft this update is related to, if any
35
+ * (i.e. the status is `typing` for a draft action, or `stop_draft`)
36
+ */
37
+ get draftId(): tl.Long | null;
38
+ /** Whether the ongoing draft streaming may be stopped by the user */
39
+ get canStopDraft(): boolean;
40
+ /** Whether the draft should be kept once the user stops the streaming */
41
+ get keepDraftOnStop(): boolean;
33
42
  }
@@ -95,10 +95,28 @@ class UserTypingUpdate {
95
95
  return "interaction";
96
96
  case "sendMessageEmojiInteractionSeen":
97
97
  return "interaction_seen";
98
+ case "sendMessageStopDraftAction":
99
+ return "stop_draft";
98
100
  default:
99
101
  assertNever(this.raw.action);
100
102
  }
101
103
  }
104
+ /**
105
+ * ID of the draft this update is related to, if any
106
+ * (i.e. the status is `typing` for a draft action, or `stop_draft`)
107
+ */
108
+ get draftId() {
109
+ const action = this.raw.action;
110
+ return "randomId" in action ? action.randomId : null;
111
+ }
112
+ /** Whether the ongoing draft streaming may be stopped by the user */
113
+ get canStopDraft() {
114
+ return "canStop" in this.raw.action ? this.raw.action.canStop : false;
115
+ }
116
+ /** Whether the draft should be kept once the user stops the streaming */
117
+ get keepDraftOnStop() {
118
+ return "keepOnStop" in this.raw.action ? this.raw.action.keepOnStop : false;
119
+ }
102
120
  }
103
121
  const UserTypingUpdate$1 = /* @__PURE__ */ makeInspectable(UserTypingUpdate);
104
122
  export {
@@ -480,6 +480,24 @@ class UpdatesManager {
480
480
  index.set(bare, cached);
481
481
  return true;
482
482
  }
483
+ async function fetchEntitiesPeers(entities) {
484
+ if (!entities) return true;
485
+ for (const ent of entities) {
486
+ if (ent._ === "messageEntityMentionName" && !await fetchPeer(ent.userId)) {
487
+ return false;
488
+ }
489
+ }
490
+ return true;
491
+ }
492
+ async function fetchRichMessagePeers(richMessage) {
493
+ if (!richMessage) return true;
494
+ const richMessagePeers = /* @__PURE__ */ new Set();
495
+ collectRichMessagePeerIds(richMessage, richMessagePeers);
496
+ for (const peer of richMessagePeers) {
497
+ if (!await fetchPeer(peer)) return false;
498
+ }
499
+ return true;
500
+ }
483
501
  switch (upd._) {
484
502
  case "updateNewMessage":
485
503
  case "updateNewChannelMessage":
@@ -503,20 +521,8 @@ class UpdatesManager {
503
521
  }
504
522
  if (!await fetchPeer(msg.viaBotId)) return missing;
505
523
  if (!await fetchPeer(msg.guestchatViaFrom)) return missing;
506
- if (msg.entities) {
507
- for (const ent of msg.entities) {
508
- if (ent._ === "messageEntityMentionName") {
509
- if (!await fetchPeer(ent.userId)) return missing;
510
- }
511
- }
512
- }
513
- if (msg.richMessage) {
514
- const richMessagePeers = /* @__PURE__ */ new Set();
515
- collectRichMessagePeerIds(msg.richMessage, richMessagePeers);
516
- for (const peer of richMessagePeers) {
517
- if (!await fetchPeer(peer)) return missing;
518
- }
519
- }
524
+ if (!await fetchEntitiesPeers(msg.entities)) return missing;
525
+ if (!await fetchRichMessagePeers(msg.richMessage)) return missing;
520
526
  if (msg.media) {
521
527
  switch (msg.media._) {
522
528
  case "messageMediaContact":
@@ -554,6 +560,22 @@ class UpdatesManager {
554
560
  if (!await fetchPeer(msg.action.fromId)) return missing;
555
561
  if (!await fetchPeer(msg.action.toId)) return missing;
556
562
  break;
563
+ case "messageActionChatJoinedViaCommunity":
564
+ if (!await fetchPeer(peerUtils.toggleChannelIdMark(msg.action.communityId), true)) {
565
+ return missing;
566
+ }
567
+ break;
568
+ case "messageActionChangeCommunity":
569
+ if (msg.action.communityId !== void 0 && !await fetchPeer(peerUtils.toggleChannelIdMark(msg.action.communityId), true)) {
570
+ return missing;
571
+ }
572
+ break;
573
+ case "messageActionGiftPremium":
574
+ case "messageActionGiftCode":
575
+ case "messageActionStarGift":
576
+ case "messageActionStarGiftUnique":
577
+ if (!await fetchEntitiesPeers(msg.action.message?.entities)) return missing;
578
+ break;
557
579
  }
558
580
  }
559
581
  break;
@@ -564,6 +586,8 @@ class UpdatesManager {
564
586
  if (!await fetchPeer(msg.peerId, true)) return missing;
565
587
  if (!await fetchPeer(msg.fromId)) return missing;
566
588
  if (!await fetchPeer(msg.receiverId)) return missing;
589
+ if (!await fetchEntitiesPeers(msg.entities)) return missing;
590
+ if (!await fetchRichMessagePeers(msg.richMessage)) return missing;
567
591
  break;
568
592
  }
569
593
  case "updateEphemeralBotCallbackQuery":
@@ -571,20 +595,8 @@ class UpdatesManager {
571
595
  if (!await fetchPeer(upd.userId)) return missing;
572
596
  break;
573
597
  case "updateDraftMessage":
574
- if ("entities" in upd.draft && upd.draft.entities) {
575
- for (const ent of upd.draft.entities) {
576
- if (ent._ === "messageEntityMentionName") {
577
- if (!await fetchPeer(ent.userId)) return missing;
578
- }
579
- }
580
- }
581
- if ("richMessage" in upd.draft && upd.draft.richMessage) {
582
- const richMessagePeers = /* @__PURE__ */ new Set();
583
- collectRichMessagePeerIds(upd.draft.richMessage, richMessagePeers);
584
- for (const peer of richMessagePeers) {
585
- if (!await fetchPeer(peer)) return missing;
586
- }
587
- }
598
+ if ("entities" in upd.draft && !await fetchEntitiesPeers(upd.draft.entities)) return missing;
599
+ if ("richMessage" in upd.draft && !await fetchRichMessagePeers(upd.draft.richMessage)) return missing;
588
600
  }
589
601
  return missing;
590
602
  }
@@ -473,6 +473,24 @@ class UpdatesManager {
473
473
  index.set(bare, cached);
474
474
  return true;
475
475
  }
476
+ async function fetchEntitiesPeers(entities) {
477
+ if (!entities) return true;
478
+ for (const ent of entities) {
479
+ if (ent._ === "messageEntityMentionName" && !await fetchPeer(ent.userId)) {
480
+ return false;
481
+ }
482
+ }
483
+ return true;
484
+ }
485
+ async function fetchRichMessagePeers(richMessage) {
486
+ if (!richMessage) return true;
487
+ const richMessagePeers = /* @__PURE__ */ new Set();
488
+ collectRichMessagePeerIds(richMessage, richMessagePeers);
489
+ for (const peer of richMessagePeers) {
490
+ if (!await fetchPeer(peer)) return false;
491
+ }
492
+ return true;
493
+ }
476
494
  switch (upd._) {
477
495
  case "updateNewMessage":
478
496
  case "updateNewChannelMessage":
@@ -496,20 +514,8 @@ class UpdatesManager {
496
514
  }
497
515
  if (!await fetchPeer(msg.viaBotId)) return missing;
498
516
  if (!await fetchPeer(msg.guestchatViaFrom)) return missing;
499
- if (msg.entities) {
500
- for (const ent of msg.entities) {
501
- if (ent._ === "messageEntityMentionName") {
502
- if (!await fetchPeer(ent.userId)) return missing;
503
- }
504
- }
505
- }
506
- if (msg.richMessage) {
507
- const richMessagePeers = /* @__PURE__ */ new Set();
508
- collectRichMessagePeerIds(msg.richMessage, richMessagePeers);
509
- for (const peer of richMessagePeers) {
510
- if (!await fetchPeer(peer)) return missing;
511
- }
512
- }
517
+ if (!await fetchEntitiesPeers(msg.entities)) return missing;
518
+ if (!await fetchRichMessagePeers(msg.richMessage)) return missing;
513
519
  if (msg.media) {
514
520
  switch (msg.media._) {
515
521
  case "messageMediaContact":
@@ -547,6 +553,22 @@ class UpdatesManager {
547
553
  if (!await fetchPeer(msg.action.fromId)) return missing;
548
554
  if (!await fetchPeer(msg.action.toId)) return missing;
549
555
  break;
556
+ case "messageActionChatJoinedViaCommunity":
557
+ if (!await fetchPeer(toggleChannelIdMark(msg.action.communityId), true)) {
558
+ return missing;
559
+ }
560
+ break;
561
+ case "messageActionChangeCommunity":
562
+ if (msg.action.communityId !== void 0 && !await fetchPeer(toggleChannelIdMark(msg.action.communityId), true)) {
563
+ return missing;
564
+ }
565
+ break;
566
+ case "messageActionGiftPremium":
567
+ case "messageActionGiftCode":
568
+ case "messageActionStarGift":
569
+ case "messageActionStarGiftUnique":
570
+ if (!await fetchEntitiesPeers(msg.action.message?.entities)) return missing;
571
+ break;
550
572
  }
551
573
  }
552
574
  break;
@@ -557,6 +579,8 @@ class UpdatesManager {
557
579
  if (!await fetchPeer(msg.peerId, true)) return missing;
558
580
  if (!await fetchPeer(msg.fromId)) return missing;
559
581
  if (!await fetchPeer(msg.receiverId)) return missing;
582
+ if (!await fetchEntitiesPeers(msg.entities)) return missing;
583
+ if (!await fetchRichMessagePeers(msg.richMessage)) return missing;
560
584
  break;
561
585
  }
562
586
  case "updateEphemeralBotCallbackQuery":
@@ -564,20 +588,8 @@ class UpdatesManager {
564
588
  if (!await fetchPeer(upd.userId)) return missing;
565
589
  break;
566
590
  case "updateDraftMessage":
567
- if ("entities" in upd.draft && upd.draft.entities) {
568
- for (const ent of upd.draft.entities) {
569
- if (ent._ === "messageEntityMentionName") {
570
- if (!await fetchPeer(ent.userId)) return missing;
571
- }
572
- }
573
- }
574
- if ("richMessage" in upd.draft && upd.draft.richMessage) {
575
- const richMessagePeers = /* @__PURE__ */ new Set();
576
- collectRichMessagePeerIds(upd.draft.richMessage, richMessagePeers);
577
- for (const peer of richMessagePeers) {
578
- if (!await fetchPeer(peer)) return missing;
579
- }
580
- }
591
+ if ("entities" in upd.draft && !await fetchEntitiesPeers(upd.draft.entities)) return missing;
592
+ if ("richMessage" in upd.draft && !await fetchRichMessagePeers(upd.draft.richMessage)) return missing;
581
593
  }
582
594
  return missing;
583
595
  }
@@ -39,6 +39,7 @@ function walkRichText(text, visitor) {
39
39
  case "textBankCard":
40
40
  case "textDate":
41
41
  case "textMentionName":
42
+ case "textButton":
42
43
  walkRichText(text.text, visitor);
43
44
  break;
44
45
  case "textConcat":
@@ -125,6 +126,7 @@ function walkPageBlock(block, visitor) {
125
126
  case "pageBlockAudio":
126
127
  case "pageBlockMap":
127
128
  case "inputPageBlockMap":
129
+ case "pageBlockDocument":
128
130
  walkPageCaption(block.caption, visitor);
129
131
  break;
130
132
  case "pageBlockCover":
@@ -141,6 +143,9 @@ function walkPageBlock(block, visitor) {
141
143
  break;
142
144
  case "pageBlockChannel":
143
145
  break;
146
+ case "pageBlockButtonRow":
147
+ for (const button of block.buttons) walkRichText(button.text, visitor);
148
+ break;
144
149
  case "pageBlockTable":
145
150
  walkRichText(block.title, visitor);
146
151
  for (const row of block.rows) {
@@ -32,6 +32,7 @@ function walkRichText(text, visitor) {
32
32
  case "textBankCard":
33
33
  case "textDate":
34
34
  case "textMentionName":
35
+ case "textButton":
35
36
  walkRichText(text.text, visitor);
36
37
  break;
37
38
  case "textConcat":
@@ -118,6 +119,7 @@ function walkPageBlock(block, visitor) {
118
119
  case "pageBlockAudio":
119
120
  case "pageBlockMap":
120
121
  case "inputPageBlockMap":
122
+ case "pageBlockDocument":
121
123
  walkPageCaption(block.caption, visitor);
122
124
  break;
123
125
  case "pageBlockCover":
@@ -134,6 +136,9 @@ function walkPageBlock(block, visitor) {
134
136
  break;
135
137
  case "pageBlockChannel":
136
138
  break;
139
+ case "pageBlockButtonRow":
140
+ for (const button of block.buttons) walkRichText(button.text, visitor);
141
+ break;
137
142
  case "pageBlockTable":
138
143
  walkRichText(block.title, visitor);
139
144
  for (const row of block.rows) {
package/methods.cjs CHANGED
@@ -112,9 +112,12 @@ const getPeerDialogs = require("./highlevel/methods/dialogs/get-peer-dialogs.cjs
112
112
  const iterDialogs = require("./highlevel/methods/dialogs/iter-dialogs.cjs");
113
113
  const joinChatlist = require("./highlevel/methods/dialogs/join-chatlist.cjs");
114
114
  const setFoldersOrder = require("./highlevel/methods/dialogs/set-folders-order.cjs");
115
+ const deleteAllWelcomeMessages = require("./highlevel/methods/ephemeral/delete-all-welcome-messages.cjs");
115
116
  const deleteEphemeralMessage = require("./highlevel/methods/ephemeral/delete-ephemeral-message.cjs");
117
+ const deleteWelcomeMessage = require("./highlevel/methods/ephemeral/delete-welcome-message.cjs");
116
118
  const editEphemeralMessage = require("./highlevel/methods/ephemeral/edit-ephemeral-message.cjs");
117
119
  const getEphemeralCallbackAnswer = require("./highlevel/methods/ephemeral/get-ephemeral-callback-answer.cjs");
120
+ const getWelcomeMessages = require("./highlevel/methods/ephemeral/get-welcome-messages.cjs");
118
121
  const sendEphemeralMessage = require("./highlevel/methods/ephemeral/send-ephemeral-message.cjs");
119
122
  const downloadBuffer = require("./highlevel/methods/files/download-buffer.cjs");
120
123
  const downloadChunk = require("./highlevel/methods/files/download-chunk.cjs");
@@ -415,9 +418,12 @@ exports.getPeerDialogs = getPeerDialogs.getPeerDialogs;
415
418
  exports.iterDialogs = iterDialogs.iterDialogs;
416
419
  exports.joinChatlist = joinChatlist.joinChatlist;
417
420
  exports.setFoldersOrder = setFoldersOrder.setFoldersOrder;
421
+ exports.deleteAllWelcomeMessages = deleteAllWelcomeMessages.deleteAllWelcomeMessages;
418
422
  exports.deleteEphemeralMessage = deleteEphemeralMessage.deleteEphemeralMessage;
423
+ exports.deleteWelcomeMessage = deleteWelcomeMessage.deleteWelcomeMessage;
419
424
  exports.editEphemeralMessage = editEphemeralMessage.editEphemeralMessage;
420
425
  exports.getEphemeralCallbackAnswer = getEphemeralCallbackAnswer.getEphemeralCallbackAnswer;
426
+ exports.getWelcomeMessages = getWelcomeMessages.getWelcomeMessages;
421
427
  exports.sendEphemeralMessage = sendEphemeralMessage.sendEphemeralMessage;
422
428
  exports.downloadAsBuffer = downloadBuffer.downloadAsBuffer;
423
429
  exports.downloadChunk = downloadChunk.downloadChunk;
package/methods.js CHANGED
@@ -105,9 +105,12 @@ import { getPeerDialogs } from "./highlevel/methods/dialogs/get-peer-dialogs.js"
105
105
  import { iterDialogs } from "./highlevel/methods/dialogs/iter-dialogs.js";
106
106
  import { joinChatlist } from "./highlevel/methods/dialogs/join-chatlist.js";
107
107
  import { setFoldersOrder } from "./highlevel/methods/dialogs/set-folders-order.js";
108
+ import { deleteAllWelcomeMessages } from "./highlevel/methods/ephemeral/delete-all-welcome-messages.js";
108
109
  import { deleteEphemeralMessage } from "./highlevel/methods/ephemeral/delete-ephemeral-message.js";
110
+ import { deleteWelcomeMessage } from "./highlevel/methods/ephemeral/delete-welcome-message.js";
109
111
  import { editEphemeralMessage } from "./highlevel/methods/ephemeral/edit-ephemeral-message.js";
110
112
  import { getEphemeralCallbackAnswer } from "./highlevel/methods/ephemeral/get-ephemeral-callback-answer.js";
113
+ import { getWelcomeMessages } from "./highlevel/methods/ephemeral/get-welcome-messages.js";
111
114
  import { sendEphemeralMessage } from "./highlevel/methods/ephemeral/send-ephemeral-message.js";
112
115
  import { downloadAsBuffer } from "./highlevel/methods/files/download-buffer.js";
113
116
  import { downloadChunk } from "./highlevel/methods/files/download-chunk.js";
@@ -340,6 +343,7 @@ export {
340
343
  createStickerSet,
341
344
  createStreamingDraft,
342
345
  createSupergroup,
346
+ deleteAllWelcomeMessages,
343
347
  deleteBusinessChatLink,
344
348
  deleteChannel,
345
349
  deleteChatPhoto,
@@ -357,6 +361,7 @@ export {
357
361
  deleteStickerFromSet,
358
362
  deleteStories,
359
363
  deleteUserHistory,
364
+ deleteWelcomeMessage,
360
365
  downloadAsBuffer,
361
366
  downloadAsIterable,
362
367
  downloadAsStream,
@@ -466,6 +471,7 @@ export {
466
471
  getUser,
467
472
  getUsers,
468
473
  getWebPagePreview,
474
+ getWelcomeMessages,
469
475
  hideAllCommunityLinkRequests,
470
476
  hideAllJoinRequests,
471
477
  hideCommunityLinkRequest,
@@ -201,13 +201,20 @@ class MtprotoSession {
201
201
  else writer.object(content);
202
202
  return messageId;
203
203
  }
204
- resetLastPing(withTime = false) {
204
+ resetLastPing(withTime = false, keepPending = false) {
205
205
  if (withTime) this.lastPingTime = 0;
206
- if (!this.lastPingMsgId.isZero()) {
206
+ if (!keepPending && !this.lastPingMsgId.isZero()) {
207
207
  this.pendingMessages.delete(this.lastPingMsgId);
208
208
  }
209
209
  this.lastPingMsgId = Long.ZERO;
210
210
  }
211
+ forgetPendingPings() {
212
+ for (const [msgId, info] of this.pendingMessages) {
213
+ if (info._ === "ping") this.pendingMessages.delete(msgId);
214
+ }
215
+ this.lastPingTime = 0;
216
+ this.lastPingMsgId = Long.ZERO;
217
+ }
211
218
  addToChain(chainId, msgId) {
212
219
  const prevMsgId = this.chains.get(chainId);
213
220
  this.chains.set(chainId, msgId);
@@ -43,6 +43,7 @@ export type PendingMessage = {
43
43
  } | {
44
44
  _: 'ping';
45
45
  pingId: Long;
46
+ sentAt: number;
46
47
  containerId: Long;
47
48
  } | {
48
49
  _: 'destroy_session';
@@ -120,7 +121,8 @@ export declare class MtprotoSession {
120
121
  /** Decrypt a single MTProto message using session's keys */
121
122
  decryptMessage(data: Uint8Array, callback: Parameters<AuthKey['decryptMessage']>[2]): void;
122
123
  writeMessage(writer: TlBinaryWriter, content: tl.TlObject | mtp.TlObject | Uint8Array, isContentRelated?: boolean): Long;
123
- resetLastPing(withTime?: boolean): void;
124
+ resetLastPing(withTime?: boolean, keepPending?: boolean): void;
125
+ forgetPendingPings(): void;
124
126
  addToChain(chainId: string | number, msgId: Long): Long | undefined;
125
127
  removeFromChain(chainId: string | number, msgId: Long): void;
126
128
  getPendingChainedFails(chainId: string | number): SortedArray<PendingRpc>;
@@ -43,6 +43,7 @@ export type PendingMessage = {
43
43
  } | {
44
44
  _: 'ping';
45
45
  pingId: Long;
46
+ sentAt: number;
46
47
  containerId: Long;
47
48
  } | {
48
49
  _: 'destroy_session';
@@ -120,7 +121,8 @@ export declare class MtprotoSession {
120
121
  /** Decrypt a single MTProto message using session's keys */
121
122
  decryptMessage(data: Uint8Array, callback: Parameters<AuthKey['decryptMessage']>[2]): void;
122
123
  writeMessage(writer: TlBinaryWriter, content: tl.TlObject | mtp.TlObject | Uint8Array, isContentRelated?: boolean): Long;
123
- resetLastPing(withTime?: boolean): void;
124
+ resetLastPing(withTime?: boolean, keepPending?: boolean): void;
125
+ forgetPendingPings(): void;
124
126
  addToChain(chainId: string | number, msgId: Long): Long | undefined;
125
127
  removeFromChain(chainId: string | number, msgId: Long): void;
126
128
  getPendingChainedFails(chainId: string | number): SortedArray<PendingRpc>;
@@ -194,13 +194,20 @@ class MtprotoSession {
194
194
  else writer.object(content);
195
195
  return messageId;
196
196
  }
197
- resetLastPing(withTime = false) {
197
+ resetLastPing(withTime = false, keepPending = false) {
198
198
  if (withTime) this.lastPingTime = 0;
199
- if (!this.lastPingMsgId.isZero()) {
199
+ if (!keepPending && !this.lastPingMsgId.isZero()) {
200
200
  this.pendingMessages.delete(this.lastPingMsgId);
201
201
  }
202
202
  this.lastPingMsgId = Long.ZERO;
203
203
  }
204
+ forgetPendingPings() {
205
+ for (const [msgId, info] of this.pendingMessages) {
206
+ if (info._ === "ping") this.pendingMessages.delete(msgId);
207
+ }
208
+ this.lastPingTime = 0;
209
+ this.lastPingMsgId = Long.ZERO;
210
+ }
204
211
  addToChain(chainId, msgId) {
205
212
  const prevMsgId = this.chains.get(chainId);
206
213
  this.chains.set(chainId, msgId);
@@ -227,7 +227,7 @@ class NetworkManager {
227
227
  _: "initConnection",
228
228
  deviceModel,
229
229
  systemVersion: "1.0",
230
- appVersion: "0.31.0",
230
+ appVersion: "0.32.0",
231
231
  systemLangCode: "en",
232
232
  langPack: "",
233
233
  // "langPacks are for official apps only"
@@ -220,7 +220,7 @@ class NetworkManager {
220
220
  _: "initConnection",
221
221
  deviceModel,
222
222
  systemVersion: "1.0",
223
- appVersion: "0.31.0",
223
+ appVersion: "0.32.0",
224
224
  systemLangCode: "en",
225
225
  langPack: "",
226
226
  // "langPacks are for official apps only"
@@ -123,7 +123,7 @@ class SessionConnection extends persistentConnection.PersistentConnection {
123
123
  this._session.initConnectionCalled = false;
124
124
  this._flushTimer.reset();
125
125
  this._salts.isFetching = false;
126
- this._session.resetLastPing(true);
126
+ this._session.forgetPendingPings();
127
127
  for (const timeout of this._session.pendingGetStateTimeouts.values()) {
128
128
  utils.timers.clearTimeout(timeout);
129
129
  }
@@ -738,7 +738,9 @@ class SessionConnection extends persistentConnection.PersistentConnection {
738
738
  break;
739
739
  case "ping":
740
740
  this.log.debug("ping (msg_id = %l) failed because of %s", msgId, reason);
741
- this._session.resetLastPing(true);
741
+ if (this._session.lastPingMsgId.eq(msgId)) {
742
+ this._session.resetLastPing(true);
743
+ }
742
744
  break;
743
745
  case "rpc": {
744
746
  const rpc = msgInfo.rpc;
@@ -811,14 +813,17 @@ class SessionConnection extends persistentConnection.PersistentConnection {
811
813
  if (info.pingId.neq(pingId)) {
812
814
  this.log.warn("received pong to %l, but expected ping_id = %l (got %l)", msgId, info.pingId, pingId);
813
815
  }
814
- const rtt = performance.now() - this._session.lastPingTime;
816
+ this._session.pendingMessages.delete(msgId);
817
+ const rtt = performance.now() - info.sentAt;
815
818
  this._session.lastPingRtt = rtt;
816
819
  if (info.containerId.neq(msgId)) {
817
820
  this._onMessageAcked(info.containerId);
818
821
  }
819
822
  this.log.debug("received pong: msg_id %l, ping_id %l, rtt = %dms", msgId, pingId, rtt);
820
- this._session.resetLastPing();
821
- this._flushTimer.emitBefore(this._session.lastPingTime + this._pingMustDelay());
823
+ if (this._session.lastPingMsgId.eq(msgId)) {
824
+ this._session.resetLastPing();
825
+ this._flushTimer.emitBefore(this._session.lastPingTime + this._pingMustDelay());
826
+ }
822
827
  }
823
828
  _onBadServerSalt(msg) {
824
829
  this._salts.currentSalt = msg.newServerSalt;
@@ -1211,7 +1216,7 @@ class SessionConnection extends persistentConnection.PersistentConnection {
1211
1216
  const active = this._online && this._isActive();
1212
1217
  if (active && !this._active) {
1213
1218
  this._session.lastActivityTime = now;
1214
- this._session.resetLastPing(true);
1219
+ this._session.resetLastPing(true, true);
1215
1220
  }
1216
1221
  this._active = active;
1217
1222
  if (this._checkTimeouts(now)) return;
@@ -1393,6 +1398,7 @@ class SessionConnection extends persistentConnection.PersistentConnection {
1393
1398
  const pingPending = {
1394
1399
  _: "ping",
1395
1400
  pingId,
1401
+ sentAt: now,
1396
1402
  containerId: pingMsgId
1397
1403
  };
1398
1404
  this._session.pendingMessages.set(pingMsgId, pingPending);
@@ -116,7 +116,7 @@ class SessionConnection extends PersistentConnection {
116
116
  this._session.initConnectionCalled = false;
117
117
  this._flushTimer.reset();
118
118
  this._salts.isFetching = false;
119
- this._session.resetLastPing(true);
119
+ this._session.forgetPendingPings();
120
120
  for (const timeout of this._session.pendingGetStateTimeouts.values()) {
121
121
  timers.clearTimeout(timeout);
122
122
  }
@@ -731,7 +731,9 @@ class SessionConnection extends PersistentConnection {
731
731
  break;
732
732
  case "ping":
733
733
  this.log.debug("ping (msg_id = %l) failed because of %s", msgId, reason);
734
- this._session.resetLastPing(true);
734
+ if (this._session.lastPingMsgId.eq(msgId)) {
735
+ this._session.resetLastPing(true);
736
+ }
735
737
  break;
736
738
  case "rpc": {
737
739
  const rpc = msgInfo.rpc;
@@ -804,14 +806,17 @@ class SessionConnection extends PersistentConnection {
804
806
  if (info.pingId.neq(pingId)) {
805
807
  this.log.warn("received pong to %l, but expected ping_id = %l (got %l)", msgId, info.pingId, pingId);
806
808
  }
807
- const rtt = performance.now() - this._session.lastPingTime;
809
+ this._session.pendingMessages.delete(msgId);
810
+ const rtt = performance.now() - info.sentAt;
808
811
  this._session.lastPingRtt = rtt;
809
812
  if (info.containerId.neq(msgId)) {
810
813
  this._onMessageAcked(info.containerId);
811
814
  }
812
815
  this.log.debug("received pong: msg_id %l, ping_id %l, rtt = %dms", msgId, pingId, rtt);
813
- this._session.resetLastPing();
814
- this._flushTimer.emitBefore(this._session.lastPingTime + this._pingMustDelay());
816
+ if (this._session.lastPingMsgId.eq(msgId)) {
817
+ this._session.resetLastPing();
818
+ this._flushTimer.emitBefore(this._session.lastPingTime + this._pingMustDelay());
819
+ }
815
820
  }
816
821
  _onBadServerSalt(msg) {
817
822
  this._salts.currentSalt = msg.newServerSalt;
@@ -1204,7 +1209,7 @@ class SessionConnection extends PersistentConnection {
1204
1209
  const active = this._online && this._isActive();
1205
1210
  if (active && !this._active) {
1206
1211
  this._session.lastActivityTime = now;
1207
- this._session.resetLastPing(true);
1212
+ this._session.resetLastPing(true, true);
1208
1213
  }
1209
1214
  this._active = active;
1210
1215
  if (this._checkTimeouts(now)) return;
@@ -1386,6 +1391,7 @@ class SessionConnection extends PersistentConnection {
1386
1391
  const pingPending = {
1387
1392
  _: "ping",
1388
1393
  pingId,
1394
+ sentAt: now,
1389
1395
  containerId: pingMsgId
1390
1396
  };
1391
1397
  this._session.pendingMessages.set(pingMsgId, pingPending);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};