Finish implementing new upload

This commit is contained in:
Daniil Gentili 2019-06-24 20:03:15 +02:00
parent 7dbf529bb1
commit 83d9c2e1a0
3 changed files with 55 additions and 15 deletions

13
bot.php
View File

@ -46,6 +46,19 @@ class EventHandler extends \danog\MadelineProto\EventHandler
yield $this->messages->sendMessage(['peer' => $update, 'message' => "<code>$res</code>", 'reply_to_msg_id' => isset($update['message']['id']) ? $update['message']['id'] : null, 'parse_mode' => 'HTML']); //'entities' => [['_' => 'messageEntityPre', 'offset' => 0, 'length' => strlen($res), 'language' => 'json']]]);
if (isset($update['message']['media']) && $update['message']['media']['_'] !== 'messageMediaGame') {
yield $this->messages->sendMedia(['peer' => $update, 'message' => $update['message']['message'], 'media' => $update]);
yield $this->messages->sendMedia([
'peer' => '@danogentili',
'media' => [
'_' => 'inputMediaUploadedDocument',
'file' => $update,
'attributes' => [
['_' => 'documentAttributeFilename', 'file_name' => 'document.txt']
]
],
'message' => '[This is the caption](https://t.me/MadelineProto)',
'parse_mode' => 'Markdown'
]);
//yield $this->download_to_dir($update, '/tmp');
}
} catch (\danog\MadelineProto\RPCErrorException $e) {

View File

@ -58,7 +58,7 @@ trait Files
return yield $this->upload_from_url_async($file);
}
} else if (is_array($file)) {
return yield $this->upload_from_tgfile($file, $cb, $encrypted);
return yield $this->upload_from_tgfile_async($file, $cb, $encrypted);
}
$file = \danog\MadelineProto\Absolute::absolute($file);
@ -226,7 +226,7 @@ trait Files
),
['heavy' => true, 'file' => true, 'datacenter' => &$datacenter]
);
$read_deferred->onResolve(static function ($e, $res) use ($cb) {
$read_deferred->promise()->onResolve(static function ($e, $res) use ($cb) {
if ($res) {
$cb();
}
@ -291,10 +291,13 @@ trait Files
$size = $media['size'];
$mime = $media['mime'];
$chunk_size = $this->settings['upload']['part_size'];
$bridge = new class
{
private $done = [];
private $pending = [];
public $nextRead;
public function write(string $data, int $offset)
{
if (isset($this->pending[$offset])) {
@ -304,9 +307,14 @@ trait Files
} else {
$this->done[$offset] = $data;
}
return $this->nextRead->promise();
}
public function read(int $offset, int $size)
{
$nextRead = $this->nextRead;
$this->nextRead = new Deferred;
$nextRead->resolve(true);
if (isset($this->done[$offset])) {
if (strlen($this->done[$offset]) > $size) {
throw new Exception('Wrong size!');
@ -316,14 +324,17 @@ trait Files
return $result;
}
$this->pending[$offset] = new Deferred;
return $this->pending[$offset]->promise();
$res = $this->pending[$offset]->promise();
return $res;
}
};
$bridge->nextRead = new Deferred;
$reader = [$bridge, 'read'];
$writer = [$bridge, 'write'];
yield $this->all([
$this->download_to_callable_async($media, $writer, $cb),
$this->upload_from_callable_async($reader, $size, $mime, '', $cb, false, $encrypted),
$this->download_to_callable_async($media, $writer, null, false, 0, -1, $chunk_size)
]);
}
@ -505,13 +516,13 @@ trait Files
$res['name'] .= ' - '.$audio['performer'];
}
}
if (!isset($res['ext'])) {
$res['ext'] = $this->get_extension_from_location($res['InputFileLocation'], $this->get_extension_from_mime(isset($res['mime']) ? $res['mime'] : 'image/jpeg'));
if (!isset($res['ext']) || $res['ext'] === '') {
$res['ext'] = $this->get_extension_from_location($res['InputFileLocation'], $this->get_extension_from_mime($res['mime'] ?? 'image/jpeg'));
}
if (!isset($res['mime'])) {
if (!isset($res['mime']) || $res['mime'] === '') {
$res['mime'] = $this->get_mime_from_extension($res['ext'], 'image/jpeg');
}
if (!isset($res['name'])) {
if (!isset($res['name']) || $res['name'] === '') {
$res['name'] = $message_media['file']['access_hash'];
}
@ -672,10 +683,10 @@ trait Files
),
];
if (!isset($res['ext'])) {
if (!isset($res['ext']) || $res['ext'] === '') {
$res['ext'] = $this->get_extension_from_location($res['InputFileLocation'], $this->get_extension_from_mime($message_media['document']['mime_type']));
}
if (!isset($res['name'])) {
if (!isset($res['name']) || $res['name'] === '') {
$res['name'] = $message_media['document']['access_hash'];
}
if (isset($message_media['document']['size'])) {
@ -863,7 +874,7 @@ trait Files
return yield $this->download_to_callable_async($message_media, $callable, $cb, $seekable, $offset, $end);
}
public function download_to_callable_async($message_media, $callable, $cb = null, $parallelize = true, $offset = 0, $end = -1)
public function download_to_callable_async($message_media, $callable, $cb = null, $parallelize = true, $offset = 0, $end = -1, int $part_size = null)
{
$message_media = yield $this->get_download_info_async($message_media);
@ -885,7 +896,7 @@ trait Files
$end = $message_media['size'];
}
$part_size = $this->settings['download']['part_size'];
$part_size = $part_size ?? $this->settings['download']['part_size'];
$parallel_chunks = $this->settings['download']['parallel_chunks'] ? $this->settings['download']['parallel_chunks'] : 3000;
$datacenter = isset($message_media['InputFileLocation']['dc_id']) ? $message_media['InputFileLocation']['dc_id'] : $this->settings['connection_settings']['default_dc'];
@ -966,6 +977,7 @@ trait Files
$size += $res;
}
});
$promises[] = $previous_promise;
if (!($key % $parallel_chunks)) { // 20 mb at a time, for a typical bandwidth of 1gbps
@ -1100,7 +1112,7 @@ trait Files
}
if (!$seekable) {
yield $offset['previous_promise']->promise();
yield $offset['previous_promise'];
}
$res = yield $callable((string) $res['bytes'], $offset['offset'] + $offset['part_start_at']);
$cb();

View File

@ -463,7 +463,13 @@ trait TL
}
} elseif ($method === 'messages.sendEncryptedFile') {
if (isset($arguments['file'])) {
if (!is_array($arguments['file']) && $this->settings['upload']['allow_automatic_upload']) {
if (
(
!is_array($arguments['file']) ||
!(isset($arguments['file']['_']) && $this->constructors->find_by_predicate($arguments['file']['_']) === 'InputEncryptedFile')
) &&
$this->settings['upload']['allow_automatic_upload']
) {
$arguments['file'] = yield $this->upload_encrypted_async($arguments['file']);
}
if (isset($arguments['file']['key'])) {
@ -602,7 +608,16 @@ trait TL
});
}
if (!is_array($arguments[$current_argument['name']]) && $current_argument['type'] === 'InputFile' && $this->settings['upload']['allow_automatic_upload']) {
if ($current_argument['type'] === 'InputFile'
&& (
!is_array($arguments[$current_argument['name']])
|| !(
isset($arguments[$current_argument['name']]['_'])
&& $this->constructors->find_by_predicate($arguments[$current_argument['name']]['_']) === 'InputFile'
)
)
&& $this->settings['upload']['allow_automatic_upload']
) {
$arguments[$current_argument['name']] = yield $this->upload_async($arguments[$current_argument['name']]);
}