@mtcute/core 0.29.7 → 0.30.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 (134) hide show
  1. package/client.cjs +8 -0
  2. package/client.js +8 -0
  3. package/highlevel/client.d.cts +67 -7
  4. package/highlevel/client.d.ts +67 -7
  5. package/highlevel/methods/chats/join-chat.cjs +38 -16
  6. package/highlevel/methods/chats/join-chat.d.cts +20 -6
  7. package/highlevel/methods/chats/join-chat.d.ts +20 -6
  8. package/highlevel/methods/chats/join-chat.js +38 -16
  9. package/highlevel/methods/chats/save-draft.d.cts +4 -1
  10. package/highlevel/methods/chats/save-draft.d.ts +4 -1
  11. package/highlevel/methods/files/normalize-input-media.cjs +8 -0
  12. package/highlevel/methods/files/normalize-input-media.js +9 -1
  13. package/highlevel/methods/messages/create-rich-streaming-draft.cjs +39 -0
  14. package/highlevel/methods/messages/create-rich-streaming-draft.d.cts +42 -0
  15. package/highlevel/methods/messages/create-rich-streaming-draft.d.ts +42 -0
  16. package/highlevel/methods/messages/create-rich-streaming-draft.js +34 -0
  17. package/highlevel/methods/messages/normalize-rich-message.cjs +157 -0
  18. package/highlevel/methods/messages/normalize-rich-message.d.cts +10 -0
  19. package/highlevel/methods/messages/normalize-rich-message.d.ts +10 -0
  20. package/highlevel/methods/messages/normalize-rich-message.js +152 -0
  21. package/highlevel/methods/messages/send-rich-message.cjs +49 -0
  22. package/highlevel/methods/messages/send-rich-message.d.cts +38 -0
  23. package/highlevel/methods/messages/send-rich-message.d.ts +38 -0
  24. package/highlevel/methods/messages/send-rich-message.js +44 -0
  25. package/highlevel/methods.d.cts +5 -0
  26. package/highlevel/methods.d.ts +5 -0
  27. package/highlevel/storage/service/peers.cjs +1 -0
  28. package/highlevel/storage/service/peers.js +1 -0
  29. package/highlevel/types/bots/inline-message/factories.cjs +14 -0
  30. package/highlevel/types/bots/inline-message/factories.d.cts +9 -1
  31. package/highlevel/types/bots/inline-message/factories.d.ts +9 -1
  32. package/highlevel/types/bots/inline-message/factories.js +14 -0
  33. package/highlevel/types/bots/inline-message/types.d.cts +17 -1
  34. package/highlevel/types/bots/inline-message/types.d.ts +17 -1
  35. package/highlevel/types/files/utils.d.cts +1 -1
  36. package/highlevel/types/files/utils.d.ts +1 -1
  37. package/highlevel/types/media/input-media/types.d.cts +1 -1
  38. package/highlevel/types/media/input-media/types.d.ts +1 -1
  39. package/highlevel/types/messages/index.d.cts +1 -0
  40. package/highlevel/types/messages/index.d.ts +1 -0
  41. package/highlevel/types/messages/message.cjs +5 -0
  42. package/highlevel/types/messages/message.d.cts +3 -0
  43. package/highlevel/types/messages/message.d.ts +3 -0
  44. package/highlevel/types/messages/message.js +5 -0
  45. package/highlevel/types/messages/rich/index.d.cts +4 -0
  46. package/highlevel/types/messages/rich/index.d.ts +4 -0
  47. package/highlevel/types/messages/rich/inner.cjs +219 -0
  48. package/highlevel/types/messages/rich/inner.d.cts +127 -0
  49. package/highlevel/types/messages/rich/inner.d.ts +127 -0
  50. package/highlevel/types/messages/rich/inner.js +214 -0
  51. package/highlevel/types/messages/rich/rich-message.cjs +50 -0
  52. package/highlevel/types/messages/rich/rich-message.d.cts +18 -0
  53. package/highlevel/types/messages/rich/rich-message.d.ts +18 -0
  54. package/highlevel/types/messages/rich/rich-message.js +45 -0
  55. package/highlevel/types/messages/rich/types.d.cts +76 -0
  56. package/highlevel/types/messages/rich/types.d.ts +76 -0
  57. package/highlevel/types/peers/full-chat.cjs +6 -0
  58. package/highlevel/types/peers/full-chat.d.cts +2 -0
  59. package/highlevel/types/peers/full-chat.d.ts +2 -0
  60. package/highlevel/types/peers/full-chat.js +6 -0
  61. package/highlevel/types/peers/user.cjs +4 -0
  62. package/highlevel/types/peers/user.d.cts +2 -0
  63. package/highlevel/types/peers/user.d.ts +2 -0
  64. package/highlevel/types/peers/user.js +4 -0
  65. package/highlevel/types/updates/user-typing-update.cjs +2 -0
  66. package/highlevel/types/updates/user-typing-update.js +2 -0
  67. package/highlevel/updates/manager.cjs +195 -0
  68. package/highlevel/updates/manager.js +195 -0
  69. package/highlevel/utils/entities.cjs +176 -0
  70. package/highlevel/utils/entities.d.cts +18 -0
  71. package/highlevel/utils/entities.d.ts +18 -0
  72. package/highlevel/utils/entities.js +177 -1
  73. package/highlevel/utils/inspectable.cjs +1 -0
  74. package/highlevel/utils/inspectable.d.cts +1 -0
  75. package/highlevel/utils/inspectable.d.ts +1 -0
  76. package/highlevel/utils/inspectable.js +1 -0
  77. package/index.cjs +4 -0
  78. package/index.js +4 -0
  79. package/methods.cjs +4 -0
  80. package/methods.js +4 -0
  81. package/network/flood-control.cjs +149 -0
  82. package/network/flood-control.d.cts +79 -0
  83. package/network/flood-control.d.ts +79 -0
  84. package/network/flood-control.js +144 -0
  85. package/network/flood-control.test.d.cts +1 -0
  86. package/network/flood-control.test.d.ts +1 -0
  87. package/network/mtproto-session.cjs +1 -21
  88. package/network/mtproto-session.d.cts +1 -5
  89. package/network/mtproto-session.d.ts +1 -5
  90. package/network/mtproto-session.js +2 -22
  91. package/network/mtproxy/_fake-tls.cjs +169 -107
  92. package/network/mtproxy/_fake-tls.js +169 -107
  93. package/network/mtproxy/_fake-tls.test.d.cts +1 -0
  94. package/network/mtproxy/_fake-tls.test.d.ts +1 -0
  95. package/network/multi-session-connection.cjs +26 -16
  96. package/network/multi-session-connection.d.cts +1 -1
  97. package/network/multi-session-connection.d.ts +1 -1
  98. package/network/multi-session-connection.js +26 -16
  99. package/network/multi-session-connection.test.d.cts +1 -0
  100. package/network/multi-session-connection.test.d.ts +1 -0
  101. package/network/network-manager.cjs +3 -2
  102. package/network/network-manager.d.cts +12 -0
  103. package/network/network-manager.d.ts +12 -0
  104. package/network/network-manager.js +3 -2
  105. package/network/persistent-connection.cjs +25 -1
  106. package/network/persistent-connection.d.cts +5 -0
  107. package/network/persistent-connection.d.ts +5 -0
  108. package/network/persistent-connection.js +25 -1
  109. package/network/session-connection.cjs +5 -10
  110. package/network/session-connection.d.cts +0 -2
  111. package/network/session-connection.d.ts +0 -2
  112. package/network/session-connection.js +5 -10
  113. package/package.json +1 -1
  114. package/tl/api-schema.json +1 -1
  115. package/tl/binary/reader.cjs +182 -26
  116. package/tl/binary/reader.js +182 -26
  117. package/tl/binary/writer.cjs +437 -20
  118. package/tl/binary/writer.js +437 -20
  119. package/tl/compat/reader.cjs +23 -0
  120. package/tl/compat/reader.js +23 -0
  121. package/tl/index.d.cts +425 -14
  122. package/tl/index.d.ts +425 -14
  123. package/tl/inner-tl.cjs +22 -8
  124. package/tl/inner-tl.js +22 -8
  125. package/types/utils.d.cts +4 -0
  126. package/types/utils.d.ts +4 -0
  127. package/utils/binary/compat.cjs +79 -0
  128. package/utils/binary/compat.js +79 -0
  129. package/utils/index.d.cts +1 -0
  130. package/utils/index.d.ts +1 -0
  131. package/utils/long-utils.cjs +10 -0
  132. package/utils/long-utils.js +10 -0
  133. package/utils.cjs +9 -0
  134. package/utils.js +11 -2
