Fix self-restart, avoid exceptions surfacing in the download bot

This commit is contained in:
Daniil Gentili 2019-12-29 20:32:19 +01:00
parent 4de96f2e45
commit f85f7bd8ba
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
9 changed files with 84 additions and 31 deletions

View File

@ -174,12 +174,12 @@ $settings = [
$MadelineProto = new \danog\MadelineProto\API('bot.madeline', $settings); $MadelineProto = new \danog\MadelineProto\API('bot.madeline', $settings);
$MadelineProto->async(true); $MadelineProto->async(true);
$MadelineProto->loop(function () use ($MadelineProto) {
yield $MadelineProto->start();
yield $MadelineProto->setEventHandler('\EventHandler');
});
while (true) { while (true) {
try { try {
$MadelineProto->loop(function () use ($MadelineProto) {
yield $MadelineProto->start();
yield $MadelineProto->setEventHandler('\EventHandler');
});
$MadelineProto->loop(); $MadelineProto->loop();
} catch (\Throwable $e) { } catch (\Throwable $e) {
try { try {

View File

@ -28,14 +28,14 @@ namespace danog\MadelineProto\Async;
class AsyncParameters class AsyncParameters
{ {
/** /**
* Async callable * Async callable.
* *
* @var callable * @var callable
*/ */
private $callable; private $callable;
/** /**
* Create async parameters * Create async parameters.
* *
* @param callable $callable Async callable that will return parameters * @param callable $callable Async callable that will return parameters
*/ */
@ -46,7 +46,7 @@ class AsyncParameters
/** /**
* Create async parameters * Create async parameters.
* *
* @param callable $callable Async callable that will return parameters * @param callable $callable Async callable that will return parameters
*/ */
@ -56,7 +56,7 @@ class AsyncParameters
} }
/** /**
* Get parameters asynchronously * Get parameters asynchronously.
* *
* @return \Generator<array>|\Amp\Promise<array> * @return \Generator<array>|\Amp\Promise<array>
*/ */

View File

@ -534,9 +534,13 @@ class DataCenterConnection implements JsonSerializable
public function waitGetConnection(): Promise public function waitGetConnection(): Promise
{ {
if (empty($this->availableConnections)) { if (empty($this->availableConnections)) {
return $this->connectionsPromise->onResolve(function ($e, $v) { $deferred = new Deferred;
return $this->getConnection(); $this->connectionsPromise->onResolve(
}); function ($e, $v) use ($deferred) {
$deferred->resolve($this->getConnection());
}
);
return $deferred->promise();
} }
return new Success($this->getConnection()); return new Success($this->getConnection());
} }

View File

@ -19,22 +19,55 @@
namespace danog\MadelineProto; namespace danog\MadelineProto;
/**
* File callback interface.
*/
class FileCallback implements FileCallbackInterface class FileCallback implements FileCallbackInterface
{ {
/**
* File to download/upload.
*
* @var mixed
*/
private $file; private $file;
/**
* Callback.
*
* @var callable
*/
private $callback; private $callback;
public function __construct($file, $callback) /**
* Construct file callback.
*
* @param mixed $file File to download/upload
* @param callable $callback Callback
*/
public function __construct($file, callable $callback)
{ {
$this->file = $file; $this->file = $file;
$this->callback = $callback; $this->callback = $callback;
} }
/**
* Get file.
*
* @return mixed
*/
public function getFile() public function getFile()
{ {
return $this->file; return $this->file;
} }
/**
* Invoke callback.
*
* @param int $percent Percent
* @param int $speed Speed in mbps
* @param int $time Time
*
* @return mixed
*/
public function __invoke($percent, $speed, $time) public function __invoke($percent, $speed, $time)
{ {
$callback = $this->callback; $callback = $this->callback;

View File

@ -19,9 +19,26 @@
namespace danog\MadelineProto; namespace danog\MadelineProto;
/**
* File callback interface.
*/
interface FileCallbackInterface interface FileCallbackInterface
{ {
/**
* Get file.
*
* @return mixed
*/
public function getFile(); public function getFile();
/**
* Invoke callback.
*
* @param int $percent Percent
* @param int $speed Speed in mbps
* @param int $time Time
*
* @return mixed
*/
public function __invoke($percent, $speed, $time); public function __invoke($percent, $speed, $time);
} }

View File

@ -4403,30 +4403,30 @@ class InternalDoc extends APIFactory
* Upload file. * Upload file.
* *
* @param FileCallbackInterface|string|array $file File, URL or Telegram file to upload * @param FileCallbackInterface|string|array $file File, URL or Telegram file to upload
* @param string $file_name File name * @param string $fileName File name
* @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface)
* @param boolean $encrypted Whether to encrypt file for secret chats * @param boolean $encrypted Whether to encrypt file for secret chats
* *
* @return \Generator<array> * @return \Generator<array>
*/ */
public function upload($file, string $file_name = '', $cb = null, bool $encrypted = false, array $extra = []) public function upload($file, string $fileName = '', $cb = null, bool $encrypted = false, array $extra = [])
{ {
return $this->__call(__FUNCTION__, [$file, $file_name, $cb, $encrypted, $extra]); return $this->__call(__FUNCTION__, [$file, $fileName, $cb, $encrypted, $extra]);
} }
/** /**
* Upload file from URL. * Upload file from URL.
* *
* @param string|FileCallbackInterface $url URL of file * @param string|FileCallbackInterface $url URL of file
* @param integer $size Size of file * @param integer $size Size of file
* @param string $file_name File name * @param string $fileName File name
* @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface)
* @param boolean $encrypted Whether to encrypt file for secret chats * @param boolean $encrypted Whether to encrypt file for secret chats
* *
* @return array * @return array
*/ */
public function uploadFromUrl($url, int $size = 0, string $file_name = '', $cb = null, bool $encrypted = false, array $extra = []) public function uploadFromUrl($url, int $size = 0, string $fileName = '', $cb = null, bool $encrypted = false, array $extra = [])
{ {
return $this->__call(__FUNCTION__, [$url, $size, $file_name, $cb, $encrypted, $extra]); return $this->__call(__FUNCTION__, [$url, $size, $fileName, $cb, $encrypted, $extra]);
} }
/** /**
* Upload file from stream. * Upload file from stream.
@ -4434,15 +4434,15 @@ class InternalDoc extends APIFactory
* @param mixed $stream PHP resource or AMPHP async stream * @param mixed $stream PHP resource or AMPHP async stream
* @param integer $size File size * @param integer $size File size
* @param string $mime Mime type * @param string $mime Mime type
* @param string $file_name File name * @param string $fileName File name
* @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface)
* @param boolean $encrypted Whether to encrypt file for secret chats * @param boolean $encrypted Whether to encrypt file for secret chats
* *
* @return array * @return array
*/ */
public function uploadFromStream($stream, int $size, string $mime, string $file_name = '', $cb = null, bool $encrypted = false, array $extra = []) public function uploadFromStream($stream, int $size, string $mime, string $fileName = '', $cb = null, bool $encrypted = false, array $extra = [])
{ {
return $this->__call(__FUNCTION__, [$stream, $size, $mime, $file_name, $cb, $encrypted, $extra]); return $this->__call(__FUNCTION__, [$stream, $size, $mime, $fileName, $cb, $encrypted, $extra]);
} }
/** /**
* Upload file from callable. * Upload file from callable.
@ -4453,29 +4453,29 @@ class InternalDoc extends APIFactory
* @param mixed $callable Callable * @param mixed $callable Callable
* @param integer $size File size * @param integer $size File size
* @param string $mime Mime type * @param string $mime Mime type
* @param string $file_name File name * @param string $fileName File name
* @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface)
* @param boolean $seekable Whether chunks can be fetched out of order * @param boolean $seekable Whether chunks can be fetched out of order
* @param boolean $encrypted Whether to encrypt file for secret chats * @param boolean $encrypted Whether to encrypt file for secret chats
* *
* @return \Generator<array> * @return \Generator<array>
*/ */
public function uploadFromCallable($callable, int $size, string $mime, string $file_name = '', $cb = null, bool $seekable = true, bool $encrypted = false, array $extra = []) public function uploadFromCallable($callable, int $size, string $mime, string $fileName = '', $cb = null, bool $seekable = true, bool $encrypted = false, array $extra = [])
{ {
return $this->__call(__FUNCTION__, [$callable, $size, $mime, $file_name, $cb, $seekable, $encrypted, $extra]); return $this->__call(__FUNCTION__, [$callable, $size, $mime, $fileName, $cb, $seekable, $encrypted, $extra]);
} }
/** /**
* Upload file to secret chat. * Upload file to secret chat.
* *
* @param FileCallbackInterface|string|array $file File, URL or Telegram file to upload * @param FileCallbackInterface|string|array $file File, URL or Telegram file to upload
* @param string $file_name File name * @param string $fileName File name
* @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface)
* *
* @return \Generator<array> * @return \Generator<array>
*/ */
public function uploadEncrypted($file, string $file_name = '', $cb = null, array $extra = []) public function uploadEncrypted($file, string $fileName = '', $cb = null, array $extra = [])
{ {
return $this->__call(__FUNCTION__, [$file, $file_name, $cb, $extra]); return $this->__call(__FUNCTION__, [$file, $fileName, $cb, $extra]);
} }
/** /**
* Reupload telegram file. * Reupload telegram file.

View File

@ -23,7 +23,6 @@ use Amp\Deferred;
use Amp\Promise; use Amp\Promise;
use Amp\Success; use Amp\Success;
use danog\MadelineProto\Async\AsyncParameters; use danog\MadelineProto\Async\AsyncParameters;
use danog\MadelineProto\Async\Parameters;
use danog\MadelineProto\Tools; use danog\MadelineProto\Tools;
use function Amp\Promise\all; use function Amp\Promise\all;

View File

@ -412,7 +412,7 @@ trait Files
*/ */
private $partSize; private $partSize;
/** /**
* Offset for callback * Offset for callback.
* *
* @var int * @var int
*/ */
@ -460,7 +460,7 @@ trait Files
return $this->read[$offset]->promise(); return $this->read[$offset]->promise();
} }
/** /**
* Read callback, called when the chunk is read and fully resent * Read callback, called when the chunk is read and fully resent.
* *
* @return void * @return void
*/ */

View File

@ -131,7 +131,7 @@ trait Loop
$params = $_GET; $params = $_GET;
$params['MadelineSelfRestart'] = Tools::randomInt(); $params['MadelineSelfRestart'] = Tools::randomInt();
$url = \explode($uri, '?', 2)[0] ?? ''; $url = \explode('?', $uri, 2)[0] ?? '';
$query = \http_build_query($params); $query = \http_build_query($params);
$uri = \implode('?', [$url, $query]); $uri = \implode('?', [$url, $query]);