diff --git a/author/project/system/models/traits/files.php b/author/project/system/models/traits/files.php deleted file mode 100755 index 415dff5..0000000 --- a/author/project/system/models/traits/files.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @author mirzaev - */ -trait files -{ - /** - * Delete - * - * Delete files recursively - * - * @param string $directory Directory - * @param array &$errors Registry of errors - * - * @return void - */ - private static function delete(string $directory, array &$errors = []): void - { - try { - if (file_exists($directory)) { - // Directory exists - - // Deleting descendant files and directories (enter to the recursion) - foreach (scandir($directory) as $file) { - if ($file === '.' || $file === '..') continue; - else if (is_dir("$directory/$file")) static::delete("$directory/$file", $errors); - else unlink("$directory/$file"); - } - - // Deleting the directory - rmdir($directory); - - // Exit (success) - return; - } else throw new exception('Directory does not exist'); - } catch (exception $e) { - // Writing to the registry of errors - $errors[] = [ - 'text' => $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - // Exit (fail) - return; - } -} diff --git a/composer.json b/composer.json index e9c86b4..0c05d9f 100755 --- a/composer.json +++ b/composer.json @@ -27,7 +27,12 @@ "mirzaev/baza": "^3.3", "twig/twig": "^3.10", "twig/extra-bundle": "^3.7", - "twig/intl-extra": "^3.10" + "twig/intl-extra": "^3.10", + "svoboda/time": "^1.0", + "badfarm/zanzara": "^0.9.1", + "nyholm/psr7": "^1.8", + "react/filesystem": "^0.1.2", + "react/async": "^4.3" }, "autoload": { "psr-4": { @@ -41,5 +46,11 @@ }, "scripts": { "pre-update-cmd": "./install.sh" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "wyrihaximus/composer-update-bin-autoload-path": true + } } } diff --git a/examples/systemd/deeproots.service b/examples/systemd/deeproots.service new file mode 100644 index 0000000..88ad42c --- /dev/null +++ b/examples/systemd/deeproots.service @@ -0,0 +1,16 @@ +[Unit] +Description=Telegram chat-robot: @domain_of_your_robot_here + +Wants=network.target +After=syslog.target network-online.target + +[Service] +ExecStart=sudo -u www-data /usr/bin/php /var/www/deeproots/mirzaev/deeproots/system/public/telegram.php +PIDFile=/var/run/php/deeproots.pid +RemainAfterExit=no +RuntimeMaxSec=3600s +Restart=always +RestartSec=5s + +[Install] +WantedBy=multi-user.target diff --git a/author/project/system/controllers/core.php b/mirzaev/deeproots/system/controllers/core.php similarity index 79% rename from author/project/system/controllers/core.php rename to mirzaev/deeproots/system/controllers/core.php index a939477..982e8f9 100755 --- a/author/project/system/controllers/core.php +++ b/mirzaev/deeproots/system/controllers/core.php @@ -5,10 +5,7 @@ declare(strict_types=1); namespace mirzaev\deeproots\controllers; // Files of the project -use mirzaev\deeproots\views\templater, - mirzaev\deeproots\models\core as models, - mirzaev\deeproots\models\session, - mirzaev\deeproots\models\enumerations\language; +use mirzaev\deeproots\models\core as models; // Framework for PHP use mirzaev\minimal\core as minimal, @@ -25,11 +22,10 @@ use mirzaev\minimal\core as minimal, * @param response $response Response * @param array $errors Registry of errors * - * @method void __construct(minimal $minimal) Constructor + * @method void __construct(minimal $minimal, bool $initialize) Constructor * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License - * @author Arsen Mirzaev Tatyano-Muradovich - * @author mirzaev + * @author svoboda */ class core extends controller { @@ -58,7 +54,6 @@ class core extends controller * @var array $errors Registry of errors */ protected array $errors = [ - 'system' => [] ]; /** @@ -69,7 +64,7 @@ class core extends controller * * @return void */ - public function __construct(minimal $core) + public function __construct(minimal $core, bool $initialize = true) { // Blocking requests from CloudFlare (better to write this blocking into nginx config file) if (isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return status::bruh->label; diff --git a/author/project/system/controllers/index.php b/mirzaev/deeproots/system/controllers/index.php similarity index 100% rename from author/project/system/controllers/index.php rename to mirzaev/deeproots/system/controllers/index.php diff --git a/author/project/system/databases/.gitignore b/mirzaev/deeproots/system/databases/.gitignore similarity index 100% rename from author/project/system/databases/.gitignore rename to mirzaev/deeproots/system/databases/.gitignore diff --git a/mirzaev/deeproots/system/localizations/english.php b/mirzaev/deeproots/system/localizations/english.php new file mode 100644 index 0000000..578a9f8 --- /dev/null +++ b/mirzaev/deeproots/system/localizations/english.php @@ -0,0 +1,184 @@ + 'DeepRoots', + 'empty' => 'Empty', + 'yes' => 'Yes', + 'no' => 'No', + + // Main menu + 'menu_title' => 'Main menu', + 'menu_button_start' => 'Start', + 'menu_button_rating' => 'Rating', + 'menu_button_balance' => 'Balance', + 'menu_button_system_accounts' => 'Accounts', + 'menu_button_system_questions' => 'Questions', + 'menu_button_system_settings' => 'Settings', + 'menu_system_authorized' => 'System authorization found', + + // Account + 'account_title' => 'Account', + 'account_identifier' => 'Identifier', + 'account_authorized_system' => 'Access to the system', + 'account_authorized_game_play' => 'Access to play games', + 'account_authorized_rating_display' => 'Access to display in the rating', + 'account_authorized_balance_deposit' => 'Access to deposit into the balance', + 'account_authorized_balance_withdraw' => 'Access to withdraw from the balance', + 'account_authorized_settings' => 'Access to settings', + 'account_authorized_system_accounts' => 'System access to accounts', + 'account_authorized_system_questions' => 'System access to questions', + 'account_authorized_system_settings' => 'System access to system settings', + + // Language setting + 'settings_select_language_title' => 'Select language', + 'settings_select_language_description' => 'The selected language will be writed in your account settings', + 'settings_language_update_success' => 'Language replaced:', + 'settings_language_update_fail' => 'Failed to replace language', + + // Language selection + 'select_language_title' => 'Select language', + 'select_language_description' => 'The selected language will be used in the current process', + 'select_language_button_add' => 'Add a language', + + // Repository + 'repository_title' => 'Repository', + 'repository_text' => << 'The code', + 'repository_button_issues' => 'Issues', + 'repository_button_suggestions' => 'Suggestions', + + // Author + 'author_title' => 'Author', + 'author_text' => << 'Neurojournal', + 'author_button_projects' => 'Projects', + 'author_button_twitter' => 'Twitter', + 'author_button_bluesky' => 'Bluesky', + 'author_button_bastyon' => 'Bastyon', + 'author_button_youtube_english' => 'YouTube', + 'author_button_youtube_russian' => 'YouTube', + 'author_button_message' => 'Send a message', + + // Questions (system) + 'system_questions_title' => 'The questions registry', + 'system_questions_questions' => 'Questions', + 'system_questions_answers' => 'Answers', + 'system_questions_answers_amount_matches' => 'The amount of questions matches the amount of answers', + 'system_questions_answers_amount_different' => 'The amount of questions does not match the amount of answers', + 'system_questions_amount_matches' => 'The amount of questions matches the amount of localizations', + 'system_questions_amount_different' => 'The amount of questions does not match the amount of localizations', + 'system_questions_localizations_amount_matches' => 'Amounts of localizations matches with each other', + 'system_questions_localizations_amount_different' => 'Amounts of localizations does not match with each other', + 'system_questions_button_search' => 'Search', + 'system_questions_button_create' => 'Create', + + // Question create (system) + 'system_questions_create_created' => 'The question was created', + + // Question search (system) + 'system_questions_search_title' => 'The question search process', + 'system_questions_search_continued' => 'The process of the question search found and continued', + 'system_questions_search_started' => 'The process of the question search started', + 'system_questions_search_not_started' => 'The process of the question search is not started', + 'system_questions_search_ended' => 'The process of the question search ended', + 'system_questions_search_page_next_exists' => 'There are more questions in the registry', + 'system_questions_search_page_next_not_exists' => 'There are no more questions in the registry', + 'system_questions_search_empty' => 'No questions found', + 'system_questions_search_question_title' => 'Question', + 'system_questions_search_question_answer' => 'Answer', + 'system_questions_search_identifier_request_title' => 'Enter identifier', + 'system_questions_search_identifier_request_not_acceptable' => 'Failed to process the identifier', + 'system_questions_search_identifier_request_too_short' => 'Identifier length must be \>\= 1 and \<\= 12', + 'system_questions_search_identifier_request_too_long' => 'Identifier length must be \>\= 1 and \<\= 12', + 'system_questions_search_identifier_request_restricted_characters_title' => "Restricted any characters except digits", + 'system_questions_search_identifier_request_restricted_characters_description' => "Remove these characters:", + 'system_questions_search_identifier_cancel_success' => 'Cancelled the identifier replacing process', + 'system_questions_search_identifier_delete_success' => 'Identifier deleted', + 'system_questions_search_identifier_update_success' => 'Identifier replaced:', + 'system_questions_search_identifier_update_fail' => 'Failed to replace identifier', + 'system_questions_search_text_request_title' => 'Enter text', + 'system_questions_search_text_request_not_acceptable' => 'Failed to process the text', + 'system_questions_search_text_request_too_short' => 'Text length must be \>\= 3 and \<\= 256', + 'system_questions_search_text_request_too_long' => 'Text length must be \>\= 3 and \<\= 256', + 'system_questions_search_text_cancel_success' => 'Cancelled the text replacing process', + 'system_questions_search_text_delete_success' => 'Text deleted', + 'system_questions_search_text_update_success' => 'Text replaced:', + 'system_questions_search_text_update_fail' => 'Failed to replace text', + 'system_questions_search_a_request_title' => 'Enter A\-answer', + 'system_questions_search_a_request_not_acceptable' => 'Failed to process the A\-answer', + 'system_questions_search_a_request_too_short' => 'A\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_a_request_too_long' => 'A\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_a_cancel_success' => 'Cancelled the A\-answer replacing process', + 'system_questions_search_a_delete_success' => 'A\-answer deleted', + 'system_questions_search_a_update_success' => 'A\-answer replaced:', + 'system_questions_search_a_update_fail' => 'Failed to replace A\-answer', + 'system_questions_search_b_request_title' => 'Enter B\-answer', + 'system_questions_search_b_request_not_acceptable' => 'Failed to process the B\-answer', + 'system_questions_search_b_request_too_short' => 'B\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_b_request_too_long' => 'B\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_b_cancel_success' => 'Cancelled the B\-answer replacing process', + 'system_questions_search_b_delete_success' => 'B\-answer deleted', + 'system_questions_search_b_update_success' => 'B\-answer replaced:', + 'system_questions_search_b_update_fail' => 'Failed to replace B\-answer', + 'system_questions_search_c_request_title' => 'Enter C\-answer', + 'system_questions_search_c_request_not_acceptable' => 'Failed to process the C\-answer', + 'system_questions_search_c_request_too_short' => 'C\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_c_request_too_long' => 'C\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_c_cancel_success' => 'Cancelled the C\-answer replacing process', + 'system_questions_search_c_delete_success' => 'C\-answer deleted', + 'system_questions_search_c_update_success' => 'C\-answer replaced:', + 'system_questions_search_c_update_fail' => 'Failed to replace C\-answer', + 'system_questions_search_d_request_title' => 'Enter D\-answer', + 'system_questions_search_d_request_not_acceptable' => 'Failed to process the D\-answer', + 'system_questions_search_d_request_too_short' => 'D\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_d_request_too_long' => 'D\-answer length must be \>\= 3 and \<\= 128', + 'system_questions_search_d_cancel_success' => 'Cancelled the D\-answer replacing process', + 'system_questions_search_d_delete_success' => 'D\-answer deleted', + 'system_questions_search_d_update_success' => 'D\-answer replaced:', + 'system_questions_search_d_update_fail' => 'Failed to replace D\-answer', + 'system_questions_search_button_delete' => 'Delete', + 'system_questions_search_button_author' => 'Author', + 'system_questions_search_button_active' => 'Active', + 'system_questions_search_button_inactive' => 'Inactive', + 'system_questions_search_button_answer' => 'Answer', + 'system_questions_search_button_localizations' => 'Localizations', + 'system_questions_search_button_identifier' => 'Identifier', + 'system_questions_search_button_text' => 'Text', + 'system_questions_search_button_a' => 'A', + 'system_questions_search_button_b' => 'B', + 'system_questions_search_button_c' => 'C', + 'system_questions_search_button_d' => 'D', + 'system_questions_search_button_delete' => 'Delete', + 'system_questions_search_button_cancel' => 'Cancel', + 'system_questions_search_button_page_next' => 'Next page', + 'system_questions_search_button_end' => 'End the search process', + 'system_questions_search_not_localized' => 'Failed to initialize the question localization', + + // Question localization create (system) + 'system_questions_localization_create_created' => 'The question localization was created', + + // Authorization + 'not_authorized_system' => 'You do not have access to the system', + 'not_authorized_game_play' => 'You do not have access to play games', + 'not_authorized_rating_display' => 'You do not have access to display in the rating', + 'not_authorized_balance_deposit' => 'You do not have access to deposit into the balance', + 'not_authorized_balance_withdraw' => 'You do not have access to withdraw from the balance', + 'not_authorized_settings' => 'You do not have access to the settings', + 'not_authorized_system_accounts' => 'You do not have system access to the accounts', + 'not_authorized_system_questions' => 'You do not have system access to the questions', + 'not_authorized_system_settings' => 'You do not have system access to the system settings', + + // Other + 'why_so_shroomious' => 'why so shroomious', +]; diff --git a/mirzaev/deeproots/system/localizations/russian.php b/mirzaev/deeproots/system/localizations/russian.php new file mode 100644 index 0000000..4506d7e --- /dev/null +++ b/mirzaev/deeproots/system/localizations/russian.php @@ -0,0 +1,184 @@ + 'DeepRoots', + 'empty' => 'Пусто', + 'yes' => 'Да', + 'no' => 'Нет', + + // Главное меню + 'menu_title' => 'Главное меню', + 'menu_button_start' => 'Начать', + 'menu_button_rating' => 'Рейтинг', + 'menu_button_balance' => 'Баланс', + 'menu_button_system_accounts' => 'Аккаунты', + 'menu_button_system_questions' => 'Вопросы', + 'menu_button_system_settings' => 'Настройки', + 'menu_system_authorized' => 'Найдена системная авторизация', + + // Аккаунт + 'account_title' => 'Аккаунт', + 'account_identifier' => 'Идентификатор', + 'account_authorized_system' => 'Доступ к системе', + 'account_authorized_game_play' => 'Доступ к играм', + 'account_authorized_rating_display' => 'Доступ к отображению в рейтинге', + 'account_authorized_balance_deposit' => 'Доступ к пополнению баланса', + 'account_authorized_balance_withdraw' => 'Доступ к выводу баланса', + 'account_authorized_settings' => 'Доступ к настроекам', + 'account_authorized_system_accounts' => 'Системный доступ к аккаунтам', + 'account_authorized_system_questions' => 'Системный доступ к вопросам', + 'account_authorized_system_settings' => 'Системный доступ к системным настройкам', + + // Настройки языка + 'settings_select_language_title' => 'Выбери язык', + 'settings_select_language_description' => 'Выбранный язык будет записан в настройки аккаунта', + 'settings_language_update_success' => 'Язык заменён:', + 'settings_language_update_fail' => 'Не удалось заменить язык', + + // Выбор языка + 'select_language_title' => 'Выбери язык', + 'select_language_description' => 'Выбранный язык будет использован в текущем процессе', + 'select_language_button_add' => 'Добавить язык', + + // Репозиторий + 'repository_title' => 'Репозиторий', + 'repository_text' => << 'Код', + 'repository_button_issues' => 'Проблемы', + 'repository_button_suggestions' => 'Предложения', + + // Автор + 'author_title' => 'Автор', + 'author_text' => << 'Нейрожурнал', + 'author_button_projects' => 'Проекты', + 'author_button_twitter' => 'Twitter', + 'author_button_bluesky' => 'Bluesky', + 'author_button_bastyon' => 'Bastyon', + 'author_button_youtube_english' => 'YouTube', + 'author_button_youtube_russian' => 'YouTube', + 'author_button_message' => 'Отправить сообщение', + + // Вопросы (система) + 'system_questions_title' => 'Реестр вопросов', + 'system_questions_questions' => 'Вопросы', + 'system_questions_answers' => 'Ответы', + 'system_questions_answers_amount_matches' => 'Количество вопросов совпадает с количеством ответов', + 'system_questions_answers_amount_different' => 'Количество вопросов не совпадает с количеством ответов', + 'system_questions_amount_matches' => 'Количество вопросов совпадает с количеством локализаций', + 'system_questions_amount_different' => 'Количество вопросов не совпадает с количеством локализаций', + 'system_questions_localizations_amount_matches' => 'Количества локализаций совпадает друг с другом', + 'system_questions_localizations_amount_different' => 'Количества локализаций не совпадает друг с другом', + 'system_questions_button_search' => 'Поиск', + 'system_questions_button_create' => 'Создать', + + // Создание вопроса (система) + 'system_questions_create_created' => 'Создан вопрос', + + // Поиск вопроса (система) + 'system_questions_search_title' => 'Процесс поиска вопроса', + 'system_questions_search_continued' => 'Процесс поиска вопроса найден и продолжен', + 'system_questions_search_started' => 'Процесс поиска вопроса начат', + 'system_questions_search_not_started' => 'Процесс поиска вопроса не начат', + 'system_questions_search_ended' => 'Процесс поиска вопроса завершён', + 'system_questions_search_page_next_exists' => 'В реестре есть ещё вопросы', + 'system_questions_search_page_next_not_exists' => 'В реестре больше нет вопросов', + 'system_questions_search_empty' => 'Вопросы не найдены', + 'system_questions_search_question_title' => 'Вопрос', + 'system_questions_search_question_answer' => 'Ответ', + 'system_questions_search_identifier_request_title' => 'Введи идентификатор', + 'system_questions_search_identifier_request_not_acceptable' => 'Не удалось обработать идентификатор', + 'system_questions_search_identifier_request_too_short' => 'Длина идентификатора должна быть \>\= 1 и \<\= 12', + 'system_questions_search_identifier_request_too_long' => 'Длина идентификатора должна быть \>\= 1 и \<\= 12', + 'system_questions_search_identifier_request_restricted_characters_title' => "Запрещены любые символы, кроме цифр", + 'system_questions_search_identifier_request_restricted_characters_description' => "Удали эти символы:", + 'system_questions_search_identifier_cancel_success' => 'Отменён процесс замены идентификатора', + 'system_questions_search_identifier_delete_success' => 'Идентификатор удалён', + 'system_questions_search_identifier_update_success' => 'Идентификатор заменён:', + 'system_questions_search_identifier_update_fail' => 'Не удалось заменить идентификатор', + 'system_questions_search_text_request_title' => 'Введи текст', + 'system_questions_search_text_request_not_acceptable' => 'Не удалось обработать текст', + 'system_questions_search_text_request_too_short' => 'Длина текста должна быть \>\= 3 и \<\= 256', + 'system_questions_search_text_request_too_long' => 'Длина текста должна быть \>\= 3 и \<\= 256', + 'system_questions_search_text_cancel_success' => 'Отменён процесс замены текста', + 'system_questions_search_text_delete_success' => 'Текст удалён', + 'system_questions_search_text_update_success' => 'Текст заменён:', + 'system_questions_search_text_update_fail' => 'Не удалось заменить текст', + 'system_questions_search_a_request_title' => 'Введи A\-ответ', + 'system_questions_search_a_request_not_acceptable' => 'Не удалось обработать A\-ответ', + 'system_questions_search_a_request_too_short' => 'Длина A\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_a_request_too_long' => 'Длина A\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_a_cancel_success' => 'Отменён процесс замены A\-ответа', + 'system_questions_search_a_delete_success' => 'A\-ответ удалён', + 'system_questions_search_a_update_success' => 'A\-ответ заменён:', + 'system_questions_search_a_update_fail' => 'Не удалось заменить A\-ответ', + 'system_questions_search_b_request_title' => 'Введи B\-ответ', + 'system_questions_search_b_request_not_acceptable' => 'Не удалось обработать B\-ответ', + 'system_questions_search_b_request_too_short' => 'Длина B\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_b_request_too_long' => 'Длина B\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_b_cancel_success' => 'Отменён процесс замены B\-ответа', + 'system_questions_search_b_delete_success' => 'B\-ответ удалён', + 'system_questions_search_b_update_success' => 'B\-ответ заменён:', + 'system_questions_search_b_update_fail' => 'Не удалось заменить B\-ответ', + 'system_questions_search_c_request_title' => 'Введи C\-ответ', + 'system_questions_search_c_request_not_acceptable' => 'Не удалось обработать C\-ответ', + 'system_questions_search_c_request_too_short' => 'Длина C\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_c_request_too_long' => 'Длина C\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_c_cancel_success' => 'Отменён процесс замены C\-ответа', + 'system_questions_search_c_delete_success' => 'C\-ответ удалён', + 'system_questions_search_c_update_success' => 'C\-ответ заменён:', + 'system_questions_search_c_update_fail' => 'Не удалось заменить C\-ответ', + 'system_questions_search_d_request_title' => 'Введи D\-ответ', + 'system_questions_search_d_request_not_acceptable' => 'Не удалось обработать D\-ответ', + 'system_questions_search_d_request_too_short' => 'Длина D\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_d_request_too_long' => 'Длина D\-ответа должна быть \>\= 3 и \<\= 128', + 'system_questions_search_d_cancel_success' => 'Отменён процесс замены D\-ответа', + 'system_questions_search_d_delete_success' => 'D\-ответ удалён', + 'system_questions_search_d_update_success' => 'D\-ответ заменён:', + 'system_questions_search_d_update_fail' => 'Не удалось заменить D\-ответ', + 'system_questions_search_button_delete' => 'Удалить', + 'system_questions_search_button_author' => 'Автор', + 'system_questions_search_button_active' => 'Активен', + 'system_questions_search_button_inactive' => 'Неактивен', + 'system_questions_search_button_answer' => 'Ответ', + 'system_questions_search_button_localizations' => 'Локализации', + 'system_questions_search_button_identifier' => 'Идентифиикатор', + 'system_questions_search_button_text' => 'Текст', + 'system_questions_search_button_a' => 'А', + 'system_questions_search_button_b' => 'Б', + 'system_questions_search_button_c' => 'В', + 'system_questions_search_button_d' => 'Г', + 'system_questions_search_button_delete' => 'Удалить', + 'system_questions_search_button_cancel' => 'Отменить', + 'system_questions_search_button_page_next' => 'Следующая страница', + 'system_questions_search_button_end' => 'Завершить процесс поиска', + 'system_questions_search_not_localized' => 'Не удалось инициализировать локализацию вопроса', + + // Создание локализации вопроса (система) + 'system_questions_localization_create_created' => 'Создана локализация вопроса', + + // Авторизация + 'not_authorized_system' => 'У тебя нет доступа к системе', + 'not_authorized_game_play' => 'У тебя нет доступа к играм', + 'not_authorized_rating_display' => 'У тебя нет доступа к отображению в рейтинге', + 'not_authorized_balance_deposit' => 'У тебя нет доступа к пополнению баланса', + 'not_authorized_balance_withdraw' => 'У тебя нет доступа к выводу баланса', + 'not_authorized_settings' => 'У тебя нет доступа к настройкам', + 'not_authorized_system_accounts' => 'У тебя нет системного доступа к аккаунтам', + 'not_authorized_system_questions' => 'У тебя нет системного доступа к вопросам', + 'not_authorized_system_settings' => 'У тебя нет системного доступа к системным настройкам', + + // Прочее + 'why_so_shroomious' => 'почему такой грибъёзный', +]; diff --git a/mirzaev/deeproots/system/models/account.php b/mirzaev/deeproots/system/models/account.php new file mode 100755 index 0000000..8932e5b --- /dev/null +++ b/mirzaev/deeproots/system/models/account.php @@ -0,0 +1,224 @@ + + */ +final class account extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'accounts.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::utf8) + ->columns( + new column('identifier', type::integer_unsigned), + new column('name', type::string, ['length' => 64]), + new column('language', type::string, ['length' => 2]), + new column('authorized_system', type::char), + new column('authorized_game_play', type::char), + new column('authorized_rating_display', type::char), + new column('authorized_balance_deposit', type::char), + new column('authorized_balance_withdraw', type::char), + new column('authorized_settings', type::char), + new column('authorized_system_accounts', type::char), + new column('authorized_system_questions', type::char), + new column('authorized_system_settings', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Initialize + * + * Searches for the account record by the telegram account in the database, + * and if it does not find it, then create the account record and the connection record + * + * @param record $telegram The telegram account + * + * @throws exception_runtime if failed to deactivate the connection between missing account and the telegram account + * @throws exception_runtime if failed to connect the account with the telegram account + * @throws exception_runtime if failed to find the created account + * @throws exception_runtime if failed to create the account + * + * @return record The account record from the database + */ + public function initialize(record $telegram): record + { + // Initializing the connection model + $connection = new connection; + + // Searching for the connection record between theaccount and the telegram account in the database + $connected = $connection->database->read(filter: fn(record $record) => $record->telegram === $telegram->identifier, amount: 1)[0] ?? null; + + if ($connected instanceof record) { + // Found the connection record between the account and the telegram account + + // Searching for the account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier === $connected->account, amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the account + + // Exit (success) + return $account; + } else { + // Not found the account + + // Deactivating the connection between missing account and the telegram account + $deactivated = $connected->read( + filter: fn(record $record) => $record->identifier === $connected->identifier, + update: function (record &$record) { + $record->active = 0; + $record->updated = svoboda::timestamp(); + }, + amount: 1)[0] ?? null; + + if ($deactivated instanceof record && $deactivated->active === 0) { + // Deactivated the connection between missing account and the telegram account + + // Creating the account + goto create; + } else { + // Failed to deactivate the connection between missing account and the telegram account + + // Exit (fail) + throw new exception_runtime('Failed to deactivate the connection between missing account and the telegram account'); + } + } + } else { + // Not found the connection record between the account and the telegram account + + // Creating the account process start + create: + + // Creating the account + $identifier = $this->create("$telegram->name_first $telegram->name_second", language::{$telegram->language ?? language::en->name} ?? language::en); + + if ($identifier) { + // Created the account + + // Searching for the created account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier === $identifier, amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the created account + + // Connecting the created account with the telegram account + $connected = $connection->create(account: $account->identifier, telegram: $telegram->identifier); + + if ($connected) { + // Connected the created account with the telegram account + + // Exit (success) + return $account; + } else { + // Not connected the created account with the telegram account + + // Exit (fail) + throw new exception_runtime('Failed to connect the account with the telegram account'); + } + } else { + // Not found the created account + + // Exit (fail) + throw new exception_runtime('Failed to find the created account'); + } + } else { + // Not created the account + + // Exit (fail) + throw new exception_runtime('Failed to create the account'); + } + } + } + + /** + * Create + * + * Creates the account record in the database + * + * @param telegram $telegram The telegram account + * + * @return int|false The record identifier, if created + */ + public function create(string $name, language $language): int|false + { + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $name, + $language->name, + ACCOUNT_ACCESS_SYSTEM, + ACCOUNT_ACCESS_GAME_PLAY, + ACCOUNT_ACCESS_RATING_DISPLAY, + ACCOUNT_ACCESS_BALANCE_DEPOSIT, + ACCOUNT_ACCESS_BALANCE_WITHDRAW, + ACCOUNT_ACCESS_SETTINGS, + ACCOUNT_ACCESS_SYSTEM_ACCOUNTS, + ACCOUNT_ACCESS_SYSTEM_QUESTIONS, + ACCOUNT_ACCESS_SYSTEM_SETTINGS, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/mirzaev/deeproots/system/models/answer.php b/mirzaev/deeproots/system/models/answer.php new file mode 100755 index 0000000..7413ee9 --- /dev/null +++ b/mirzaev/deeproots/system/models/answer.php @@ -0,0 +1,110 @@ + + */ +final class answer extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'answers.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @param language $language Questions language + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('A', type::char), + new column('B', type::char), + new column('C', type::char), + new column('D', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the record in the database + * + * @param int $identifier Identifier (same for questions in every language) + * @param int $a Number of points for answer A + * @param int $b Number of points for answer B + * @param int $c Number of points for answer C + * @param int $d Number of points for answer D + * + * @return int|false The record identifier, if created + */ + public function create(?int $identifier, int $a = 0, int $b = 0, int $c = 0, int $d = 0): int|false + { + // Initializing the identifier + $identifier ??= $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $a, + $b, + $c, + $d, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/mirzaev/deeproots/system/models/connection.php b/mirzaev/deeproots/system/models/connection.php new file mode 100755 index 0000000..3d60ba2 --- /dev/null +++ b/mirzaev/deeproots/system/models/connection.php @@ -0,0 +1,110 @@ + + */ +final class connection extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'connection.baza'; + + /** + * Database + * + * Identifier: The record identifier + * Account: The account identifier + * Telegram: The telegram account identifier + * Updated: Timestamp of the last the record update + * Created: Timestamp of the record creating + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('account', type::integer_unsigned), + new column('telegram', type::integer_unsigned), + new column('active', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the record in the database + * + * @param int $account Identifier of the account + * @param int $telegram Identifier of the telegram account + * @param bool $active Is the connection active? + * + * @return int|false The record identifier, if created + */ + public function create(int $account, int $telegram, bool $active = true): int|false + { + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + $account, + $telegram, + (int) $active, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/author/project/system/models/core.php b/mirzaev/deeproots/system/models/core.php similarity index 95% rename from author/project/system/models/core.php rename to mirzaev/deeproots/system/models/core.php index c2e81f3..732a542 100755 --- a/author/project/system/models/core.php +++ b/mirzaev/deeproots/system/models/core.php @@ -20,7 +20,6 @@ use exception; * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich - * @author mirzaev */ class core extends model { diff --git a/author/project/system/models/enumerations/language.php b/mirzaev/deeproots/system/models/enumerations/language.php similarity index 55% rename from author/project/system/models/enumerations/language.php rename to mirzaev/deeproots/system/models/enumerations/language.php index 72dce07..4e00cb7 100755 --- a/author/project/system/models/enumerations/language.php +++ b/mirzaev/deeproots/system/models/enumerations/language.php @@ -7,46 +7,53 @@ namespace mirzaev\deeproots\models\enumerations; /** * Language * - * Types of languages by ISO 639-1 standart + * Types of languages by ISO 639-1 standart @deprecated * * @package mirzaev\deeproots\models\enumerations * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich - * @author mirzaev */ enum language { case en; case ru; + case in; /** - * Label - * + * Label + * * Initialize label of the language * * @param language|null language Language into which to translate * * @return string Translated label of the language */ - public function label(?language language = language::en): string + public function label(?language $language = language::en): string { // Exit (success) - return match (this) { - language::en => match (language) { + return match ($this) { + language::en => match ($language) { language::en => 'English', - language::ru => 'Английский' + language::ru => 'Английский', + language::in => 'अंग्रेज़ी', }, - language::ru => match (language) { + language::ru => match ($language) { language::en => 'Russian', - language::ru => 'Русский' + language::ru => 'Русский', + language::in => 'रूसी', + }, + language::in => match ($language) { + language::en => 'Hindi', + language::ru => 'Хинди', + language::in => 'हिन्दी', } }; } /** - * Flag - * + * Flag + * * Initialize the flag emoji of the language * * @return string The flag emoji of the language @@ -54,9 +61,10 @@ enum language public function flag(): string { // Exit (success) - return match (this) { + return match ($this) { language::en => '🇺🇸', - language::ru => '🇷🇺' + language::ru => '🇷🇺', + language::in => '🇮🇳', }; } } diff --git a/mirzaev/deeproots/system/models/question.php b/mirzaev/deeproots/system/models/question.php new file mode 100755 index 0000000..b8476c4 --- /dev/null +++ b/mirzaev/deeproots/system/models/question.php @@ -0,0 +1,98 @@ + + */ +final class question extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'questions.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('active', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Create + * + * Creates the record in the database + * + * @param bool $active Is the question active? + * + * @return int|false The record identifier, if created + */ + public function create(bool $active = false): int|false + { + // Initializing the identifier + $identifier ??= $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + (int) $active, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/mirzaev/deeproots/system/models/question/localization.php b/mirzaev/deeproots/system/models/question/localization.php new file mode 100755 index 0000000..cf6df79 --- /dev/null +++ b/mirzaev/deeproots/system/models/question/localization.php @@ -0,0 +1,110 @@ + + */ +final class localization extends core +{ + /** + * Files + * + * @var string $database Path to the database files + */ + protected string $files = DATABASES . DIRECTORY_SEPARATOR . 'questions' . DIRECTORY_SEPARATOR . 'localizations'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @param language $language Language + * + * @return void + */ + public function __construct(language $language) + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::ascii) + ->columns( + new column('identifier', type::integer_unsigned), + new column('text', type::string, ['length' => 256]), + new column('A', type::string, ['length' => 128]), + new column('B', type::string, ['length' => 128]), + new column('C', type::string, ['length' => 128]), + new column('D', type::string, ['length' => 128]), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->files . DIRECTORY_SEPARATOR . strtolower($language->label()) . '.baza'); + } + + /** + * Create + * + * Creates the record in the database + * + * @param int $identifier Identifier of the question::class record + * @param string $text Text (length: 256) + * @param string $a Answer A (length: 128) + * @param string $b Answer B (length: 128) + * @param string $c Answer C (length: 128) + * @param string $d Answer D (length: 128) + * + * @return int|false The record identifier, if created + */ + public function create(int $identifier, string $text, string $a, string $b, string $c, string $d): int|false + { + // Initializing the record + $record = $this->database->record( + $identifier, + $text, + $a, + $b, + $c, + $d, + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/mirzaev/deeproots/system/models/telegram.php b/mirzaev/deeproots/system/models/telegram.php new file mode 100755 index 0000000..9bdb48d --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram.php @@ -0,0 +1,192 @@ + + */ +final class telegram extends core +{ + /** + * File + * + * @var string $database Path to the database file + */ + protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'telegram.baza'; + + /** + * Database + * + * @var database $database The database + */ + public protected(set) database $database; + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Initializing the database + $this->database = new database() + ->encoding(encoding::utf8) + ->columns( + new column('identifier', type::integer_unsigned), + new column('domain', type::string, ['length' => 32]), + new column('name_first', type::string, ['length' => 64]), + new column('name_second', type::string, ['length' => 64]), + new column('language', type::string, ['length' => 2]), + new column('robot', type::char), + new column('updated', type::integer_unsigned), + new column('created', type::integer_unsigned) + ) + ->connect($this->file); + } + + /** + * Initialize + * + * Searches for the telegram account record in the database, and if it does not find it, then create + * + * @param model $telegram The telegram account + * + * @throws exception_runtime if update the telegram account record in the database by the telegram account values + * @throws exception_runtime if failed to find the created telegram account + * @throws exception_runtime if failed to create the telegram account + * + * @return record The telegram account record from the database + */ + public function initialize(model $telegram): record + { + // Searching for the account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier === $telegram->getId(), amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the telegram account record + + if ( + $account->name_first !== $telegram->getFirstName() || + $account->name_second !== $telegram->getLastName() || + $account->domain !== $telegram->getUsername() + ) { + // The telegram account was updated + + // Updating the account in the database + $updated = $this->database->read( + filter: fn(record $record) => $record->identifier === $telegram->getId(), + update: function (record &$record) use ($telegram){ + // Writing new values into the record + $record->name_first = $telegram->getFirstName(); + $record->name_second = $telegram->getLastName(); + $record->domain = $telegram->getUsername(); + $record->updated = svoboda::timestamp(); + }, + amount: 1 + )[0] ?? null; + + if ($updated instanceof record && $updated->values() !== $account->values()) { + // Updated the account in the database + + // Exit (success) + return $updated; + } else { + // Not updated the account in the database + + // Exit (fail) + throw new exception_runtime('Failed to update the account record in the database by the telegram account values'); + } + } + + // Exit (success) + return $account; + } else { + // Not found the account record + + if ($this->create($telegram)) { + // Created the account + + // Searching for the created telegram account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier === $telegram->getId(), amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the created telegram account + + // Exit (success) + return $account; + } else { + // Not found the created telegram account + + // Exit (fail) + throw new exception_runtime('Failed to find the created telegram account'); + } + } else { + // Not created the telegram account + + // Exit (fail) + throw new exception_runtime('Failed to create the telegram account'); + } + } + } + + /** + * Create + * + * Creates the account record in the database + * + * @param model $telegram The telegram account + * + * @return int|false The record identifier, if created + */ + public function create(model $telegram): int|false + { + // Initializing the identifier + $identifier = (int) $telegram->getId(); + + // Initializing the record + $record = $this->database->record( + $identifier, + $telegram->getUsername(), + $telegram->getFirstName(), + $telegram->getLastName(), + $telegram->getLanguageCode(), + (int) $telegram->isBot(), + svoboda::timestamp(), + svoboda::timestamp() + ); + + // Creating the record in the database + $created = $this->database->write($record); + + // Exit (success) + return $created ? $identifier : false; + } +} diff --git a/mirzaev/deeproots/system/models/telegram/buttons/account/localization/create.php b/mirzaev/deeproots/system/models/telegram/buttons/account/localization/create.php new file mode 100755 index 0000000..04386cb --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/buttons/account/localization/create.php @@ -0,0 +1,228 @@ + + */ +final class create extends core +{ + /** + * Language + * + * Send the language selection menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function language(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_create::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Initializing the account model + $model_account = new account; + + // Initializing the account localizations + $existed = $model_account->localization->database->read( + filter: fn(record $localization) => $localization->account === $account->identifier, + amount: ACCOUNT_LOCALIZATION_CREATE_ACCOUNT_LOCALIZATIONS_AMOUNT + ); + + // Declaring the buffer of languages to exclude + $exclude = []; + + // Initializing languages to exclude + foreach ($existed as $record) $exclude[] = $record->language; + + if (count($exclude) !== count(language::cases())) { + // Not all languages in the registry have localizations created (expected) + + // Sending the language selection + selections::language( + context: $context, + prefix: 'account_localization_create_select_language_', + title: '🌏 *' . $localization['account_localization_create_select_language_title'] . '*', + description: '🌏 *' . $localization['account_localization_create_select_language_description'] . '*', + exclude: $exclude + ); + } else { + // All languages in the registry have localizations created (expected) + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_every_language_created'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_create::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization create process + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_create_name_request'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the account localization create buffer + $context->nextStep([process_account_localization_create::class, 'name']); + }); + } else { + // Not found started account localization create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_create_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/buttons/account/localization/update.php b/mirzaev/deeproots/system/models/telegram/buttons/account/localization/update.php new file mode 100755 index 0000000..d5abe5e --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/buttons/account/localization/update.php @@ -0,0 +1,102 @@ + + */ +final class update extends core +{ + /** + * Name + * + * Request to enter name + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(process_account_localization_update::PROCESS) + ->then(function (?array $process) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($process) { + // Found started account localization update process + + // Sending the message + $context->sendMessage('📄 *' . $localization['account_localization_update_name_request'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the account localization update buffer + $context->nextStep([process_account_localization_update::class, 'name']); + }); + } else { + // Not found started account localization update process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization['account_localization_update_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/buttons/question/search.php b/mirzaev/deeproots/system/models/telegram/buttons/question/search.php new file mode 100755 index 0000000..2a3889a --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/buttons/question/search.php @@ -0,0 +1,579 @@ + + */ +final class search extends core +{ + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = process_question_search::PROCESS; + + /** + * Identifier + * + * Request to enter identifier + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function identifier(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_identifier_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'identifier']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Text + * + * Request to enter text + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function text(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_text_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'text']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * A + * + * Request to enter A-answer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function a(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_a_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'a']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * B + * + * Request to enter B-answer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function b(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_b_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'b']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * C + * + * Request to enter C-answer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function c(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_c_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'c']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * D + * + * Request to enter D-answer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function d(context $context) + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage( + '📄 *' . $localization[static::PROCESS . '_d_request_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => 'delete' + ], + [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => 'cancel' + ] + ], + ], + 'disable_notification' => true + ] + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Writing into the distribution search buffer + $context->nextStep([process_question_search::class, 'd']); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*'); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/commands.php b/mirzaev/deeproots/system/models/telegram/commands.php new file mode 100755 index 0000000..d7a8eb7 --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/commands.php @@ -0,0 +1,741 @@ + + */ +final class commands extends core +{ + /** + * Menu + * + * Responce for the commands: "/start", '/menu' + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the title + $title = '📋 *' . $localization['menu_title'] . '*'; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🧠 ' . $localization['menu_button_start'], + 'callback_data' => 'projects' + ] + ], + [ + [ + 'text' => '📈 ' . $localization['menu_button_rating'], + 'callback_data' => 'rating' + ], + [ + 'text' => '💰 ' . $localization['menu_button_balance'], + 'callback_data' => 'balance' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context, $localization, $account) { + // Sended the message + + if ( + $account->authorized_system_accounts || + $account->authorized_system_questions || + $account->authorized_system_settings + ) { + // Found at least one system authorization + + // Initializing the keyboard buffer + $keyboard = []; + + if ($account->authorized_system_accounts) { + // Authorized to accounts + + // Generating the button and writing into the keyboard buffer + $keyboard[] = [ + [ + 'text' => '🐣 ' . $localization['menu_button_system_accounts'], + 'callback_data' => 'system_accounts' + ] + ]; + } + + if ($account->authorized_system_questions) { + // Authorized to questions + + // Generating the button and writing into the keyboard buffer + $keyboard[] = [ + [ + 'text' => '🗂 ' . $localization['menu_button_system_questions'], + 'callback_data' => 'system_questions' + ] + ]; + } + + if ($account->authorized_system_settings) { + // Authorized to system settings + + // Generating the button and writing into the keyboard buffer + $keyboard[] = [ + [ + 'text' => '⚙️ ' . $localization['menu_button_system_settings'], + 'callback_data' => 'system_settings' + ] + ]; + } + + // Sending the message + $context->sendMessage( + '🛠 ' . $localization['menu_system_authorized'], + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Account + * + * Responce for the command: "/account" + * + * Sends information about account with menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function account(context $context): void + { + // Initializing the telegram account + $telegram = $context->get('telegram'); + + if ($telegram instanceof record) { + // Initialized the telegram account + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing title for the message + $title = '🫵 ' . $localization['account_title']; + + // Initializing the account identifier row for the message + $identifier = '*' . $localization['account_identifier'] . ":* $account->identifier \($telegram->identifier\)"; + + // Declaring buufer of rows about authorizations + $authorizations = ''; + + // Initializing rows about authorization + foreach ($account->values() as $key => $value) { + // Iterating over account parameters + + if (str_starts_with($key, 'authorized_')) { + // Iterating over account authorizations + + if (str_starts_with($key, 'authorized_system_') && $value) { + // A system authorization + + // Writing into buffer of rows about authorizations + $authorizations .= '✅ ⚠️ *' . ($localization["account_$key"] ?? $key) . ':* ' . $localization['yes'] . "\n"; + } else { + // Not a system authorization + + // Writing into buffer of rows about authorizations + $authorizations .= ($value ? '✅' : '❎') . ' *' . ($localization["account_$key"] ?? $key) . ':* ' . ($value ? $localization['yes'] : $localization['no']) . "\n"; + } + } + } + + // Trimming the last line break character + $authorizations = trim($authorizations, "\n"); + + // Sending the message + $context->sendMessage( + <<sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the telegram account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Language + * + * Responce for the command: "/language" + * + * Send the language selection menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function language(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the language selection + process_language_select::menu( + context: $context, + prefix: 'settings_language_', + title: '🌏 *' . $localization['settings_select_language_title'] . '*', + description: '🌏 *' . $localization['settings_select_language_description'] . '*' + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Repository + * + * Responce for the command: "/repository" + * + * Sends information about project and menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function repository(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing title of the message + $title = '🏛️ ' . $localization['repository_title']; + + // Sending the message + $context->sendMessage($title . "\n\n" . $localization['repository_text'], [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🏛️ ' . $localization['repository_button_code'], + 'url' => 'https://git.mirzaev.sexy/mirzaev/deeproots' + ] + ], + [ + [ + 'text' => '⚠️ ' . $localization['repository_button_issues'], + 'url' => 'https://git.mirzaev.sexy/mirzaev/deeproots/issues' + ], + [ + 'text' => '🌱 ' . $localization['repository_button_suggestions'], + 'url' => 'https://git.mirzaev.sexy/mirzaev/deeproots/issues' + ] + ] + ], + 'remove_keyboard' => true, + 'disable_notification' => true + ], + 'link_preview_options' => [ + 'is_disabled' => true + ] + ]); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Author + * + * Responce for the command: "/author" + * + * Sends + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function author(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing title of the message + $title = '👽 ' . $localization['author_title']; + + // Sending the message + $context->sendMessage($title . "\n\n" . $localization['author_text'], [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '📚 ' . $localization['author_button_neurojournal'], + 'url' => 'https://mirzaev.sexy' + ], + [ + 'text' => '🤟 ' . $localization['author_button_projects'], + 'url' => 'https://git.svoboda.works/mirzaev?tab=activity' + ] + ], + [ + [ + 'text' => '✖️ ' . $localization['author_button_twitter'], + 'url' => 'https://x.com/mirzaev_sexy' + ], + [ + 'text' => '🦋 ' . $localization['author_button_bluesky'], + 'url' => 'https://bsky.app/profile/mirzaev.bsky.social' + ], + [ + 'text' => '⛓️ ' . $localization['author_button_bastyon'], + 'url' => 'https://bsky.app/profile/mirzaev.bsky.social' + ] + ], + [ + [ + 'text' => '🇺🇸 ' . $localization['author_button_youtube_english'], + 'url' => 'https://www.youtube.com/@MIRZAEV' + ], + [ + 'text' => '🇷🇺 ' . $localization['author_button_youtube_russian'], + 'url' => 'https://www.youtube.com/@MIRZAEV' + ] + ], + [ + [ + 'text' => '✉️ ' . $localization['author_button_message'], + 'url' => 'https://t.me/mirzaev_sexy' + ] + ] + ], + 'remove_keyboard' => true, + 'disable_notification' => true + ], + 'link_preview_options' => [ + 'is_disabled' => true + ] + ]); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Society + * + * Responce for the command: "/society" + * + * Sends the "mushroom" image and the localized text "why so shroomious" + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function society(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendPhoto( + new file_input(STORAGE . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'mushroom.jpg'), + [ + 'caption' => $localization['why_so_shroomious'], + 'disable_notification' => true + ] + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Questions (system) + * + * Sends questions. answers and localizations management menu + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function system_questions(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the question model + $model_question = new question(); + + // Counting questions + $questions = $model_question->database->count(); + + // Initializing the answer model + $model_answer = new answer(); + + // Counting answers + $answers = $model_answer->database->count(); + + // Declaring the localizations amounts buffer + $localizations = []; + + // Declaring the questions list + $list = ''; + + foreach (language::cases() as $case) { + // Iterating over language + + // Initializing the localization model by the language + $model_question_localization = new question_localization(language: $case); + + // Counting localizations for the language + $amount = $model_question_localization->database->count(); + + // Writing into the localizations amounts buffer + $localizations[] = $amount; + + // Writing into the questions list + $list .= PHP_EOL . $case->flag() . ' *' . $case->label(language::{$account->language ?? LANGUAGE_DEFAULT} ?? language::{LANGUAGE_DEFAULT}) . ':* ' . $amount; + } + + // Deinitializing unnecessary variables + unset($case, $model_question, $model_question_localization, $model_answer, $amount); + + // Searching for unique values in uhe buffer of questions localizations amounts + $uniques = array_unique($localizations, SORT_REGULAR); + + // Is questions amounts matches? + $matches = count($uniques) === 1; + + // Sending the message + $context->sendMessage( + sprintf( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔍 ' . $localization['system_questions_button_search'], + 'callback_data' => 'system_questions_search' + ], + [ + 'text' => '✏️ ' . $localization['system_questions_button_create'], + 'callback_data' => 'system_questions_create' + ] + ] + ], + 'remove_keyboard' => true, + 'disable_notification' => true + ], + 'link_preview_options' => [ + 'is_disabled' => true + ] + ] + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/middlewares.php b/mirzaev/deeproots/system/models/telegram/middlewares.php new file mode 100755 index 0000000..4269615 --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/middlewares.php @@ -0,0 +1,706 @@ + + */ +final class middlewares extends core +{ + /** + * account (middleware) + * + * Initialize or registrate the account and write it to the `telegram` variable inside the `$context` + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function telegram(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $telegram = $context->getEffectiveUser(); + + // Initializing the telegram accont + $telegram = (new telegram())->initialize($telegram); + + if ($telegram instanceof record) { + // Initialized the account + + // Writing the account into the context variable + $context->set('telegram', $telegram); + + // Continuation of the process + $next($context); + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Account (middleware) + * + * Initialize or registrate the account and write it to the `account` variable inside the `$context` + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function account(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $telegram = $context->get('telegram'); + + if ($telegram instanceof record) { + // Initialized the account + + // Initializing the account + /* $account = new account()->initialize($telegram); */ + $account = (new account())->initialize($telegram); + + if ($account instanceof record) { + // Initialized the account + + // Writing the account into the context variable + $context->set('account', $account); + + // Continuation of the process + $next($context); + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Language (middleware) + * + * Implement the account language + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function language(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Writing the account language into the context variable + $context->set('language', language::{$account->language ?? LANGUAGE_DEFAULT} ?? language::{LANGUAGE_DEFAULT}); + + // Continuation of the process + $next($context); + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Localization (middleware) + * + * Implement the account language and initialize the localization file + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function localization(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing the language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized the language + + // Initializing path to the localization file + $file = LOCALIZATIONS . DIRECTORY_SEPARATOR . strtolower($language->label()) . '.php'; + + if (file_exists($file) && is_readable($file)) { + // Found the localization file + + // Initializing localization + $localization = require($file); + + if (is_array($localization)) { + // Initializae localization + + // Writing localization into the context variable + $context->set('localization', $localization); + + // Continuation of the process + $next($context); + } else { + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found the localization file + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the localization file*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * System (middleware) + * + * Check the account for access to the system + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function system(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_system) { + // Authorized the account to the system + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to the system + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_system'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Contact (middleware) + * + * Check the account for access to contact with the organization + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function contact(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_contact) { + // Authorized the account to contact with the organization + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to contact with the organization + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_contact'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Join (middleware) + * + * Check the account for access to join to distributions + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function join(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + if ($account->authorized_joins) { + // Authorized the account to joint to distributions + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to joint to distributions + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_joins'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Settings (middleware) + * + * Check the account for access to settings + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function settings(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_settings) { + // Authorized the account to the settings + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to the settings + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_settings'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Questions (system) (middleware) + * + * Check the account for system access to questions + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function system_questions(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_system_questions) { + // Authorized the account to the system settings + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to the system settings + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_system_questions'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * System settings (system) (middleware) + * + * Check the account for system access to settings + * + * @param context $context + * @param node $next + * + * @return void + */ + public static function system_settings(context $context, node $next): void + { + // Is the process stopped? + if ($context->get('stop')) return; + + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + if ($account->authorized_system_settings) { + // Authorized the account to the system settings + + // Continuation of the process + $next($context); + } else { + // Not authorized the account to the system settings + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Sending the message + $context->sendMessage('⛔ *' . $localization['not_authorized_system_settings'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + + // Stopping the process + $context->set('stop', true); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/processes/language/select.php b/mirzaev/deeproots/system/models/telegram/processes/language/select.php new file mode 100755 index 0000000..02f15e4 --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/processes/language/select.php @@ -0,0 +1,150 @@ + + */ +final class select extends core +{ + /** + * Language + * + * Send the language choose menu + * + * @param context $context Request data from Telegram + * @param string $prefix Prefix for 'callback_data' (`$prefix . $language->name`) + * @param string $title Title of the message + * @param string $description Description of the message + * @param array $exclude Languages that will be excluded ['ru', 'en'...] + * + * @return void + */ + public static function menu(context $context, string $prefix, string $title, string $description, array $exclude = []): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Declaring the buffer of generated keyboard with languages + $keyboard = []; + + // Initializing the iterator of rows + $row = 0; + + // Initializing buffer of languages + $languages = language::cases(); + + // Deleting the actual language from buffer of languages + unset($languages[array_search($language, $languages, strict: true)]); + + // Sorting buffer of languages by the actual language + $languages = [$language, ...$languages]; + + foreach ($languages as $language) { + // Iterating over languages + + // Skipping excluded languages + if (array_search($language->name, $exclude, strict: true) !== false) continue; + + // Initializing the row + $keyboard[$row] ??= []; + + // Writing the language choose button into the buffer of generated keyboard with languages + $keyboard[$row][] = [ + 'text' => ($language->flag() ? $language->flag() . ' ' : '') . $language->label($language), + 'callback_data' => $prefix . $language->name + ]; + + // When reaching 4 buttons in a row, move to the next row + if (count($keyboard[$row]) === 4) ++$row; + } + + // Writing the button for helping lozalizing + $keyboard[$row === 0 && empty($keyboard[0]) ? 0 : ++$row] = [ + [ + 'text' => '🗂 ' . $localization['select_language_button_add'], + 'url' => 'https://git.svoboda.works/mirzaev/deeproots/src/branch/stable/mirzaev/deeproots/system/localizations' + ] + ]; + + // Sending the message + $context->sendMessage( + $title ?? '🌏 *' . $localization['select_language_title'] . "*\n" . ($description ?? $localization['select_language_description']), + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true + ], + ] + ); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/processes/question/create.php b/mirzaev/deeproots/system/models/telegram/processes/question/create.php new file mode 100755 index 0000000..8938f2a --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/processes/question/create.php @@ -0,0 +1,124 @@ + + */ +final class create extends core +{ + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'system_questions_create'; + + /** + * Start + * + * Starting the process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function start(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the question model + $model_question = new question(); + + // Creating the question + $question = $model_question->create(); + + if ($question) { + // Created the question + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_created'] . '*') + ->then(function (message $message) use ($context, $question) { + // Sended the message + + // Sending the question search menu + process_question_search::start($context, $question); + }); + }; + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/processes/question/localization/create.php b/mirzaev/deeproots/system/models/telegram/processes/question/localization/create.php new file mode 100755 index 0000000..f441380 --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/processes/question/localization/create.php @@ -0,0 +1,1124 @@ + + */ +final class create extends core +{ + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'system_questions_localization_create'; + + /** + * Start + * + * Starting the process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function start(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $question) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($question) { + // Found started question create process + + // Sending the message + $context->sendMessage('📂 *' . $localization[static::PROCESS . '_continiued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Sending the question create menu + static::menu($context); + }); + } else { + // Not found started question create process + + // Initializing the question model + $model_question = new question(); + + // Creating the question + $question = $model_question->create(); + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $question) + ->then(function () use ($context, $account, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('📂 *' . $localization[static::PROCESS . '_started'] . '*') + ->then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Sending the question create menu + static::menu($context); + }); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Cancel + * + * Ending the question create process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function cancel(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started question create process + + // Deleting in the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted in the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_canceled'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + }); + } else { + // Not found started question create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * End + * + * Ending the question create process + * and creating the distribution record in the database + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function end(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started question create process + + // Initializing the distribution model + $model_distribution = new distribution; + + // Creating the distribution + $created_distribution = $model_distribution->create( + creator: $account->identifier, + latitude: $distribution['latitude'], + longitude: $distribution['longitude'] + ); + + if ($created_distribution) { + // Created the distribution + + // Sending the message + $context->sendMessage('✏️ *' . $localization[static::PROCESS . '_created_distribution'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization, $distribution, $model_distribution, $created_distribution) { + // Sended the message + + // Initializing the distribution localization + $created_localization = $model_distribution->localization->create( + distribution: $created_distribution, + language: $distribution['localization']['language'], + name: $distribution['localization']['name'] + ); + + if ($created_localization) { + // Created the localization + + // Sending the message + $context->sendMessage('✏️ *' . $localization[static::PROCESS . '_created_localization'] . '*') + ->then(function (message $message) use ($context, $localization) { + // Sended the message + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS) + ->then(function () use ($context, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_completed'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + }); + }); + } else { + // Not created the distribution localization + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_created_localization'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + } else { + // Not created the distribution + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_created_distribution'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started question create process + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Generation + * + * Sends the question create menu with parameters: language, name, location + * When all parameters was initialized then sends the complete button + * + * @param context $context Request data from Telegram + * + * @return void + */ + protected static function menu(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started question create process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($distribution['localization']['language']) ? '🟢 ' . $localization[static::PROCESS . '_button_language'] : '🟢 ' . $localization['distribution_declaration_button_language'] . ': ' . $distribution['localization']['language']->flag() . ' ' . $distribution['localization']['language']->label($language), + 'callback_data' => static::PROCESS . '_language' + ] + ], + [ + [ + 'text' => empty($distribution['localization']['name']) ? '🔴 ' . $localization[static::PROCESS . '_button_name'] : '🟢 ' . $localization['distribution_declaration_button_name'] . ': ' . $distribution['localization']['name'], + 'callback_data' => static::PROCESS . '_name' + ] + ], + [ + [ + 'text' => empty($distribution['latitude']) || empty('longitude') ? '🔴 ' . $localization[static::PROCESS . '_button_location'] : '🟢 ' . $localization['distribution_declaration_button_location'] . ': ' . $distribution['latitude'] . ', ' . $distribution['longitude'], + 'callback_data' => static::PROCESS . '_location' + ] + ], + ]; + + // Initializing the index of last row + $last = count($keyboard); + + // Initializing the last row + $keyboard[$last] ??= []; + + // Initializing the button for canceling the generation process + $keyboard[$last][] = [ + 'text' => '❎ ' . $localization[static::PROCESS . '_button_cancel'], + 'callback_data' => static::PROCESS . '_cancel' + ]; + + if ( + !empty($distribution['localization']['language']) && + !empty($distribution['localization']['name']) && + !empty($distribution['latitude']) && + !empty($distribution['longitude']) + ) { + // Initialized all requeired parameters + + // Initializing the button for completing the generation process + $keyboard[$last][] = [ + 'text' => '✅ ' . $localization[static::PROCESS . '_button_confirm'], + 'callback_data' => static::PROCESS . '_end' + ]; + } + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $localization, $keyboard) { + // Deinitialized the conversation process + + // Sending the message + $context->sendMessage( + '📀 *' . $localization[static::PROCESS . '_generation'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ); + }); + } else { + // Not found started question create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function ($message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Language + * + * Write language into the question create buffer + * + * @param context $context Request data from Telegram + * @param language $new The language + * + * @return void + */ + public static function language(context $context, language $new): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $language, $localization, $new) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started question create process + + try { + // Initializing the old language + $old = $distribution['localization']['language']; + + // Writing into the question create process buffer + $distribution['localization']['language'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $distribution) + ->then(function () use ($context, $account, $language, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_language_update_success'] . '* ' . ($old->flag() ? $old->flag() . ' ' : '') . $old->label($language) . ' → *' . ($new->flag() ? $new->flag() . ' ' : '') . $new->label($language) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the question create menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about language update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_language_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not found started question create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function ($message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Name + * + * Write name into the question create buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function name(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started question create process + + // Initializing the new name + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new name + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 64) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[\W\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters (except spaces) + $characters = []; + + // Declaring the counter of found spaces + $spaces = 0; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + if ($match === ' ') { + // Space-character + + // Increasing the counter of found spaces + ++$spaces; + } else { + // Not space-character + + // Writing into the buffer of found restricted characers (except spaces) + $characters[] = $match; + } + } + + if (empty($characters)) { + // Not found restricted characters + + if ($spaces <= 2) { + // Number of spaces is not more than 2 + + try { + // Initializing the old name + $old = empty($distribution['localization']['name']) ? '_' . $localization['empty'] . '_' : $distribution['localization']['name']; + + // Writing into the question create process buffer + $distribution['localization']['name'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $distribution) + ->then(function () use ($context, $account, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_name_update_success'] . "* $old → *$new*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the question create menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Number of spaces is more than 2 + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_spaces'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_question_create::name($context); + }); + } + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization[static::PROCESS . '_name_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization[static::PROCESS . '_name_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_question_create::name($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_question_create::name($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_name_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_question_create::name($context); + }); + } + } else { + // Failed to initialize the new name + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_name_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter name again + button_question_create::name($context); + }); + } + } else { + // Not found started question create process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Location + * + * Write latitude and longitude into the question create buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function location(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $distribution) use ($context, $account, $localization) { + // Readed from the telegram user buffer + + if ($distribution) { + // Found started declaration process + + // Initializing the new location + preg_match_all('/(\-?\d{1,2})\.?(\d*)/', $context->getMessage()->getText(), $matches); + + if ($matches[0]) { + // Initialized the new location + + // Initializing the new latitude + $latitude = round((float) $matches[0][0], 6); + + // Initializing the new longitude + $longitude = round((float) $matches[0][1], 6); + + if (!empty($latitude) && !empty($longitude)) { + // Initialized the new latitude and the new longitude + + if ($latitude >= 0) { + // Passed latitude minimum value check + + if ($latitude <= 90) { + // Passed latitude maximum value check + + if ($longitude >= 0) { + // Passed longitude minimum value check + + if ($longitude <= 180) { + // Passed longitude maximum value check + + try { + // Initializing the old location + $old = str_replace('.', '\\.', (empty($distribution['latitude']) ? '_' . $localization['empty'] . '_' : $distribution['latitude']) . ', ' . (empty($distribution['longitude']) ? '_' . $localization['empty'] . '_' : $distribution['longitude'])); + + // Writing into the question create process buffer + $distribution['latitude'] = $latitude; + $distribution['longitude'] = $longitude; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $distribution) + ->then(function () use ($context, $account, $localization, $latitude, $longitude, $old) { + // Writed to the telegram user buffer + + // Initializing the new location + $new = str_replace('.', '\\.', $latitude . ', ' . $longitude); + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_location_update_success'] . "*\n$old → *$new*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Sending the question create menu + static::menu($context); + }); + }); + } catch (error $error) { + // Failed to send the message about name update + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_name_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not passed longitude maximum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_big'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_question_create::location($context); + }); + } + } else { + // Not passed longitude minimum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_longitude_too_small'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_question_create::location($context); + }); + } + } else { + // Not passed latitude maximum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_big'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_question_create::location($context); + }); + } + } else { + // Not passed latitude minimum value check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_location_send_latitude_too_small'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter locaztion again + button_question_create::location($context); + }); + } + } else { + // Failed to initialize the new name + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to send location again + button_question_create::location($context); + }); + } + } else { + // Not initialized the new location + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_location_send_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to send locaztion again + button_question_create::location($context); + }); + } + } else { + // Not found started distribution declaratoin process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/processes/question/search.php b/mirzaev/deeproots/system/models/telegram/processes/question/search.php new file mode 100755 index 0000000..659851d --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/processes/question/search.php @@ -0,0 +1,2226 @@ + + */ +final class search extends core +{ + use escape; + + /** + * Process + * + * @var const string PROCESS Name of the process in the telegram user buffer + */ + public const string PROCESS = 'system_questions_search'; + + /** + * Start + * + * Starting the search process + * + * @param context $context Request data from Telegram + * @param int|null $identifier Identifier of the question + * + * @return void + */ + public static function start(context $context, ?int $identifier = null): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language instanceof language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization, $identifier) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_continued'] . '*') + ->then(function (message $message) use ($context, $account, $language, $localization) { + // Sended the message + + // Searching + static::search($context); + }); + } else { + // Not found started search process + + // Initializing the question search buffer + $search = [ + 'identifier' => $identifier, + 'text' => null, + 'A' => null, + 'B' => null, + 'C' => null, + 'D' => null, + 'page' => 0 + ]; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $account, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_started'] . '*') + ->then(function (message $message) use ($context, $account, $localization) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * End + * + * Ending the search process + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function end(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Deleting from the telegram user buffer + $context->deleteUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $search, $localization) { + // Deleted from the telegram user buffer + + // Sending the message + $context->sendMessage('🗂 *' . $localization[static::PROCESS . '_ended'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + }); + } else { + // Not found started search process + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Search + * + * Sends the list of found questions and menu with parameters + * + * @param context $context Request data from Telegram + * + * @return void + */ + protected static function search(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing language + $language = $context->get('language'); + + if ($language) { + // Initialized language + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function (?array $search) use ($context, $account, $language, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the buffer of generated keyboard with languages + $keyboard = [ + [ + [ + 'text' => empty($search['identifier']) ? '🔴 ' . $localization[static::PROCESS . '_button_identifier'] : '🟢 ' . $localization[static::PROCESS . '_button_identifier'] . ': ' . $search['identifier'], + 'callback_data' => static::PROCESS . '_identifier' + ] + ], + [ + [ + 'text' => empty($search['text']) ? '🔴 ' . $localization[static::PROCESS . '_button_text'] : '🟢 ' . $localization[static::PROCESS . '_button_text'] . ': ' . $search['text'], + 'callback_data' => static::PROCESS . '_text' + ] + ], + [ + [ + 'text' => empty($search['A']) ? '🔴 ' . $localization[static::PROCESS . '_button_a'] : '🟢 ' . $localization[static::PROCESS . '_button_a'] . ': ' . $search['A'], + 'callback_data' => static::PROCESS . '_a' + ] + ], + [ + [ + 'text' => empty($search['B']) ? '🔴 ' . $localization[static::PROCESS . '_button_b'] : '🟢 ' . $localization[static::PROCESS . '_button_b'] . ': ' . $search['B'], + 'callback_data' => static::PROCESS . '_b' + ] + ], + [ + [ + 'text' => empty($search['C']) ? '🔴 ' . $localization[static::PROCESS . '_button_c'] : '🟢 ' . $localization[static::PROCESS . '_button_c'] . ': ' . $search['C'], + 'callback_data' => static::PROCESS . '_c' + ] + ], + [ + [ + 'text' => empty($search['D']) ? '🔴 ' . $localization[static::PROCESS . '_button_d'] : '🟢 ' . $localization[static::PROCESS . '_button_d'] . ': ' . $search['D'], + 'callback_data' => static::PROCESS . '_d' + ] + ] + ]; + + // Ending the conversation process + $context->endConversation() + ->then(function () use ($context, $account, $language, $localization, $search, $keyboard) { + // Deinitialized the conversation process + + // Initializing the question model + $model_question = new question; + + // Initializing amount of questions for reading per page + $page = SYSTEM_QUESTIONS_SEARCH_PAGE; + + if ( + empty($search['identifier']) && + empty($search['text']) && + empty($search['A']) && + empty($search['B']) && + empty($search['C']) && + empty($search['D']) + ) { + // Each parameter is empty + + // Search for questions + $questions = $model_question->database->read( + amount: $page + 1, + offset: $search['page'] < 1 ? 0 : $page * $search['page'] + ); + } else { + // The search buffer has at least one parameter + + // Search for questions + $questions = $model_question->database->read( + filter: function (record $question) use ($search) { + // Initializing the matched buffer + $matched = false; + + if (!empty($search['identifier'])) { + // Requested search by identifier + + if ($question->identifier === $search['identifier']) { + // Identifier matched + + // Reinitializing the matched buffer + $matched = true; + } else { + // Identifier not matched + + // Exit (success) + return false; + } + } + + if ( + !empty($search['text']) || + !empty($search['A']) || + !empty($search['B']) || + !empty($search['C']) || + !empty($search['D']) + ) { + // Requested search with localizations + + // Initializing the buffer of result for localizations matchings process + $result = false; + + foreach (language::cases() as $case) { + // Iterating over languages + + // Initializing the question localization model + $model_question_localization = new question_localization($case); + + // Initializing localization + $localization = $model_question_localization->database->read( + filter: fn(record $localization) => $localization->identifier === $question->identifier, + amount: 1 + )[0] ?? null; + + if ($localization instanceof record) { + // Initialized the question localization + + if (!empty($search['text'])) { + // Requested search by localizations text + + // Splitting the localization text into parts + $parts = preg_split('/[\s]/', $localization->text); + + foreach ($parts as $part) { + // Iterating over localization text parts + + if (levenshtein($part, $search['text']) <= SYSTEM_QUESTIONS_SEARCH_QUESTION_TEXT_LEVENSHTEIN_DISTANCE) { + // Text matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 1; + } + } + + if ($result) { + // Text matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // Text not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if (!empty($search['A'])) { + // Requested search by localizations A + + // Initializing the result status + $result = false; + + // Splitting the localization A into parts + $parts = preg_split('/[\s]/', $localization->A); + + foreach ($parts as $part) { + // Iterating over localization A parts + + if (levenshtein($part, $search['A']) <= SYSTEM_QUESTIONS_SEARCH_QUESTION_A_LEVENSHTEIN_DISTANCE) { + // A matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 1; + } + } + + if ($result) { + // A matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // A not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if (!empty($search['B'])) { + // Requested search by localizations B + + // Initializing the result status + $result = false; + + // Splitting the localization B into parts + $parts = preg_split('/[\s]/', $localization->B); + + foreach ($parts as $part) { + // Iterating over localization B parts + + if (levenshtein($part, $search['B']) <= SYSTEM_QUESTIONS_SEARCH_QUESTION_B_LEVENSHTEIN_DISTANCE) { + // B matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 1; + } + } + + if ($result) { + // B matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // B not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if (!empty($search['C'])) { + // Requested search by localizations C + + // Initializing the result status + $result = false; + + // Splitting the localization C into parts + $parts = preg_split('/[\s]/', $localization->C); + + foreach ($parts as $part) { + // Iterating over localization C parts + + if (levenshtein($part, $search['C']) <= SYSTEM_QUESTIONS_SEARCH_QUESTION_C_LEVENSHTEIN_DISTANCE) { + // C matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 1; + } + } + + if ($result) { + // C matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // C not matched by Levenshtein function + + // Exit (success) + return false; + } + } + + if (!empty($search['D'])) { + // Requested search by localizations D + + // Initializing the result status + $result = false; + + // Splitting the localization D into parts + $parts = preg_split('/[\s]/', $localization->D); + + foreach ($parts as $part) { + // Iterating over localization D parts + + if (levenshtein($part, $search['D']) <= SYSTEM_QUESTIONS_SEARCH_QUESTION_D_LEVENSHTEIN_DISTANCE) { + // D matched by Levenshtein function + + // Reinitializing the matched buffer + $result = true; + + // Exit (success) + break 1; + } + } + + if ($result) { + // D matched by Levenshtein function + + // Reinitializing the matched buffer + $matched = true; + } else { + // D not matched by Levenshtein function + + // Exit (success) + return false; + } + } + } + } + + // Reinitializing the matched buffer + $matched = $result; + } + + // Exit (success) + return $matched; + }, + amount: $page + 1, + offset: $search['page'] < 1 ? 0 : $page * $search['page'] + ); + } + + // Initializing the next page existence status + $next = count($questions) > $page; + + // Deleting the additional readed questions + unset($questions[$page]); + + // Sending the message + $context->sendMessage( + '🔍 *' . $localization[static::PROCESS . '_title'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context, $account, $language, $localization, $search, $page, $next, $questions) { + // Sended the message + + if (count($questions) > 0) { + // Initialized questions + + foreach ($questions as $question) { + // Iterating over found questions + + /* // Initializing the question localization model by the account language + $model_question_localization = new question_localization(language::{$account->language ?? LANGUAGE_DEFAULT} ?? language::{LANGUAGE_DEFAULT}); + + // Initializing the question localization + $question_localization = $model_question_localization->database->read( + filter: fn(record $localization) => $localization->identifier === $question->identifier, + amount: 1 + )[0] ?? null; + + if (is_null($question_localization)) { + // Failed to initialize the question localization by the account language + + // Reinitializing the question localization model by the default language + $model_question_localization = new question_localization(language::{LANGUAGE_DEFAULT}); + + // Initializing the question localization + $question_localization = $model_question_localization->database->read( + filter: fn(record $localization) => $localization->identifier === $question->identifier, + amount: 1 + )[0] ?? null; + + if (is_null($question_localization)) { + // Failed to initialize the question localization by the default language + + // Sending the message + await($context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_localized'] . '* \(' . $question->identifier . '\)') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + })); + + // Processing the next question + continue; + } + } */ + + // Initializing the message text + $text = static::message( + question: $question, + localization: $localization + ); + + // Initializing the message keyboard + $keyboard = static::keyboard( + question: $question, + localization: $localization + ); + + // Sending the message + await($context->sendMessage( + $text, + [ + 'reply_markup' => [ + 'inline_keyboard' => $keyboard, + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )); + } + + if ($next) { + // Exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ], + [ + [ + 'text' => '📤 ' . $localization[static::PROCESS . '_button_page_next'] . ': ' . ++$search['page'], + 'callback_data' => static::PROCESS . '_next' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } else { + // Not exists the next page + + // Sending the message + $context->sendMessage( + '🔎 *' . $localization[static::PROCESS . '_page_next_not_exists'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + )->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized questions + + // Sending the message + $context->sendMessage( + '⚠️ *' . $localization[static::PROCESS . '_empty'] . '*', + [ + 'reply_markup' => [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔒 ' . $localization[static::PROCESS . '_button_end'], + 'callback_data' => static::PROCESS . '_end' + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + }); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized language + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize language*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Next + * + * Write actual page + 1 into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function next(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Writing into the question search process buffer + ++$search['page']; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context) { + // Writed to the telegram user buffer + + // Searching + static::search($context); + }); + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Identifier + * + * Write identifier into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function identifier(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_identifier_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['identifier'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_identifier_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new identifier + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new identifier + + if (mb_strlen($new) >= 1) { + // Passed minimum length check + + if (mb_strlen($new) <= 12) { + // Passed maximum length check + + // Search for restricted characters + preg_match_all('/[^\d]/u', $new, $matches); + + // Declaring the buffer of found restricted characters + $characters = []; + + foreach ($matches[0] as $match) { + // Iterating over found restricted characters + + // Writing into the buffer of found restricted characers + $characters[] = $match; + } + + if (empty($characters)) { + // Not found restricted characters + + // Initializing the old identifier + $old = empty($search['identifier']) ? '_' . $localization['empty'] . '_' : $search['identifier']; + + // Writing into the question search process buffer + $search['identifier'] = (int) $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_identifier_update_success'] . "* $old → *$new*") + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Found restricted characters + + // Initializing title of the message + $title = '⚠️ *' . $localization[static::PROCESS . '_identifier_request_restricted_characters_title'] . '*'; + + // Initializing description of the message + $description = '*' . $localization[static::PROCESS . '_identifier_request_restricted_characters_description'] . '* \\' . implode(', \\', $characters); + + // Sending the message + $context->sendMessage( + <<then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter identifier again + buttons_question_search::identifier($context); + }); + } + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_identifier_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter identifier again + buttons_question_search::identifier($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_identifier_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter identifier again + buttons_question_search::identifier($context); + }); + } + } else { + // Failed to initialize the new identifier + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_identifier_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter identifier again + buttons_question_search::identifier($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Text + * + * Write text into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function text(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_text_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['text'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_text_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new text + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new text + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 256) { + // Passed maximum length check + + // Initializing the old text + $old = empty($search['text']) ? '_' . $localization['empty'] . '_' : $search['text']; + + // Writing into the question search process buffer + $search['text'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_text_update_success'] . "* $old → *" . escape::markdown($new) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_text_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter text again + buttons_question_search::text($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_text_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter text again + buttons_question_search::text($context); + }); + } + } else { + // Failed to initialize the new text + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_text_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter text again + buttons_question_search::text($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + /** + * A + * + * Write A-answer into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function a(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_a_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['A'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_a_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new A-answer + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new A-answer + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Initializing the old A-answer + $old = empty($search['A']) ? '_' . $localization['empty'] . '_' : $search['A']; + + // Writing into the question search process buffer + $search['A'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_a_update_success'] . "* $old → *" . escape::markdown($new) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_a_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter A-answer again + buttons_question_search::a($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_a_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter A-answer again + buttons_question_search::a($context); + }); + } + } else { + // Failed to initialize the new A-answer + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_a_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter A-answer again + buttons_question_search::a($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + + /** + * B + * + * Write B-answer into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function b(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_b_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['B'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_b_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new B-answer + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new B-snswer + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Initializing the old B-answer + $old = empty($search['B']) ? '_' . $localization['empty'] . '_' : $search['B']; + + // Writing into the question search process buffer + $search['B'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_b_update_success'] . "* $old → *" . escape::markdown($new) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_b_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter B-answer again + buttons_question_search::b($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_b_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter B-answer again + buttons_question_search::b($context); + }); + } + } else { + // Failed to initialize the new B-answer + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_b_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter B-answer again + buttons_question_search::b($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * C + * + * Write C-answer into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function c(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_c_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['C'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_c_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new C-answer + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new C-answer + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Initializing the old C-answer + $old = empty($search['C']) ? '_' . $localization['empty'] . '_' : $search['C']; + + // Writing into the question search process buffer + $search['C'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_c_update_success'] . "* $old → *" . escape::markdown($new) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_c_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter C-answer again + buttons_question_search::c($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_c_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter C-answer again + buttons_question_search::c($context); + }); + } + } else { + // Failed to initialize the new text + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_c_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter C-answer again + buttons_question_search::c($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * D + * + * Write D-answer into the question search buffer + * + * @param context $context Request data from Telegram + * + * @return void + */ + public static function d(context $context): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Reading from the telegram user buffer + $context->getUserDataItem(static::PROCESS) + ->then(function ($search) use ($context, $localization) { + // Readed from the telegram user buffer + + if ($search) { + // Found started search process + + // Initializing the button + $button = $context->getCallbackQuery()?->getData(); + + if ($button === 'cancel') { + // Cancel + + // Sending the message + $context->sendMessage('❎ *' . $localization[static::PROCESS . '_d_cancel_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + } else if ($button === 'delete') { + // Delete + + // Writing into the question search process buffer + $search['D'] = null; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('🗑 *' . $localization[static::PROCESS . '_d_delete_success'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Searching + static::search($context); + }); + }); + } else { + // Write + + // Initializing the new D-answer + $new = $context->getMessage()->getText(); + + if (!empty($new)) { + // Initialized the new D-answer + + if (mb_strlen($new) >= 3) { + // Passed minimum length check + + if (mb_strlen($new) <= 128) { + // Passed maximum length check + + // Initializing the old D-answer + $old = empty($search['D']) ? '_' . $localization['empty'] . '_' : $search['D']; + + // Writing into the question search process buffer + $search['D'] = $new; + + // Writing to the telegram user buffer + $context->setUserDataItem(static::PROCESS, $search) + ->then(function () use ($context, $localization, $new, $old) { + // Writed to the telegram user buffer + + // Sending the message + $context->sendMessage('✅ *' . $localization[static::PROCESS . '_d_update_success'] . "* $old → *" . escape::markdown($new) . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Searching + static::search($context); + }); + }); + } else { + // Not passed maximum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_d_request_too_long'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter D-answer again + buttons_question_search::d($context); + }); + } + } else { + // Not passed minimum length check + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_d_request_too_short'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter D-answer again + buttons_question_search::d($context); + }); + } + } else { + // Failed to initialize the new D-answer + + // Sending the message + $context->sendMessage('📄 *' . $localization[static::PROCESS . '_d_request_not_acceptable'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Requesting to enter D-answer again + buttons_question_search::d($context); + }); + } + } + } else { + // Not found started search process + + // Sending the message + $context->sendMessage('⚠️ *' . $localization[static::PROCESS . '_not_started'] . '*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + + // Sending the system questions menu + commands::system_questions($context); + }); + } + }); + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Keyboard + * + * Generate inline keyboard + * + * @param record $question The question + * @param array $localization The account localization + * + * @return array Generated inline keyboard + */ + public static function keyboard(record $question, array $localization): array + { + // Declaring the toggle button + $toggle = []; + + if ($question->active) { + // Active + + // Initializing the toggle button + $toggle = [ + 'text' => '🟢 ' . $localization[static::PROCESS . '_button_active'], + 'callback_data' => static::PROCESS . '_deactivate' + ]; + } else { + // Inactive + + // Initializing the toggle button + $toggle = [ + 'text' => '🔴 ' . $localization[static::PROCESS . '_button_inactive'], + 'callback_data' => static::PROCESS . '_activate' + ]; + } + + // Exit (success) + return [ + [ + [ + 'text' => '🗑 ' . $localization[static::PROCESS . '_button_delete'], + 'callback_data' => static::PROCESS . '_delete' + ], + [ + 'text' => '🐣 ' . $localization[static::PROCESS . '_button_author'], + 'callback_data' => static::PROCESS . '_author' + ], + $toggle + ], + [ + [ + 'text' => '🔏 ' . $localization[static::PROCESS . '_button_answer'], + 'callback_data' => static::PROCESS . '_answer' + ], + [ + 'text' => '🌏 ' . $localization[static::PROCESS . '_button_localizations'], + 'callback_data' => static::PROCESS . '_localizations' + ], + ] + ]; + } + + /** + * Message text + * + * Generate text + * + * @param record $question The question + * @param array $localization The account localization + * + * @return string Generated text + */ + public static function message(record $question, array $localization): string + { + // Initializing the answer model + $model_answer = new answer(); + + // Initializing the answer + $answer = $model_answer->database->read( + filter: fn(record $record) => $record->identifier === $question->identifier, + amount: 1 + )[0] ?? null; + + // Declaring the questions list + $list = ''; + + foreach (language::cases() as $case) { + // Iterating over language + + // Initializing the localization model by the language + $model_question_localization = new question_localization(language: $case); + + // Initializing the localization + $_localization = $model_question_localization->database->read( + filter: fn(record $record) => $record->identifier === $question->identifier, + amount: 1 + )[0] ?? null; + + // Writing into the questions list + $list .= PHP_EOL . $case->flag() . ' *' . $case->label(language::{$account->language ?? 'en'} ?? language::en) . ':* ' . ($localization[$_localization instanceof record ? 'yes' : 'no']); + } + + // Deinitializing unnecessary variables + unset($case, $model_question, $model_question_localization, $model_answer, $amount); // Exit (success) + return sprintf( + <<identifier, + $localization[static::PROCESS . '_question_answer'], + $answer instanceof record ? "A:$answer->a B:$answer->b C:$answer->c D:$answer->d" : $localization['empty'], + $list + ); + } +} diff --git a/mirzaev/deeproots/system/models/telegram/settings.php b/mirzaev/deeproots/system/models/telegram/settings.php new file mode 100755 index 0000000..72baa1e --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/settings.php @@ -0,0 +1,156 @@ + + */ +final class settings extends core +{ + /** + * Language + * + * Write language into the account record + * + * @param context $context Request data from Telegram + * @param language $language The language + * + * @return void + */ + public static function language(context $context, language $language): void + { + // Initializing the account + $account = $context->get('account'); + + if ($account instanceof record) { + // Initialized the account + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + // Initializing the account model + $model = new account(); + + // Updating the account in the database + $updated = $model->database->read( + filter: fn(record $record) => $record->identifier === $account->identifier, + update: function (record &$record) use ($language) { + // Writing new language value into the record + $record->language = $language->name; + }, + amount: 1 + )[0] ?? null; + + if ($updated instanceof record) { + // Updated the account in the database + + // Writing the updated account into the context variable + $context->set('account', $updated); + + middlewares::language($context, new node(function (context $context) use ($account, $updated) { + // Updated language + + middlewares::localization($context, new node(function (context $context) use ($account, $updated) { + // Updated localization + + // Initializing localization + $localization = $context->get('localization'); + + if ($localization) { + // Initialized localization + + try { + // Initializing the old language + $old = language::{$account->language}; + + // Initializing the new language + $new = language::{$updated->language}; + + // Sending the message + $context->sendMessage('✅ *' . $localization['settings_language_update_success'] . '* ' . ($old->flag() ? $old->flag() . ' ' : '') . $old->label($new) . ' → *' . ($new->flag() ? $new->flag() . ' ' : '') . $new->label($new) . '*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } catch (error $error) { + // Failed to send the message about language update + + // Sending the message + $context->sendMessage('❎ *' . $localization['settings_language_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + })); + })); + } else { + // Not updated the account in the database + + // Sending the message + $context->sendMessage('❎ *' . $localization['settings_language_update_fail']) + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized localization + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize localization*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } else { + // Not initialized the account + + // Sending the message + $context->sendMessage('⚠️ *Failed to initialize the account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/mirzaev/deeproots/system/models/telegram/traits/escape.php b/mirzaev/deeproots/system/models/telegram/traits/escape.php new file mode 100644 index 0000000..a9dcf87 --- /dev/null +++ b/mirzaev/deeproots/system/models/telegram/traits/escape.php @@ -0,0 +1,57 @@ + + */ +trait escape +{ + /** + * Markdown + * + * Escaping for markdown + * + * @param string $text Text + * @param array $exception Symbols excluded from escaping + * + * @return string Escaped text + */ + public static function markdown(string $text, array $exceptions = []): string + { + // Initializing the registry of symbols for escaping + $from = array_diff( + [ + '#', + '*', + '_', + '=', + '.', + '[', + ']', + '(', + ')', + '-', + '>', + '<', + '!', + '`' + ], + $exceptions + ); + + // Initializing the registry of targets for escaping + $to = []; + foreach ($from as $symbol) $to[] = "\\$symbol"; + + // Escaping and exit (success) + return str_replace($from, $to, $text); + } +} diff --git a/author/project/system/public/css/fonts/dejavu.css b/mirzaev/deeproots/system/public/css/fonts/dejavu.css similarity index 100% rename from author/project/system/public/css/fonts/dejavu.css rename to mirzaev/deeproots/system/public/css/fonts/dejavu.css diff --git a/author/project/system/public/css/fonts/fira.css b/mirzaev/deeproots/system/public/css/fonts/fira.css similarity index 100% rename from author/project/system/public/css/fonts/fira.css rename to mirzaev/deeproots/system/public/css/fonts/fira.css diff --git a/author/project/system/public/css/fonts/hack.css b/mirzaev/deeproots/system/public/css/fonts/hack.css similarity index 100% rename from author/project/system/public/css/fonts/hack.css rename to mirzaev/deeproots/system/public/css/fonts/hack.css diff --git a/author/project/system/public/fonts/commissioner.ttf b/mirzaev/deeproots/system/public/fonts/commissioner.ttf similarity index 100% rename from author/project/system/public/fonts/commissioner.ttf rename to mirzaev/deeproots/system/public/fonts/commissioner.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSans.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSans.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSans.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerif.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerif.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerif.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf diff --git a/author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf b/mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf similarity index 100% rename from author/project/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf rename to mirzaev/deeproots/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf diff --git a/author/project/system/public/fonts/fira/FiraMono-Bold.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Bold.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Bold.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Bold.woff diff --git a/author/project/system/public/fonts/fira/FiraMono-Bold.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Bold.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Bold.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Bold.woff2 diff --git a/author/project/system/public/fonts/fira/FiraMono-Medium.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Medium.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Medium.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Medium.woff diff --git a/author/project/system/public/fonts/fira/FiraMono-Medium.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Medium.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Medium.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Medium.woff2 diff --git a/author/project/system/public/fonts/fira/FiraMono-Regular.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Regular.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Regular.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Regular.woff diff --git a/author/project/system/public/fonts/fira/FiraMono-Regular.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraMono-Regular.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraMono-Regular.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraMono-Regular.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Bold.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Bold.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Bold.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Bold.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Bold.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Bold.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Bold.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Bold.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-BoldItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-BoldItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-BoldItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-BoldItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-BoldItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-BoldItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-BoldItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-BoldItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Book.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Book.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Book.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Book.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Book.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Book.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Book.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Book.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-BookItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-BookItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-BookItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-BookItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-BookItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-BookItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-BookItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-BookItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Eight.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Eight.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Eight.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Eight.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Eight.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Eight.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Eight.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Eight.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-EightItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-EightItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-EightItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-EightItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-EightItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-EightItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-EightItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-EightItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraBold.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBold.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraBold.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBold.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraBold.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBold.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraBold.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBold.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraLight.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLight.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraLight.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLight.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraLight.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLight.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraLight.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLight.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Four.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Four.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Four.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Four.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Four.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Four.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Four.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Four.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-FourItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-FourItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-FourItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-FourItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-FourItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-FourItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-FourItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-FourItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Hair.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Hair.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Hair.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Hair.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Hair.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Hair.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Hair.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Hair.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-HairItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-HairItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-HairItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-HairItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-HairItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-HairItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-HairItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-HairItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Heavy.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Heavy.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Heavy.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Heavy.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Heavy.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Heavy.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Heavy.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Heavy.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-HeavyItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-HeavyItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-HeavyItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-HeavyItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Italic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Italic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Italic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Italic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Italic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Italic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Italic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Italic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Light.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Light.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Light.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Light.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Light.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Light.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Light.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Light.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-LightItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-LightItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-LightItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-LightItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-LightItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-LightItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-LightItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-LightItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Medium.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Medium.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Medium.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Medium.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Medium.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Medium.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Medium.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Medium.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-MediumItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-MediumItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-MediumItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-MediumItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-MediumItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-MediumItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-MediumItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-MediumItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Regular.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Regular.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Regular.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Regular.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Regular.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Regular.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Regular.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Regular.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-SemiBold.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBold.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-SemiBold.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBold.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-SemiBold.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBold.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-SemiBold.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBold.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Thin.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Thin.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Thin.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Thin.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Thin.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Thin.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Thin.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Thin.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-ThinItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ThinItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ThinItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ThinItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-ThinItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-ThinItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-ThinItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-ThinItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Two.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Two.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Two.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Two.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Two.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Two.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Two.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Two.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-TwoItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-TwoItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-TwoItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-TwoItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-TwoItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-TwoItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-TwoItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-TwoItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-Ultra.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Ultra.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Ultra.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Ultra.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-Ultra.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-Ultra.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-Ultra.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-Ultra.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraItalic.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraLight.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLight.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraLight.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLight.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraLight.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLight.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraLight.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLight.woff2 diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraLightItalic.woff b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLightItalic.woff similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraLightItalic.woff rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLightItalic.woff diff --git a/author/project/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 b/mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 similarity index 100% rename from author/project/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 rename to mirzaev/deeproots/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 diff --git a/author/project/system/public/fonts/hack/hack-bold-subset.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-bold-subset.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-bold-subset.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-bold-subset.woff diff --git a/author/project/system/public/fonts/hack/hack-bold-subset.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-bold-subset.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-bold-subset.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-bold-subset.woff2 diff --git a/author/project/system/public/fonts/hack/hack-bold.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-bold.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-bold.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-bold.woff diff --git a/author/project/system/public/fonts/hack/hack-bold.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-bold.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-bold.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-bold.woff2 diff --git a/author/project/system/public/fonts/hack/hack-bolditalic-subset.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic-subset.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-bolditalic-subset.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic-subset.woff diff --git a/author/project/system/public/fonts/hack/hack-bolditalic-subset.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic-subset.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-bolditalic-subset.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic-subset.woff2 diff --git a/author/project/system/public/fonts/hack/hack-bolditalic.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-bolditalic.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic.woff diff --git a/author/project/system/public/fonts/hack/hack-bolditalic.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-bolditalic.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-bolditalic.woff2 diff --git a/author/project/system/public/fonts/hack/hack-italic-subset.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-italic-subset.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-italic-subset.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-italic-subset.woff diff --git a/author/project/system/public/fonts/hack/hack-italic-subset.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-italic-subset.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-italic-subset.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-italic-subset.woff2 diff --git a/author/project/system/public/fonts/hack/hack-italic.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-italic.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-italic.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-italic.woff diff --git a/author/project/system/public/fonts/hack/hack-italic.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-italic.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-italic.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-italic.woff2 diff --git a/author/project/system/public/fonts/hack/hack-regular-subset.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-regular-subset.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-regular-subset.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-regular-subset.woff diff --git a/author/project/system/public/fonts/hack/hack-regular-subset.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-regular-subset.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-regular-subset.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-regular-subset.woff2 diff --git a/author/project/system/public/fonts/hack/hack-regular.woff b/mirzaev/deeproots/system/public/fonts/hack/hack-regular.woff similarity index 100% rename from author/project/system/public/fonts/hack/hack-regular.woff rename to mirzaev/deeproots/system/public/fonts/hack/hack-regular.woff diff --git a/author/project/system/public/fonts/hack/hack-regular.woff2 b/mirzaev/deeproots/system/public/fonts/hack/hack-regular.woff2 similarity index 100% rename from author/project/system/public/fonts/hack/hack-regular.woff2 rename to mirzaev/deeproots/system/public/fonts/hack/hack-regular.woff2 diff --git a/author/project/system/public/index.php b/mirzaev/deeproots/system/public/index.php similarity index 100% rename from author/project/system/public/index.php rename to mirzaev/deeproots/system/public/index.php diff --git a/mirzaev/deeproots/system/public/telegram.php b/mirzaev/deeproots/system/public/telegram.php new file mode 100755 index 0000000..6ab3b7a --- /dev/null +++ b/mirzaev/deeproots/system/public/telegram.php @@ -0,0 +1,104 @@ +setParseMode(config::PARSE_MODE_MARKDOWN); +$config->useReactFileSystem(true); + +// Initializing the robot +$robot = new Zanzara(TELEGRAM_KEY, $config); + +// Initializing the updates listener +$robot->onUpdate(function (Context $context): void {}); + +// Initializing the robot middlewares +$robot->middleware([middlewares::class, 'telegram']); +$robot->middleware([middlewares::class, 'account']); +$robot->middleware([middlewares::class, 'language']); +$robot->middleware([middlewares::class, 'localization']); +$robot->middleware([middlewares::class, 'system']); + +// Initializing the robot commands handlers +$robot->onCommand('start', [commands::class, 'menu']); +$robot->onCommand('menu', [commands::class, 'menu']); +$robot->onCommand('account', [commands::class, 'account']); +/* $robot->onCommand('svoboda', [commands::class, 'svoboda']); */ +$robot->onCommand('language', [commands::class, 'language'])->middleware([middlewares::class, 'settings']); +$robot->onCommand('repository', [commands::class, 'repository']); +/* $robot->onCommand('projects', [commands::class, 'projects']); */ +$robot->onCommand('author', [commands::class, 'author']); +$robot->onCommand('society', [commands::class, 'society']); +/* $robot->onCommand('system_settings', [commands::class, 'system_settings'])->middleware([middlewares::class, 'system_settings']); */ + +// Initializing the robot settings language buttons handlers +foreach (language::cases() as $language) { + // Iterating over languages + + // Initializing language buttons + $robot->onCbQueryData(['settings_language_' . $language->name], fn(context $context) => settings::language($context, $language)); +}; + +$robot->onCbQueryData(['system_questions_search_identifier'], [buttons_question_search::class, 'identifier'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_text'], [buttons_question_search::class, 'text'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_a'], [buttons_question_search::class, 'a'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_b'], [buttons_question_search::class, 'b'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_c'], [buttons_question_search::class, 'c'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_d'], [buttons_question_search::class, 'd'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_end'], [process_question_search::class, 'end'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search_next'], [process_question_search::class, 'next'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_search'], [process_question_search::class, 'start'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions_create'], [process_question_create::class, 'start'])->middleware([middlewares::class, 'system_questions']); +$robot->onCbQueryData(['system_questions'], [commands::class, 'system_questions'])->middleware([middlewares::class, 'system_questions']); + +// Starting chat-robot +$robot->run(); diff --git a/author/project/system/public/themes/default/css/aside.css b/mirzaev/deeproots/system/public/themes/default/css/aside.css similarity index 100% rename from author/project/system/public/themes/default/css/aside.css rename to mirzaev/deeproots/system/public/themes/default/css/aside.css diff --git a/author/project/system/public/themes/default/css/colors.css b/mirzaev/deeproots/system/public/themes/default/css/colors.css similarity index 100% rename from author/project/system/public/themes/default/css/colors.css rename to mirzaev/deeproots/system/public/themes/default/css/colors.css diff --git a/author/project/system/public/themes/default/css/fonts.css b/mirzaev/deeproots/system/public/themes/default/css/fonts.css similarity index 100% rename from author/project/system/public/themes/default/css/fonts.css rename to mirzaev/deeproots/system/public/themes/default/css/fonts.css diff --git a/author/project/system/public/themes/default/css/footer.css b/mirzaev/deeproots/system/public/themes/default/css/footer.css similarity index 100% rename from author/project/system/public/themes/default/css/footer.css rename to mirzaev/deeproots/system/public/themes/default/css/footer.css diff --git a/author/project/system/public/themes/default/css/header.css b/mirzaev/deeproots/system/public/themes/default/css/header.css similarity index 100% rename from author/project/system/public/themes/default/css/header.css rename to mirzaev/deeproots/system/public/themes/default/css/header.css diff --git a/author/project/system/public/themes/default/css/main.css b/mirzaev/deeproots/system/public/themes/default/css/main.css similarity index 100% rename from author/project/system/public/themes/default/css/main.css rename to mirzaev/deeproots/system/public/themes/default/css/main.css diff --git a/author/project/system/public/themes/default/css/system.css b/mirzaev/deeproots/system/public/themes/default/css/system.css similarity index 100% rename from author/project/system/public/themes/default/css/system.css rename to mirzaev/deeproots/system/public/themes/default/css/system.css diff --git a/author/project/system/settings/.gitignore b/mirzaev/deeproots/system/settings/.gitignore similarity index 100% rename from author/project/system/settings/.gitignore rename to mirzaev/deeproots/system/settings/.gitignore diff --git a/author/project/system/settings/arangodb.php.sample b/mirzaev/deeproots/system/settings/arangodb.php.sample similarity index 100% rename from author/project/system/settings/arangodb.php.sample rename to mirzaev/deeproots/system/settings/arangodb.php.sample diff --git a/author/project/system/settings/system.php.sample b/mirzaev/deeproots/system/settings/system.php.sample similarity index 100% rename from author/project/system/settings/system.php.sample rename to mirzaev/deeproots/system/settings/system.php.sample diff --git a/mirzaev/deeproots/system/settings/telegram.php.sample b/mirzaev/deeproots/system/settings/telegram.php.sample new file mode 100755 index 0000000..7679934 --- /dev/null +++ b/mirzaev/deeproots/system/settings/telegram.php.sample @@ -0,0 +1,3 @@ +