@@ -5,6 +5,8 @@ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WAR
5
5
  }
6
6
  "use strict";
7
7
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const Long = require("long");
9
+ const peerUtils = require("../../utils/peer-utils.cjs");
8
10
  function joinTextWithEntities(parts, delim = "") {
9
11
  const textParts = [];
10
12
  const newEntities = [];
@@ -36,4 +38,178 @@ function joinTextWithEntities(parts, delim = "") {
36
38
  entities: newEntities
37
39
  };
38
40
  }
41
+ function _entityToRichTextWrapper(entity, text) {
42
+ const covered = () => text.slice(entity.offset, entity.offset + entity.length);
43
+ switch (entity._) {
44
+ case "messageEntityBold":
45
+ return (inner) => ({ _: "textBold", text: inner });
46
+ case "messageEntityItalic":
47
+ return (inner) => ({ _: "textItalic", text: inner });
48
+ case "messageEntityUnderline":
49
+ return (inner) => ({ _: "textUnderline", text: inner });
50
+ case "messageEntityStrike":
51
+ return (inner) => ({ _: "textStrike", text: inner });
52
+ case "messageEntityCode":
53
+ case "messageEntityPre":
54
+ return (inner) => ({ _: "textFixed", text: inner });
55
+ case "messageEntitySpoiler":
56
+ return (inner) => ({ _: "textSpoiler", text: inner });
57
+ case "messageEntityMention":
58
+ return (inner) => ({ _: "textMention", text: inner });
59
+ case "messageEntityHashtag":
60
+ return (inner) => ({ _: "textHashtag", text: inner });
61
+ case "messageEntityCashtag":
62
+ return (inner) => ({ _: "textCashtag", text: inner });
63
+ case "messageEntityBotCommand":
64
+ return (inner) => ({ _: "textBotCommand", text: inner });
65
+ case "messageEntityBankCard":
66
+ return (inner) => ({ _: "textBankCard", text: inner });
67
+ case "messageEntityUrl":
68
+ return (inner) => ({ _: "textUrl", text: inner, url: covered(), webpageId: Long.ZERO });
69
+ case "messageEntityTextUrl":
70
+ return (inner) => ({ _: "textUrl", text: inner, url: entity.url, webpageId: Long.ZERO });
71
+ case "messageEntityEmail":
72
+ return (inner) => ({ _: "textEmail", text: inner, email: covered() });
73
+ case "messageEntityPhone":
74
+ return (inner) => ({ _: "textPhone", text: inner, phone: covered() });
75
+ case "messageEntityMentionName":
76
+ return (inner) => ({ _: "textMentionName", text: inner, userId: entity.userId });
77
+ case "inputMessageEntityMentionName":
78
+ return (inner) => ({ _: "textMentionName", text: inner, userId: peerUtils.getMarkedPeerId(entity.userId) });
79
+ case "messageEntityCustomEmoji":
80
+ return () => ({ _: "textCustomEmoji", documentId: entity.documentId, alt: covered() });
81
+ case "messageEntityFormattedDate":
82
+ return (inner) => ({
83
+ _: "textDate",
84
+ text: inner,
85
+ date: entity.date,
86
+ relative: entity.relative,
87
+ shortTime: entity.shortTime,
88
+ longTime: entity.longTime,
89
+ shortDate: entity.shortDate,
90
+ longDate: entity.longDate,
91
+ dayOfWeek: entity.dayOfWeek
92
+ });
93
+ default:
94
+ return null;
95
+ }
96
+ }
97
+ function textWithEntitiesToRichText(input) {
98
+ const { text, entities } = input;
99
+ if (!text) return { _: "textEmpty" };
100
+ if (!entities?.length) return { _: "textPlain", text };
101
+ const bounds = /* @__PURE__ */ new Set([0, text.length]);
102
+ for (const e of entities) {
103
+ bounds.add(e.offset);
104
+ bounds.add(e.offset + e.length);
105
+ }
106
+ const sorted = [...bounds].filter((b) => b >= 0 && b <= text.length).sort((a, b) => a - b);
107
+ const segments = [];
108
+ for (let i = 0; i < sorted.length - 1; i++) {
109
+ const start = sorted[i];
110
+ const end = sorted[i + 1];
111
+ if (start === end) continue;
112
+ let node = { _: "textPlain", text: text.slice(start, end) };
113
+ const active = entities.filter((e) => e.offset <= start && e.offset + e.length >= end).sort((a, b) => a.length - b.length);
114
+ for (const e of active) {
115
+ const wrap = _entityToRichTextWrapper(e, text);
116
+ if (wrap) node = wrap(node);
117
+ }
118
+ segments.push(node);
119
+ }
120
+ if (segments.length === 0) return { _: "textEmpty" };
121
+ if (segments.length === 1) return segments[0];
122
+ return { _: "textConcat", texts: segments };
123
+ }
124
+ function _richTextNodeToEntity(node, offset, length) {
125
+ switch (node._) {
126
+ case "textBold":
127
+ return { _: "messageEntityBold", offset, length };
128
+ case "textItalic":
129
+ return { _: "messageEntityItalic", offset, length };
130
+ case "textUnderline":
131
+ return { _: "messageEntityUnderline", offset, length };
132
+ case "textStrike":
133
+ return { _: "messageEntityStrike", offset, length };
134
+ case "textFixed":
135
+ return { _: "messageEntityCode", offset, length };
136
+ case "textSpoiler":
137
+ return { _: "messageEntitySpoiler", offset, length };
138
+ case "textMention":
139
+ return { _: "messageEntityMention", offset, length };
140
+ case "textHashtag":
141
+ return { _: "messageEntityHashtag", offset, length };
142
+ case "textCashtag":
143
+ return { _: "messageEntityCashtag", offset, length };
144
+ case "textBotCommand":
145
+ return { _: "messageEntityBotCommand", offset, length };
146
+ case "textBankCard":
147
+ return { _: "messageEntityBankCard", offset, length };
148
+ case "textUrl":
149
+ return { _: "messageEntityTextUrl", offset, length, url: node.url };
150
+ case "textEmail":
151
+ return { _: "messageEntityEmail", offset, length };
152
+ case "textPhone":
153
+ return { _: "messageEntityPhone", offset, length };
154
+ case "textMentionName":
155
+ return { _: "messageEntityMentionName", offset, length, userId: node.userId };
156
+ case "textDate":
157
+ return {
158
+ _: "messageEntityFormattedDate",
159
+ offset,
160
+ length,
161
+ date: node.date,
162
+ relative: node.relative,
163
+ shortTime: node.shortTime,
164
+ longTime: node.longTime,
165
+ shortDate: node.shortDate,
166
+ longDate: node.longDate,
167
+ dayOfWeek: node.dayOfWeek
168
+ };
169
+ default:
170
+ return null;
171
+ }
172
+ }
173
+ function richTextToTextWithEntities(rich) {
174
+ const entities = [];
175
+ let text = "";
176
+ const walk = (node) => {
177
+ switch (node._) {
178
+ case "textEmpty":
179
+ return;
180
+ case "textPlain":
181
+ text += node.text;
182
+ return;
183
+ case "textConcat":
184
+ for (const t of node.texts) walk(t);
185
+ return;
186
+ case "textImage":
187
+ return;
188
+ case "textMath":
189
+ text += node.source;
190
+ return;
191
+ case "textCustomEmoji": {
192
+ const start = text.length;
193
+ text += node.alt;
194
+ entities.push({
195
+ _: "messageEntityCustomEmoji",
196
+ offset: start,
197
+ length: text.length - start,
198
+ documentId: node.documentId
199
+ });
200
+ return;
201
+ }
202
+ default: {
203
+ const start = text.length;
204
+ walk(node.text);
205
+ const entity = _richTextNodeToEntity(node, start, text.length - start);
206
+ if (entity) entities.push(entity);
207
+ }
208
+ }
209
+ };
210
+ walk(rich);
211
+ return { text, entities };
212
+ }
39
213
  exports.joinTextWithEntities = joinTextWithEntities;
