1
0
mirror of https://github.com/danog/MadelineProto.git synced 2024-12-02 12:57:49 +01:00

Allow specifying command types in FilterCommand

This commit is contained in:
Daniil Gentili 2023-07-18 20:35:01 +02:00
parent 34a226c660
commit 8f6bea02a5
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
7 changed files with 47 additions and 16 deletions

2
docs

@ -1 +1 @@
Subproject commit 2cfccd0d5d83a44cf30750a27ad6f9f511ecbb0b Subproject commit ecb8774a1acc96a62a57a60baf3569283216432b

View File

@ -143,5 +143,8 @@
"plugins_do_not_use_require": "per motivi di performance, i plugin possono solo includere altri file presenti nella cartella plugins usando il meccanismo di autocaricamento PSR-4 (non usando require o include).", "plugins_do_not_use_require": "per motivi di performance, i plugin possono solo includere altri file presenti nella cartella plugins usando il meccanismo di autocaricamento PSR-4 (non usando require o include).",
"cli_need_dl.php_link": "È necessario specificare l'URL dello script di scaricamente per usare getDownloadLink via CLI!", "cli_need_dl.php_link": "È necessario specificare l'URL dello script di scaricamente per usare getDownloadLink via CLI!",
"need_dl.php": "Impossibile generare lo script di scaricamento di default (%s), è necessario creare un file dl.php con il seguente contenuto: %s e passare il suo URL al secondo parametro di getDownloadLink", "need_dl.php": "Impossibile generare lo script di scaricamento di default (%s), è necessario creare un file dl.php con il seguente contenuto: %s e passare il suo URL al secondo parametro di getDownloadLink",
"dl.php_powered_by_madelineproto": "Server di scaricamento file Telegram (fino a 4GB), creato usando <a href=\"https://docs.madelineproto.xyz\" target=\"_blank\">MadelineProto</a>!<br>Clicca <a href=\"https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link\" target=\"_blank\">qui</a> per configurare il tuo personale server di scaricamento file Telegram!" "dl.php_powered_by_madelineproto": "Server di scaricamento file Telegram (fino a 4GB), creato usando <a href=\"https://docs.madelineproto.xyz\" target=\"_blank\">MadelineProto</a>!<br>Clicca <a href=\"https://docs.madelineproto.xyz/docs/FILES.html#getting-a-download-link\" target=\"_blank\">qui</a> per configurare il tuo personale server di scaricamento file Telegram!",
"invalid_dl.php_session": "%s non è uno script di scaricamento valido perché l'ID della sessione non è corretto (mi aspettavo %s, ho ricevuto %s)",
"account_banned": "!!!!!!! ATTENZIONE !!!!!!!\nIl sistema antispam di telegram ha sospeso questo account.\nPer continuare, è richiesta una verifica manuale.\nMandare un'email in inglese a recover@telegram.org, chiedendo di sbannare il numero di telefono %s, spiegando brevemente cosa si ha intenzione di fare con l'account.\nPoi rieseguite nuovamente il login.\nIgnorare questo messaggio se la sessione è stata resettata intenzionalmente.",
"plugin_path_does_not_exist": "La cartella dei plugin %s non esiste!"
} }

View File

@ -379,7 +379,7 @@ abstract class EventHandler extends AbstractAPI
$pathNew = \realpath(\dirname((new ReflectionClass($class))->getFileName()).DIRECTORY_SEPARATOR.$path); $pathNew = \realpath(\dirname((new ReflectionClass($class))->getFileName()).DIRECTORY_SEPARATOR.$path);
if ($pathNew === false) { if ($pathNew === false) {
unset($paths[$k]); unset($paths[$k]);
Logger::log(sprintf(Lang::$current_lang['plugin_path_does_not_exist'], $path), Logger::FATAL_ERROR); Logger::log(\sprintf(Lang::$current_lang['plugin_path_does_not_exist'], $path), Logger::FATAL_ERROR);
continue; continue;
} }
} }
@ -403,7 +403,7 @@ abstract class EventHandler extends AbstractAPI
require $file; require $file;
continue; continue;
} }
if (str_contains($fileName, '.')) { if (\str_contains($fileName, '.')) {
continue; continue;
} }
$class = $namespace.'\\'.$fileName; $class = $namespace.'\\'.$fileName;

