From f85f7bd8baef0416003d7e1b65bddcb60c61158e Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Sun, 29 Dec 2019 20:32:19 +0100 Subject: [PATCH] Fix self-restart, avoid exceptions surfacing in the download bot --- examples/downloadRenameBot.php | 8 ++--- .../MadelineProto/Async/AsyncParameters.php | 8 ++--- .../MadelineProto/DataCenterConnection.php | 10 ++++-- src/danog/MadelineProto/FileCallback.php | 35 ++++++++++++++++++- .../MadelineProto/FileCallbackInterface.php | 17 +++++++++ src/danog/MadelineProto/InternalDoc.php | 30 ++++++++-------- .../MTProtoSession/CallHandler.php | 1 - .../MadelineProto/MTProtoTools/Files.php | 4 +-- src/danog/MadelineProto/Wrappers/Loop.php | 2 +- 9 files changed, 84 insertions(+), 31 deletions(-) diff --git a/examples/downloadRenameBot.php b/examples/downloadRenameBot.php index 6e8b1f72..02337d69 100644 --- a/examples/downloadRenameBot.php +++ b/examples/downloadRenameBot.php @@ -174,12 +174,12 @@ $settings = [ $MadelineProto = new \danog\MadelineProto\API('bot.madeline', $settings); $MadelineProto->async(true); -$MadelineProto->loop(function () use ($MadelineProto) { - yield $MadelineProto->start(); - yield $MadelineProto->setEventHandler('\EventHandler'); -}); while (true) { try { + $MadelineProto->loop(function () use ($MadelineProto) { + yield $MadelineProto->start(); + yield $MadelineProto->setEventHandler('\EventHandler'); + }); $MadelineProto->loop(); } catch (\Throwable $e) { try { diff --git a/src/danog/MadelineProto/Async/AsyncParameters.php b/src/danog/MadelineProto/Async/AsyncParameters.php index fdb737d7..223b508a 100644 --- a/src/danog/MadelineProto/Async/AsyncParameters.php +++ b/src/danog/MadelineProto/Async/AsyncParameters.php @@ -28,14 +28,14 @@ namespace danog\MadelineProto\Async; class AsyncParameters { /** - * Async callable + * Async callable. * * @var callable */ private $callable; /** - * Create async parameters + * Create async 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 */ @@ -56,7 +56,7 @@ class AsyncParameters } /** - * Get parameters asynchronously + * Get parameters asynchronously. * * @return \Generator|\Amp\Promise */ diff --git a/src/danog/MadelineProto/DataCenterConnection.php b/src/danog/MadelineProto/DataCenterConnection.php index 8fc2d599..45cf1748 100644 --- a/src/danog/MadelineProto/DataCenterConnection.php +++ b/src/danog/MadelineProto/DataCenterConnection.php @@ -534,9 +534,13 @@ class DataCenterConnection implements JsonSerializable public function waitGetConnection(): Promise { if (empty($this->availableConnections)) { - return $this->connectionsPromise->onResolve(function ($e, $v) { - return $this->getConnection(); - }); + $deferred = new Deferred; + $this->connectionsPromise->onResolve( + function ($e, $v) use ($deferred) { + $deferred->resolve($this->getConnection()); + } + ); + return $deferred->promise(); } return new Success($this->getConnection()); } diff --git a/src/danog/MadelineProto/FileCallback.php b/src/danog/MadelineProto/FileCallback.php index e1d0902d..7dcd6927 100644 --- a/src/danog/MadelineProto/FileCallback.php +++ b/src/danog/MadelineProto/FileCallback.php @@ -19,22 +19,55 @@ namespace danog\MadelineProto; +/** + * File callback interface. + */ class FileCallback implements FileCallbackInterface { + /** + * File to download/upload. + * + * @var mixed + */ private $file; + /** + * Callback. + * + * @var callable + */ 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->callback = $callback; } + /** + * Get file. + * + * @return mixed + */ public function getFile() { 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) { $callback = $this->callback; diff --git a/src/danog/MadelineProto/FileCallbackInterface.php b/src/danog/MadelineProto/FileCallbackInterface.php index 0192041c..7f5b177e 100644 --- a/src/danog/MadelineProto/FileCallbackInterface.php +++ b/src/danog/MadelineProto/FileCallbackInterface.php @@ -19,9 +19,26 @@ namespace danog\MadelineProto; +/** + * File callback interface. + */ interface FileCallbackInterface { + /** + * Get file. + * + * @return mixed + */ 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); } diff --git a/src/danog/MadelineProto/InternalDoc.php b/src/danog/MadelineProto/InternalDoc.php index b13fbb11..5d2f99de 100644 --- a/src/danog/MadelineProto/InternalDoc.php +++ b/src/danog/MadelineProto/InternalDoc.php @@ -4403,30 +4403,30 @@ class InternalDoc extends APIFactory * Upload file. * * @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 boolean $encrypted Whether to encrypt file for secret chats * * @return \Generator */ - 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. * * @param string|FileCallbackInterface $url URL 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 boolean $encrypted Whether to encrypt file for secret chats * * @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. @@ -4434,15 +4434,15 @@ class InternalDoc extends APIFactory * @param mixed $stream PHP resource or AMPHP async stream * @param integer $size File size * @param string $mime Mime type - * @param string $file_name File name + * @param string $fileName File name * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param boolean $encrypted Whether to encrypt file for secret chats * * @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. @@ -4453,29 +4453,29 @@ class InternalDoc extends APIFactory * @param mixed $callable Callable * @param integer $size File size * @param string $mime Mime type - * @param string $file_name File name + * @param string $fileName File name * @param callable $cb Callback (DEPRECATED, use FileCallbackInterface) * @param boolean $seekable Whether chunks can be fetched out of order * @param boolean $encrypted Whether to encrypt file for secret chats * * @return \Generator */ - 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. * * @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) * * @return \Generator */ - 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. diff --git a/src/danog/MadelineProto/MTProtoSession/CallHandler.php b/src/danog/MadelineProto/MTProtoSession/CallHandler.php index d9ae23f0..373a65f3 100644 --- a/src/danog/MadelineProto/MTProtoSession/CallHandler.php +++ b/src/danog/MadelineProto/MTProtoSession/CallHandler.php @@ -23,7 +23,6 @@ use Amp\Deferred; use Amp\Promise; use Amp\Success; use danog\MadelineProto\Async\AsyncParameters; -use danog\MadelineProto\Async\Parameters; use danog\MadelineProto\Tools; use function Amp\Promise\all; diff --git a/src/danog/MadelineProto/MTProtoTools/Files.php b/src/danog/MadelineProto/MTProtoTools/Files.php index be8bfd70..ec7e32f0 100644 --- a/src/danog/MadelineProto/MTProtoTools/Files.php +++ b/src/danog/MadelineProto/MTProtoTools/Files.php @@ -412,7 +412,7 @@ trait Files */ private $partSize; /** - * Offset for callback + * Offset for callback. * * @var int */ @@ -460,7 +460,7 @@ trait Files 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 */ diff --git a/src/danog/MadelineProto/Wrappers/Loop.php b/src/danog/MadelineProto/Wrappers/Loop.php index 6ac09f96..d793faa0 100644 --- a/src/danog/MadelineProto/Wrappers/Loop.php +++ b/src/danog/MadelineProto/Wrappers/Loop.php @@ -131,7 +131,7 @@ trait Loop $params = $_GET; $params['MadelineSelfRestart'] = Tools::randomInt(); - $url = \explode($uri, '?', 2)[0] ?? ''; + $url = \explode('?', $uri, 2)[0] ?? ''; $query = \http_build_query($params); $uri = \implode('?', [$url, $query]);