214
+ exports.richTextToTextWithEntities = richTextToTextWithEntities;
215
+ exports.textWithEntitiesToRichText = textWithEntitiesToRichText;
@@ -1,3 +1,4 @@
1
+ import { tl } from '../../tl/index.js';
1
2
  import { TextWithEntities } from '../types/misc/entities.js';
2
3
  /**
3
4
  * Join multiple text parts with entities into a single text with entities,
@@ -17,3 +18,20 @@ import { TextWithEntities } from '../types/misc/entities.js';
17
18
  * ```
18
19
  */
19
20
  export declare function joinTextWithEntities(parts: (string | TextWithEntities)[], delim?: string | TextWithEntities): TextWithEntities;
21
+ /**
22
+ * Convert a {@link TextWithEntities} into a {@link tl.TypeRichText} tree
23
+ * (as used in page blocks / instant view).
24
+ *
25
+ * Overlapping entities are handled by splitting the text at every entity
26
+ * boundary and nesting the wrappers per-segment, so the result may be more
27
+ * fragmented than the input, but always renders identically.
28
+ */
29
+ export declare function textWithEntitiesToRichText(input: TextWithEntities): tl.TypeRichText;
30
+ /**
31
+ * Convert a {@link tl.TypeRichText} tree back into a {@link TextWithEntities}.
32
+ *
33
+ * This conversion is **lossy**: rich text nodes that have no message entity
34
+ * equivalent (e.g. `textMarked`, `textSubscript`, anchors, images) are dropped,
35
+ * keeping only their textual content.
36
+ */
37
+ export declare function richTextToTextWithEntities(rich: tl.TypeRichText): TextWithEntities;
@@ -1,3 +1,4 @@
1
+ import { tl } from '../../tl/index.js';
1
2
  import { TextWithEntities } from '../types/misc/entities.js';