View File

@ -2,7 +2,9 @@
namespace danog\MadelineProto\EventHandler\Filter; namespace danog\MadelineProto\EventHandler\Filter;
use AssertionError;
use Attribute; use Attribute;
use danog\MadelineProto\EventHandler\CommandType;
use danog\MadelineProto\EventHandler\Message; use danog\MadelineProto\EventHandler\Message;
use danog\MadelineProto\EventHandler\Update; use danog\MadelineProto\EventHandler\Update;
use Webmozart\Assert\Assert; use Webmozart\Assert\Assert;
@ -13,12 +15,29 @@ use Webmozart\Assert\Assert;
#[Attribute(Attribute::TARGET_METHOD)] #[Attribute(Attribute::TARGET_METHOD)]
final class FilterCommand extends Filter final class FilterCommand extends Filter
{ {
public function __construct(private readonly string $command) /**
* @var array<CommandType>
*/
public readonly array $commandTypes;
/**
* @param string $command Command
* @param list<CommandType> $types Command types, if empty all command types are allowed.
*/
public function __construct(private readonly string $command, array $types = [CommandType::BANG, CommandType::DOT, CommandType::SLASH])
{ {
Assert::true(\preg_match("/^\w+$/", $command) === 1, "An invalid command was specified!"); Assert::true(\preg_match("/^\w+$/", $command) === 1, "An invalid command was specified!");
Assert::notEmpty($types, 'No command types were specified!');
$c = [];
foreach ($types as $type) {
if (isset($c[$type->value])) {
throw new AssertionError($type->value." was already specified!");
}
$c[$type->value] = true;
}
$this->commandTypes = $types;
} }
public function apply(Update $update): bool public function apply(Update $update): bool
{ {
return $update instanceof Message && $update->command === $this->command; return $update instanceof Message && $update->command === $this->command && \in_array($update->command, $this->commandTypes, true);
} }
} }

View File

