teleproto 1.214.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.
- package/CryptoFile.d.ts +2 -0
- package/CryptoFile.js +37 -0
- package/Helpers.d.ts +150 -0
- package/Helpers.js +477 -0
- package/LICENSE +23 -0
- package/Password.d.ts +14 -0
- package/Password.js +270 -0
- package/README.md +98 -0
- package/Utils.d.ts +227 -0
- package/Utils.js +1247 -0
- package/Version.d.ts +1 -0
- package/Version.js +4 -0
- package/client/2fa.d.ts +48 -0
- package/client/2fa.js +108 -0
- package/client/TelegramClient.d.ts +1043 -0
- package/client/TelegramClient.js +1181 -0
- package/client/account.d.ts +0 -0
- package/client/account.js +1 -0
- package/client/auth.d.ts +92 -0
- package/client/auth.js +388 -0
- package/client/bots.d.ts +6 -0
- package/client/bots.js +23 -0
- package/client/buttons.d.ts +4 -0
- package/client/buttons.js +86 -0
- package/client/chats.d.ts +45 -0
- package/client/chats.js +350 -0
- package/client/dialogs.d.ts +52 -0
- package/client/dialogs.js +174 -0
- package/client/downloads.d.ts +156 -0
- package/client/downloads.js +614 -0
- package/client/fs.d.ts +1 -0
- package/client/fs.js +17 -0
- package/client/index.d.ts +15 -0
- package/client/index.js +64 -0
- package/client/messageParse.d.ts +17 -0
- package/client/messageParse.js +191 -0
- package/client/messages.d.ts +263 -0
- package/client/messages.js +813 -0
- package/client/os.d.ts +2 -0
- package/client/os.js +37 -0
- package/client/path.d.ts +2 -0
- package/client/path.js +7 -0
- package/client/telegramBaseClient.d.ts +237 -0
- package/client/telegramBaseClient.js +368 -0
- package/client/updates.d.ts +33 -0
- package/client/updates.js +260 -0
- package/client/uploads.d.ts +136 -0
- package/client/uploads.js +514 -0
- package/client/users.d.ts +29 -0
- package/client/users.js +490 -0
- package/crypto/AuthKey.d.ts +19 -0
- package/crypto/AuthKey.js +76 -0
- package/crypto/CTR.d.ts +5 -0
- package/crypto/CTR.js +16 -0
- package/crypto/Factorizator.d.ts +19 -0
- package/crypto/Factorizator.js +74 -0
- package/crypto/IGE.d.ts +11 -0
- package/crypto/IGE.js +115 -0
- package/crypto/RSA.d.ts +14 -0
- package/crypto/RSA.js +70 -0
- package/crypto/converters.d.ts +19 -0
- package/crypto/converters.js +52 -0
- package/crypto/crypto.d.ts +19 -0
- package/crypto/crypto.js +58 -0
- package/crypto/words.d.ts +6 -0
- package/crypto/words.js +47 -0
- package/define.d.ts +77 -0
- package/entityCache.d.ts +7 -0
- package/entityCache.js +79 -0
- package/errors/Common.d.ts +71 -0
- package/errors/Common.js +122 -0
- package/errors/RPCBaseErrors.d.ts +84 -0
- package/errors/RPCBaseErrors.js +134 -0
- package/errors/RPCErrorList.d.ts +37 -0
- package/errors/RPCErrorList.js +117 -0
- package/errors/index.d.ts +11 -0
- package/errors/index.js +32 -0
- package/events/Album.d.ts +36 -0
- package/events/Album.js +104 -0
- package/events/CallbackQuery.d.ts +73 -0
- package/events/CallbackQuery.js +193 -0
- package/events/DeletedMessage.d.ts +45 -0
- package/events/DeletedMessage.js +63 -0
- package/events/EditedMessage.d.ts +30 -0
- package/events/EditedMessage.js +41 -0
- package/events/NewMessage.d.ts +89 -0
- package/events/NewMessage.js +182 -0
- package/events/Raw.d.ts +29 -0
- package/events/Raw.js +43 -0
- package/events/common.d.ts +66 -0
- package/events/common.js +141 -0
- package/events/index.d.ts +2 -0
- package/events/index.js +8 -0
- package/extensions/AsyncQueue.d.ts +10 -0
- package/extensions/AsyncQueue.js +32 -0
- package/extensions/BinaryReader.d.ts +99 -0
- package/extensions/BinaryReader.js +242 -0
- package/extensions/BinaryWriter.d.ts +6 -0
- package/extensions/BinaryWriter.js +15 -0
- package/extensions/Deferred.d.ts +8 -0
- package/extensions/Deferred.js +16 -0
- package/extensions/Logger.d.ts +54 -0
- package/extensions/Logger.js +128 -0
- package/extensions/MessagePacker.d.ts +21 -0
- package/extensions/MessagePacker.js +154 -0
- package/extensions/PendingState.d.ts +12 -0
- package/extensions/PendingState.js +29 -0
- package/extensions/PromisedNetSockets.d.ts +24 -0
- package/extensions/PromisedNetSockets.js +192 -0
- package/extensions/PromisedWebSockets.d.ts +18 -0
- package/extensions/PromisedWebSockets.js +124 -0
- package/extensions/html.d.ts +5 -0
- package/extensions/html.js +228 -0
- package/extensions/index.d.ts +7 -0
- package/extensions/index.js +17 -0
- package/extensions/markdown.d.ts +5 -0
- package/extensions/markdown.js +76 -0
- package/extensions/markdownv2.d.ts +5 -0
- package/extensions/markdownv2.js +51 -0
- package/extensions/net.d.ts +1 -0
- package/extensions/net.js +17 -0
- package/extensions/socks.d.ts +1 -0
- package/extensions/socks.js +17 -0
- package/index.d.ts +14 -0
- package/index.js +62 -0
- package/inspect.d.ts +1 -0
- package/inspect.js +5 -0
- package/network/Authenticator.d.ts +12 -0
- package/network/Authenticator.js +192 -0
- package/network/MTProtoPlainSender.d.ts +19 -0
- package/network/MTProtoPlainSender.js +74 -0
- package/network/MTProtoSender.d.ts +290 -0
- package/network/MTProtoSender.js +873 -0
- package/network/MTProtoState.d.ts +102 -0
- package/network/MTProtoState.js +267 -0
- package/network/RequestState.d.ts +18 -0
- package/network/RequestState.js +35 -0
- package/network/connection/Connection.d.ts +69 -0
- package/network/connection/Connection.js +162 -0
- package/network/connection/TCPAbridged.d.ts +19 -0
- package/network/connection/TCPAbridged.js +58 -0
- package/network/connection/TCPFull.d.ts +16 -0
- package/network/connection/TCPFull.js +61 -0
- package/network/connection/TCPMTProxy.d.ts +49 -0
- package/network/connection/TCPMTProxy.js +121 -0
- package/network/connection/TCPObfuscated.d.ts +18 -0
- package/network/connection/TCPObfuscated.js +78 -0
- package/network/connection/index.d.ts +4 -0
- package/network/connection/index.js +11 -0
- package/network/index.d.ts +11 -0
- package/network/index.js +23 -0
- package/package.json +50 -0
- package/requestIter.d.ts +24 -0
- package/requestIter.js +109 -0
- package/sessions/Abstract.d.ts +103 -0
- package/sessions/Abstract.js +6 -0
- package/sessions/Memory.d.ts +38 -0
- package/sessions/Memory.js +272 -0
- package/sessions/StoreSession.d.ts +14 -0
- package/sessions/StoreSession.js +77 -0
- package/sessions/StringSession.d.ts +32 -0
- package/sessions/StringSession.js +116 -0
- package/sessions/index.d.ts +4 -0
- package/sessions/index.js +11 -0
- package/sessions/localStorage.d.ts +1 -0
- package/sessions/localStorage.js +4 -0
- package/tl/AllTLObjects.d.ts +3 -0
- package/tl/AllTLObjects.js +17 -0
- package/tl/MTProtoRequest.d.ts +18 -0
- package/tl/MTProtoRequest.js +38 -0
- package/tl/api.d.ts +32488 -0
- package/tl/api.js +507 -0
- package/tl/apiTl.d.ts +2 -0
- package/tl/apiTl.js +2209 -0
- package/tl/core/GZIPPacked.d.ts +15 -0
- package/tl/core/GZIPPacked.js +51 -0
- package/tl/core/MessageContainer.d.ts +12 -0
- package/tl/core/MessageContainer.js +42 -0
- package/tl/core/RPCResult.d.ts +14 -0
- package/tl/core/RPCResult.js +32 -0
- package/tl/core/TLMessage.d.ts +10 -0
- package/tl/core/TLMessage.js +14 -0
- package/tl/core/index.d.ts +6 -0
- package/tl/core/index.js +16 -0
- package/tl/custom/button.d.ts +24 -0
- package/tl/custom/button.js +78 -0
- package/tl/custom/chatGetter.d.ts +29 -0
- package/tl/custom/chatGetter.js +116 -0
- package/tl/custom/dialog.d.ts +30 -0
- package/tl/custom/dialog.js +40 -0
- package/tl/custom/draft.d.ts +21 -0
- package/tl/custom/draft.js +48 -0
- package/tl/custom/file.d.ts +21 -0
- package/tl/custom/file.js +68 -0
- package/tl/custom/forward.d.ts +15 -0
- package/tl/custom/forward.js +47 -0
- package/tl/custom/index.d.ts +1 -0
- package/tl/custom/index.js +5 -0
- package/tl/custom/inlineResult.d.ts +32 -0
- package/tl/custom/inlineResult.js +87 -0
- package/tl/custom/inlineResults.d.ts +20 -0
- package/tl/custom/inlineResults.js +26 -0
- package/tl/custom/message.d.ts +427 -0
- package/tl/custom/message.js +716 -0
- package/tl/custom/messageButton.d.ts +54 -0
- package/tl/custom/messageButton.js +152 -0
- package/tl/custom/senderGetter.d.ts +28 -0
- package/tl/custom/senderGetter.js +55 -0
- package/tl/generateModule.d.ts +1 -0
- package/tl/generateModule.js +17 -0
- package/tl/generationHelpers.d.ts +11 -0
- package/tl/generationHelpers.js +289 -0
- package/tl/index.d.ts +3 -0
- package/tl/index.js +10 -0
- package/tl/patched/index.d.ts +2 -0
- package/tl/patched/index.js +76 -0
- package/tl/schemaTl.d.ts +2 -0
- package/tl/schemaTl.js +64 -0
- package/tl/types-generator/generate.d.ts +1 -0
- package/tl/types-generator/generate.js +84 -0
- package/tl/types-generator/template.d.ts +6 -0
- package/tl/types-generator/template.js +257 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CustomFile = void 0;
|
|
7
|
+
exports.uploadFile = uploadFile;
|
|
8
|
+
exports._fileToMedia = _fileToMedia;
|
|
9
|
+
exports._sendAlbum = _sendAlbum;
|
|
10
|
+
exports.sendFile = sendFile;
|
|
11
|
+
const tl_1 = require("../tl");
|
|
12
|
+
const Helpers_1 = require("../Helpers");
|
|
13
|
+
const Utils_1 = require("../Utils");
|
|
14
|
+
const path_1 = __importDefault(require("./path"));
|
|
15
|
+
const fs_1 = require("./fs");
|
|
16
|
+
const index_1 = require("../index");
|
|
17
|
+
const messageParse_1 = require("./messageParse");
|
|
18
|
+
const messages_1 = require("./messages");
|
|
19
|
+
const big_integer_1 = __importDefault(require("big-integer"));
|
|
20
|
+
/**
|
|
21
|
+
* A custom file class that mimics the browser's File class.<br/>
|
|
22
|
+
* You should use this whenever you want to upload a file.
|
|
23
|
+
*/
|
|
24
|
+
class CustomFile {
|
|
25
|
+
constructor(name, size, path, buffer) {
|
|
26
|
+
this.name = name;
|
|
27
|
+
this.size = size;
|
|
28
|
+
this.path = path;
|
|
29
|
+
this.buffer = buffer;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.CustomFile = CustomFile;
|
|
33
|
+
class CustomBuffer {
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
if (!options.buffer && !options.filePath) {
|
|
37
|
+
throw new Error("Either one of `buffer` or `filePath` should be specified");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async slice(begin, end) {
|
|
41
|
+
const { buffer, filePath } = this.options;
|
|
42
|
+
if (buffer) {
|
|
43
|
+
return buffer.slice(begin, end);
|
|
44
|
+
}
|
|
45
|
+
else if (filePath) {
|
|
46
|
+
const buffSize = end - begin;
|
|
47
|
+
const buff = Buffer.alloc(buffSize);
|
|
48
|
+
const fHandle = await fs_1.promises.open(filePath, "r");
|
|
49
|
+
await fHandle.read(buff, 0, buffSize, begin);
|
|
50
|
+
await fHandle.close();
|
|
51
|
+
return Buffer.from(buff);
|
|
52
|
+
}
|
|
53
|
+
return Buffer.alloc(0);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const KB_TO_BYTES = 1024;
|
|
57
|
+
const LARGE_FILE_THRESHOLD = 10 * 1024 * 1024;
|
|
58
|
+
const UPLOAD_TIMEOUT = 15 * 1000;
|
|
59
|
+
const DISCONNECT_SLEEP = 1000;
|
|
60
|
+
const BUFFER_SIZE_2GB = 2 ** 31;
|
|
61
|
+
const BUFFER_SIZE_20MB = 20 * 1024 * 1024;
|
|
62
|
+
async function getFileBuffer(file, fileSize, maxBufferSize) {
|
|
63
|
+
const options = {};
|
|
64
|
+
if (fileSize > maxBufferSize && file instanceof CustomFile) {
|
|
65
|
+
options.filePath = file.path;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
options.buffer = Buffer.from(await fileToBuffer(file));
|
|
69
|
+
}
|
|
70
|
+
return new CustomBuffer(options);
|
|
71
|
+
}
|
|
72
|
+
/** @hidden */
|
|
73
|
+
async function uploadFile(client, fileParams) {
|
|
74
|
+
const { file, onProgress } = fileParams;
|
|
75
|
+
let { workers } = fileParams;
|
|
76
|
+
const { name, size } = file;
|
|
77
|
+
const fileId = (0, Helpers_1.readBigIntFromBuffer)((0, Helpers_1.generateRandomBytes)(8), true, true);
|
|
78
|
+
const isLarge = size > LARGE_FILE_THRESHOLD;
|
|
79
|
+
const partSize = (0, Utils_1.getAppropriatedPartSize)((0, big_integer_1.default)(size)) * KB_TO_BYTES;
|
|
80
|
+
const partCount = Math.floor((size + partSize - 1) / partSize);
|
|
81
|
+
const buffer = await getFileBuffer(file, size, fileParams.maxBufferSize || BUFFER_SIZE_20MB - 1);
|
|
82
|
+
// Make sure a new sender can be created before starting upload
|
|
83
|
+
await client.getSender(client.session.dcId);
|
|
84
|
+
if (!workers || !size) {
|
|
85
|
+
workers = 1;
|
|
86
|
+
}
|
|
87
|
+
if (workers >= partCount) {
|
|
88
|
+
workers = partCount;
|
|
89
|
+
}
|
|
90
|
+
let progress = 0;
|
|
91
|
+
if (onProgress) {
|
|
92
|
+
onProgress(progress);
|
|
93
|
+
}
|
|
94
|
+
for (let i = 0; i < partCount; i += workers) {
|
|
95
|
+
const sendingParts = [];
|
|
96
|
+
let end = i + workers;
|
|
97
|
+
if (end > partCount) {
|
|
98
|
+
end = partCount;
|
|
99
|
+
}
|
|
100
|
+
for (let j = i; j < end; j++) {
|
|
101
|
+
let endPart = (j + 1) * partSize;
|
|
102
|
+
if (endPart > size) {
|
|
103
|
+
endPart = size;
|
|
104
|
+
}
|
|
105
|
+
if (endPart == j * partSize) {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
const bytes = await buffer.slice(j * partSize, endPart);
|
|
109
|
+
// eslint-disable-next-line no-loop-func
|
|
110
|
+
sendingParts.push((async (jMemo, bytesMemo) => {
|
|
111
|
+
while (true) {
|
|
112
|
+
let sender;
|
|
113
|
+
try {
|
|
114
|
+
// We always upload from the DC we are in
|
|
115
|
+
sender = await client.getSender(client.session.dcId);
|
|
116
|
+
await sender.send(isLarge
|
|
117
|
+
? new tl_1.Api.upload.SaveBigFilePart({
|
|
118
|
+
fileId,
|
|
119
|
+
filePart: jMemo,
|
|
120
|
+
fileTotalParts: partCount,
|
|
121
|
+
bytes: bytesMemo,
|
|
122
|
+
})
|
|
123
|
+
: new tl_1.Api.upload.SaveFilePart({
|
|
124
|
+
fileId,
|
|
125
|
+
filePart: jMemo,
|
|
126
|
+
bytes: bytesMemo,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (sender && !sender.isConnected()) {
|
|
131
|
+
await (0, Helpers_1.sleep)(DISCONNECT_SLEEP);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
else if (err instanceof index_1.errors.FloodWaitError) {
|
|
135
|
+
await (0, Helpers_1.sleep)(err.seconds * 1000);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
if (onProgress) {
|
|
141
|
+
if (onProgress.isCanceled) {
|
|
142
|
+
throw new Error("USER_CANCELED");
|
|
143
|
+
}
|
|
144
|
+
progress += 1 / partCount;
|
|
145
|
+
onProgress(progress);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
})(j, bytes));
|
|
150
|
+
}
|
|
151
|
+
await Promise.all(sendingParts);
|
|
152
|
+
}
|
|
153
|
+
return isLarge
|
|
154
|
+
? new tl_1.Api.InputFileBig({
|
|
155
|
+
id: fileId,
|
|
156
|
+
parts: partCount,
|
|
157
|
+
name,
|
|
158
|
+
})
|
|
159
|
+
: new tl_1.Api.InputFile({
|
|
160
|
+
id: fileId,
|
|
161
|
+
parts: partCount,
|
|
162
|
+
name,
|
|
163
|
+
md5Checksum: "", // This is not a "flag", so not sure if we can make it optional.
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/** @hidden */
|
|
167
|
+
async function _fileToMedia(client, { file, forceDocument, fileSize, progressCallback, attributes, thumb, voiceNote = false, videoNote = false, supportsStreaming = false, mimeType, asImage, workers = 1, }) {
|
|
168
|
+
if (!file) {
|
|
169
|
+
return { fileHandle: undefined, media: undefined, image: undefined };
|
|
170
|
+
}
|
|
171
|
+
const isImage = index_1.utils.isImage(file);
|
|
172
|
+
if (asImage == undefined) {
|
|
173
|
+
asImage = isImage && !forceDocument;
|
|
174
|
+
}
|
|
175
|
+
if (typeof file == "object" &&
|
|
176
|
+
!Buffer.isBuffer(file) &&
|
|
177
|
+
!(file instanceof tl_1.Api.InputFile) &&
|
|
178
|
+
!(file instanceof tl_1.Api.InputFileBig) &&
|
|
179
|
+
!(file instanceof CustomFile) &&
|
|
180
|
+
!("read" in file)) {
|
|
181
|
+
try {
|
|
182
|
+
return {
|
|
183
|
+
fileHandle: undefined,
|
|
184
|
+
media: index_1.utils.getInputMedia(file, {
|
|
185
|
+
isPhoto: asImage,
|
|
186
|
+
attributes: attributes,
|
|
187
|
+
forceDocument: forceDocument,
|
|
188
|
+
voiceNote: voiceNote,
|
|
189
|
+
videoNote: videoNote,
|
|
190
|
+
supportsStreaming: supportsStreaming,
|
|
191
|
+
}),
|
|
192
|
+
image: asImage,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
return {
|
|
197
|
+
fileHandle: undefined,
|
|
198
|
+
media: undefined,
|
|
199
|
+
image: isImage,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
let media;
|
|
204
|
+
let fileHandle;
|
|
205
|
+
let createdFile;
|
|
206
|
+
if (file instanceof tl_1.Api.InputFile || file instanceof tl_1.Api.InputFileBig) {
|
|
207
|
+
fileHandle = file;
|
|
208
|
+
}
|
|
209
|
+
else if (typeof file == "string" &&
|
|
210
|
+
(file.startsWith("https://") || file.startsWith("http://"))) {
|
|
211
|
+
if (asImage) {
|
|
212
|
+
media = new tl_1.Api.InputMediaPhotoExternal({ url: file });
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
media = new tl_1.Api.InputMediaDocumentExternal({ url: file });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else if (!(typeof file == "string") || (await fs_1.promises.lstat(file)).isFile()) {
|
|
219
|
+
if (typeof file == "string") {
|
|
220
|
+
createdFile = new CustomFile(path_1.default.basename(file), (await fs_1.promises.stat(file)).size, file);
|
|
221
|
+
}
|
|
222
|
+
else if ((typeof File !== "undefined" && file instanceof File) ||
|
|
223
|
+
file instanceof CustomFile) {
|
|
224
|
+
createdFile = file;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
let name;
|
|
228
|
+
if ("name" in file) {
|
|
229
|
+
// @ts-ignore
|
|
230
|
+
name = file.name;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
name = "unnamed";
|
|
234
|
+
}
|
|
235
|
+
if (Buffer.isBuffer(file)) {
|
|
236
|
+
createdFile = new CustomFile(name, file.length, "", file);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!createdFile) {
|
|
240
|
+
throw new Error(`Could not create file from ${JSON.stringify(file)}`);
|
|
241
|
+
}
|
|
242
|
+
fileHandle = await uploadFile(client, {
|
|
243
|
+
file: createdFile,
|
|
244
|
+
onProgress: progressCallback,
|
|
245
|
+
workers: workers,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
throw new Error(`"Not a valid path nor a url ${file}`);
|
|
250
|
+
}
|
|
251
|
+
if (media != undefined) {
|
|
252
|
+
}
|
|
253
|
+
else if (fileHandle == undefined) {
|
|
254
|
+
throw new Error(`Failed to convert ${file} to media. Not an existing file or an HTTP URL`);
|
|
255
|
+
}
|
|
256
|
+
else if (asImage) {
|
|
257
|
+
media = new tl_1.Api.InputMediaUploadedPhoto({
|
|
258
|
+
file: fileHandle,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
let res = index_1.utils.getAttributes(file, {
|
|
264
|
+
mimeType: mimeType,
|
|
265
|
+
attributes: attributes,
|
|
266
|
+
forceDocument: forceDocument && !isImage,
|
|
267
|
+
voiceNote: voiceNote,
|
|
268
|
+
videoNote: videoNote,
|
|
269
|
+
supportsStreaming: supportsStreaming,
|
|
270
|
+
thumb: thumb,
|
|
271
|
+
});
|
|
272
|
+
attributes = res.attrs;
|
|
273
|
+
mimeType = res.mimeType;
|
|
274
|
+
let uploadedThumb;
|
|
275
|
+
if (!thumb) {
|
|
276
|
+
uploadedThumb = undefined;
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// todo refactor
|
|
280
|
+
if (typeof thumb == "string") {
|
|
281
|
+
uploadedThumb = new CustomFile(path_1.default.basename(thumb), (await fs_1.promises.stat(thumb)).size, thumb);
|
|
282
|
+
}
|
|
283
|
+
else if (typeof File !== "undefined" && thumb instanceof File) {
|
|
284
|
+
uploadedThumb = thumb;
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
let name;
|
|
288
|
+
if ("name" in thumb) {
|
|
289
|
+
name = thumb.name;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
name = "unnamed";
|
|
293
|
+
}
|
|
294
|
+
if (Buffer.isBuffer(thumb)) {
|
|
295
|
+
uploadedThumb = new CustomFile(name, thumb.length, "", thumb);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (!uploadedThumb) {
|
|
299
|
+
throw new Error(`Could not create file from ${file}`);
|
|
300
|
+
}
|
|
301
|
+
uploadedThumb = await uploadFile(client, {
|
|
302
|
+
file: uploadedThumb,
|
|
303
|
+
workers: 1,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
media = new tl_1.Api.InputMediaUploadedDocument({
|
|
307
|
+
file: fileHandle,
|
|
308
|
+
mimeType: mimeType,
|
|
309
|
+
attributes: attributes,
|
|
310
|
+
thumb: uploadedThumb,
|
|
311
|
+
forceFile: forceDocument && !isImage,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
fileHandle: fileHandle,
|
|
316
|
+
media: media,
|
|
317
|
+
image: asImage,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/** @hidden */
|
|
321
|
+
async function _sendAlbum(client, entity, { file, caption, forceDocument = false, fileSize, clearDraft = false, progressCallback, replyTo, attributes, thumb, parseMode, voiceNote = false, videoNote = false, silent, supportsStreaming = false, scheduleDate, workers = 1, noforwards, commentTo, topMsgId, }) {
|
|
322
|
+
entity = await client.getInputEntity(entity);
|
|
323
|
+
let files = [];
|
|
324
|
+
if (!Array.isArray(file)) {
|
|
325
|
+
files = [file];
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
files = file;
|
|
329
|
+
}
|
|
330
|
+
if (!Array.isArray(caption)) {
|
|
331
|
+
if (!caption) {
|
|
332
|
+
caption = "";
|
|
333
|
+
}
|
|
334
|
+
caption = [caption];
|
|
335
|
+
}
|
|
336
|
+
const captions = [];
|
|
337
|
+
for (const c of caption) {
|
|
338
|
+
captions.push(await (0, messageParse_1._parseMessageText)(client, c, parseMode));
|
|
339
|
+
}
|
|
340
|
+
if (commentTo != undefined) {
|
|
341
|
+
const discussionData = await (0, messages_1.getCommentData)(client, entity, commentTo);
|
|
342
|
+
entity = discussionData.entity;
|
|
343
|
+
replyTo = discussionData.replyTo;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
replyTo = index_1.utils.getMessageId(replyTo);
|
|
347
|
+
}
|
|
348
|
+
if (!attributes) {
|
|
349
|
+
attributes = [];
|
|
350
|
+
}
|
|
351
|
+
let index = 0;
|
|
352
|
+
const albumFiles = [];
|
|
353
|
+
for (const file of files) {
|
|
354
|
+
let { fileHandle, media, image } = await _fileToMedia(client, {
|
|
355
|
+
file: file,
|
|
356
|
+
forceDocument: forceDocument,
|
|
357
|
+
fileSize: fileSize,
|
|
358
|
+
progressCallback: progressCallback,
|
|
359
|
+
// @ts-ignore
|
|
360
|
+
attributes: attributes[index],
|
|
361
|
+
thumb: thumb,
|
|
362
|
+
voiceNote: voiceNote,
|
|
363
|
+
videoNote: videoNote,
|
|
364
|
+
supportsStreaming: supportsStreaming,
|
|
365
|
+
workers: workers,
|
|
366
|
+
});
|
|
367
|
+
index++;
|
|
368
|
+
if (media instanceof tl_1.Api.InputMediaUploadedPhoto ||
|
|
369
|
+
media instanceof tl_1.Api.InputMediaPhotoExternal) {
|
|
370
|
+
const r = await client.invoke(new tl_1.Api.messages.UploadMedia({
|
|
371
|
+
peer: entity,
|
|
372
|
+
media,
|
|
373
|
+
}));
|
|
374
|
+
if (r instanceof tl_1.Api.MessageMediaPhoto) {
|
|
375
|
+
media = (0, Utils_1.getInputMedia)(r.photo);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else if (media instanceof tl_1.Api.InputMediaUploadedDocument) {
|
|
379
|
+
const r = await client.invoke(new tl_1.Api.messages.UploadMedia({
|
|
380
|
+
peer: entity,
|
|
381
|
+
media,
|
|
382
|
+
}));
|
|
383
|
+
if (r instanceof tl_1.Api.MessageMediaDocument) {
|
|
384
|
+
media = (0, Utils_1.getInputMedia)(r.document);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
let text = "";
|
|
388
|
+
let msgEntities = [];
|
|
389
|
+
if (captions.length) {
|
|
390
|
+
[text, msgEntities] = captions.shift();
|
|
391
|
+
}
|
|
392
|
+
albumFiles.push(new tl_1.Api.InputSingleMedia({
|
|
393
|
+
media: media,
|
|
394
|
+
message: text,
|
|
395
|
+
entities: msgEntities,
|
|
396
|
+
}));
|
|
397
|
+
}
|
|
398
|
+
let replyObject = undefined;
|
|
399
|
+
if (replyTo != undefined) {
|
|
400
|
+
replyObject = new tl_1.Api.InputReplyToMessage({
|
|
401
|
+
replyToMsgId: (0, Utils_1.getMessageId)(replyTo),
|
|
402
|
+
topMsgId: (0, Utils_1.getMessageId)(topMsgId),
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const result = await client.invoke(new tl_1.Api.messages.SendMultiMedia({
|
|
406
|
+
peer: entity,
|
|
407
|
+
replyTo: replyObject,
|
|
408
|
+
multiMedia: albumFiles,
|
|
409
|
+
silent: silent,
|
|
410
|
+
scheduleDate: scheduleDate,
|
|
411
|
+
clearDraft: clearDraft,
|
|
412
|
+
noforwards: noforwards,
|
|
413
|
+
}));
|
|
414
|
+
const randomIds = albumFiles.map((m) => m.randomId);
|
|
415
|
+
return client._getResponseMessage(randomIds, result, entity);
|
|
416
|
+
}
|
|
417
|
+
/** @hidden */
|
|
418
|
+
async function sendFile(client, entity, { file, caption, forceDocument = false, fileSize, clearDraft = false, progressCallback, replyTo, attributes, thumb, parseMode, formattingEntities, voiceNote = false, videoNote = false, buttons, silent, supportsStreaming = false, scheduleDate, workers = 1, noforwards, commentTo, topMsgId, }) {
|
|
419
|
+
if (!file) {
|
|
420
|
+
throw new Error("You need to specify a file");
|
|
421
|
+
}
|
|
422
|
+
if (!caption) {
|
|
423
|
+
caption = "";
|
|
424
|
+
}
|
|
425
|
+
entity = await client.getInputEntity(entity);
|
|
426
|
+
if (commentTo != undefined) {
|
|
427
|
+
const discussionData = await (0, messages_1.getCommentData)(client, entity, commentTo);
|
|
428
|
+
entity = discussionData.entity;
|
|
429
|
+
replyTo = discussionData.replyTo;
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
replyTo = index_1.utils.getMessageId(replyTo);
|
|
433
|
+
}
|
|
434
|
+
if (Array.isArray(file)) {
|
|
435
|
+
return await _sendAlbum(client, entity, {
|
|
436
|
+
file: file,
|
|
437
|
+
caption: caption,
|
|
438
|
+
replyTo: replyTo,
|
|
439
|
+
parseMode: parseMode,
|
|
440
|
+
attributes: attributes,
|
|
441
|
+
silent: silent,
|
|
442
|
+
scheduleDate: scheduleDate,
|
|
443
|
+
supportsStreaming: supportsStreaming,
|
|
444
|
+
clearDraft: clearDraft,
|
|
445
|
+
forceDocument: forceDocument,
|
|
446
|
+
noforwards: noforwards,
|
|
447
|
+
topMsgId: topMsgId,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
if (Array.isArray(caption)) {
|
|
451
|
+
caption = caption[0] || "";
|
|
452
|
+
}
|
|
453
|
+
let msgEntities;
|
|
454
|
+
if (formattingEntities != undefined) {
|
|
455
|
+
msgEntities = formattingEntities;
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
[caption, msgEntities] = await (0, messageParse_1._parseMessageText)(client, caption, parseMode);
|
|
459
|
+
}
|
|
460
|
+
const { fileHandle, media, image } = await _fileToMedia(client, {
|
|
461
|
+
file: file,
|
|
462
|
+
forceDocument: forceDocument,
|
|
463
|
+
fileSize: fileSize,
|
|
464
|
+
progressCallback: progressCallback,
|
|
465
|
+
// @ts-ignore
|
|
466
|
+
attributes: attributes,
|
|
467
|
+
thumb: thumb,
|
|
468
|
+
voiceNote: voiceNote,
|
|
469
|
+
videoNote: videoNote,
|
|
470
|
+
supportsStreaming: supportsStreaming,
|
|
471
|
+
workers: workers,
|
|
472
|
+
});
|
|
473
|
+
if (media == undefined) {
|
|
474
|
+
throw new Error(`Cannot use ${file} as file.`);
|
|
475
|
+
}
|
|
476
|
+
const markup = client.buildReplyMarkup(buttons);
|
|
477
|
+
let replyObject = undefined;
|
|
478
|
+
if (replyTo != undefined) {
|
|
479
|
+
replyObject = new tl_1.Api.InputReplyToMessage({
|
|
480
|
+
replyToMsgId: (0, Utils_1.getMessageId)(replyTo),
|
|
481
|
+
topMsgId: (0, Utils_1.getMessageId)(topMsgId),
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
const request = new tl_1.Api.messages.SendMedia({
|
|
485
|
+
peer: entity,
|
|
486
|
+
media: media,
|
|
487
|
+
replyTo: replyObject,
|
|
488
|
+
message: caption,
|
|
489
|
+
entities: msgEntities,
|
|
490
|
+
replyMarkup: markup,
|
|
491
|
+
silent: silent,
|
|
492
|
+
scheduleDate: scheduleDate,
|
|
493
|
+
clearDraft: clearDraft,
|
|
494
|
+
noforwards: noforwards,
|
|
495
|
+
});
|
|
496
|
+
const result = await client.invoke(request);
|
|
497
|
+
return client._getResponseMessage(request, result, entity);
|
|
498
|
+
}
|
|
499
|
+
function fileToBuffer(file) {
|
|
500
|
+
if (typeof File !== "undefined" && file instanceof File) {
|
|
501
|
+
return new Response(file).arrayBuffer();
|
|
502
|
+
}
|
|
503
|
+
else if (file instanceof CustomFile) {
|
|
504
|
+
if (file.buffer != undefined) {
|
|
505
|
+
return file.buffer;
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
return fs_1.promises.readFile(file.path);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
throw new Error("Could not create buffer from file " + file);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Api } from "../tl";
|
|
2
|
+
import type { Entity, EntityLike } from "../define";
|
|
3
|
+
import type { TelegramClient } from "..";
|
|
4
|
+
import bigInt from "big-integer";
|
|
5
|
+
import { MTProtoSender } from "../network";
|
|
6
|
+
/** @hidden */
|
|
7
|
+
export declare function invoke<R extends Api.AnyRequest>(client: TelegramClient, request: R, dcId?: number, otherSender?: MTProtoSender): Promise<R["__response"]>;
|
|
8
|
+
/** @hidden */
|
|
9
|
+
export declare function getMe<T extends boolean, R = T extends true ? Api.InputPeerUser : Api.User>(client: TelegramClient, inputPeer: T): Promise<R>;
|
|
10
|
+
/** @hidden */
|
|
11
|
+
export declare function isBot(client: TelegramClient): Promise<boolean | undefined>;
|
|
12
|
+
/** @hidden */
|
|
13
|
+
export declare function isUserAuthorized(client: TelegramClient): Promise<boolean>;
|
|
14
|
+
/** @hidden */
|
|
15
|
+
export declare function getEntity(client: TelegramClient, entity: EntityLike | EntityLike[]): Promise<Entity | Entity[]>;
|
|
16
|
+
/** @hidden */
|
|
17
|
+
export declare function getInputEntity(client: TelegramClient, peer: EntityLike): Promise<Api.TypeInputPeer>;
|
|
18
|
+
/** @hidden */
|
|
19
|
+
export declare function _getEntityFromString(client: TelegramClient, string: string): Promise<Api.TypeUser | Api.TypeInputPeer | Api.TypeChat>;
|
|
20
|
+
/** @hidden */
|
|
21
|
+
export declare function getPeerId(client: TelegramClient, peer: EntityLike, addMark?: boolean): Promise<string>;
|
|
22
|
+
/** @hidden */
|
|
23
|
+
export declare function _getPeer(client: TelegramClient, peer: EntityLike): Promise<Api.PeerUser | Api.PeerChat | Api.PeerChannel | undefined>;
|
|
24
|
+
/** @hidden */
|
|
25
|
+
export declare function _getInputDialog(client: TelegramClient, dialog: any): Promise<any>;
|
|
26
|
+
/** @hidden */
|
|
27
|
+
export declare function _getInputNotify(client: TelegramClient, notify: any): Promise<any>;
|
|
28
|
+
/** @hidden */
|
|
29
|
+
export declare function _selfId(client: TelegramClient): bigInt.BigInteger | undefined;
|