2
3
  /**
3
4
  * Join multiple text parts with entities into a single text with entities,
@@ -17,3 +18,20 @@ import { TextWithEntities } from '../types/misc/entities.js';
17
18
  * ```
18
19
  */
19
20
  export declare function joinTextWithEntities(parts: (string | TextWithEntities)[], delim?: string | TextWithEntities): TextWithEntities;
21
+ /**
22
+ * Convert a {@link TextWithEntities} into a {@link tl.TypeRichText} tree
23
+ * (as used in page blocks / instant view).
24
+ *
25
+ * Overlapping entities are handled by splitting the text at every entity
26
+ * boundary and nesting the wrappers per-segment, so the result may be more
27
+ * fragmented than the input, but always renders identically.
28
+ */
29
+ export declare function textWithEntitiesToRichText(input: TextWithEntities): tl.TypeRichText;
30
+ /**
31
+ * Convert a {@link tl.TypeRichText} tree back into a {@link TextWithEntities}.
32
+ *
33
+ * This conversion is **lossy**: rich text nodes that have no message entity
34
+ * equivalent (e.g. `textMarked`, `textSubscript`, anchors, images) are dropped,
35
+ * keeping only their textual content.
36
+ */
37
+ export declare function richTextToTextWithEntities(rich: tl.TypeRichText): TextWithEntities;
@@ -1,3 +1,5 @@
1
+ import Long from "long";
2
+ import { getMarkedPeerId } from "../../utils/peer-utils.js";
1
3
  function joinTextWithEntities(parts, delim = "") {
2
4
  const textParts = [];
3
5
  const newEntities = [];
@@ -29,6 +31,180 @@ function joinTextWithEntities(parts, delim = "") {
29
31
  entities: newEntities
30
32
  };
31
33
  }