@ -105,12 +105,12 @@ class Exception extends \Exception
*/ */
public static function exceptionHandler(\Throwable $exception): void public static function exceptionHandler(\Throwable $exception): void
{ {
$print = function (string $s) { $print = function (string $s): void {
Logger::log($s, Logger::FATAL_ERROR); Logger::log($s, Logger::FATAL_ERROR);
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
echo($s.PHP_EOL); echo($s.PHP_EOL);
} else { } else {
echo(str_replace("\n", "<br>", htmlentities($s)).PHP_EOL); echo(\str_replace("\n", "<br>", \htmlentities($s)).PHP_EOL);
} }
}; };
if (\str_contains($exception->getMessage(), 'Fiber stack protect failed') if (\str_contains($exception->getMessage(), 'Fiber stack protect failed')

View File

@ -146,6 +146,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'بەهای پێدراو ژمارەیی نییە', 'not_numeric' => 'بەهای پێدراو ژمارەیی نییە',
'params_missing' => 'پارامێتری پێویست نەماوە', 'params_missing' => 'پارامێتری پێویست نەماوە',
'peer_not_in_db' => 'ئەم هاوتایە لە بنکەدراوەی ناوخۆیی هاوتادا ئامادە نییە', 'peer_not_in_db' => 'ئەم هاوتایە لە بنکەدراوەی ناوخۆیی هاوتادا ئامادە نییە',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'پێشبینی (بەهای ژێر _) دانەنرابوو!', 'predicate_not_set' => 'پێشبینی (بەهای ژێر _) دانەنرابوو!',
@ -301,6 +302,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Given value isn\'t numeric',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Missing required parameter',
'peer_not_in_db' => 'This peer is not present in the internal peer database', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',
@ -456,6 +458,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'مقدار ورودی عددی نیست', 'not_numeric' => 'مقدار ورودی عددی نیست',
'params_missing' => 'ورودی موردنیاز یافت نشد', 'params_missing' => 'ورودی موردنیاز یافت نشد',
'peer_not_in_db' => 'این peer در پایگاه داده (دیتابیس) peer وجود ندارد', 'peer_not_in_db' => 'این peer در پایگاه داده (دیتابیس) peer وجود ندارد',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'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' => 'مستند (مقدار تحت _) تنظیم نشده!',
@ -611,6 +614,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'La valeur donnée n\'est pas numérique', 'not_numeric' => 'La valeur donnée n\'est pas numérique',
'params_missing' => 'Paramètre requis manquant', 'params_missing' => 'Paramètre requis manquant',
'peer_not_in_db' => 'This peer is not present in the internal peer database', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',
@ -766,6 +770,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'הערך הנתון אינו מספרי', 'not_numeric' => 'הערך הנתון אינו מספרי',
'params_missing' => 'חסר פרמטר נדרש', 'params_missing' => 'חסר פרמטר נדרש',
'peer_not_in_db' => 'עמית זה לא קיים במסד הנתונים הפנימי של עמיתים', 'peer_not_in_db' => 'עמית זה לא קיים במסד הנתונים הפנימי של עמיתים',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'פרדיקט (ערך תחת _) לא הוגדר!', 'predicate_not_set' => 'פרדיקט (ערך תחת _) לא הוגדר!',
@ -800,12 +805,12 @@ If you intentionally deleted this account, ignore this message.',
[ [
'2fa_uncalled' => 'Non sto aspettando la password, chiama prima le funzioni phoneLogin e completePhoneLogin!', '2fa_uncalled' => 'Non sto aspettando la password, chiama prima le funzioni phoneLogin e completePhoneLogin!',
'accepting_call' => 'Sto accettando una chiamata da %s...', 'accepting_call' => 'Sto accettando una chiamata da %s...',
'account_banned' => '!!!!!!! WARNING !!!!!!! 'account_banned' => '!!!!!!! ATTENZIONE !!!!!!!
Telegram\'s flood prevention system suspended this account. Il sistema antispam di telegram ha sospeso questo account.
To continue, manual verification is required. Per continuare, è richiesta una verifica manuale.
Send an email to recover@telegram.org, asking to unban the phone number %s, and shortly describe what will you do with this phone number. Mandare un\'email in inglese a recover@telegram.org, chiedendo di sbannare il numero di telefono %s, spiegando brevemente cosa si ha intenzione di fare con l\'account.
Then login again. Poi rieseguite nuovamente il login.
If you intentionally deleted this account, ignore this message.', Ignorare questo messaggio se la sessione è stata resettata intenzionalmente.',
'already_loggedIn' => 'Questa istanza di MadelineProto è già loggata!', 'already_loggedIn' => 'Questa istanza di MadelineProto è già loggata!',
'apiAppInstructionsAuto0' => 'Inserisci il nome dell\'app, può essere qualsiasi cosa: ', 'apiAppInstructionsAuto0' => 'Inserisci il nome dell\'app, può essere qualsiasi cosa: ',
'apiAppInstructionsAuto1' => 'Inserisci il nome ridotto dell\'app, caratteri alfanumerici: ', 'apiAppInstructionsAuto1' => 'Inserisci il nome ridotto dell\'app, caratteri alfanumerici: ',
@ -867,7 +872,7 @@ If you intentionally deleted this account, ignore this message.',
'file_type_invalid' => 'È stato fornito un tipo file errato', 'file_type_invalid' => 'È stato fornito un tipo file errato',
'fingerprint_invalid' => 'fingerprint della chiave non valido!', 'fingerprint_invalid' => 'fingerprint della chiave non valido!',
'go' => 'Vai', 'go' => 'Vai',
'invalid_dl.php_session' => '%s is not a valid download script because its session ID is different (expected %s, got %s)', 'invalid_dl.php_session' => '%s non è uno script di scaricamento valido perché l\'ID della sessione non è corretto (mi aspettavo %s, ho ricevuto %s)',
'length_too_big' => 'Il valore fornito è troppo lungo', 'length_too_big' => 'Il valore fornito è troppo lungo',
'loginBot' => 'Inserisci il tuo bot token: ', 'loginBot' => 'Inserisci il tuo bot token: ',
'loginBotTokenWeb' => 'Token del bot', 'loginBotTokenWeb' => 'Token del bot',
@ -921,6 +926,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'Il valore fornito non è numerico', 'not_numeric' => 'Il valore fornito non è numerico',
'params_missing' => 'Non hai fornito un parametro obbligatorio, rileggi la documentazione API', 'params_missing' => 'Non hai fornito un parametro obbligatorio, rileggi la documentazione API',
'peer_not_in_db' => 'Questo utente/gruppo/canale non è presente nel database interno MadelineProto', 'peer_not_in_db' => 'Questo utente/gruppo/canale non è presente nel database interno MadelineProto',
'plugin_path_does_not_exist' => 'La cartella dei plugin %s non esiste!',
'plugins_do_not_use_require' => 'per motivi di performance, i plugin possono solo includere altri file presenti nella cartella plugins usando il meccanismo di autocaricamento PSR-4 (non usando require o include).', 'plugins_do_not_use_require' => 'per motivi di performance, i plugin possono solo includere altri file presenti nella cartella plugins usando il meccanismo di autocaricamento PSR-4 (non usando require o include).',
'plugins_must_have_exactly_one_class' => 'un plugin deve definire esattamente una classe! Per definire più classi, interfacce o trait, si prega di creare file separati, che verranno caricati da MadelineProto automaticamente.', 'plugins_must_have_exactly_one_class' => 'un plugin deve definire esattamente una classe! Per definire più classi, interfacce o trait, si prega di creare file separati, che verranno caricati da MadelineProto automaticamente.',
'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!', 'predicate_not_set' => 'Il predicato (valore sotto chiave _, esempio [\'_\' => \'inputPeer\']) non è impostato!',
@ -1076,6 +1082,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Given value isn\'t numeric',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Missing required parameter',
'peer_not_in_db' => 'This peer is not present in the internal peer database', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',
@ -1231,6 +1238,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'Kiritilgan qiymat raqamlar emas', 'not_numeric' => 'Kiritilgan qiymat raqamlar emas',
'params_missing' => 'Talab etiladigan parametr kiritilmagan', 'params_missing' => 'Talab etiladigan parametr kiritilmagan',
'peer_not_in_db' => 'Bu obyekt ichki ma\'lumotlar bazasida mavjud emas', 'peer_not_in_db' => 'Bu obyekt ichki ma\'lumotlar bazasida mavjud emas',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'Predikat (_ ostidagi qiymat) belgilanmagan!', 'predicate_not_set' => 'Predikat (_ ostidagi qiymat) belgilanmagan!',
@ -1388,6 +1396,7 @@ If you intentionally deleted this account, ignore this message.',
'not_numeric' => 'Given value isn\'t numeric', 'not_numeric' => 'Given value isn\'t numeric',
'params_missing' => 'Missing required parameter', 'params_missing' => 'Missing required parameter',
'peer_not_in_db' => 'This peer is not present in the internal peer database', 'peer_not_in_db' => 'This peer is not present in the internal peer database',
'plugin_path_does_not_exist' => 'Plugin path %s does not exist!',
'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).', 'plugins_do_not_use_require' => 'for performance reasons, plugins can only automatically include or require other files present in the plugins folder by triggering the PSR-4 autoloader (not by manually require()\'ing them).',
'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.',
'predicate_not_set' => 'Predicate (value under _) was not set!', 'predicate_not_set' => 'Predicate (value under _) was not set!',

View File

@ -489,7 +489,7 @@ trait UpdateHandler
} }
} }
if ($result === null) { if ($result === null) {
$updates = json_encode($updates); $updates = \json_encode($updates);
throw new Exception("Could not find any message in $updates!"); throw new Exception("Could not find any message in $updates!");
} }
return $result; return $result;