From 8cc968543349a728432fc78e5d68c9ca892cbdc8 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Sun, 17 Dec 2023 16:54:01 +0100 Subject: [PATCH] Improve peer handling logic --- langs/fa.json | 2 +- src/API.php | 2 +- src/Lang.php | 4 ++-- src/Loop/Update/FeedLoop.php | 6 +++--- src/Loop/Update/SeqLoop.php | 2 +- src/Loop/Update/UpdateLoop.php | 12 ++++++------ src/MTProto.php | 1 + src/MTProtoTools/UpdateHandler.php | 28 +++++++++++++++------------- 8 files changed, 30 insertions(+), 27 deletions(-) diff --git a/langs/fa.json b/langs/fa.json index cc4594fce..4cee0e0ec 100644 --- a/langs/fa.json +++ b/langs/fa.json @@ -143,7 +143,7 @@ "cli_need_dl.php_link": "لطفا هنگام استفاده از getDownloadLink روی CLI (محیط ترمینال)، لینک اسکریپت دانلود را مشخص کنید!", "need_dl.php": "اسکریپت دانلود پیشفرض تولید نشد (%s)، لطفا یک فایل dl.php بسیازید و این محتوا را در آن قرار دهید: %s سپس لینک آن فایل را به ورودی دوم getDownloadLink بدهید", "dl.php_powered_by_madelineproto": "سرور دانلود فایل تلگرام (تا حداکثر 4 گیگابایت)، قدرت گرفته از مدلین‌پروتو!
برای اطلاعات بیشتر در مورد طریقه اجرای سرور دانلود تلگرام شخصی خود اینجا کلیک کنید!", - "update_madelineproto": "شما در حال اجرای یک نسخه قدیمی از مدلین هستید، یک به‌روزرسانی نیاز است!", + "update_madelineproto": "شما نسخه قدیمی MadelineProto را اجرا می‌کنید، سورس شما نیاز به بروزرسانی دارد: در حال حاضر %s در حال اجرا است، اما آخرین نسخه با چندین رفع اشکال و ویژگی‌های جدید %s است!", "dl.php_check_logs_make_sure_session_running": "هم ربات ایونت‌هندلر مدلین‌پروتو مرتبط و هم سرور IPC مدلین‌پروتو آفلاین هستند، لطفا لاگ‌ها را بررسی کنید و مطمئن شوید حداقل یکی از آنها در حال اجراست!", "invalid_dl.php_session": "%s یک اسکریپت دانلود درست و معتبر نیست چرا که سشن‌آیدی متفاوت است (انتظار این سشن‌آیدی وجود داشت: %s، اما این دریافت شد: %s)", "account_banned": "!!!!!!! اخطار !!!!!!!\nسیستم جلوگیری از فلود تلگرام، این حساب را معلق کرده.\nبرای ادامه، تایید دستی نیاز است.\nیک ایمیل به recover@telegram.org بفرستید، و از آنها آزادسازی شماره %s را جویا باشید، و کوتاه توضیح دهید که چه کاری با این شماره انجام خواهید داد.\nسپس دوباره وارد شوید.\nاگر از قصد این حساب را حذف کرده‌اید، این پیام را نادیده بگیرید.", diff --git a/src/API.php b/src/API.php index f13a93826..1945b2f07 100644 --- a/src/API.php +++ b/src/API.php @@ -51,7 +51,7 @@ final class API extends AbstractAPI * * @var string */ - public const RELEASE = '8.0.0-beta180'; + public const RELEASE = '8.0.0-beta181'; /** * We're not logged in. * diff --git a/src/Lang.php b/src/Lang.php index 47758521c..7495a89e0 100644 --- a/src/Lang.php +++ b/src/Lang.php @@ -26,7 +26,7 @@ final class Lang 'he' => 74, 'it' => 100, 'ckb' => 74, - 'fa' => 99, + 'fa' => 100, 'ru' => 53, 'uz' => 74, ]; @@ -524,7 +524,7 @@ If you intentionally deleted this account, ignore this message.', 'translate_madelineproto_web' => 'مدلین‌پروتو را می‌توان به زبان شما ترجمه کرد (پیشرفت ترجمه فعلی: %d%%)، برای مشارکت در ترجمه اینجا را کلیک کنید!', 'type_extract_error' => 'نمی‌توان نوع (تایپ) "%s" را استخراج کرد، شما باید MadelineProto را به روز رسانی کنید!', 'type_extract_error_id' => 'نمی‌توان نوع: %s را با ایدی %s استخراج کرد، شما باید MadelineProto را به روز رسانی کنید!', - 'update_madelineproto' => 'شما در حال اجرای یک نسخه قدیمی از مدلین هستید، یک به‌روزرسانی نیاز است!', + 'update_madelineproto' => 'شما نسخه قدیمی MadelineProto را اجرا می‌کنید، سورس شما نیاز به بروزرسانی دارد: در حال حاضر %s در حال اجرا است، اما آخرین نسخه با چندین رفع اشکال و ویژگی‌های جدید %s است!', 'value_bigger_than_2147483647' => 'مقدار داده شده‌ی %s بیشتر از 2147483647 است', 'value_bigger_than_4294967296' => 'مقدار داده شده‌ی %s بیشتر از 4294967296 است', 'value_bigger_than_9223372036854775807' => 'مقدار داده شده‌ی %s بیشتر از 9223372036854775807 است', diff --git a/src/Loop/Update/FeedLoop.php b/src/Loop/Update/FeedLoop.php index 19791ae3d..9b822a812 100644 --- a/src/Loop/Update/FeedLoop.php +++ b/src/Loop/Update/FeedLoop.php @@ -106,7 +106,7 @@ final class FeedLoop extends Loop { foreach ($updates as $update) { if ($update['_'] === 'updateChannelTooLong') { - $this->API->logger('Got channel too long update, getting difference...', Logger::VERBOSE); + $this->API->logger("Got channel too long update in $this, getting difference...", Logger::VERBOSE); $this->updater->resume(); continue; } @@ -116,7 +116,7 @@ final class FeedLoop extends Loop $mid = $update['message']['id'] ?? '-'; $mypts = $this->state->pts(); $computed = $mypts + $pts_count; - $this->API->logger("{$msg}. My pts: {$mypts}, remote pts: {$update['pts']}, computed pts: {$computed}, msg id: {$mid}, channel id: {$this->channelId}", Logger::ULTRA_VERBOSE); + $this->API->logger("{$msg}. My pts: {$mypts}, remote pts: {$update['pts']}, computed pts: {$computed}, msg id: {$mid}, channel id: {$this->channelId}", Logger::VERBOSE); }; $result = $this->state->checkPts($update); if ($result < 0) { @@ -249,7 +249,7 @@ final class FeedLoop extends Loop return $this->API->feeders[self::GENERIC]->feedSingle($update); } } - $this->API->logger('Was fed an update of type '.$update['_']." in {$this}...", Logger::ULTRA_VERBOSE); + $this->API->logger('Was fed an update of type '.$update['_']." in {$this}...", Logger::VERBOSE); if ($update['_'] === 'updateLoginToken') { $this->API->saveUpdate($update); return $this->channelId; diff --git a/src/Loop/Update/SeqLoop.php b/src/Loop/Update/SeqLoop.php index 1e5d20ea3..76a99dddc 100644 --- a/src/Loop/Update/SeqLoop.php +++ b/src/Loop/Update/SeqLoop.php @@ -74,7 +74,7 @@ final class SeqLoop extends Loop } $this->feeder = $this->API->feeders[FeedLoop::GENERIC]; $this->state = $this->API->loadUpdateState(); - $this->API->logger("Resumed $this!", Logger::LEVEL_ULTRA_VERBOSE); + $this->API->logger("Resumed $this!", Logger::LEVEL_VERBOSE); while (!$this->incomingUpdates->isEmpty()) { $this->parse($this->incomingUpdates); diff --git a/src/Loop/Update/UpdateLoop.php b/src/Loop/Update/UpdateLoop.php index 99ec5dabb..fa62ad351 100644 --- a/src/Loop/Update/UpdateLoop.php +++ b/src/Loop/Update/UpdateLoop.php @@ -118,7 +118,7 @@ final class UpdateLoop extends Loop $this->toPts = null; while (true) { if ($this->channelId) { - $this->API->logger('Resumed and fetching '.$this->channelId.' difference...', Logger::ULTRA_VERBOSE); + $this->API->logger('Resumed and fetching '.$this->channelId.' difference...', Logger::VERBOSE); if ($state->pts() <= 1) { $limit = 10; } elseif ($this->API->authorization['user']['bot']) { @@ -156,7 +156,7 @@ final class UpdateLoop extends Loop return self::STOP; } $timeout = min(self::DEFAULT_TIMEOUT, $difference['timeout'] ?? self::DEFAULT_TIMEOUT); - $this->API->logger('Got '.$difference['_'], Logger::ULTRA_VERBOSE); + $this->API->logger('Got '.$difference['_'], Logger::VERBOSE); switch ($difference['_']) { case 'updates.channelDifferenceEmpty': $state->update($difference); @@ -192,7 +192,7 @@ final class UpdateLoop extends Loop throw new Exception('Unrecognized update difference received: '.var_export($difference, true)); } } else { - $this->API->logger('Resumed and fetching normal difference...', Logger::ULTRA_VERBOSE); + $this->API->logger('Resumed and fetching normal difference...', Logger::VERBOSE); do { try { $difference = $this->API->methodCallAsyncRead('updates.getDifference', ['pts' => $state->pts(), 'date' => $state->date(), 'qts' => $state->qts()], $this->API->authorized_dc); @@ -203,7 +203,7 @@ final class UpdateLoop extends Loop } } } while (true); - $this->API->logger('Got '.$difference['_'], Logger::ULTRA_VERBOSE); + $this->API->logger('Got '.$difference['_'], Logger::VERBOSE); $timeout = self::DEFAULT_TIMEOUT; switch ($difference['_']) { case 'updates.differenceEmpty': @@ -245,11 +245,11 @@ final class UpdateLoop extends Loop } } } - $this->API->logger("Finished parsing updates in {$this}, now resuming feeders", Logger::ULTRA_VERBOSE); + $this->API->logger("Finished parsing updates in {$this}, now resuming feeders", Logger::VERBOSE); foreach ($result as $channelId => $_) { $this->API->feeders[$channelId]?->resume(); } - $this->API->logger("Finished parsing updates in {$this}, pausing for $timeout seconds", Logger::ULTRA_VERBOSE); + $this->API->logger("Finished parsing updates in {$this}, pausing for $timeout seconds", Logger::VERBOSE); return $timeout; } diff --git a/src/MTProto.php b/src/MTProto.php index 71a788704..c74bdeaa2 100644 --- a/src/MTProto.php +++ b/src/MTProto.php @@ -1836,6 +1836,7 @@ final class MTProto implements TLCallback, LoggerGetter, SettingsGetter [ 'InputFileLocation' => $this->getDownloadInfo(...), 'InputPeer' => $this->getInputPeer(...), + 'InputDialogPeer' => fn (mixed $id) => ['_' => 'inputDialogPeer', 'peer' => $this->getInputPeer($id)], 'InputCheckPasswordSRP' => fn (string $password): array => (new PasswordCalculator($this->methodCallAsyncRead('account.getPassword', [], $this->authorized_dc)))->getCheckPassword($password), ], ); diff --git a/src/MTProtoTools/UpdateHandler.php b/src/MTProtoTools/UpdateHandler.php index 737c34c75..683a1a12a 100644 --- a/src/MTProtoTools/UpdateHandler.php +++ b/src/MTProtoTools/UpdateHandler.php @@ -1056,20 +1056,22 @@ trait UpdateHandler && \in_array($update['message']['action']['_'], ['messageActionChatEditTitle', 'messageActionChatEditPhoto', 'messageActionChatDeletePhoto', 'messageActionChatMigrateTo', 'messageActionChannelMigrateFrom', 'messageActionGroupCall'], true) ) ) { - try { - $id = $this->getIdInternal($update); - \assert($id !== null); - $this->refreshPeerCache($id); - if ($this->getSettings()->getDb()->getEnableFullPeerDb()) { - $this->peerDatabase->expireFull($id); + $id = $this->getIdInternal($update); + \assert($id !== null); + EventLoop::queue(function () use ($id): void { + try { + $this->refreshPeerCache($id); + if ($this->getSettings()->getDb()->getEnableFullPeerDb()) { + $this->peerDatabase->expireFull($id); + } + } catch (PeerNotInDbException) { + } catch (FloodWaitError) { + } catch (RPCErrorException $e) { + if ($e->rpc !== 'CHANNEL_PRIVATE' && $e->rpc !== 'MSG_ID_INVALID') { + throw $e; + } } - } catch (PeerNotInDbException) { - } catch (FloodWaitError) { - } catch (RPCErrorException $e) { - if ($e->rpc !== 'CHANNEL_PRIVATE' && $e->rpc !== 'MSG_ID_INVALID') { - throw $e; - } - } + }); } if ($update['_'] === 'updateDcOptions') { $this->logger->logger('Got new dc options', Logger::VERBOSE);