1
0
mirror of https://github.com/danog/MadelineProto.git synced 2024-11-30 06:18:58 +01:00

Download script improvements

This commit is contained in:
Daniil Gentili 2023-07-18 15:44:09 +02:00
parent 0b56199466
commit 2f8c3016c0
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
21 changed files with 52 additions and 46 deletions

View File

@ -496,7 +496,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdhconfig-array" name="getDhConfig">Get diffie-hellman configuration: getDhConfig</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdhconfig-array" name="getDhConfig">Get diffie-hellman configuration: getDhConfig</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdownloadinfo-mixed-messagemedia-array-ext-string-name-string-mime-string-size-int-inputfilelocation-array" name="getDownloadInfo">Get download info of file: getDownloadInfo</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdownloadinfo-mixed-messagemedia-array-ext-string-name-string-mime-string-size-int-inputfilelocation-array" name="getDownloadInfo">Get download info of file: getDownloadInfo</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getpropicinfo-mixed-data-array" name="getPropicInfo">Get download info of the propic of a user: getPropicInfo</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getpropicinfo-mixed-data-array" name="getPropicInfo">Get download info of the propic of a user: getPropicInfo</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdownloadlink-danog-madelineproto-eventhandler-message-danog-madelineproto-eventhandler-media-array-string-media-string-scripturl-null-string" name="getDownloadLink">Get download link of media file: getDownloadLink</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getdownloadlink-danog-madelineproto-eventhandler-message-danog-madelineproto-eventhandler-media-array-string-media-string-scripturl-null-int-size-null-string-name-null-string-mime-null-string" name="getDownloadLink">Get download link of media file: getDownloadLink</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#geteventhandler-class-string-plugineventhandler-class-null-danog-madelineproto-eventhandler-danog-madelineproto-ipc-eventhandlerproxy-__php_incomplete_class-null" name="getEventHandler">Get event handler (or plugin instance): getEventHandler</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#geteventhandler-class-string-plugineventhandler-class-null-danog-madelineproto-eventhandler-danog-madelineproto-ipc-eventhandlerproxy-__php_incomplete_class-null" name="getEventHandler">Get event handler (or plugin instance): getEventHandler</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getextensionfromlocation-mixed-location-string-default-string" name="getExtensionFromLocation">Get extension from file location: getExtensionFromLocation</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getextensionfromlocation-mixed-location-string-default-string" name="getExtensionFromLocation">Get extension from file location: getExtensionFromLocation</a>
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getextensionfrommime-string-mime-string" name="getExtensionFromMime">Get extension from mime type: getExtensionFromMime</a> * <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getextensionfrommime-string-mime-string" name="getExtensionFromMime">Get extension from mime type: getExtensionFromMime</a>

2
docs

@ -1 +1 @@
Subproject commit 2bbdf1b074a607c666dd7f9fd71cc19a137deae2 Subproject commit ceaadaca96b69220bc631c2e0f9c0f11db206ab2

View File

@ -145,9 +145,8 @@
"plugins_must_have_exactly_one_class": "a plugin must define exactly one class! To define multiple classes, interfaces or traits, create separate files, they will be autoloaded by MadelineProto automatically.", "plugins_must_have_exactly_one_class": "a plugin must define exactly one class! To define multiple classes, interfaces or traits, create separate files, they will be autoloaded by MadelineProto automatically.",
"cli_need_dl.php_link": "Please specify a download script URL when using getDownloadLink via CLI!", "cli_need_dl.php_link": "Please specify a download script URL when using getDownloadLink via CLI!",
"invalid_dl.php": "%s is not a valid download script (%s)", "invalid_dl.php_session": "%s is not a valid download script because its session ID is different (expected %s, got %s)",
"need_dl.php": "Could not generate default download script (%s), please create a dl.php file with the following content: %s and pass its URL to the second parameter of getDownloadLink", "need_dl.php": "Could not generate default download script (%s), please create a dl.php file with the following content: %s and pass its URL to the second parameter of getDownloadLink",
"dl.php_powered_by_madelineproto": "Telegram file download server (up to 4GB), powered by <a href=\"https://docs.madelineproto.xyz\" target=\"_blank\">MadelineProto</a>!<br>Click <a href=\"https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link\" target=\"_blank\">here</a> for more info on how to setup your very own Telegram file download server!" "dl.php_powered_by_madelineproto": "Telegram file download server (up to 4GB), powered by <a href=\"https://docs.madelineproto.xyz\" target=\"_blank\">MadelineProto</a>!<br>Click <a href=\"https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link\" target=\"_blank\">here</a> for more info on how to setup your very own Telegram file download server!"
} }

