@mtcute/core 0.30.0 → 0.30.2
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.
- package/client.cjs +8 -0
- package/client.js +8 -0
- package/highlevel/client.d.cts +63 -1
- package/highlevel/client.d.ts +63 -1
- package/highlevel/methods/files/download-iterable.cjs +80 -45
- package/highlevel/methods/files/download-iterable.js +80 -45
- package/highlevel/methods/files/normalize-input-media.cjs +9 -1
- package/highlevel/methods/files/normalize-input-media.js +10 -2
- package/highlevel/methods/files/upload-file.cjs +6 -1
- package/highlevel/methods/files/upload-file.js +6 -1
- package/highlevel/methods/messages/create-rich-streaming-draft.cjs +39 -0
- package/highlevel/methods/messages/create-rich-streaming-draft.d.cts +42 -0
- package/highlevel/methods/messages/create-rich-streaming-draft.d.ts +42 -0
- package/highlevel/methods/messages/create-rich-streaming-draft.js +34 -0
- package/highlevel/methods/messages/normalize-rich-message.cjs +168 -0
- package/highlevel/methods/messages/normalize-rich-message.d.cts +10 -0
- package/highlevel/methods/messages/normalize-rich-message.d.ts +10 -0
- package/highlevel/methods/messages/normalize-rich-message.js +163 -0
- package/highlevel/methods/messages/send-common.cjs +3 -2
- package/highlevel/methods/messages/send-common.d.cts +4 -1
- package/highlevel/methods/messages/send-common.d.ts +4 -1
- package/highlevel/methods/messages/send-common.js +3 -2
- package/highlevel/methods/messages/send-rich-message.cjs +49 -0
- package/highlevel/methods/messages/send-rich-message.d.cts +38 -0
- package/highlevel/methods/messages/send-rich-message.d.ts +38 -0
- package/highlevel/methods/messages/send-rich-message.js +44 -0
- package/highlevel/methods.d.cts +3 -0
- package/highlevel/methods.d.ts +3 -0
- package/highlevel/types/bots/inline-message/factories.cjs +14 -0
- package/highlevel/types/bots/inline-message/factories.d.cts +9 -1
- package/highlevel/types/bots/inline-message/factories.d.ts +9 -1
- package/highlevel/types/bots/inline-message/factories.js +14 -0
- package/highlevel/types/bots/inline-message/types.d.cts +17 -1
- package/highlevel/types/bots/inline-message/types.d.ts +17 -1
- package/highlevel/types/files/utils.d.cts +9 -0
- package/highlevel/types/files/utils.d.ts +9 -0
- package/highlevel/types/media/input-media/types.d.cts +1 -1
- package/highlevel/types/media/input-media/types.d.ts +1 -1
- package/highlevel/types/messages/index.d.cts +1 -1
- package/highlevel/types/messages/index.d.ts +1 -1
- package/highlevel/types/messages/message.cjs +1 -1
- package/highlevel/types/messages/message.d.cts +1 -1
- package/highlevel/types/messages/message.d.ts +1 -1
- package/highlevel/types/messages/message.js +1 -1
- package/highlevel/types/messages/rich/index.d.cts +4 -0
- package/highlevel/types/messages/rich/index.d.ts +4 -0
- package/highlevel/types/messages/rich/inner.cjs +219 -0
- package/highlevel/types/messages/rich/inner.d.cts +127 -0
- package/highlevel/types/messages/rich/inner.d.ts +127 -0
- package/highlevel/types/messages/rich/inner.js +214 -0
- package/highlevel/types/messages/{rich-message.cjs → rich/rich-message.cjs} +6 -6
- package/highlevel/types/messages/{rich-message.d.cts → rich/rich-message.d.cts} +5 -5
- package/highlevel/types/messages/{rich-message.d.ts → rich/rich-message.d.ts} +5 -5
- package/highlevel/types/messages/{rich-message.js → rich/rich-message.js} +6 -6
- package/highlevel/types/messages/rich/types.d.cts +76 -0
- package/highlevel/types/messages/rich/types.d.ts +76 -0
- package/highlevel/updates/manager.cjs +10 -169
- package/highlevel/updates/manager.js +10 -169
- package/highlevel/utils/entities.cjs +176 -0
- package/highlevel/utils/entities.d.cts +18 -0
- package/highlevel/utils/entities.d.ts +18 -0
- package/highlevel/utils/entities.js +177 -1
- package/highlevel/utils/index.d.cts +1 -0
- package/highlevel/utils/index.d.ts +1 -0
- package/highlevel/utils/walk-page-blocks.cjs +164 -0
- package/highlevel/utils/walk-page-blocks.d.cts +9 -0
- package/highlevel/utils/walk-page-blocks.d.ts +9 -0
- package/highlevel/utils/walk-page-blocks.js +159 -0
- package/index.cjs +3 -1
- package/index.js +3 -1
- package/methods.cjs +4 -0
- package/methods.js +4 -0
- package/network/authorization.cjs +1 -1
- package/network/authorization.js +1 -1
- package/network/delay-gate.cjs +29 -0
- package/network/delay-gate.d.cts +5 -0
- package/network/delay-gate.d.ts +5 -0
- package/network/delay-gate.js +24 -0
- package/network/delay-gate.test.d.cts +1 -0
- package/network/delay-gate.test.d.ts +1 -0
- package/network/message-id-store.cjs +30 -0
- package/network/message-id-store.d.cts +7 -0
- package/network/message-id-store.d.ts +7 -0
- package/network/message-id-store.js +25 -0
- package/network/message-id-store.test.d.cts +1 -0
- package/network/message-id-store.test.d.ts +1 -0
- package/network/middlewares/bundle.cjs +2 -0
- package/network/middlewares/bundle.d.cts +1 -0
- package/network/middlewares/bundle.d.ts +1 -0
- package/network/middlewares/bundle.js +2 -0
- package/network/middlewares/default.cjs +6 -1
- package/network/middlewares/default.js +6 -1
- package/network/middlewares/flood-waiter.test.d.cts +1 -0
- package/network/middlewares/flood-waiter.test.d.ts +1 -0
- package/network/middlewares/internal-errors.test.d.cts +1 -0
- package/network/middlewares/internal-errors.test.d.ts +1 -0
- package/network/middlewares/media-throttle.cjs +65 -0
- package/network/middlewares/media-throttle.d.cts +5 -0
- package/network/middlewares/media-throttle.d.ts +5 -0
- package/network/middlewares/media-throttle.js +60 -0
- package/network/middlewares/media-throttle.test.d.cts +1 -0
- package/network/middlewares/media-throttle.test.d.ts +1 -0
- package/network/middlewares/on-error.test.d.cts +1 -0
- package/network/middlewares/on-error.test.d.ts +1 -0
- package/network/middlewares/on-method.test.d.cts +1 -0
- package/network/middlewares/on-method.test.d.ts +1 -0
- package/network/mtproto-session.cjs +9 -2
- package/network/mtproto-session.d.cts +5 -2
- package/network/mtproto-session.d.ts +5 -2
- package/network/mtproto-session.js +9 -2
- package/network/mtproxy/_fake-tls.cjs +169 -107
- package/network/mtproxy/_fake-tls.js +169 -107
- package/network/mtproxy/_fake-tls.test.d.cts +1 -0
- package/network/mtproxy/_fake-tls.test.d.ts +1 -0
- package/network/multi-session-connection.cjs +7 -0
- package/network/multi-session-connection.d.cts +2 -0
- package/network/multi-session-connection.d.ts +2 -0
- package/network/multi-session-connection.js +7 -0
- package/network/network-manager.cjs +7 -1
- package/network/network-manager.js +7 -1
- package/network/resource-limiter.cjs +60 -0
- package/network/resource-limiter.d.cts +11 -0
- package/network/resource-limiter.d.ts +11 -0
- package/network/resource-limiter.js +55 -0
- package/network/resource-limiter.test.d.cts +1 -0
- package/network/resource-limiter.test.d.ts +1 -0
- package/network/server-salt.cjs +7 -3
- package/network/server-salt.d.cts +2 -0
- package/network/server-salt.d.ts +2 -0
- package/network/server-salt.js +7 -3
- package/network/session-connection.cjs +106 -20
- package/network/session-connection.d.cts +11 -0
- package/network/session-connection.d.ts +11 -0
- package/network/session-connection.js +106 -20
- package/package.json +1 -1
- package/tl/api-schema.json +1 -1
- package/tl/binary/reader.cjs +115 -109
- package/tl/binary/reader.js +115 -109
- package/tl/binary/writer.cjs +243 -245
- package/tl/binary/writer.js +243 -245
- package/tl/index.d.cts +227 -216
- package/tl/index.d.ts +227 -216
- package/tl/inner-tl.cjs +3 -1
- package/tl/inner-tl.js +3 -1
- package/types/utils.d.cts +4 -0
- package/types/utils.d.ts +4 -0
- package/utils.cjs +4 -0
- package/utils.js +5 -1
|
@@ -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
|
};
|
|
@@ -0,0 +1,164 @@
|
|
|
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 utils = require("../../types/utils.cjs");
|
|
9
|
+
function walkRichText(text, visitor) {
|
|
10
|
+
if (!text) return;
|
|
11
|
+
visitor.richText?.(text);
|
|
12
|
+
switch (text._) {
|
|
13
|
+
case "textEmpty":
|
|
14
|
+
case "textPlain":
|
|
15
|
+
case "textEmail":
|
|
16
|
+
case "textPhone":
|
|
17
|
+
case "textImage":
|
|
18
|
+
case "textMath":
|
|
19
|
+
case "textCustomEmoji":
|
|
20
|
+
break;
|
|
21
|
+
case "textBold":
|
|
22
|
+
case "textItalic":
|
|
23
|
+
case "textUnderline":
|
|
24
|
+
case "textStrike":
|
|
25
|
+
case "textFixed":
|
|
26
|
+
case "textUrl":
|
|
27
|
+
case "textSubscript":
|
|
28
|
+
case "textSuperscript":
|
|
29
|
+
case "textMarked":
|
|
30
|
+
case "textAnchor":
|
|
31
|
+
case "textSpoiler":
|
|
32
|
+
case "textMention":
|
|
33
|
+
case "textHashtag":
|
|
34
|
+
case "textBotCommand":
|
|
35
|
+
case "textCashtag":
|
|
36
|
+
case "textAutoUrl":
|
|
37
|
+
case "textAutoEmail":
|
|
38
|
+
case "textAutoPhone":
|
|
39
|
+
case "textBankCard":
|
|
40
|
+
case "textDate":
|
|
41
|
+
case "textMentionName":
|
|
42
|
+
walkRichText(text.text, visitor);
|
|
43
|
+
break;
|
|
44
|
+
case "textConcat":
|
|
45
|
+
for (const child of text.texts) walkRichText(child, visitor);
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
utils.assertNever();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function walkPageCaption(caption, visitor) {
|
|
52
|
+
if (!caption) return;
|
|
53
|
+
walkRichText(caption.text, visitor);
|
|
54
|
+
walkRichText(caption.credit, visitor);
|
|
55
|
+
}
|
|
56
|
+
function walkPageBlock(block, visitor) {
|
|
57
|
+
if (!block) return;
|
|
58
|
+
visitor.pageBlock?.(block);
|
|
59
|
+
switch (block._) {
|
|
60
|
+
case "pageBlockUnsupported":
|
|
61
|
+
case "pageBlockDivider":
|
|
62
|
+
case "pageBlockAnchor":
|
|
63
|
+
case "pageBlockMath":
|
|
64
|
+
break;
|
|
65
|
+
case "pageBlockTitle":
|
|
66
|
+
case "pageBlockSubtitle":
|
|
67
|
+
case "pageBlockHeader":
|
|
68
|
+
case "pageBlockSubheader":
|
|
69
|
+
case "pageBlockParagraph":
|
|
70
|
+
case "pageBlockPreformatted":
|
|
71
|
+
case "pageBlockFooter":
|
|
72
|
+
case "pageBlockKicker":
|
|
73
|
+
case "pageBlockThinking":
|
|
74
|
+
case "pageBlockHeading1":
|
|
75
|
+
case "pageBlockHeading2":
|
|
76
|
+
case "pageBlockHeading3":
|
|
77
|
+
case "pageBlockHeading4":
|
|
78
|
+
case "pageBlockHeading5":
|
|
79
|
+
case "pageBlockHeading6":
|
|
80
|
+
walkRichText(block.text, visitor);
|
|
81
|
+
break;
|
|
82
|
+
case "pageBlockAuthorDate":
|
|
83
|
+
walkRichText(block.author, visitor);
|
|
84
|
+
break;
|
|
85
|
+
case "pageBlockList":
|
|
86
|
+
for (const item of block.items) {
|
|
87
|
+
switch (item._) {
|
|
88
|
+
case "pageListItemText":
|
|
89
|
+
walkRichText(item.text, visitor);
|
|
90
|
+
break;
|
|
91
|
+
case "pageListItemBlocks":
|
|
92
|
+
for (const block2 of item.blocks) walkPageBlock(block2, visitor);
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
utils.assertNever();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case "pageBlockOrderedList":
|
|
100
|
+
for (const item of block.items) {
|
|
101
|
+
switch (item._) {
|
|
102
|
+
case "pageListOrderedItemText":
|
|
103
|
+
walkRichText(item.text, visitor);
|
|
104
|
+
break;
|
|
105
|
+
case "pageListOrderedItemBlocks":
|
|
106
|
+
for (const block2 of item.blocks) walkPageBlock(block2, visitor);
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
utils.assertNever();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
case "pageBlockBlockquote":
|
|
114
|
+
case "pageBlockPullquote":
|
|
115
|
+
walkRichText(block.text, visitor);
|
|
116
|
+
walkRichText(block.caption, visitor);
|
|
117
|
+
break;
|
|
118
|
+
case "pageBlockPhoto":
|
|
119
|
+
case "pageBlockVideo":
|
|
120
|
+
case "pageBlockEmbed":
|
|
121
|
+
case "pageBlockAudio":
|
|
122
|
+
case "pageBlockMap":
|
|
123
|
+
case "inputPageBlockMap":
|
|
124
|
+
walkPageCaption(block.caption, visitor);
|
|
125
|
+
break;
|
|
126
|
+
case "pageBlockCover":
|
|
127
|
+
walkPageBlock(block.cover, visitor);
|
|
128
|
+
break;
|
|
129
|
+
case "pageBlockEmbedPost":
|
|
130
|
+
for (const child of block.blocks) walkPageBlock(child, visitor);
|
|
131
|
+
walkPageCaption(block.caption, visitor);
|
|
132
|
+
break;
|
|
133
|
+
case "pageBlockCollage":
|
|
134
|
+
case "pageBlockSlideshow":
|
|
135
|
+
for (const child of block.items) walkPageBlock(child, visitor);
|
|
136
|
+
walkPageCaption(block.caption, visitor);
|
|
137
|
+
break;
|
|
138
|
+
case "pageBlockChannel":
|
|
139
|
+
break;
|
|
140
|
+
case "pageBlockTable":
|
|
141
|
+
walkRichText(block.title, visitor);
|
|
142
|
+
for (const row of block.rows) {
|
|
143
|
+
for (const cell of row.cells) walkRichText(cell.text, visitor);
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
case "pageBlockDetails":
|
|
147
|
+
for (const child of block.blocks) walkPageBlock(child, visitor);
|
|
148
|
+
walkRichText(block.title, visitor);
|
|
149
|
+
break;
|
|
150
|
+
case "pageBlockRelatedArticles":
|
|
151
|
+
walkRichText(block.title, visitor);
|
|
152
|
+
break;
|
|
153
|
+
case "pageBlockBlockquoteBlocks":
|
|
154
|
+
for (const child of block.blocks) walkPageBlock(child, visitor);
|
|
155
|
+
walkRichText(block.caption, visitor);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
utils.assertNever();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function walkPageBlocks(blocks, visitor) {
|
|
162
|
+
for (const block of blocks) walkPageBlock(block, visitor);
|
|
163
|
+
}
|
|
164
|
+
exports.walkPageBlocks = walkPageBlocks;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { tl } from '../../tl/index.js';
|
|
2
|
+
export interface PageBlockVisitor {
|
|
3
|
+
/** Called for every rich text node in the tree */
|
|
4
|
+
richText?: (text: tl.TypeRichText) => void;
|
|
5
|
+
/** Called for every page block in the tree */
|
|
6
|
+
pageBlock?: (block: tl.TypePageBlock) => void;
|
|
7
|
+
}
|
|
8
|
+
/** Recursively walk a list of page blocks, invoking the given visitor callbacks */
|
|
9
|
+
export declare function walkPageBlocks(blocks: tl.TypePageBlock[], visitor: PageBlockVisitor): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { tl } from '../../tl/index.js';
|
|
2
|
+
export interface PageBlockVisitor {
|
|
3
|
+
/** Called for every rich text node in the tree */
|
|
4
|
+
richText?: (text: tl.TypeRichText) => void;
|
|
5
|
+
/** Called for every page block in the tree */
|
|
6
|
+
pageBlock?: (block: tl.TypePageBlock) => void;
|
|
7
|
+
}
|
|
8
|
+
/** Recursively walk a list of page blocks, invoking the given visitor callbacks */
|
|
9
|
+
export declare function walkPageBlocks(blocks: tl.TypePageBlock[], visitor: PageBlockVisitor): void;
|