34
+ function _entityToRichTextWrapper(entity, text) {
35
+ const covered = () => text.slice(entity.offset, entity.offset + entity.length);
36
+ switch (entity._) {
37
+ case "messageEntityBold":
38
+ return (inner) => ({ _: "textBold", text: inner });
39
+ case "messageEntityItalic":
40
+ return (inner) => ({ _: "textItalic", text: inner });
41
+ case "messageEntityUnderline":
42
+ return (inner) => ({ _: "textUnderline", text: inner });
43
+ case "messageEntityStrike":
44
+ return (inner) => ({ _: "textStrike", text: inner });
45
+ case "messageEntityCode":
46
+ case "messageEntityPre":
47
+ return (inner) => ({ _: "textFixed", text: inner });
48
+ case "messageEntitySpoiler":
49
+ return (inner) => ({ _: "textSpoiler", text: inner });
50
+ case "messageEntityMention":
51
+ return (inner) => ({ _: "textMention", text: inner });
52
+ case "messageEntityHashtag":
53
+ return (inner) => ({ _: "textHashtag", text: inner });
54
+ case "messageEntityCashtag":
55
+ return (inner) => ({ _: "textCashtag", text: inner });
56
+ case "messageEntityBotCommand":
57
+ return (inner) => ({ _: "textBotCommand", text: inner });
58
+ case "messageEntityBankCard":
59
+ return (inner) => ({ _: "textBankCard", text: inner });
60
+ case "messageEntityUrl":
61
+ return (inner) => ({ _: "textUrl", text: inner, url: covered(), webpageId: Long.ZERO });
62
+ case "messageEntityTextUrl":
63
+ return (inner) => ({ _: "textUrl", text: inner, url: entity.url, webpageId: Long.ZERO });
64
+ case "messageEntityEmail":
65
+ return (inner) => ({ _: "textEmail", text: inner, email: covered() });
66
+ case "messageEntityPhone":
67
+ return (inner) => ({ _: "textPhone", text: inner, phone: covered() });
68
+ case "messageEntityMentionName":
69
+ return (inner) => ({ _: "textMentionName", text: inner, userId: entity.userId });
70
+ case "inputMessageEntityMentionName":
71
+ return (inner) => ({ _: "textMentionName", text: inner, userId: getMarkedPeerId(entity.userId) });
72
+ case "messageEntityCustomEmoji":
73
+ return () => ({ _: "textCustomEmoji", documentId: entity.documentId, alt: covered() });
74
+ case "messageEntityFormattedDate":
75
+ return (inner) => ({
76
+ _: "textDate",
77
+ text: inner,
78
+ date: entity.date,
79
+ relative: entity.relative,
80
+ shortTime: entity.shortTime,
81
+ longTime: entity.longTime,
82
+ shortDate: entity.shortDate,
83
+ longDate: entity.longDate,
84
+ dayOfWeek: entity.dayOfWeek
85
+ });
86
+ default:
87
+ return null;
88
+ }
89
+ }
90
+ function textWithEntitiesToRichText(input) {
91
+ const { text, entities } = input;
92
+ if (!text) return { _: "textEmpty" };
93
+ if (!entities?.length) return { _: "textPlain", text };
94
+ const bounds = /* @__PURE__ */ new Set([0, text.length]);
95
+ for (const e of entities) {
96
+ bounds.add(e.offset);
97
+ bounds.add(e.offset + e.length);
98
+ }
99
+ const sorted = [...bounds].filter((b) => b >= 0 && b <= text.length).sort((a, b) => a - b);
100
+ const segments = [];
101
+ for (let i = 0; i < sorted.length - 1; i++) {
102
+ const start = sorted[i];
103
+ const end = sorted[i + 1];
104
+ if (start === end) continue;
105
+ let node = { _: "textPlain", text: text.slice(start, end) };
106
+ const active = entities.filter((e) => e.offset <= start && e.offset + e.length >= end).sort((a, b) => a.length - b.length);
107
+ for (const e of active) {
108
+ const wrap = _entityToRichTextWrapper(e, text);
109
+ if (wrap) node = wrap(node);
110
+ }
111
+ segments.push(node);
112
+ }
113
+ if (segments.length === 0) return { _: "textEmpty" };
114
+ if (segments.length === 1) return segments[0];
115
+ return { _: "textConcat", texts: segments };
116
+ }
117
+ function _richTextNodeToEntity(node, offset, length) {
118
+ switch (node._) {
119
+ case "textBold":
120
+ return { _: "messageEntityBold", offset, length };
121
+ case "textItalic":
122
+ return { _: "messageEntityItalic", offset, length };
123
+ case "textUnderline":
124
+ return { _: "messageEntityUnderline", offset, length };
125
+ case "textStrike":
126
+ return { _: "messageEntityStrike", offset, length };
127
+ case "textFixed":
128
+ return { _: "messageEntityCode", offset, length };
129
+ case "textSpoiler":
130
+ return { _: "messageEntitySpoiler", offset, length };
131
+ case "textMention":
132
+ return { _: "messageEntityMention", offset, length };
133
+ case "textHashtag":
134
+ return { _: "messageEntityHashtag", offset, length };
135
+ case "textCashtag":
136
+ return { _: "messageEntityCashtag", offset, length };
137
+ case "textBotCommand":
138
+ return { _: "messageEntityBotCommand", offset, length };
139
+ case "textBankCard":
140
+ return { _: "messageEntityBankCard", offset, length };
141
+ case "textUrl":
142
+ return { _: "messageEntityTextUrl", offset, length, url: node.url };
143
+ case "textEmail":
144
+ return { _: "messageEntityEmail", offset, length };
145
+ case "textPhone":
146
+ return { _: "messageEntityPhone", offset, length };
147
+ case "textMentionName":
148
+ return { _: "messageEntityMentionName", offset, length, userId: node.userId };
149
+ case "textDate":
150
+ return {
151
+ _: "messageEntityFormattedDate",
152
+ offset,
153
+ length,
154
+ date: node.date,
155
+ relative: node.relative,
156
+ shortTime: node.shortTime,
157
+ longTime: node.longTime,
158
+ shortDate: node.shortDate,
159
+ longDate: node.longDate,
160
+ dayOfWeek: node.dayOfWeek
161
+ };
162
+ default:
163
+ return null;
164
+ }
165
+ }
166
+ function richTextToTextWithEntities(rich) {
167
+ const entities = [];
168
+ let text = "";
169
+ const walk = (node) => {
170
+ switch (node._) {
171
+ case "textEmpty":
172
+ return;
173
+ case "textPlain":
174
+ text += node.text;
175
+ return;
176
+ case "textConcat":
177
+ for (const t of node.texts) walk(t);
178
+ return;
179
+ case "textImage":
180
+ return;
181
+ case "textMath":
182
+ text += node.source;
183
+ return;
184
+ case "textCustomEmoji": {
185
+ const start = text.length;
186
+ text += node.alt;
187
+ entities.push({
188
+ _: "messageEntityCustomEmoji",
189
+ offset: start,
190
+ length: text.length - start,
191
+ documentId: node.documentId
192
+ });
193
+ return;
194
+ }
195
+ default: {
196
+ const start = text.length;
197
+ walk(node.text);
198
+ const entity = _richTextNodeToEntity(node, start, text.length - start);
199
+ if (entity) entities.push(entity);
200
+ }
201
+ }
202
+ };
203
+ walk(rich);
204
+ return { text, entities };
205
+ }
32
206
  export {
33
- joinTextWithEntities
207
+ joinTextWithEntities,
208
+ richTextToTextWithEntities,
209
+ textWithEntitiesToRichText
34
210
  };