View File

@ -132,7 +132,7 @@
"do_not_remove_MadelineProto.log_phar": "لطفا madeline.phar یا madeline.php را حذف نکنید، در غیراینصورت مدلین‌پروتو crash خواهد کرد. در صورت داشتن هرگونه مشکل با مدلین‌پروتو، آن را به https://github.com/danog/MadelineProto یا https://t.me/pwrtelegramgroup گزارش کنید", "do_not_remove_MadelineProto.log_phar": "لطفا madeline.phar یا madeline.php را حذف نکنید، در غیراینصورت مدلین‌پروتو crash خواهد کرد. در صورت داشتن هرگونه مشکل با مدلین‌پروتو، آن را به https://github.com/danog/MadelineProto یا https://t.me/pwrtelegramgroup گزارش کنید",
"do_not_use_deprecated_function": "تابع %s منسوخ شده، لطفا به جای آن از %s استفاده کنید", "do_not_use_deprecated_function": "تابع %s منسوخ شده، لطفا به جای آن از %s استفاده کنید",
"mmapErrorPart3": "برای تداوم تغییر در طول راه‌اندازی دوباره: %s", "mmapErrorPart3": "برای تداوم تغییر در طول راه‌اندازی دوباره: %s",
"recommend_not_use_filesystem_function": "استفاده از تابع %s پیشنهاد نمیشود، چراکه دسترسی و کار با فایل های سیستمی موقع پردازش آپدیت باعث کم شدن سرعت ربات شما میشود، لطفا صفحه https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions را ببینید تا با راه‌های جایگزین برای ذخیره اطلاعات که باعث کاهش سرعت نمیشوند آشنا شوید!", "recommend_not_use_filesystem_function": "استفاده از تابع %s پیشنهاد نمیشود، چراکه دسترسی و کار با فایل های سیستمی موقع پردازش آپدیت باعث کم شدن سرعت ربات شما میشود، لطفا صفحه https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions را ببینید تا با راه‌های جایگزین برای ذخیره اطلاعات که باعث کاهش سرعت ربات شما نمیشوند آشنا شوید!",
"do_not_use_blocking_function": "به دلایل عملکردی و اجرایی، ایونت‌هندلرها نباید از فانکشن %s که async نیست استفاده کنند، لطفا به جای آن از %s استفاده کنید", "do_not_use_blocking_function": "به دلایل عملکردی و اجرایی، ایونت‌هندلرها نباید از فانکشن %s که async نیست استفاده کنند، لطفا به جای آن از %s استفاده کنید",
"do_not_use_blocking_class": "به دلایل عملکردی و اجرایی، هندلرها نباید از کلس %s که async نیست استفاده کنند، به جای آن از %s استفاده کنید", "do_not_use_blocking_class": "به دلایل عملکردی و اجرایی، هندلرها نباید از کلس %s که async نیست استفاده کنند، به جای آن از %s استفاده کنید",
"do_not_use_non_root_require_in_event_handler": "به دلایل عملکردی و اجرایی، شما نباید از require یا include داخل کلس ایونت‌هندلر استفاده کنید، فقط require های سطح root مجاز هستند.", "do_not_use_non_root_require_in_event_handler": "به دلایل عملکردی و اجرایی، شما نباید از require یا include داخل کلس ایونت‌هندلر استفاده کنید، فقط require های سطح root مجاز هستند.",

@ -1 +1 @@
Subproject commit 2185331bb36565039fd1bcbe14ee7c25eeab2f51 Subproject commit 5bac791635b33c1c978bacad22f65c0f11633eb6

View File

@ -418,7 +418,9 @@ final class API extends AbstractAPI
} else { } else {
Assert::notEmpty($eventHandler); Assert::notEmpty($eventHandler);
Assert::allClassExists($eventHandler); Assert::allClassExists($eventHandler);
foreach ($eventHandler as $c) { $c::cachePlugins($c); } foreach ($eventHandler as $c) {
$c::cachePlugins($c);
}
} }
$errors = []; $errors = [];

