diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5b3a258 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,8 @@ +[submodule "pechatalka.mjs"] + path = pechatalka.mjs + url = https://git.svoboda.works/mirzaev/pechatalka.mjs + branch = stable +[submodule "damper.mjs"] + path = damper.mjs + url = https://git.svoboda.works/mirzaev/damper.mjs + branch = stable diff --git a/composer.json b/composer.json index 68da142..688c6d7 100755 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { - "name": "mirzaev/pechatalka", + "name": "svoboda/pechatalka", "description": "Chat-robot constructor for the Svoboda typography", - "homepage": "https://git.svoboda.works/mirzaev/pechatalka", + "homepage": "https://git.svoboda.works/svoboda/pechatalka", "type": "site", "keywords": [ "minimal", @@ -15,32 +15,42 @@ "name": "Arsen Mirzaev Tatyano-Muradovich", "email": "arsen@mirzaev.sexy", "homepage": "https://mirzaev.sexy", - "role": "Programmer" + "role": "Creator" } ], "support": { - "wiki": "https://git.svoboda.works/mirzaev/pechatalka/wiki", - "issues": "https://git.svoboda.works/mirzaev/pechatalka/issues" + "wiki": "https://git.svoboda.works/svoboda/pechatalka/wiki", + "issues": "https://git.svoboda.works/svoboda/pechatalka/issues" }, "require": { "php": "^8.4", - "mirzaev/minimal": "^3.6", + "mirzaev/minimal": "^3", "mirzaev/baza": "^3.3", "twig/twig": "^3.2", "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" }, "autoload": { "psr-4": { - "mirzaev\\pechatalka\\": "mirzaev/pechatalka/system" + "svoboda\\pechatalka\\": "svoboda/pechatalka/system" } }, "autoload-dev": { "psr-4": { - "mirzaev\\pechatalka\\tests\\": "mirzaev/pechatalka/tests" + "svoboda\\pechatalka\\tests\\": "svoboda/pechatalka/tests" } }, "scripts": { "pre-update-cmd": "./install.sh" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "wyrihaximus/composer-update-bin-autoload-path": true + } } } diff --git a/damper.mjs b/damper.mjs new file mode 160000 index 0000000..68589e9 --- /dev/null +++ b/damper.mjs @@ -0,0 +1 @@ +Subproject commit 68589e968cbc043f35c2948a9c90293b6f5f9cb9 diff --git a/examples/nginx/pechatalka.conf b/examples/nginx/pechatalka.conf new file mode 100644 index 0000000..2b2a717 --- /dev/null +++ b/examples/nginx/pechatalka.conf @@ -0,0 +1,53 @@ +server { + listen 80; + listen [::]:80; + + server_name pechatalka.svoboda.works; + + # 301 302 + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl; + listen 443 quic; + listen [::]:443 ssl; + listen [::]:443 quic; + + server_name pechatalka.svoboda.works; + + http2 on; + http3 on; + quic_gso on; + quic_retry on; + + add_header Alt-Svc 'h3=":$server_port"; ma=86400'; + add_header x-quic 'h3'; + + root /var/www/pechatalka.svoboda.works/svoboda/pechatalka/system/public; + + index index.php; + + keepalive_timeout 60; + + include snippets/ssl-params.conf; + include snippets/ssl-svoboda.conf; + include snippets/php8_4.conf; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|mp3|ogg|ogv|webm|htc|woff2|woff)$ { + expires 1M; + access_log off; + add_header Cache-Control "max-age=2629746, public"; + } + + location ~* \.(?:css|js|mjs|min)$ { + expires 1y; + access_log off; + add_header Cache-Control "max-age=31556952, public"; + } +} + diff --git a/examples/systemd/pechatalka.service b/examples/systemd/pechatalka.service new file mode 100644 index 0000000..8047359 --- /dev/null +++ b/examples/systemd/pechatalka.service @@ -0,0 +1,17 @@ +[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/pechatalka/svoboda/pechatalka/system/public/robot.php +PIDFile=/var/run/php/pechatalka.pid +RemainAfterExit=no +RuntimeMaxSec=3600s +Restart=always +RestartSec=5s + +[Install] +WantedBy=multi-user.target + diff --git a/mirzaev/pechatalka/system/public/js/modules/pechatalka.mjs.min b/mirzaev/pechatalka/system/public/js/modules/pechatalka.mjs.min deleted file mode 120000 index ac514c1..0000000 --- a/mirzaev/pechatalka/system/public/js/modules/pechatalka.mjs.min +++ /dev/null @@ -1 +0,0 @@ -pechatalka.mjs/pechatalka.mjs.min \ No newline at end of file diff --git a/mirzaev/pechatalka/system/public/themes/default/css/aside.css b/mirzaev/pechatalka/system/public/themes/default/css/aside.css deleted file mode 100644 index faf9c91..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/aside.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8"; - -aside { -} diff --git a/mirzaev/pechatalka/system/public/themes/default/css/colors.css b/mirzaev/pechatalka/system/public/themes/default/css/colors.css deleted file mode 100644 index 9eaf50b..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/colors.css +++ /dev/null @@ -1,37 +0,0 @@ -@charset "UTF-8"; - -@media (prefers-color-scheme: dark) { - :root { - --text-color: initial; - --text-color-hover: initial; - --text-color-active: initial; - --text-notice-color: initial; - --text-warning-color: initial; - --text-selected-color: initial; - --text-selected-background-color: initial; - - --link-color: initial; - --link-color-hover: initial; - --link-color-active: initial; - - color: var(--text-color); - } -} - -@media (prefers-color-scheme: light) { - :root { - --text-color: initial; - --text-color-hover: initial; - --text-color-active: initial; - --text-notice-color: initial; - --text-warning-color: initial; - --text-selected-color: initial; - --text-selected-background-color: initial; - - --link-color: initial; - --link-color-hover: initial; - --link-color-active: initial; - - color: var(--text-color); - } -} diff --git a/mirzaev/pechatalka/system/public/themes/default/css/fonts.css b/mirzaev/pechatalka/system/public/themes/default/css/fonts.css deleted file mode 100755 index 84f16b4..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/fonts.css +++ /dev/null @@ -1,9 +0,0 @@ -@import url('/css/fonts/fira.css'); -@import url('/css/fonts/hack.css'); -@import url('/css/fonts/dejavu.css'); - -@font-face { - font-family: 'Commissioner'; - src: url('/fonts/commissioner.ttf'); - font-weight: 400; -} diff --git a/mirzaev/pechatalka/system/public/themes/default/css/footer.css b/mirzaev/pechatalka/system/public/themes/default/css/footer.css deleted file mode 100644 index 605243b..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/footer.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8"; - -footer { -} \ No newline at end of file diff --git a/mirzaev/pechatalka/system/public/themes/default/css/header.css b/mirzaev/pechatalka/system/public/themes/default/css/header.css deleted file mode 100644 index b440dd5..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/header.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8"; - -header { -} diff --git a/mirzaev/pechatalka/system/public/themes/default/css/main.css b/mirzaev/pechatalka/system/public/themes/default/css/main.css deleted file mode 100755 index d9cb3e3..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/main.css +++ /dev/null @@ -1,13 +0,0 @@ -@charset "UTF-8"; - -body { - margin: unset; -} - -main { - display: flex; - flex-direction: column; - align-items: center; - gap: var(--gap); - transition: 0s; -} \ No newline at end of file diff --git a/mirzaev/pechatalka/system/public/themes/default/css/system.css b/mirzaev/pechatalka/system/public/themes/default/css/system.css deleted file mode 100644 index 1137f56..0000000 --- a/mirzaev/pechatalka/system/public/themes/default/css/system.css +++ /dev/null @@ -1,34 +0,0 @@ -@charset "UTF-8"; - -:root { - --gap: min(12px, 1rem); - - /* font-family: , system-ui, sans-serif; */ - font-family: "dejavu"; - text-decoration: none; - outline: none; - border: none; - transition: 0.1s ease-out; -} - -/* Selection */ -::selection { - color: var(--text-selected-color); - background: var(--text-selected-background-color); -} - -::-moz-selection { - color: var(--text-selected-color); - background: var(--text-selected-background-color); -} - - -.unselectable { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - diff --git a/mirzaev/pechatalka/system/settings/arangodb.php.sample b/mirzaev/pechatalka/system/settings/arangodb.php.sample deleted file mode 100755 index c5b651f..0000000 --- a/mirzaev/pechatalka/system/settings/arangodb.php.sample +++ /dev/null @@ -1,8 +0,0 @@ - 'unix:///var/run/arangodb3/arango.sock', - 'database' => 'pechatalka', - 'name' => 'pechatalka', - 'password' => '' -]; diff --git a/mirzaev/pechatalka/system/views/themes/default/js.html b/mirzaev/pechatalka/system/views/themes/default/js.html deleted file mode 100755 index 784e58d..0000000 --- a/mirzaev/pechatalka/system/views/themes/default/js.html +++ /dev/null @@ -1,5 +0,0 @@ -{% block js %} -{% for element in js %} - -{% endfor %} -{% endblock %} diff --git a/pechatalka.mjs b/pechatalka.mjs index a32ea39..b140047 160000 --- a/pechatalka.mjs +++ b/pechatalka.mjs @@ -1 +1 @@ -Subproject commit a32ea39cf65b73016db5e8baad93bff77811075f +Subproject commit b1400479c4f06b49d0a6d6d5c4496cd9b4430752 diff --git a/svoboda/pechatalka/system/controllers/constructor.php b/svoboda/pechatalka/system/controllers/constructor.php new file mode 100755 index 0000000..a0af9e9 --- /dev/null +++ b/svoboda/pechatalka/system/controllers/constructor.php @@ -0,0 +1,70 @@ + + */ +final class constructor extends core +{ + /** + * Errors + * + * @var array $errors Registry of errors + */ + protected array $errors = [ + 'system' => [] + ]; + + /** + * Pin + * + * @return null + */ + public function pin(): null + { + if (str_contains($this->request->headers['accept'], content::any->value)) { + // Request for any response + + // Render page + $page = $this->view->render('/constructor/pin/page.html'); + + // Sending response + $this->response + ->start() + ->clean() + ->sse() + ->write($page) + ->validate($this->request) + ?->body() + ->end(); + + // Deinitializing rendered page + unset($page); + + // Exit (success) + return null; + } + + // Exit (fail) + return null; + } +} diff --git a/mirzaev/pechatalka/system/controllers/core.php b/svoboda/pechatalka/system/controllers/core.php similarity index 82% rename from mirzaev/pechatalka/system/controllers/core.php rename to svoboda/pechatalka/system/controllers/core.php index 2d7157f..0619a06 100755 --- a/mirzaev/pechatalka/system/controllers/core.php +++ b/svoboda/pechatalka/system/controllers/core.php @@ -2,13 +2,12 @@ declare(strict_types=1); -namespace mirzaev\pechatalka\controllers; +namespace svoboda\pechatalka\controllers; // Files of the project -use mirzaev\pechatalka\views\templater, - mirzaev\pechatalka\models\core as models, - mirzaev\pechatalka\models\session, - mirzaev\pechatalka\models\enumerations\language; +use svoboda\pechatalka\views\templater, + svoboda\pechatalka\models\core as models, + svoboda\pechatalka\models\enumerations\language; // Framework for PHP use mirzaev\minimal\core as minimal, @@ -19,7 +18,7 @@ use mirzaev\minimal\core as minimal, /** * Controllers core * - * @package mirzaev\pechatalka\controllers + * @package svoboda\pechatalka\controllers * * @param language $language Language * @param response $response Response @@ -29,7 +28,6 @@ use mirzaev\minimal\core as minimal, * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich - * @author mirzaev */ class core extends controller { @@ -75,7 +73,7 @@ class core extends controller if (isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return status::bruh->label; // Initializing the view template engine instance - $this->view = new templater($this->session); + $this->view = new templater(); // For the extends system parent::__construct(core: $core); diff --git a/mirzaev/pechatalka/system/controllers/index.php b/svoboda/pechatalka/system/controllers/index.php similarity index 87% rename from mirzaev/pechatalka/system/controllers/index.php rename to svoboda/pechatalka/system/controllers/index.php index 9d46a83..fa50853 100755 --- a/mirzaev/pechatalka/system/controllers/index.php +++ b/svoboda/pechatalka/system/controllers/index.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace mirzaev\pechatalka\controllers; +namespace svoboda\pechatalka\controllers; // Files of the project -use mirzaev\pechatalka\controllers\core; +use svoboda\pechatalka\controllers\core; // Framework for PHP use mirzaev\minimal\http\enumerations\content, @@ -14,7 +14,7 @@ use mirzaev\minimal\http\enumerations\content, /** * Index * - * @package mirzaev\pechatalka\controllers + * @package svoboda\pechatalka\controllers * * @param array $errors Registry of errors * @@ -22,7 +22,6 @@ use mirzaev\minimal\http\enumerations\content, * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich - * @author mirzaev */ final class index extends core { diff --git a/mirzaev/pechatalka/system/databases/.gitignore b/svoboda/pechatalka/system/databases/.gitignore similarity index 100% rename from mirzaev/pechatalka/system/databases/.gitignore rename to svoboda/pechatalka/system/databases/.gitignore diff --git a/svoboda/pechatalka/system/localizations/english.php b/svoboda/pechatalka/system/localizations/english.php new file mode 100644 index 0000000..a5f9c81 --- /dev/null +++ b/svoboda/pechatalka/system/localizations/english.php @@ -0,0 +1,83 @@ + 'Svoboda', + 'svoboda_work_union' => 'Svoboda Work Union', + 'svoboda_work_union_short' => 'SWU', + 'pechatalka' => 'Pechatalka', + 'empty' => 'Empty', + 'yes' => 'Yes', + 'no' => 'No', + + // Main menu + 'menu_title' => 'Main menu', + 'menu_accounts' => 'Accounts', + 'menu_button_constructor_pin' => 'Pin', + 'menu_not_syncronized' => 'The database does not synchronize with the blockchain network', + + // Account + 'account_title' => 'Account', + 'account_export' => 'This account can be exported to the Svoboda main blockchain network in the future', + 'account_data' => "⚠️ Your data may be given to the special services of Russia\nBe careful and think with your head.", + 'account_security_repository' => 'Information security', + 'account_security_repository_mirror_github' => 'mirror', + 'account_authorized_system' => 'Access to the system', + 'account_authorized_settings' => 'Access to settings', + 'account_authorized_system_accounts' => 'System access to accounts management', + 'account_authorized_system_settings' => 'System access to the system settings', + 'account_button_localizations' => 'Localizations', + 'account_localization_create_failted_to_initialize_language' => 'Failed to initialize language', + + // 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_telegram' => 'Telegram', + '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', + + // Authorization + 'not_authorized_system' => 'You do not have access to the system', + 'not_authorized_messages' => 'You do not have access to send messages', + 'not_authorized_joins' => 'You do not have access to joins', + 'not_authorized_settings' => 'You do not have access to the settings', + 'not_authorized_system_settings' => 'You do not have access to the system settings', + 'not_authorized_system_distributions' => 'You do not have access to distributions administration', + + // Other + 'why_so_shroomious' => 'why so shroomious' +]; diff --git a/svoboda/pechatalka/system/localizations/russian.php b/svoboda/pechatalka/system/localizations/russian.php new file mode 100644 index 0000000..23e67c3 --- /dev/null +++ b/svoboda/pechatalka/system/localizations/russian.php @@ -0,0 +1,88 @@ + 'Свобода', + 'svoboda_work_union' => 'Рабочий Союз Свободы', + 'svoboda_work_union_short' => 'РСС', + 'Pechatalka' => 'Печаталка', + 'empty' => 'Пусто', + 'yes' => 'Да', + 'no' => 'Нет', + + // Main menu + 'menu_title' => 'Главное меню', + 'menu_accounts' => 'Аккаунты', + 'menu_button_constructor_pin' => 'Значок', + 'menu_not_syncronized' => 'База данных не синхронизируется с блокчейн сетью', + + // Аккаунт + 'account_title' => 'Аккаунт', + 'account_export' => 'Этот аккаунт может быть экспортирован в основную блокчейн сеть Свободы в будущем', + 'account_data' => "⚠️ Твои данные могут быть выданы спецслужбам России\nБудь осторожен и думай своей головой", + 'account_security_repository' => 'Информационная безопасность', + 'account_security_repository_mirror_github' => 'зеркало', + 'account_authorized_system' => 'Доступ к системе', + 'account_authorized_messages' => 'Доступ к сообщениям', + 'account_authorized_joins' => 'Доступ к вступлениям', + 'account_authorized_settings' => 'Доступ к изменению настроек', + 'account_authorized_system_accounts' => 'Системный доступ к управлению аккаунтами', + 'account_authorized_system_distributions' => 'Системный доступ к управлению дистрибутивами', + 'account_authorized_system_members' => 'Системный доступ к управлению участниками дистрибутивов', + 'account_authorized_system_settings' => 'Системный доступ к системным настройкам', + 'account_button_localizations' => 'Локализации', + 'account_localization_create_failted_to_initialize_language' => 'Не удалось инициализировать язык', + + // Настройки языка + '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_telegram' => 'Телеграм', + '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' => 'Отправить сообщение', + + // Авторизация + 'not_authorized_system' => 'У тебя нет доступа к системе', + 'not_authorized_messages' => 'У тебя нет доступа к сообщениям', + 'not_authorized_joins' => 'У тебя нет доступа к вступлениям', + 'not_authorized_settings' => 'У тебя нет доступа к настройкам', + 'not_authorized_system_settings' => 'У тебя нет доступа к системным настройкам', + 'not_authorized_system_distributions' => 'У тебя нет доступа к администрированию дистрибутивов', + + // Прочее + 'why_so_shroomious' => 'почему такой грибъёзный' + +]; diff --git a/svoboda/pechatalka/system/models/account.php b/svoboda/pechatalka/system/models/account.php new file mode 100644 index 0000000..cd467e7 --- /dev/null +++ b/svoboda/pechatalka/system/models/account.php @@ -0,0 +1,202 @@ + + */ +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('identifier_telegram', type::integer), + 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('authorized_system', type::char), + new column('authorized_settings', type::char), + new column('authorized_system_accounts', 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 in the database, and if it does not find it, it creates it + * + * @param telegram $telegram The telegram account + * + * @throws exception_runtime if update the account record in the database by the telegram account values + * @throws exception_runtime if failed to find the registered account + * @throws exception_runtime if failed to registrate the account + * + * @return record The account record from the database + */ + public function initialize(telegram $telegram): record + { + // Searching for the account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier_telegram === $telegram->getId(), amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the 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 === $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->registrate($telegram)) { + // Registered the account + + // Searching for the registered account in the database + $account = $this->database->read(filter: fn(record $record) => $record->identifier_telegram === $telegram->getId(), amount: 1)[0] ?? null; + + if ($account instanceof record) { + // Found the registered account + + // Exit (success) + return $account; + } else { + // Not found the registered account + + // Exit (fail) + throw new exception_runtime('Failed to find the registered account'); + } + } else { + // Not registered the account + + // Exit (fail) + throw new exception_runtime('Failed to registrate the account'); + } + } + } + + /** + * Registrate + * + * Creates the account record in the database + * + * @param telegram $telegram The telegram account + * + * @return int|false The record identifier, if created + */ + public function registrate(telegram $telegram): int|false + { + // Initializing the identifier + $identifier = $this->database->count() + 1; + + // Initializing the record + $record = $this->database->record( + $identifier, + (int) $telegram->getId(), + $telegram->getFirstName(), + $telegram->getLastName(), + $telegram->getUsername(), + $telegram->getLanguageCode(), + (int) $telegram->isBot(), + 1, + 1, + 0, + 0, + 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/pechatalka/system/models/core.php b/svoboda/pechatalka/system/models/core.php similarity index 80% rename from mirzaev/pechatalka/system/models/core.php rename to svoboda/pechatalka/system/models/core.php index c053efd..49b099a 100755 --- a/mirzaev/pechatalka/system/models/core.php +++ b/svoboda/pechatalka/system/models/core.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\pechatalka\models; +namespace svoboda\pechatalka\models; // Framework for PHP use mirzaev\minimal\model, @@ -14,13 +14,12 @@ use exception; /** * Models core * - * @package mirzaev\pechatalka\models + * @package svoboda\pechatalka\models * * @method void __construct() Constructor * * @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 { @@ -38,8 +37,5 @@ class core extends model * * @return void */ - public function __construct() - { - } + public function __construct() {} } - diff --git a/mirzaev/pechatalka/system/models/enumerations/language.php b/svoboda/pechatalka/system/models/enumerations/language.php similarity index 91% rename from mirzaev/pechatalka/system/models/enumerations/language.php rename to svoboda/pechatalka/system/models/enumerations/language.php index c55b4aa..9decf2d 100755 --- a/mirzaev/pechatalka/system/models/enumerations/language.php +++ b/svoboda/pechatalka/system/models/enumerations/language.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace mirzaev\pechatalka\models\enumerations; +namespace svoboda\pechatalka\models\enumerations; /** * Language * * Types of languages by ISO 639-1 standart * - * @package mirzaev\pechatalka\models\enumerations + * @package svoboda\pechatalka\models\enumerations * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich diff --git a/svoboda/pechatalka/system/models/telegram/account.php b/svoboda/pechatalka/system/models/telegram/account.php new file mode 100644 index 0000000..f4ba04b --- /dev/null +++ b/svoboda/pechatalka/system/models/telegram/account.php @@ -0,0 +1,33 @@ + + */ +final class account extends core +{ +} + diff --git a/svoboda/pechatalka/system/models/telegram/commands.php b/svoboda/pechatalka/system/models/telegram/commands.php new file mode 100644 index 0000000..cc3cd2e --- /dev/null +++ b/svoboda/pechatalka/system/models/telegram/commands.php @@ -0,0 +1,533 @@ + + */ +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'] . '*'; + + // Initializing accounts + $accounts = '*' . $localization['menu_accounts'] . ':* ' . ((new account)->database->count() ?? 0); + + // Initializing the data syncronization for the message + $syncronization = '⛓️‍💥 ' . $localization['menu_not_syncronized']; + + // Sending the message + $context->sendMessage( + << [ + 'inline_keyboard' => [ + [ + [ + 'text' => '🔘 ' . $localization['menu_button_constructor_pin'], + 'web_app' => [ + 'url' => 'https://pechatalka.svoboda.works/constructor/pin' + ] + ] + ] + ], + 'disable_notification' => true, + 'remove_keyboard' => true + ], + ] + ) + ->then(function (message $message) use ($context) { + // Sended the message + }); + } 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 your Telegram account*') + ->then(function (message $message) use ($context) { + // 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 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']; + + // 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 + + // Skipping system authorizations + if (str_starts_with($key, 'authorized_system_')) continue; + + // 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"); + + // Initializing the data export for the message + $export = '📤 ' . $localization['account_export']; + + // Initializing the data security for the message + $data = $localization['account_data']; + + // Initializing the data security repository for the message + $security = '📁 [' . $localization['account_security_repository'] . '](https://git.svoboda.works/mirzaev/security) \([' . $localization['account_security_repository_mirror_github'] . '](https://github.com/mature-woman/security)\)'; + + // Sending the message + $context->sendMessage( + << [ + '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 your Telegram account*') + ->then(function (message $message) use ($context) { + // 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 your Telegram 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/svoboda/pechatalka' + ] + ], + [ + [ + 'text' => '⚠️ ' . $localization['repository_button_issues'], + 'url' => 'https://git.mirzaev.sexy/svoboda/pechatalka/issues' + ], + [ + 'text' => '🌱 ' . $localization['repository_button_suggestions'], + 'url' => 'https://git.mirzaev.sexy/svoboda/pechatalka/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 your Telegram 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_telegram'], + 'url' => 'https://t.me/blog_mirzaev_sexy' + ], + [ + '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 your Telegram 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) { + // 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) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/pechatalka/system/models/telegram/middlewares.php b/svoboda/pechatalka/system/models/telegram/middlewares.php new file mode 100644 index 0000000..5d92b5d --- /dev/null +++ b/svoboda/pechatalka/system/models/telegram/middlewares.php @@ -0,0 +1,372 @@ + + */ +final class middlewares extends core +{ + /** + * 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 telegram account + $telegram = $context->getEffectiveUser(); + + // 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 your Telegram 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 + + if ($account->language) { + // Initialized the language parameter + + try { + // Writing the account language into the context variable + $context->set('language', language::{$account->language}); + } catch (error $error) { + // Not initialized the language + + // Writing the default language into the context variable + $context->set('language', language::en); + } + } else { + // Not initialized the language parameter + + // Writing the default language into the context variable + $context->set('language', language::en); + } + + // Continuation of the process + $next($context); + } 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(); + }); + } + } + + /** + * 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)) { + // Initialized 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 your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * Settings (middleware) + * + * Check the account for access to the 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 your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } + + /** + * System settings (middleware) + * + * Check the account for access to the system 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 your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} + diff --git a/svoboda/pechatalka/system/models/telegram/processes/language/select.php b/svoboda/pechatalka/system/models/telegram/processes/language/select.php new file mode 100644 index 0000000..053c67c --- /dev/null +++ b/svoboda/pechatalka/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/svoboda/pechatalka/src/branch/stable/svoboda/pechatalka/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 your Telegram account*') + ->then(function (message $message) use ($context) { + // Sended the message + + // Ending the conversation process + $context->endConversation(); + }); + } + } +} diff --git a/svoboda/pechatalka/system/models/telegram/settings.php b/svoboda/pechatalka/system/models/telegram/settings.php new file mode 100644 index 0000000..acbfbec --- /dev/null +++ b/svoboda/pechatalka/system/models/telegram/settings.php @@ -0,0 +1,157 @@ + + */ +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 your Telegram account*') + ->then(function (message $message) use ($context) { + // Ending the conversation process + $context->endConversation(); + }); + } + } +} + diff --git a/mirzaev/pechatalka/system/models/traits/files.php b/svoboda/pechatalka/system/models/traits/files.php similarity index 94% rename from mirzaev/pechatalka/system/models/traits/files.php rename to svoboda/pechatalka/system/models/traits/files.php index f4e1338..7bcce10 100755 --- a/mirzaev/pechatalka/system/models/traits/files.php +++ b/svoboda/pechatalka/system/models/traits/files.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\pechatalka\models\traits; +namespace svoboda\pechatalka\models\traits; // Built-in libraries use exception; @@ -14,7 +14,7 @@ use exception; * * @method static void delete(string $directory, array &$errors) * - * @package mirzaev\pechatalka\models\traits + * @package svoboda\pechatalka\models\traits * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich diff --git a/svoboda/pechatalka/system/public/css/fonts/cascadia_code.css b/svoboda/pechatalka/system/public/css/fonts/cascadia_code.css new file mode 100755 index 0000000..fa4da19 --- /dev/null +++ b/svoboda/pechatalka/system/public/css/fonts/cascadia_code.css @@ -0,0 +1,8 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Cascadia Code'; + src: url("/fonts/geologica/CascadiaCode-Regular.woff2"); + font-weight: 400; + font-style: normal; +} diff --git a/svoboda/pechatalka/system/public/css/fonts/commissioner.css b/svoboda/pechatalka/system/public/css/fonts/commissioner.css new file mode 100755 index 0000000..1c32387 --- /dev/null +++ b/svoboda/pechatalka/system/public/css/fonts/commissioner.css @@ -0,0 +1,7 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Commissioner'; + src: url('/fonts/commissioner/commissioner.ttf'); + font-weight: 400; +} diff --git a/mirzaev/pechatalka/system/public/css/fonts/dejavu.css b/svoboda/pechatalka/system/public/css/fonts/dejavu.css similarity index 100% rename from mirzaev/pechatalka/system/public/css/fonts/dejavu.css rename to svoboda/pechatalka/system/public/css/fonts/dejavu.css diff --git a/mirzaev/pechatalka/system/public/css/fonts/fira.css b/svoboda/pechatalka/system/public/css/fonts/fira.css similarity index 100% rename from mirzaev/pechatalka/system/public/css/fonts/fira.css rename to svoboda/pechatalka/system/public/css/fonts/fira.css diff --git a/svoboda/pechatalka/system/public/css/fonts/geologica.css b/svoboda/pechatalka/system/public/css/fonts/geologica.css new file mode 100755 index 0000000..86cd3a3 --- /dev/null +++ b/svoboda/pechatalka/system/public/css/fonts/geologica.css @@ -0,0 +1,65 @@ +@charset "UTF-8"; + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Thin.ttf"); + font-weight: 100; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica_Auto-ExtraLight.ttf"); + font-weight: 200; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Light.ttf"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Regular.ttf"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Medium.ttf"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-SemiBold.ttf"); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Bold.ttf"); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-ExtraBold.ttf"); + font-weight: 800; + font-style: normal; +} + +@font-face { + font-family: 'Geologica'; + src: url("/fonts/geologica/Geologica-Black.ttf"); + font-weight: 900; + font-style: normal; +} + diff --git a/mirzaev/pechatalka/system/public/css/fonts/hack.css b/svoboda/pechatalka/system/public/css/fonts/hack.css similarity index 100% rename from mirzaev/pechatalka/system/public/css/fonts/hack.css rename to svoboda/pechatalka/system/public/css/fonts/hack.css diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCode.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCode.woff2 new file mode 100644 index 0000000..8e6778a Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCode.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeItalic.woff2 new file mode 100644 index 0000000..ed8477b Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeItalic.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNF.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNF.woff2 new file mode 100644 index 0000000..56b6c99 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNF.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNFItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNFItalic.woff2 new file mode 100644 index 0000000..571613f Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodeNFItalic.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePL.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePL.woff2 new file mode 100644 index 0000000..afc5e80 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePL.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePLItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePLItalic.woff2 new file mode 100644 index 0000000..b8c1622 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaCodePLItalic.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMono.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMono.woff2 new file mode 100644 index 0000000..ca77005 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMono.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoItalic.woff2 new file mode 100644 index 0000000..d396032 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoItalic.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNF.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNF.woff2 new file mode 100644 index 0000000..57bd3a8 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNF.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNFItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNFItalic.woff2 new file mode 100644 index 0000000..0040b80 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoNFItalic.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPL.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPL.woff2 new file mode 100644 index 0000000..d7c5245 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPL.woff2 differ diff --git a/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPLItalic.woff2 b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPLItalic.woff2 new file mode 100644 index 0000000..9ce8f63 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/cascadia_code/CascadiaMonoPLItalic.woff2 differ diff --git a/mirzaev/pechatalka/system/public/fonts/commissioner.ttf b/svoboda/pechatalka/system/public/fonts/commissioner/commissioner.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/commissioner.ttf rename to svoboda/pechatalka/system/public/fonts/commissioner/commissioner.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Bold.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans-Oblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSans.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Bold.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-BoldOblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed-Oblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansCondensed.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Bold.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-BoldOblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono-Oblique.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSansMono.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Bold.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-BoldItalic.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif-Italic.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerif.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Bold.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-BoldItalic.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed-Italic.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf b/svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf rename to svoboda/pechatalka/system/public/fonts/dejavu/DejaVuLGCSerifCondensed.ttf diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Bold.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Medium.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraMono-Regular.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Bold.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-BoldItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Book.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Book.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Book.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Book.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Book.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Book.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Book.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Book.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-BookItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Eight.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-EightItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBold.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraBoldItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLight.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ExtraLightItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Four.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Four.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Four.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Four.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Four.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Four.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Four.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Four.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-FourItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Hair.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-HairItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Heavy.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-HeavyItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Italic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Light.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Light.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Light.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Light.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Light.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Light.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Light.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Light.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-LightItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Medium.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-MediumItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Regular.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBold.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-SemiBoldItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Thin.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-ThinItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Two.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Two.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Two.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Two.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Two.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Two.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Two.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Two.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-TwoItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-Ultra.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraItalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLight.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 b/svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 rename to svoboda/pechatalka/system/public/fonts/fira/FiraSans-UltraLightItalic.woff2 diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Black.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Black.ttf new file mode 100644 index 0000000..2cc1af6 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Black.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Bold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Bold.ttf new file mode 100644 index 0000000..6ffd74f Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Bold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraBold.ttf new file mode 100644 index 0000000..ed35390 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraLight.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraLight.ttf new file mode 100644 index 0000000..70aae9c Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-ExtraLight.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Light.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Light.ttf new file mode 100644 index 0000000..1a26fb9 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Light.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Medium.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Medium.ttf new file mode 100644 index 0000000..9670c9f Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Medium.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Regular.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Regular.ttf new file mode 100644 index 0000000..9843d1b Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Regular.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-SemiBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-SemiBold.ttf new file mode 100644 index 0000000..a0df465 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-SemiBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Thin.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Thin.ttf new file mode 100644 index 0000000..8cd70c1 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica-Thin.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Black.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Black.ttf new file mode 100644 index 0000000..1ab7db8 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Black.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Bold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Bold.ttf new file mode 100644 index 0000000..6f8c28a Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Bold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraBold.ttf new file mode 100644 index 0000000..9de8e45 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraLight.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraLight.ttf new file mode 100644 index 0000000..f1af6d0 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-ExtraLight.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Light.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Light.ttf new file mode 100644 index 0000000..f2b9ef3 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Light.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Medium.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Medium.ttf new file mode 100644 index 0000000..14ed036 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Medium.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Regular.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Regular.ttf new file mode 100644 index 0000000..d218ef3 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Regular.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-SemiBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-SemiBold.ttf new file mode 100644 index 0000000..8d774df Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-SemiBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Thin.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Thin.ttf new file mode 100644 index 0000000..2e040d1 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Auto-Thin.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Black.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Black.ttf new file mode 100644 index 0000000..d05f23d Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Black.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Bold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Bold.ttf new file mode 100644 index 0000000..4b19619 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Bold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraBold.ttf new file mode 100644 index 0000000..6b9795a Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraLight.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraLight.ttf new file mode 100644 index 0000000..597c1d5 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-ExtraLight.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Light.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Light.ttf new file mode 100644 index 0000000..25a23ca Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Light.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Medium.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Medium.ttf new file mode 100644 index 0000000..30d5662 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Medium.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Regular.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Regular.ttf new file mode 100644 index 0000000..7047a05 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Regular.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-SemiBold.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-SemiBold.ttf new file mode 100644 index 0000000..dac579f Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-SemiBold.ttf differ diff --git a/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Thin.ttf b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Thin.ttf new file mode 100644 index 0000000..0d5a824 Binary files /dev/null and b/svoboda/pechatalka/system/public/fonts/geologica/Geologica_Cursive-Thin.ttf differ diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bold-subset.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-bold-subset.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bold-subset.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-bold-subset.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bold-subset.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-bold-subset.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bold-subset.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-bold-subset.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bold.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-bold.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bold.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-bold.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bold.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-bold.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bold.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-bold.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic-subset.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-bolditalic.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-bolditalic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-italic-subset.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-italic-subset.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-italic-subset.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-italic-subset.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-italic-subset.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-italic-subset.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-italic-subset.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-italic-subset.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-italic.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-italic.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-italic.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-italic.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-italic.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-italic.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-italic.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-italic.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-regular-subset.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-regular-subset.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-regular-subset.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-regular-subset.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-regular-subset.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-regular-subset.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-regular-subset.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-regular-subset.woff2 diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-regular.woff b/svoboda/pechatalka/system/public/fonts/hack/hack-regular.woff similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-regular.woff rename to svoboda/pechatalka/system/public/fonts/hack/hack-regular.woff diff --git a/mirzaev/pechatalka/system/public/fonts/hack/hack-regular.woff2 b/svoboda/pechatalka/system/public/fonts/hack/hack-regular.woff2 similarity index 100% rename from mirzaev/pechatalka/system/public/fonts/hack/hack-regular.woff2 rename to svoboda/pechatalka/system/public/fonts/hack/hack-regular.woff2 diff --git a/mirzaev/pechatalka/system/public/index.php b/svoboda/pechatalka/system/public/index.php similarity index 79% rename from mirzaev/pechatalka/system/public/index.php rename to svoboda/pechatalka/system/public/index.php index 023de93..767417d 100755 --- a/mirzaev/pechatalka/system/public/index.php +++ b/svoboda/pechatalka/system/public/index.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace mirzaev\pechatalka; +namespace svoboda\pechatalka; // Framework for PHP use mirzaev\minimal\core, @@ -34,6 +34,13 @@ define('STORAGE', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'st // Initializing path to the databases directory define('DATABASES', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'databases'); +// Initializing path to the localizations directory +define('LOCALIZATIONS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'localizations'); + +// Initiailizing telegram key +define('TELEGRAM_KEY', require(SETTINGS . DIRECTORY_SEPARATOR . 'telegram.php')); + + // Initializing dependencies require ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; @@ -43,6 +50,7 @@ $core = new core(namespace: __NAMESPACE__); // Initializing routes $core->router ->write('/', new route('index', 'index'), 'GET') + ->write('/constructor/pin', new route('constructor', 'pin'), 'GET') ; // Handling request diff --git a/svoboda/pechatalka/system/public/js/core.js b/svoboda/pechatalka/system/public/js/core.js new file mode 100644 index 0000000..dca8cc7 --- /dev/null +++ b/svoboda/pechatalka/system/public/js/core.js @@ -0,0 +1,297 @@ +'use strict'; + +/** + * @name Core + * + * @description + * Core of the project + * + * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License + * @author Arsen Mirzaev Tatyano-Muradovich + */ +class core { + // Domain + static domain = window.location.hostname; + + // Language + static language = "ru"; + + // Theme + static theme = window.getComputedStyle(document.getElementById('theme')); + + // Window + static window; + + // The "loading" element + static loading = document.getElementById("loading"); + + // The
element + static header = document.body.getElementsByTagName("header")[0]; + + // The