@@ -50,4 +50,5 @@ function makeInspectable(obj, props, hide) {
50
50
  obj.prototype[customInspectSymbol] = obj.prototype.toJSON;
51
51
  return obj;
52
52
  }
53
+ exports.customInspectSymbol = customInspectSymbol;
53
54
  exports.makeInspectable = makeInspectable;
@@ -1,3 +1,4 @@
1
+ export declare const customInspectSymbol: symbol;
1
2
  /**
2
3
  * Small helper function that adds `toJSON` and `util.custom.inspect`
3
4
  * methods to a given class based on its getters
@@ -1,3 +1,4 @@
1
+ export declare const customInspectSymbol: symbol;
1
2
  /**
2
3
  * Small helper function that adds `toJSON` and `util.custom.inspect`
3
4
  * methods to a given class based on its getters
@@ -44,5 +44,6 @@ function makeInspectable(obj, props, hide) {
44
44
  return obj;
45
45
  }
46
46
  export {
47
+ customInspectSymbol,
47
48
  makeInspectable
48
49
  };
package/index.cjs CHANGED
@@ -56,6 +56,8 @@ const messageReactions = require("./highlevel/types/messages/message-reactions.c
56
56
  const messageReplies = require("./highlevel/types/messages/message-replies.cjs");
57
57
  const message = require("./highlevel/types/messages/message.cjs");
58
58
  const repliedMessage = require("./highlevel/types/messages/replied-message.cjs");
59
+ const richMessage = require("./highlevel/types/messages/rich/rich-message.cjs");
60
+ const inner$1 = require("./highlevel/types/messages/rich/inner.cjs");
59
61
  const searchFilters = require("./highlevel/types/messages/search-filters.cjs");
60
62
  const suggestedPost = require("./highlevel/types/messages/suggested-post.cjs");
61
63
  const collectibleInfo = require("./highlevel/types/misc/collectible-info.cjs");
@@ -225,6 +227,8 @@ exports.MessageReactions = messageReactions.MessageReactions;
225
227
  exports.MessageRepliesInfo = messageReplies.MessageRepliesInfo;
226
228
  exports.Message = message.Message;
227
229
  exports.RepliedMessageInfo = repliedMessage.RepliedMessageInfo;
230
+ exports.RichMessage = richMessage.RichMessage;
231
+ exports.Rich = inner$1;
228
232
  exports.SearchFilters = searchFilters.SearchFilters;
229
233
  exports.SuggestedPostInfo = suggestedPost.SuggestedPostInfo;
230
234
  exports.CollectibleInfo = collectibleInfo.CollectibleInfo;
package/index.js CHANGED
@@ -49,6 +49,8 @@ import { MessageReactions } from "./highlevel/types/messages/message-reactions.j
49
49
  import { MessageRepliesInfo } from "./highlevel/types/messages/message-replies.js";
50
50
  import { Message } from "./highlevel/types/messages/message.js";
51
51
  import { RepliedMessageInfo } from "./highlevel/types/messages/replied-message.js";
52
+ import { RichMessage } from "./highlevel/types/messages/rich/rich-message.js";
53
+ import * as inner$1 from "./highlevel/types/messages/rich/inner.js";
52
54
  import { SearchFilters } from "./highlevel/types/messages/search-filters.js";
53
55
  import { SuggestedPostInfo } from "./highlevel/types/messages/suggested-post.js";
54
56
  import { CollectibleInfo } from "./highlevel/types/misc/collectible-info.js";
@@ -271,6 +273,8 @@ export {
271
273
  RawUpdateInfo,
272
274
  ReactionCount,
273
275
  RepliedMessageInfo,
276
+ inner$1 as Rich,
277
+ RichMessage,
274
278
  SavedStarGift,
275
279
  SearchFilters,
276
280
  SentCode,
package/methods.cjs CHANGED
@@ -157,6 +157,7 @@ const iterInviteLinks = require("./highlevel/methods/invite-links/iter-invite-li
157
157
  const revokeInviteLink = require("./highlevel/methods/invite-links/revoke-invite-link.cjs");
158
158
  const appendTodoList = require("./highlevel/methods/messages/append-todo-list.cjs");
159
159
  const closePoll = require("./highlevel/methods/messages/close-poll.cjs");
160
+ const createRichStreamingDraft = require("./highlevel/methods/messages/create-rich-streaming-draft.cjs");
160
161
  const createStreamingDraft = require("./highlevel/methods/messages/create-streaming-draft.cjs");
161
162
  const deleteMessages = require("./highlevel/methods/messages/delete-messages.cjs");
162
163
  const deleteScheduledMessages = require("./highlevel/methods/messages/delete-scheduled-messages.cjs");
@@ -199,6 +200,7 @@ const sendPaidReaction = require("./highlevel/methods/messages/send-paid-reactio
199
200
  const sendQuote = require("./highlevel/methods/messages/send-quote.cjs");
200
201
  const sendReaction = require("./highlevel/methods/messages/send-reaction.cjs");
201
202
  const sendReply = require("./highlevel/methods/messages/send-reply.cjs");
203
+ const sendRichMessage = require("./highlevel/methods/messages/send-rich-message.cjs");
202
204
  const sendScheduled = require("./highlevel/methods/messages/send-scheduled.cjs");
203
205
  const sendText = require("./highlevel/methods/messages/send-text.cjs");
204
206
  const sendTyping = require("./highlevel/methods/messages/send-typing.cjs");
@@ -444,6 +446,7 @@ exports.iterInviteLinks = iterInviteLinks.iterInviteLinks;
444
446
  exports.revokeInviteLink = revokeInviteLink.revokeInviteLink;
445
447
  exports.appendTodoList = appendTodoList.appendTodoList;
446
448
  exports.closePoll = closePoll.closePoll;
449
+ exports.createRichStreamingDraft = createRichStreamingDraft.createRichStreamingDraft;
447
450
  exports.createStreamingDraft = createStreamingDraft.createStreamingDraft;
448
451
  exports.deleteMessages = deleteMessages.deleteMessages;
449
452
  exports.deleteMessagesById = deleteMessages.deleteMessagesById;
@@ -498,6 +501,7 @@ exports.sendReaction = sendReaction.sendReaction;
498
501
  exports.replyMedia = sendReply.replyMedia;
499
502
  exports.replyMediaGroup = sendReply.replyMediaGroup;
500
503
  exports.replyText = sendReply.replyText;
504
+ exports.sendRichMessage = sendRichMessage.sendRichMessage;
501
505
  exports.sendScheduled = sendScheduled.sendScheduled;
502
506
  exports.sendText = sendText.sendText;
503
507
  exports.sendTyping = sendTyping.sendTyping;
package/methods.js CHANGED
@@ -150,6 +150,7 @@ import { iterInviteLinks } from "./highlevel/methods/invite-links/iter-invite-li
150
150
  import { revokeInviteLink } from "./highlevel/methods/invite-links/revoke-invite-link.js";
151
151
  import { appendTodoList } from "./highlevel/methods/messages/append-todo-list.js";
152
152
  import { closePoll } from "./highlevel/methods/messages/close-poll.js";
153
+ import { createRichStreamingDraft } from "./highlevel/methods/messages/create-rich-streaming-draft.js";
153
154
  import { createStreamingDraft } from "./highlevel/methods/messages/create-streaming-draft.js";
154
155
  import { deleteMessages, deleteMessagesById } from "./highlevel/methods/messages/delete-messages.js";
155
156
  import { deleteScheduledMessages } from "./highlevel/methods/messages/delete-scheduled-messages.js";
@@ -192,6 +193,7 @@ import { sendPaidReaction } from "./highlevel/methods/messages/send-paid-reactio
192
193
  import { quoteWithMedia, quoteWithMediaGroup, quoteWithText } from "./highlevel/methods/messages/send-quote.js";
193
194
  import { sendReaction } from "./highlevel/methods/messages/send-reaction.js";
194
195
  import { replyMedia, replyMediaGroup, replyText } from "./highlevel/methods/messages/send-reply.js";
196
+ import { sendRichMessage } from "./highlevel/methods/messages/send-rich-message.js";
195
197
  import { sendScheduled } from "./highlevel/methods/messages/send-scheduled.js";
196
198
  import { sendText } from "./highlevel/methods/messages/send-text.js";
197
199
  import { sendTyping } from "./highlevel/methods/messages/send-typing.js";
@@ -320,6 +322,7 @@ export {
320
322
  createForumTopic,
321
323
  createGroup,
322
324
  createInviteLink,
325
+ createRichStreamingDraft,
323
326
  createStickerSet,
324
327
  createStreamingDraft,
325
328
  createSupergroup,
@@ -520,6 +523,7 @@ export {
520
523
  sendPaidReaction,
521
524
  sendReaction,
522
525
  sendRecoveryCode,
526
+ sendRichMessage,
523
527
  sendScheduled,
524
528
  sendStarGift,
525
529
  sendStarGiftOffer,