View File

@ -265,6 +265,15 @@ abstract class EventHandler extends AbstractAPI
{ {
return $this->periodicLoops[$name]; return $this->periodicLoops[$name];
} }
/**
* Obtain all PeriodicLoop instances created by the Cron attribute.
*
* @return array<string, PeriodicLoop>
*/
final public function getPeriodicLoops(): array
{
return $this->periodicLoops;
}
/** /**
* @internal * @internal
*/ */

View File

@ -16,9 +16,9 @@ final class FilterNot extends Filter
public function __construct(private readonly Filter $filter) public function __construct(private readonly Filter $filter)
{ {
} }
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
$filter = $this->filter->initialize($API) ?? $this->filter; $filter = $this->filter->initialize($API);
if ($filter instanceof self) { if ($filter instanceof self) {
// The nested filter is a FilterNot, optimize !!A => A // The nested filter is a FilterNot, optimize !!A => A
return $filter->filter; return $filter->filter;

View File

@ -26,7 +26,7 @@ final class FiltersAnd extends Filter
{ {
$final = []; $final = [];
foreach ($this->filters as $filter) { foreach ($this->filters as $filter) {
$filter = $filter->initialize($API) ?? $filter; $filter = $filter->initialize($API);
if ($filter instanceof self) { if ($filter instanceof self) {
$final = \array_merge($final, $filter->filters); $final = \array_merge($final, $filter->filters);
} else { } else {

View File

@ -26,7 +26,7 @@ final class FiltersOr extends Filter
{ {
$final = []; $final = [];
foreach ($this->filters as $filter) { foreach ($this->filters as $filter) {
$filter = $filter->initialize($API) ?? $filter; $filter = $filter->initialize($API);
if ($filter instanceof self) { if ($filter instanceof self) {
$final = \array_merge($final, $filter->filters); $final = \array_merge($final, $filter->filters);
} else { } else {

View File

@ -46,9 +46,9 @@ abstract class Filter
{ {
abstract public function apply(Update $update): bool; abstract public function apply(Update $update): bool;
/** Run some initialization logic, optionally returning a new filter to replace the current one. */ /** Run some initialization logic, optionally returning a new filter to replace the current one. */
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
return null; return $this;
} }
public static function fromReflectionType(ReflectionType $type): Filter public static function fromReflectionType(ReflectionType $type): Filter

View File

@ -14,10 +14,10 @@ use danog\MadelineProto\EventHandler\Update;
final class FilterFromAdmin extends Filter final class FilterFromAdmin extends Filter
{ {
private readonly array $adminIds; private readonly array $adminIds;
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
$this->adminIds = $API->getAdminIds(); $this->adminIds = $API->getAdminIds();
return null; return $this;
} }
public function apply(Update $update): bool public function apply(Update $update): bool
{ {

View File

@ -21,14 +21,14 @@ final class FilterFromSenders extends Filter
{ {
$this->peers = \array_unique($idOrUsername); $this->peers = \array_unique($idOrUsername);
} }
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
$res = []; $res = [];
foreach ($this->peers as $peer) { foreach ($this->peers as $peer) {
$res []= $API->getId($peer); $res []= $API->getId($peer);
} }
$this->peersResolved = $res; $this->peersResolved = $res;
return null; return $this;
} }
public function apply(Update $update): bool public function apply(Update $update): bool
{ {

View File

@ -17,10 +17,10 @@ final class FilterPeer extends Filter
public function __construct(private readonly string|int $peer) public function __construct(private readonly string|int $peer)
{ {
} }
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
$this->peerResolved = $API->getId($this->peer); $this->peerResolved = $API->getId($this->peer);
return null; return $this;
} }
public function apply(Update $update): bool public function apply(Update $update): bool
{ {

View File

@ -17,10 +17,10 @@ final class FilterSender extends Filter
public function __construct(private readonly string|int $peer) public function __construct(private readonly string|int $peer)
{ {
} }
public function initialize(EventHandler $API): ?Filter public function initialize(EventHandler $API): Filter
{ {
$this->peerResolved = $API->getId($this->peer); $this->peerResolved = $API->getId($this->peer);
return null; return $this;
} }
public function apply(Update $update): bool public function apply(Update $update): bool
{ {

View File

@ -27,12 +27,6 @@ abstract class RunnerAbstract
if (\defined('MADELINE_PHP')) { if (\defined('MADELINE_PHP')) {
return \MADELINE_PHP; return \MADELINE_PHP;
} }
/**
* If using madeline.phar, simply return madeline.phar path.
*/
if (\defined('MADELINE_PHAR')) {
return \MADELINE_PHAR;
}
// Write process runner to external file if inside a PHAR different from madeline.phar, // Write process runner to external file if inside a PHAR different from madeline.phar,
// because PHP can't open files inside a PHAR directly except for the stub. // because PHP can't open files inside a PHAR directly except for the stub.
if (\strpos(self::SCRIPT_PATH, 'phar://') === 0) { if (\strpos(self::SCRIPT_PATH, 'phar://') === 0) {

View File

@ -65,6 +65,7 @@ final class WebRunner extends RunnerAbstract
$params = [ $params = [
'argv' => ['madeline-ipc', $session, $startupId], 'argv' => ['madeline-ipc', $session, $startupId],
'cwd' => Magic::getcwd(), 'cwd' => Magic::getcwd(),
'MadelineSelfRestart' => 1
]; ];
if (\function_exists('memprof_enabled') && \memprof_enabled()) { if (\function_exists('memprof_enabled') && \memprof_enabled()) {
$params['MEMPROF_PROFILE'] = '1'; $params['MEMPROF_PROFILE'] = '1';

View File

@ -441,7 +441,7 @@ final class Lang
'plugins_do_not_use_require' => 'به دلایل عملکردی و اجرایی، پلاگین‌ها فقط میتوانند فایل های دیگر را که در پوشه پلاگین هاست با استفاده از راه‌اندازی بارگذار خودکار PSR-4، به صورت خودکار include یا require کنند (بدون require کردن دستی آنها).', 'plugins_do_not_use_require' => 'به دلایل عملکردی و اجرایی، پلاگین‌ها فقط میتوانند فایل های دیگر را که در پوشه پلاگین هاست با استفاده از راه‌اندازی بارگذار خودکار PSR-4، به صورت خودکار include یا require کنند (بدون require کردن دستی آنها).',
'plugins_must_have_exactly_one_class' => 'یک پلاگین باید دقیقا یک کلس را تعریف کند! برای تعریف چند کلس، اینترفیس یا تریت، فایل‌های جداگانه بسازید، آنها توسط مدلین‌پروتو به صورت خودکار بارگذاری خواهند شد.', 'plugins_must_have_exactly_one_class' => 'یک پلاگین باید دقیقا یک کلس را تعریف کند! برای تعریف چند کلس، اینترفیس یا تریت، فایل‌های جداگانه بسازید، آنها توسط مدلین‌پروتو به صورت خودکار بارگذاری خواهند شد.',
'predicate_not_set' => 'مستند (مقدار تحت _) تنظیم نشده!', 'predicate_not_set' => 'مستند (مقدار تحت _) تنظیم نشده!',
'recommend_not_use_filesystem_function' => 'استفاده از تابع %s پیشنهاد نمیشود، چراکه دسترسی و کار با فایل های سیستمی موقع پردازش آپدیت باعث کم شدن سرعت ربات شما میشود، لطفا صفحه https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions را ببینید تا با راه‌های جایگزین برای ذخیره اطلاعات که باعث کاهش سرعت نمیشوند آشنا شوید!', 'recommend_not_use_filesystem_function' => 'استفاده از تابع %s پیشنهاد نمیشود، چراکه دسترسی و کار با فایل های سیستمی موقع پردازش آپدیت باعث کم شدن سرعت ربات شما میشود، لطفا صفحه https://docs.madelineproto.xyz/docs/UPDATES.html#avoiding-the-use-of-filesystem-functions را ببینید تا با راه‌های جایگزین برای ذخیره اطلاعات که باعث کاهش سرعت ربات شما نمیشوند آشنا شوید!',
'rpc_tg_error' => 'تلگرام یک خطای RPC برگرداند: %s (%s), ناشی از %s:%s%sTL رد:', 'rpc_tg_error' => 'تلگرام یک خطای RPC برگرداند: %s (%s), ناشی از %s:%s%sTL رد:',
'sec_peer_not_in_db' => 'این peer مخفی در پایگاه داده (دیتابیس) داخلی peer وجود ندارد', 'sec_peer_not_in_db' => 'این peer مخفی در پایگاه داده (دیتابیس) داخلی peer وجود ندارد',
'secret_chat_skipping' => 'من چت مخفی (سکرت) %s را در پایگاه داده (دیتابیس) ندارم، درحال رد شدن از پیام...', 'secret_chat_skipping' => 'من چت مخفی (سکرت) %s را در پایگاه داده (دیتابیس) ندارم، درحال رد شدن از پیام...',

View File

@ -1654,6 +1654,7 @@ final class MTProto implements TLCallback, LoggerGetter
} }
} catch (Throwable $e) { } catch (Throwable $e) {
unset($userOrId[$k]); unset($userOrId[$k]);
$peer = \json_encode($peer);
$this->logger("Could not obtain info about report peer $peer: $e", Logger::FATAL_ERROR); $this->logger("Could not obtain info about report peer $peer: $e", Logger::FATAL_ERROR);
} }
} }

View File

@ -46,9 +46,11 @@ trait FileServer
*/ */
public static function downloadServer(string $session): void public static function downloadServer(string $session): void
{ {
if (isset($_GET['c'])) { if (isset($_GET['ping'])) {
$API = new API($session); $API = new API($session);
$API->processDownloadServerPing($_GET['c'], $_GET['i']); $id = (string) $API->getSelf()['id'];
header("Content-length: ".strlen($id));
echo $id;
die; die;
} }
if (!isset($_GET['f'])) { if (!isset($_GET['f'])) {
@ -110,7 +112,7 @@ trait FileServer
$messageMedia['mime'] ??= $mime; $messageMedia['mime'] ??= $mime;
$messageMedia['name'] ??= $name; $messageMedia['name'] ??= $name;
$f = is_string($media) ? $media : ($this->extractBotAPIFile($this->MTProtoToBotAPI($media))['file_id']); $f = \is_string($media) ? $media : ($this->extractBotAPIFile($this->MTProtoToBotAPI($media))['file_id']);
[ [
'name' => $name, 'name' => $name,
'ext' => $ext, 'ext' => $ext,
@ -208,25 +210,20 @@ trait FileServer
if (isset(self::$checkedScripts[$scriptUrl])) { if (isset(self::$checkedScripts[$scriptUrl])) {
return; return;
} }
$i = (string) \random_int(PHP_INT_MIN, PHP_INT_MAX); $scriptUrlNew = $scriptUrl.'?'.\http_build_query(['ping' => 1]);
$scriptUrlNew = $scriptUrl.'?'.\http_build_query(['c' => $scriptUrl, 'i' => $i]);
$this->logger->logger("Checking $scriptUrlNew..."); $this->logger->logger("Checking $scriptUrlNew...");
$this->fileGetContents($scriptUrlNew); $result = $this->fileGetContents($scriptUrlNew);
if (!isset(self::$checkedScripts[$scriptUrl])) { $expected = (string) $this->getSelf()['id'];
if ($result !== $expected) {
throw new AssertionError(\sprintf( throw new AssertionError(\sprintf(
Lang::$current_lang['invalid_dl.php'], Lang::$current_lang['invalid_dl.php_session'],
$scriptUrl, $scriptUrl,
"the check array wasn't populated" $expected,
)); $result,
}
if (self::$checkedScripts[$scriptUrl] !== $i) {
$v = self::$checkedScripts[$scriptUrl];
throw new AssertionError(\sprintf(
Lang::$current_lang['invalid_dl.php'],
$scriptUrl,
"the check array contains {$v} instead of $i"
)); ));
} }
self::$checkedScripts[$scriptUrl] = true;
} finally { } finally {
$lock->release(); $lock->release();
} }

View File

@ -534,9 +534,12 @@ trait Files
} }
$info = $info[$method]; $info = $info[$method];
if ($method === 'photo') { if ($method === 'photo') {
$info = array_values($info);
$cur = $info[0]; $cur = $info[0];
foreach ($info as $n) { foreach ($info as $n) {
if ($n['width'] * $n['height'] > $cur['width'] * $cur['height']) $cur = $n; if ($n['width'] * $n['height'] > $cur['width'] * $cur['height']) {
$cur = $n;
}
} }
$info = $cur; $info = $cur;
} }