start transition from rules.mirzaev.sexy
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					!.gitignore
 | 
				
			||||||
 | 
					composer.phar
 | 
				
			||||||
 | 
					vendor
 | 
				
			||||||
							
								
								
									
										14
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
 | 
					DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
 | 
				
			||||||
Version 2, December 2004
 | 
					Version 2, December 2004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -9,3 +10,16 @@ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
 | 
				
			|||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
					TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  0. You just DO WHAT THE FUCK YOU WANT TO.
 | 
					  0. You just DO WHAT THE FUCK YOU WANT TO.
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
 | 
				
			||||||
 | 
					Version 2, December 2004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
 | 
				
			||||||
 | 
					TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  0. You just DO WHAT THE FUCK YOU WANT TO.
 | 
				
			||||||
 | 
					>>>>>>> 0e6e9d8 (start transition from rules.mirzaev.sexy)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,9 @@
 | 
				
			|||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
# stdm-registry
 | 
					# stdm-registry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Interface with access to the data register with spare parts for special equipment
 | 
					Interface with access to the data register with spare parts for special equipment
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					# site-virus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Site with viruses and scary pictures
 | 
				
			||||||
 | 
					>>>>>>> 0e6e9d8 (start transition from rules.mirzaev.sexy)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										48
									
								
								composer.json
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "mirzaev/site-rules",
 | 
				
			||||||
 | 
					    "description": "Site with rules of our chat in VK",
 | 
				
			||||||
 | 
					    "readme": "README.md",
 | 
				
			||||||
 | 
					    "keywords": [
 | 
				
			||||||
 | 
					        "rules",
 | 
				
			||||||
 | 
					        "site"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "type": "site",
 | 
				
			||||||
 | 
					    "homepage": "https://git.mirzaev.sexy/mirzaev/site-rules",
 | 
				
			||||||
 | 
					    "license": "WTFPL",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "Arsen Mirzaev Tatyano-Muradovich",
 | 
				
			||||||
 | 
					            "email": "arsen@mirzaev.sexy",
 | 
				
			||||||
 | 
					            "homepage": "https://mirzaev.sexy",
 | 
				
			||||||
 | 
					            "role": "Programmer"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "support": {
 | 
				
			||||||
 | 
					        "docs": "https://git.mirzaev.sexy/mirzaev/site-rules/manual",
 | 
				
			||||||
 | 
					        "issues": "https://git.mirzaev.sexy/mirzaev/site-rules/issues"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "require": {
 | 
				
			||||||
 | 
					        "php": "~8.2",
 | 
				
			||||||
 | 
					        "ext-sodium": "~8.2",
 | 
				
			||||||
 | 
					        "mirzaev/minimal": "^2.0.x-dev",
 | 
				
			||||||
 | 
					        "mirzaev/accounts": "~1.2.x-dev",
 | 
				
			||||||
 | 
					        "mirzaev/arangodb": "^1.0.0",
 | 
				
			||||||
 | 
					        "mirzaev/vk": "^4.0",
 | 
				
			||||||
 | 
					        "triagens/arangodb": "~3.9.x-dev",
 | 
				
			||||||
 | 
					        "twig/twig": "^3.4",
 | 
				
			||||||
 | 
					        "guzzlehttp/guzzle": "^7.5"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "require-dev": {
 | 
				
			||||||
 | 
					        "phpunit/phpunit": "~9.5"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "autoload": {
 | 
				
			||||||
 | 
					        "psr-4": {
 | 
				
			||||||
 | 
					            "mirzaev\\site\\rules\\": "mirzaev/site/rules/system"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "autoload-dev": {
 | 
				
			||||||
 | 
					        "psr-4": {
 | 
				
			||||||
 | 
					            "mirzaev\\site\\rules\\tests\\": "mirzaev/site/rules/tests"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3051
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										60
									
								
								mirzaev/site/rules/system/controllers/core.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Файлы проекта
 | 
				
			||||||
 | 
					use mirzaev\site\rules\views\manager;
 | 
				
			||||||
 | 
					use mirzaev\site\rules\models\core as models;
 | 
				
			||||||
 | 
					use mirzaev\site\rules\models\account_model as account;
 | 
				
			||||||
 | 
					use mirzaev\site\rules\models\session_model as session;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Библиотека для ArangoDB
 | 
				
			||||||
 | 
					use ArangoDBClient\Document as _document;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Фреймворк PHP
 | 
				
			||||||
 | 
					use mirzaev\minimal\controller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Фреймворк ВКонтакте
 | 
				
			||||||
 | 
					use mirzaev\vk\core as vk;
 | 
				
			||||||
 | 
					use mirzaev\vk\robots\user as robot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Ядро контроллеров
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\controllers
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class core extends controller
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Переменные окружения
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  protected robot $vk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Переменные окружения
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  protected array $variables = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Конструктор
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @return void
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public function __construct() {
 | 
				
			||||||
 | 
					    parent::__construct();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Инициализация ядра моделей (соединение с базой данных...)
 | 
				
			||||||
 | 
					    new models();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Инициализация журнала ошибок
 | 
				
			||||||
 | 
					    $this->variables['errors'] = [
 | 
				
			||||||
 | 
					      'vk' => []
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Инициализация препроцессора представления
 | 
				
			||||||
 | 
					    $this->view = new manager;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								mirzaev/site/rules/system/controllers/error_controller.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Файлы проекта
 | 
				
			||||||
 | 
					use mirzaev\site\rules\controllers\core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Контроллер ошибок
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\controllers
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					final class error_controller extends core
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Страница с ошибкой
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param array $parameters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function index(array $parameters = []): ?string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Запись текста ошибки в переменную окружения
 | 
				
			||||||
 | 
					        $this->variables['text'] = $parameters['text'] ?? null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isset($parameters['code'])) {
 | 
				
			||||||
 | 
					            // Получен код ошибки
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Запись кода ошибки в переменную окружения
 | 
				
			||||||
 | 
					            $this->variables['code'] = $parameters['code'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Запись кода ответа
 | 
				
			||||||
 | 
					            http_response_code($parameters['code']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Генерация представления
 | 
				
			||||||
 | 
					            return $this->view->render(DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR . 'index.html', $this->variables);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Генерация представления
 | 
				
			||||||
 | 
					        return $this->view->render(DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR . ($parameters['code'] ?? 'index') . '.html', $this->variables);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										82
									
								
								mirzaev/site/rules/system/controllers/hotline_controller.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Файлы проекта
 | 
				
			||||||
 | 
					use mirzaev\site\rules\controllers\core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Контроллер бегущей строки
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\controllers
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					final class hotline_controller extends core
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Страница с бегущей строкой
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Можно использовать совместно с элементом <iframe> для изоляции
 | 
				
			||||||
 | 
					     * содержимого бегущей строки от поисковых роботов
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param array $parameters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function index(array $parameters = []): ?string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Инициализация элементов для генерации в головном элементе
 | 
				
			||||||
 | 
					        $this->variables['head'] = [
 | 
				
			||||||
 | 
					            'title' => 'Бегущая строка',
 | 
				
			||||||
 | 
					            'metas' => [
 | 
				
			||||||
 | 
					                [
 | 
				
			||||||
 | 
					                    'attributes' => [
 | 
				
			||||||
 | 
					                        'name' => 'robots',
 | 
				
			||||||
 | 
					                        'content' => 'nofollow'
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline'] = [
 | 
				
			||||||
 | 
					            'id' => $this->variables['request']['id'] ?? 'hotline'
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация параметров бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['parameters'] = [
 | 
				
			||||||
 | 
					            // 'step' => 2
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация аттрибутов бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['attributes'] = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация элементов бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['elements'] = [
 | 
				
			||||||
 | 
					            ['content' => '1'],
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                'tag' => 'article',
 | 
				
			||||||
 | 
					                'content' => '2'
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ['content' => '3'],
 | 
				
			||||||
 | 
					            ['content' => '4'],
 | 
				
			||||||
 | 
					            ['content' => '5'],
 | 
				
			||||||
 | 
					            ['content' => '6'],
 | 
				
			||||||
 | 
					            ['content' => '7'],
 | 
				
			||||||
 | 
					            ['content' => '8'],
 | 
				
			||||||
 | 
					            ['content' => '9'],
 | 
				
			||||||
 | 
					            ['content' => '10'],
 | 
				
			||||||
 | 
					            ['content' => '11'],
 | 
				
			||||||
 | 
					            ['content' => '12'],
 | 
				
			||||||
 | 
					            ['content' => '13'],
 | 
				
			||||||
 | 
					            ['content' => '14'],
 | 
				
			||||||
 | 
					            ['content' => '15']
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Генерация представления
 | 
				
			||||||
 | 
					        return $this->view->render(DIRECTORY_SEPARATOR . 'hotline' . DIRECTORY_SEPARATOR . 'index.html', $this->variables);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										71
									
								
								mirzaev/site/rules/system/controllers/index_controller.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Файлы проекта
 | 
				
			||||||
 | 
					use mirzaev\site\rules\controllers\core;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Контроллер основной страницы
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\controllers
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					final class index_controller extends core
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Главная страница
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param array $parameters Параметры запроса
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function index(array $parameters = []): ?string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Инициализация загружаемых категорий
 | 
				
			||||||
 | 
					        $this->variables['include'] = [
 | 
				
			||||||
 | 
					            'head' => ['self'],
 | 
				
			||||||
 | 
					            'body' => ['self']
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline'] = [
 | 
				
			||||||
 | 
					            'id' => $this->variables['request']['id'] ?? 'hotline'
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация параметров бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['parameters'] = [
 | 
				
			||||||
 | 
					            // 'step' => 2
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация аттрибутов бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['attributes'] = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация элементов бегущей строки
 | 
				
			||||||
 | 
					        $this->variables['hotline']['elements'] = [
 | 
				
			||||||
 | 
					            ['content' => '1'],
 | 
				
			||||||
 | 
					            [
 | 
				
			||||||
 | 
					                'tag' => 'article',
 | 
				
			||||||
 | 
					                'content' => '2'
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            ['content' => '3'],
 | 
				
			||||||
 | 
					            ['content' => '4'],
 | 
				
			||||||
 | 
					            ['content' => '5'],
 | 
				
			||||||
 | 
					            ['content' => '6'],
 | 
				
			||||||
 | 
					            ['content' => '7'],
 | 
				
			||||||
 | 
					            ['content' => '8'],
 | 
				
			||||||
 | 
					            ['content' => '9'],
 | 
				
			||||||
 | 
					            ['content' => '10'],
 | 
				
			||||||
 | 
					            ['content' => '11'],
 | 
				
			||||||
 | 
					            ['content' => '12'],
 | 
				
			||||||
 | 
					            ['content' => '13'],
 | 
				
			||||||
 | 
					            ['content' => '14'],
 | 
				
			||||||
 | 
					            ['content' => '15']
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Генерация представления
 | 
				
			||||||
 | 
					        return $this->view->render(DIRECTORY_SEPARATOR . 'index.html', $this->variables);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										117
									
								
								mirzaev/site/rules/system/models/core.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use mirzaev\minimal\model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use mirzaev\arangodb\connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use exception;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Ядро моделей
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\models
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class core extends model
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Записать свойство
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name Название
 | 
				
			||||||
 | 
					     * @param mixed $value Значение
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __set(string $name, mixed $value = null): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        match ($name) {
 | 
				
			||||||
 | 
					            'db' => (function () use ($value) {
 | 
				
			||||||
 | 
					                if ($this->__isset('db')) {
 | 
				
			||||||
 | 
					                    // Свойство уже было инициализировано
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Выброс исключения (неудача)
 | 
				
			||||||
 | 
					                    throw new exception('Запрещено реинициализировать соединение с базой данных ($this->db)', 500);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // Свойство ещё не было инициализировано
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if ($value instanceof connection) {
 | 
				
			||||||
 | 
					                        // Передано подходящее значение
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // Запись свойства (успех)
 | 
				
			||||||
 | 
					                        self::$db = $value;
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        // Передано неподходящее значение
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // Выброс исключения (неудача)
 | 
				
			||||||
 | 
					                        throw new exception('Соединение с базой данных ($this->db) должен быть инстанцией mirzaev\arangodb\connection', 500);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            })(),
 | 
				
			||||||
 | 
					            default => parent::__set($name, $value)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Прочитать свойство
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name Название
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return mixed Содержимое
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __get(string $name): mixed
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return match ($name) {
 | 
				
			||||||
 | 
					            'db' => (function () {
 | 
				
			||||||
 | 
					                if (!$this->__isset('db')) {
 | 
				
			||||||
 | 
					                    // Свойство не инициализировано
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Инициализация значения по умолчанию исходя из настроек
 | 
				
			||||||
 | 
					                    $this->__set('db', new connection(require static::SETTINGS));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return self::$db;
 | 
				
			||||||
 | 
					            })(),
 | 
				
			||||||
 | 
					            default => parent::__get($name)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Проверить свойство на инициализированность
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name Название
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __isset(string $name): bool
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return match ($name) {
 | 
				
			||||||
 | 
					            default => parent::__isset($name)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Удалить свойство
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name Название
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __unset(string $name): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        match ($name) {
 | 
				
			||||||
 | 
					            default => parent::__isset($name)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Статический вызов
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $name Название
 | 
				
			||||||
 | 
					     * @param array $arguments Параметры
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static function __callStatic(string $name, array $arguments): mixed
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        match ($name) {
 | 
				
			||||||
 | 
					            default => throw new exception("Не найдено свойство или функция: $name", 500)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										119
									
								
								mirzaev/site/rules/system/public/css/account.old.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					#mail>:is(form, div) {
 | 
				
			||||||
 | 
					    display       : flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail .exit {
 | 
				
			||||||
 | 
					    margin-top: 25px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail p {
 | 
				
			||||||
 | 
					    margin : 0;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail p>span {
 | 
				
			||||||
 | 
					    margin-left: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>input:is([type=text], [type=password]) {
 | 
				
			||||||
 | 
					    margin-bottom: 12px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>input:last-child {
 | 
				
			||||||
 | 
					    margin-bottom: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>.submit {
 | 
				
			||||||
 | 
					    margin-top   : 6px;
 | 
				
			||||||
 | 
					    margin-bottom: 10px;
 | 
				
			||||||
 | 
					    display      : flex;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>.submit>label {
 | 
				
			||||||
 | 
					    padding      : 10px 20px;
 | 
				
			||||||
 | 
					    border       : unset;
 | 
				
			||||||
 | 
					    border-radius: 3px 0 0 3px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>.submit>input {
 | 
				
			||||||
 | 
					    padding      : 10px 20px;
 | 
				
			||||||
 | 
					    flex-grow    : 1;
 | 
				
			||||||
 | 
					    border       : unset;
 | 
				
			||||||
 | 
					    border-radius: 0 3px 3px 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>input[type=submit].registration {
 | 
				
			||||||
 | 
					    padding         : 7px 20px;
 | 
				
			||||||
 | 
					    background-color: #86781C;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>input[type=submit].registration:hover {
 | 
				
			||||||
 | 
					    background-color: #9e8d20;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>input[type=submit].registration:is(:active, :focus) {
 | 
				
			||||||
 | 
					    background-color: #776b19;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#mail>form>ul.errors {
 | 
				
			||||||
 | 
					    margin-top      : 18px;
 | 
				
			||||||
 | 
					    margin-bottom   : 0px;
 | 
				
			||||||
 | 
					    padding         : 10px;
 | 
				
			||||||
 | 
					    text-align      : center;
 | 
				
			||||||
 | 
					    list-style      : none;
 | 
				
			||||||
 | 
					    background-color: #ae8f8f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account {
 | 
				
			||||||
 | 
					    display           : grid;
 | 
				
			||||||
 | 
					    grid-template-rows: auto auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>button#login {
 | 
				
			||||||
 | 
					    z-index : 1500;
 | 
				
			||||||
 | 
					    grid-row: 2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section.tab {
 | 
				
			||||||
 | 
					    z-index         : 1000;
 | 
				
			||||||
 | 
					    position        : relative;
 | 
				
			||||||
 | 
					    bottom          : -100%;
 | 
				
			||||||
 | 
					    padding         : 1.5rem 10%;
 | 
				
			||||||
 | 
					    display         : flex;
 | 
				
			||||||
 | 
					    flex-direction  : column;
 | 
				
			||||||
 | 
					    align-self      : end;
 | 
				
			||||||
 | 
					    text-align      : center;
 | 
				
			||||||
 | 
					    gap             : .8rem;
 | 
				
			||||||
 | 
					    background-color: var(--background-light-2);
 | 
				
			||||||
 | 
					    transition      : .2s ease-in;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>button.active+section.tab {
 | 
				
			||||||
 | 
					    bottom: 0%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section.tab h3:first-of-type {
 | 
				
			||||||
 | 
					    margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section.tab>* {
 | 
				
			||||||
 | 
					    margin: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section#mail.tab {
 | 
				
			||||||
 | 
					    grid-row          : 1;
 | 
				
			||||||
 | 
					    display           : grid;
 | 
				
			||||||
 | 
					    grid-template-rows: auto auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section#mail.tab>#profile {
 | 
				
			||||||
 | 
					    grid-row          : 1;
 | 
				
			||||||
 | 
					    display           : grid;
 | 
				
			||||||
 | 
					    grid-template-rows: auto auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#account>section#mail.tab>input[type=mail] {
 | 
				
			||||||
 | 
					    grid-row          : 2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								mirzaev/site/rules/system/public/css/books.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					main>section#books {
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-flow: row wrap;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>* {
 | 
				
			||||||
 | 
					    margin-bottom: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>form.upload {
 | 
				
			||||||
 | 
					    width: calc(100% / 3 - 20px - 9px * 2);
 | 
				
			||||||
 | 
					    height: calc(220px - 9px * 2);
 | 
				
			||||||
 | 
					    margin: 5px;
 | 
				
			||||||
 | 
					    margin-right: 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>form.upload>p {
 | 
				
			||||||
 | 
					    font-size: 3rem;
 | 
				
			||||||
 | 
					    height: 0.3rem;
 | 
				
			||||||
 | 
					    line-height: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>article.book {
 | 
				
			||||||
 | 
					    width: calc(100% / 3 - 20px);
 | 
				
			||||||
 | 
					    margin-right: 20px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>article.book:nth-child(3) {
 | 
				
			||||||
 | 
					    width: calc(100% / 3);
 | 
				
			||||||
 | 
					    margin-right: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>article.book>img {
 | 
				
			||||||
 | 
					    height: 220px;
 | 
				
			||||||
 | 
					    object-fit: cover;
 | 
				
			||||||
 | 
					    object-position: right;
 | 
				
			||||||
 | 
					    overflow: hidden;
 | 
				
			||||||
 | 
					    clip-path: polygon(5px calc(100% - 5px), calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) 5px, 5px 5px);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>article.book>h4 {
 | 
				
			||||||
 | 
					    margin-top: 5px;
 | 
				
			||||||
 | 
					    margin-bottom: 10px;
 | 
				
			||||||
 | 
					    height: 50px;
 | 
				
			||||||
 | 
					    text-align: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>section#books>article.book>p {
 | 
				
			||||||
 | 
					    margin: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										31
									
								
								mirzaev/site/rules/system/public/css/hotline.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					section.hotline {
 | 
				
			||||||
 | 
					    display: inline-flex;
 | 
				
			||||||
 | 
					    height : 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section.hotline * {
 | 
				
			||||||
 | 
					    transition: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section.hotline:last-child {
 | 
				
			||||||
 | 
					    margin-bottom: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section.hotline>article {
 | 
				
			||||||
 | 
					    margin-right    : 18px;
 | 
				
			||||||
 | 
					    width           : 140px;
 | 
				
			||||||
 | 
					    height          : 190px;
 | 
				
			||||||
 | 
					    display         : flex;
 | 
				
			||||||
 | 
					    align-self      : flex-end;
 | 
				
			||||||
 | 
					    border-radius   : 3px;
 | 
				
			||||||
 | 
					    background-color: var(--background-light-1);
 | 
				
			||||||
 | 
					    box-shadow      : 0px -6px 6px rgba(0, 0, 0, 0.3);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section.hotline>article:last-child {
 | 
				
			||||||
 | 
					    margin-right: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					section.hotline>article>* {
 | 
				
			||||||
 | 
					    margin: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								mirzaev/site/rules/system/public/css/logo.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					header>div#logo {
 | 
				
			||||||
 | 
					    position          : relative;
 | 
				
			||||||
 | 
					    height            : 260px;
 | 
				
			||||||
 | 
					    display           : flex;
 | 
				
			||||||
 | 
					    flex-direction    : column;
 | 
				
			||||||
 | 
					    justify-content   : center;
 | 
				
			||||||
 | 
					    gap               : unset;
 | 
				
			||||||
 | 
					    border-right      : 1px solid;
 | 
				
			||||||
 | 
					    border-right-color: #ccc;
 | 
				
			||||||
 | 
					    border-right-color: rgba(255, 255, 255, 0.2);
 | 
				
			||||||
 | 
					    background-color  : rgba(255, 255, 255, 0.2);
 | 
				
			||||||
 | 
					    overflow          : hidden;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header>div#logo>h4 {
 | 
				
			||||||
 | 
					    z-index: 10;
 | 
				
			||||||
 | 
					    margin : 0 20px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header>div#logo>h1 {
 | 
				
			||||||
 | 
					    z-index      : 50;
 | 
				
			||||||
 | 
					    margin       : 0 37px;
 | 
				
			||||||
 | 
					    margin-bottom: -5px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header>div#logo>#hotline_logo {
 | 
				
			||||||
 | 
					    z-index            : -50;
 | 
				
			||||||
 | 
					    position           : absolute;
 | 
				
			||||||
 | 
					    -webkit-filter     : blur(2px) brightness(1.3);
 | 
				
			||||||
 | 
					    filter             : blur(2px) brightness(1.3);
 | 
				
			||||||
 | 
					    /* background-color: var(--background); */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header>div#logo>#hotline_logo>article {
 | 
				
			||||||
 | 
					    margin-bottom: 30px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aside>section#hotline {
 | 
				
			||||||
 | 
					    clip-path: inset(0 0 0 250px);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										170
									
								
								mirzaev/site/rules/system/public/css/main.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,170 @@
 | 
				
			|||||||
 | 
					@import url('/fonts/comissioner.ttf');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes koshka_dancing {
 | 
				
			||||||
 | 
					  100% {
 | 
				
			||||||
 | 
					    bottom: -20px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes hand_dancing {
 | 
				
			||||||
 | 
					  100% {
 | 
				
			||||||
 | 
					    bottom: -20px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes knife_dancing {
 | 
				
			||||||
 | 
					  100% {
 | 
				
			||||||
 | 
					    bottom: calc(-273px + 88px + 20px);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:root {
 | 
				
			||||||
 | 
					  --background-light-3: #403939;
 | 
				
			||||||
 | 
					  --background-light-2: #322d2d;
 | 
				
			||||||
 | 
					  --background-light-1: #2b2525;
 | 
				
			||||||
 | 
					  --background-light  : #fff;
 | 
				
			||||||
 | 
					  --background        : #f00;
 | 
				
			||||||
 | 
					  --background-dark   : #000;
 | 
				
			||||||
 | 
					  --text              : #020202;
 | 
				
			||||||
 | 
					  --text-light              : #fafafa;
 | 
				
			||||||
 | 
					  --text-hover        : #fff;
 | 
				
			||||||
 | 
					  --text-active       : #d0d0d0;
 | 
				
			||||||
 | 
					  --red-light-1       : #dc4343;
 | 
				
			||||||
 | 
					  --red-light         : #bf3737;
 | 
				
			||||||
 | 
					  --red               : #a43333;
 | 
				
			||||||
 | 
					  --red-dark          : #8d2a2a;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* {
 | 
				
			||||||
 | 
					  text-decoration: none;
 | 
				
			||||||
 | 
					  outline        : none;
 | 
				
			||||||
 | 
					  border         : none;
 | 
				
			||||||
 | 
					  color          : var(--text);
 | 
				
			||||||
 | 
					  font-family    : 'Commissioner', Roboto, sans-serif;
 | 
				
			||||||
 | 
					  transition     : 0.1s ease-out;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.unselectable {
 | 
				
			||||||
 | 
					  -webkit-touch-callout: none;
 | 
				
			||||||
 | 
					  -webkit-user-select  : none;
 | 
				
			||||||
 | 
					  -khtml-user-select   : none;
 | 
				
			||||||
 | 
					  -moz-user-select     : none;
 | 
				
			||||||
 | 
					  -ms-user-select      : none;
 | 
				
			||||||
 | 
					  user-select          : none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:hover {
 | 
				
			||||||
 | 
					  color: var(--text-hover);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:active {
 | 
				
			||||||
 | 
					  color: var(--text-active);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					  margin               : 0;
 | 
				
			||||||
 | 
					  padding-top: calc(20vh + 394px);
 | 
				
			||||||
 | 
					  padding-bottom: 10vh;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  background-color     : var(--background);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aside {
 | 
				
			||||||
 | 
					  z-index    : 500;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div#wrap {
 | 
				
			||||||
 | 
					  margin-top: -394px;
 | 
				
			||||||
 | 
					  margin-left: 50vw;
 | 
				
			||||||
 | 
					  height: 394px;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div#wrap>img#masha {
 | 
				
			||||||
 | 
					  z-index: 1500;
 | 
				
			||||||
 | 
					  bottom: 0px;
 | 
				
			||||||
 | 
					  width: 333px;
 | 
				
			||||||
 | 
					  height: 394px;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  animation-duration       : 1s;
 | 
				
			||||||
 | 
					  animation-direction: alternate;
 | 
				
			||||||
 | 
					  animation-name           : koshka_dancing;
 | 
				
			||||||
 | 
					  animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					  animation-timing-function: cubic-bezier(.65,.05,.36,1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div#wrap>img#hand{
 | 
				
			||||||
 | 
					  z-index: 500;
 | 
				
			||||||
 | 
					  left: -30px;
 | 
				
			||||||
 | 
					  bottom: -5px;
 | 
				
			||||||
 | 
					  width: 70px;
 | 
				
			||||||
 | 
					  height: 88px;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  animation-duration       : .8s;
 | 
				
			||||||
 | 
					  animation-direction: alternate;
 | 
				
			||||||
 | 
					  animation-name           : hand_dancing;
 | 
				
			||||||
 | 
					  animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					  animation-timing-function: cubic-bezier(.65,.05,.36,1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					div#wrap>img#knife {
 | 
				
			||||||
 | 
					  z-index: 100500;
 | 
				
			||||||
 | 
					  left: calc(-112px + 70px - 40px);
 | 
				
			||||||
 | 
					  bottom: calc(-273px + 88px + 35px);
 | 
				
			||||||
 | 
					  width: 112px;
 | 
				
			||||||
 | 
					  height: 273px;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  animation-duration       : .8s;
 | 
				
			||||||
 | 
					  animation-direction: alternate;
 | 
				
			||||||
 | 
					  animation-name           : knife_dancing;
 | 
				
			||||||
 | 
					  animation-iteration-count: infinite;
 | 
				
			||||||
 | 
					  animation-timing-function: cubic-bezier(.65,.05,.36,1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header {
 | 
				
			||||||
 | 
					  z-index       : 5000;
 | 
				
			||||||
 | 
					  width: 800px;
 | 
				
			||||||
 | 
					  height: 100px;
 | 
				
			||||||
 | 
					  margin: 0 auto;
 | 
				
			||||||
 | 
					  display       : flex;
 | 
				
			||||||
 | 
					  border-radius: 3px 3px 0 0;
 | 
				
			||||||
 | 
					  background-color: var(--background-dark);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header>h1 {
 | 
				
			||||||
 | 
					  margin: auto;
 | 
				
			||||||
 | 
					  font-size: 2.5rem;
 | 
				
			||||||
 | 
					  color: var(--text-light);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main {
 | 
				
			||||||
 | 
					  z-index    : 1000;
 | 
				
			||||||
 | 
					  width: 800px;
 | 
				
			||||||
 | 
					  margin: 0 auto;
 | 
				
			||||||
 | 
					  border-radius: 0 0 3px 3px;
 | 
				
			||||||
 | 
					  background-color: var(--background-light)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>ol {
 | 
				
			||||||
 | 
					  margin: 50px 100px;
 | 
				
			||||||
 | 
					  font-size: 1.2rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>ol>li {
 | 
				
			||||||
 | 
					  padding-left: 40px;
 | 
				
			||||||
 | 
					  margin-bottom: 8px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main>ol>li::marker {
 | 
				
			||||||
 | 
					  /* font-size: 1.3rem; */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					footer {
 | 
				
			||||||
 | 
					  z-index    : 3000;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								mirzaev/site/rules/system/public/css/trolling.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#what_image {
 | 
				
			||||||
 | 
					    z-index: 9999999;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    width: 100vw;
 | 
				
			||||||
 | 
					    height: 100vh;
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					    transition: unset;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#what_image.active {
 | 
				
			||||||
 | 
					    display: block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.hide {
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								mirzaev/site/rules/system/public/css/upload.css
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					form.upload {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 100px;
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    border: 4px dashed #e5ddd1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					form.upload:hover {
 | 
				
			||||||
 | 
					    background-color: #ccc6bd;
 | 
				
			||||||
 | 
					    border: 4px dashed #fff7ea;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					form.upload>p {
 | 
				
			||||||
 | 
					    margin: auto;
 | 
				
			||||||
 | 
					    font-weight: bold;
 | 
				
			||||||
 | 
					    color: #eee6d9;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					form.upload:hover>p {
 | 
				
			||||||
 | 
					    color: #fff7ea;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					form.upload>input {
 | 
				
			||||||
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    opacity: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					form.upload:hover>input {
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/fonts/commissioner.ttf
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								mirzaev/site/rules/system/public/images/botnet.svg
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<svg height="32" width="32" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h32v32H0z"/><path d="M30 17.349V12h-2v-2h2V2H2v8h2v2H2v8h2v2H2v8h15.349A8.97 8.97 0 0 0 23 32a9.002 9.002 0 0 0 9-9 8.968 8.968 0 0 0-2-5.651zM14.059 22H6v-2h8.522a8.932 8.932 0 0 0-.463 2zM26 12H6v-2h20v2zM4 6h4v2H4V6zm0 10h4v2H4v-2zm4 12H4v-2h4v2zm15 1.883A6.898 6.898 0 0 1 16.115 23 6.898 6.898 0 0 1 23 16.115 6.898 6.898 0 0 1 29.883 23 6.898 6.898 0 0 1 23 29.883z"/><path d="m19 25 2 2 2-2 2 2 2-2-2-2 2-2-2-2-2 2-2-2-2 2 2 2z"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 552 B  | 
							
								
								
									
										1
									
								
								mirzaev/site/rules/system/public/images/keylogger.svg
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M0 6c0-1.1.9-2 2-2h16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V6zm2 0v2h2V6H2zm1 3v2h2V9H3zm-1 3v2h2v-2H2zm3 0v2h10v-2H5zm11 0v2h2v-2h-2zM6 9v2h2V9H6zm3 0v2h2V9H9zm3 0v2h2V9h-2zm3 0v2h2V9h-2zM5 6v2h2V6H5zm3 0v2h2V6H8zm3 0v2h2V6h-2zm3 0v2h4V6h-4z"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 328 B  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo_compressed.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo_red.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 17 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo_red_compressed.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo_red_white.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/logo_red_white_compressed.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.6 KiB  | 
							
								
								
									
										1
									
								
								mirzaev/site/rules/system/public/images/minecraft.svg
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h256v256H0z"/><path d="M224 177.3V78.7a8.1 8.1 0 0 0-4.1-7l-88-49.5a7.8 7.8 0 0 0-7.8 0l-88 49.5a8.1 8.1 0 0 0-4.1 7v98.6a8.1 8.1 0 0 0 4.1 7l88 49.5a7.8 7.8 0 0 0 7.8 0l88-49.5a8.1 8.1 0 0 0 4.1-7Z" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="16" d="m222.9 74.6-94 53.4-95.8-53.4M128.9 128l-.9 106.8"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 537 B  | 
							
								
								
									
										1
									
								
								mirzaev/site/rules/system/public/images/miner.svg
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m11.136 12.117-.596 2.415c.736.185 3.004.921 3.34-.441.35-1.421-2.009-1.789-2.744-1.974Zm.813-3.297-.54 2.191c.612.154 2.5.784 2.806-.455.318-1.293-1.654-1.581-2.266-1.736ZM12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2Zm4.358 8.575a1.743 1.743 0 0 1-1.385 1.611 1.933 1.933 0 0 1 .997 2.661c-.586 1.692-1.977 1.835-3.827 1.481l-.449 1.82-1.085-.274.443-1.795c-.28-.07-.568-.145-.864-.227l-.445 1.804-1.084-.273.45-1.824c-.254-.065-.511-.135-.774-.201l-1.412-.356.539-1.256s.8.215.788.199a.394.394 0 0 0 .498-.26l1.217-4.939a.583.583 0 0 0-.505-.638c.016-.011-.789-.198-.789-.198l.29-1.172 1.495.378-.001.006c.225.056.457.11.693.164l.444-1.802 1.085.274-.436 1.766c.291.068.584.135.87.207l.432-1.755 1.085.274-.445 1.802c1.37.477 2.372 1.193 2.175 2.523Z"/></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 825 B  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/photo_with_hand.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/photo_with_kitten.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 86 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/photo_with_knife.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										1
									
								
								mirzaev/site/rules/system/public/images/stealer.svg
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/truth.jpg
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 397 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/images/what.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 295 KiB  | 
							
								
								
									
										32
									
								
								mirzaev/site/rules/system/public/index.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use mirzaev\minimal\core;
 | 
				
			||||||
 | 
					use mirzaev\minimal\router;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ini_set('error_reporting', E_ALL);
 | 
				
			||||||
 | 
					ini_set('display_errors', 1);
 | 
				
			||||||
 | 
					ini_set('display_startup_errors', 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define('VIEWS', realpath('..' . DIRECTORY_SEPARATOR . 'views'));
 | 
				
			||||||
 | 
					define('STORAGE', realpath('..' . DIRECTORY_SEPARATOR . 'storage'));
 | 
				
			||||||
 | 
					define('INDEX', __DIR__);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Автозагрузка
 | 
				
			||||||
 | 
					require __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Инициализация маршрутазитора
 | 
				
			||||||
 | 
					$router = new router;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Запись маршрутов
 | 
				
			||||||
 | 
					$router->write('/', 'index', 'index');
 | 
				
			||||||
 | 
					$router->write('/system/hotline', 'hotline', 'index');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Инициализация ядра
 | 
				
			||||||
 | 
					$core = new core(namespace: __NAMESPACE__, router: $router);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Обработка запроса
 | 
				
			||||||
 | 
					echo $core->start();
 | 
				
			||||||
							
								
								
									
										139
									
								
								mirzaev/site/rules/system/public/js/account.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class account {
 | 
				
			||||||
 | 
					    static async initialization() {
 | 
				
			||||||
 | 
					        // Запрос
 | 
				
			||||||
 | 
					        return fetch('https://rules.mirzaev.sexy/account/initialization', {
 | 
				
			||||||
 | 
					            method: 'PUT'
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static authentication(button) {
 | 
				
			||||||
 | 
					        if (button instanceof HTMLElement) {
 | 
				
			||||||
 | 
					            // Получены обязательные входные параметры
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (button.classList.contains('active')) {
 | 
				
			||||||
 | 
					                // Кнопка активна (подразумевается)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (window.vk !== undefined) {
 | 
				
			||||||
 | 
					                    // Найдена инстанция окна
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Закрытие окна
 | 
				
			||||||
 | 
					                    window.vk.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Удаление окна
 | 
				
			||||||
 | 
					                    window.vk = undefined;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Генерация панели
 | 
				
			||||||
 | 
					                this.panel(button.parentElement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Вызов троллера
 | 
				
			||||||
 | 
					                troller.what.single();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                // Кнопка неактивна (подразумевается)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Инициализация активного статуса
 | 
				
			||||||
 | 
					                button.classList.add('active');
 | 
				
			||||||
 | 
					                button.innerText = 'Закрыть';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Настройка окна
 | 
				
			||||||
 | 
					                const width = 500;
 | 
				
			||||||
 | 
					                const height = 500;
 | 
				
			||||||
 | 
					                const left = (window.screen.width / 2) - ((width / 2) + 10);
 | 
				
			||||||
 | 
					                const top = (window.screen.height / 2) - ((height / 2) + 50);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Инициализация аккаунта
 | 
				
			||||||
 | 
					                this.initialization()
 | 
				
			||||||
 | 
					                    .then(
 | 
				
			||||||
 | 
					                        (response) => {
 | 
				
			||||||
 | 
					                            if (response.status === 401 && typeof response.headers.get('session') === 'string') {
 | 
				
			||||||
 | 
					                                // Получен код ответа 401 (не аутентифицирован) и инициализирован аккаунт
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Открытие окна с аунтентификацией ВКонтакте
 | 
				
			||||||
 | 
					                                window.vk = window.open(
 | 
				
			||||||
 | 
					                                    'https://oauth.vk.com/authorize?client_id=51447080&redirect_uri=https://rules.mirzaev.sexy/account/vk/connect&display=popup&response_type=code&scope=4521990&state=' + response.headers.get('session'),
 | 
				
			||||||
 | 
					                                    'rules_vk',
 | 
				
			||||||
 | 
					                                    'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',resizable=no,status=no,toolbar=no,menubar=no,scrollbars=no,location=no,directories=no'
 | 
				
			||||||
 | 
					                                );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Инициализация ссылки на ядро
 | 
				
			||||||
 | 
					                                const _this = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Инициализация интервала проверки закрытия окна с аунтентификацией ВКонтакте
 | 
				
			||||||
 | 
					                                const interval = setInterval(function () {
 | 
				
			||||||
 | 
					                                    if (window.vk.closed || window.vk === undefined) {
 | 
				
			||||||
 | 
					                                        // Окно с аутентификацией закрыто
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        // Удаление интервала
 | 
				
			||||||
 | 
					                                        clearInterval(interval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                        // Генерация панели
 | 
				
			||||||
 | 
					                                        _this.panel(button.parentElement);
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }, 100);
 | 
				
			||||||
 | 
					                            } else if (response.status === 200) {
 | 
				
			||||||
 | 
					                                // Получен код ответа 200 (аутентифицирован)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Генерация панели
 | 
				
			||||||
 | 
					                                this.panel(button.parentElement);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static deauthentication() {
 | 
				
			||||||
 | 
					        if (shell instanceof HTMLElement) {
 | 
				
			||||||
 | 
					            // Получены обязательные входные параметры
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fetch('https://rules.mirzaev.sexy/account/panel', {
 | 
				
			||||||
 | 
					                method: 'GET'
 | 
				
			||||||
 | 
					            }).then(
 | 
				
			||||||
 | 
					                (response) => {
 | 
				
			||||||
 | 
					                    if (response.status === 200) {
 | 
				
			||||||
 | 
					                        // Получен код ответа 200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        response.text().then(
 | 
				
			||||||
 | 
					                            (text) => {
 | 
				
			||||||
 | 
					                                console.log(text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Запись панели в оболочку
 | 
				
			||||||
 | 
					                                shell.outerHTML = text;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static async panel(shell) {
 | 
				
			||||||
 | 
					        if (shell instanceof HTMLElement) {
 | 
				
			||||||
 | 
					            // Получены обязательные входные параметры
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fetch('https://rules.mirzaev.sexy/account/panel', {
 | 
				
			||||||
 | 
					                method: 'GET'
 | 
				
			||||||
 | 
					            }).then(
 | 
				
			||||||
 | 
					                (response) => {
 | 
				
			||||||
 | 
					                    if (response.status === 200) {
 | 
				
			||||||
 | 
					                        // Получен код ответа 200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        response.text().then(
 | 
				
			||||||
 | 
					                            (text) => {
 | 
				
			||||||
 | 
					                                console.log(text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                // Запись панели в оболочку
 | 
				
			||||||
 | 
					                                shell.outerHTML = text;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										0
									
								
								mirzaev/site/rules/system/public/js/graph.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										668
									
								
								mirzaev/site/rules/system/public/js/hotline.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,668 @@
 | 
				
			|||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Бегущая строка
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @description
 | 
				
			||||||
 | 
					 * Простой, но мощный класс для создания бегущих строк. Поддерживает
 | 
				
			||||||
 | 
					 * перемещение мышью и прокрутку колесом, полностью настраивается очень гибок
 | 
				
			||||||
 | 
					 * для настроек в CSS и подразумевается, что отлично индексируется поисковыми роботами.
 | 
				
			||||||
 | 
					 * Имеет свой препроцессор, благодаря которому можно создавать бегущие строки
 | 
				
			||||||
 | 
					 * без программирования - с помощью HTML-аттрибутов, а так же возможность
 | 
				
			||||||
 | 
					 * изменять параметры (data-hotline-* аттрибуты) на лету. Есть возможность вызывать
 | 
				
			||||||
 | 
					 * события при выбранных действиях для того, чтобы пользователь имел возможность
 | 
				
			||||||
 | 
					 * дорабатывать функционал без изучения и изменения моего кода
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @example
 | 
				
			||||||
 | 
					 * сonst hotline = new hotline();
 | 
				
			||||||
 | 
					 * hotline.step = '-5';
 | 
				
			||||||
 | 
					 * hotline.start();
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @todo
 | 
				
			||||||
 | 
					 * 1. Бесконечный режим - элементы не удаляются если видны на экране (будут дубликаты)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @copyright WTFPL
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class hotline {
 | 
				
			||||||
 | 
					  // Идентификатор
 | 
				
			||||||
 | 
					  #id = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Оболочка (instanceof HTMLElement)
 | 
				
			||||||
 | 
					  #shell = document.getElementById("hotline");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Инстанция горячей строки
 | 
				
			||||||
 | 
					  #instance = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Перемещение
 | 
				
			||||||
 | 
					  #transfer = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Движение
 | 
				
			||||||
 | 
					  #move = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Наблюдатель
 | 
				
			||||||
 | 
					  #observer = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Наблюдатель
 | 
				
			||||||
 | 
					  #block = new Set(["events"]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Настраиваемые параметры
 | 
				
			||||||
 | 
					  transfer = null;
 | 
				
			||||||
 | 
					  move = null;
 | 
				
			||||||
 | 
					  delay = 10;
 | 
				
			||||||
 | 
					  step = 1;
 | 
				
			||||||
 | 
					  hover = true;
 | 
				
			||||||
 | 
					  movable = true;
 | 
				
			||||||
 | 
					  sticky = false;
 | 
				
			||||||
 | 
					  wheel = false;
 | 
				
			||||||
 | 
					  delta = null;
 | 
				
			||||||
 | 
					  vertical = false;
 | 
				
			||||||
 | 
					  observe = false;
 | 
				
			||||||
 | 
					  events = new Map([
 | 
				
			||||||
 | 
					    ["start", false],
 | 
				
			||||||
 | 
					    ["stop", false],
 | 
				
			||||||
 | 
					    ["move", false],
 | 
				
			||||||
 | 
					    ["move.block", false],
 | 
				
			||||||
 | 
					    ["move.unblock", false],
 | 
				
			||||||
 | 
					    ["offset", false],
 | 
				
			||||||
 | 
					    ["transfer.start", true],
 | 
				
			||||||
 | 
					    ["transfer.end", true],
 | 
				
			||||||
 | 
					    ["onmousemove", false]
 | 
				
			||||||
 | 
					  ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor(id, shell) {
 | 
				
			||||||
 | 
					    // Запись идентификатора
 | 
				
			||||||
 | 
					    if (typeof id === "string" || typeof id === "number") this.#id = id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Запись оболочки
 | 
				
			||||||
 | 
					    if (shell instanceof HTMLElement) this.#shell = shell;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  start() {
 | 
				
			||||||
 | 
					    if (this.#instance === null) {
 | 
				
			||||||
 | 
					      // Нет запущенной инстанции бегущей строки
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Инициализация ссылки на ядро
 | 
				
			||||||
 | 
					      const _this = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Запуск движения
 | 
				
			||||||
 | 
					      this.#instance = setInterval(function () {
 | 
				
			||||||
 | 
					        if (_this.#shell.childElementCount > 1) {
 | 
				
			||||||
 | 
					          // Найдено содержимое бегущей строки (2 и более)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Инициализация буфера для временных данных
 | 
				
			||||||
 | 
					          let buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Инициализация данных первого элемента в строке
 | 
				
			||||||
 | 
					          const first = {
 | 
				
			||||||
 | 
					            element: (buffer = _this.#shell.firstElementChild),
 | 
				
			||||||
 | 
					            coords: buffer.getBoundingClientRect()
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (_this.vertical) {
 | 
				
			||||||
 | 
					            // Вертикальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация сдвига у первого элемента (движение)
 | 
				
			||||||
 | 
					            first.offset = isNaN(
 | 
				
			||||||
 | 
					              (buffer = parseFloat(first.element.style.marginTop))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					              ? 0
 | 
				
			||||||
 | 
					              : buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация отступа до второго элемента у первого элемента (разделение)
 | 
				
			||||||
 | 
					            first.separator = isNaN(
 | 
				
			||||||
 | 
					              (buffer = parseFloat(
 | 
				
			||||||
 | 
					                getComputedStyle(first.element).marginBottom
 | 
				
			||||||
 | 
					              ))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					              ? 0
 | 
				
			||||||
 | 
					              : buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация крайнего с конца ребра первого элемента в строке
 | 
				
			||||||
 | 
					            first.end = first.coords.y + first.coords.height + first.separator;
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            // Горизонтальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация отступа у первого элемента (движение)
 | 
				
			||||||
 | 
					            first.offset = isNaN(
 | 
				
			||||||
 | 
					              (buffer = parseFloat(first.element.style.marginLeft))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					              ? 0
 | 
				
			||||||
 | 
					              : buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация отступа до второго элемента у первого элемента (разделение)
 | 
				
			||||||
 | 
					            first.separator = isNaN(
 | 
				
			||||||
 | 
					              (buffer = parseFloat(getComputedStyle(first.element).marginRight))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					              ? 0
 | 
				
			||||||
 | 
					              : buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация крайнего с конца ребра первого элемента в строке
 | 
				
			||||||
 | 
					            first.end = first.coords.x + first.coords.width + first.separator;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (
 | 
				
			||||||
 | 
					            (_this.vertical &&
 | 
				
			||||||
 | 
					              Math.round(first.end) < _this.#shell.offsetTop) ||
 | 
				
			||||||
 | 
					            (!_this.vertical && Math.round(first.end) < _this.#shell.offsetLeft)
 | 
				
			||||||
 | 
					          ) {
 | 
				
			||||||
 | 
					            // Элемент (вместе с отступом до второго элемента) вышел из области видимости (строки)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (
 | 
				
			||||||
 | 
					              (_this.transfer === null && _this.#transfer) ||
 | 
				
			||||||
 | 
					              _this.transfer === true
 | 
				
			||||||
 | 
					            ) {
 | 
				
			||||||
 | 
					              // Перенос разрешен
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (_this.vertical) {
 | 
				
			||||||
 | 
					                // Вертикальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Удаление отступов (движения)
 | 
				
			||||||
 | 
					                first.element.style.marginTop = null;
 | 
				
			||||||
 | 
					              } else {
 | 
				
			||||||
 | 
					                // Горизонтальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Удаление отступов (движения)
 | 
				
			||||||
 | 
					                first.element.style.marginLeft = null;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Копирование первого элемента в конец строки
 | 
				
			||||||
 | 
					              _this.#shell.appendChild(first.element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (_this.events.get("transfer.end")) {
 | 
				
			||||||
 | 
					                // Запрошен вызов события: "перемещение в конец"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Вызов события: "перемещение в конец"
 | 
				
			||||||
 | 
					                document.dispatchEvent(
 | 
				
			||||||
 | 
					                  new CustomEvent(`hotline.${_this.#id}.transfer.end`, {
 | 
				
			||||||
 | 
					                    detail: {
 | 
				
			||||||
 | 
					                      element: first.element,
 | 
				
			||||||
 | 
					                      offset: -(
 | 
				
			||||||
 | 
					                        (_this.vertical
 | 
				
			||||||
 | 
					                          ? first.coords.height
 | 
				
			||||||
 | 
					                          : first.coords.width) + first.separator
 | 
				
			||||||
 | 
					                      )
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  })
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          } else if (
 | 
				
			||||||
 | 
					            (_this.vertical &&
 | 
				
			||||||
 | 
					              Math.round(first.coords.y) > _this.#shell.offsetTop) ||
 | 
				
			||||||
 | 
					            (!_this.vertical &&
 | 
				
			||||||
 | 
					              Math.round(first.coords.x) > _this.#shell.offsetLeft)
 | 
				
			||||||
 | 
					          ) {
 | 
				
			||||||
 | 
					            // Передняя (движущая) граница первого элемента вышла из области видимости
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (
 | 
				
			||||||
 | 
					              (_this.transfer === null && _this.#transfer) ||
 | 
				
			||||||
 | 
					              _this.transfer === true
 | 
				
			||||||
 | 
					            ) {
 | 
				
			||||||
 | 
					              // Перенос разрешен
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Инициализация отступа у последнего элемента (разделение)
 | 
				
			||||||
 | 
					              const separator =
 | 
				
			||||||
 | 
					                (buffer = isNaN(
 | 
				
			||||||
 | 
					                  (buffer = parseFloat(
 | 
				
			||||||
 | 
					                    getComputedStyle(_this.#shell.lastElementChild)[
 | 
				
			||||||
 | 
					                    _this.vertical ? "marginBottom" : "marginRight"
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
 | 
					                  ))
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                  ? 0
 | 
				
			||||||
 | 
					                  : buffer) === 0
 | 
				
			||||||
 | 
					                  ? first.separator
 | 
				
			||||||
 | 
					                  : buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Инициализация координат первого элемента в строке
 | 
				
			||||||
 | 
					              const coords = _this.#shell.lastElementChild.getBoundingClientRect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (_this.vertical) {
 | 
				
			||||||
 | 
					                // Вертикальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Удаление отступов (движения)
 | 
				
			||||||
 | 
					                _this.#shell.lastElementChild.style.marginTop =
 | 
				
			||||||
 | 
					                  -coords.height - separator + "px";
 | 
				
			||||||
 | 
					              } else {
 | 
				
			||||||
 | 
					                // Горизонтальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Удаление отступов (движения)
 | 
				
			||||||
 | 
					                _this.#shell.lastElementChild.style.marginLeft =
 | 
				
			||||||
 | 
					                  -coords.width - separator + "px";
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Копирование последнего элемента в начало строки
 | 
				
			||||||
 | 
					              _this.#shell.insertBefore(
 | 
				
			||||||
 | 
					                _this.#shell.lastElementChild,
 | 
				
			||||||
 | 
					                first.element
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Удаление отступов у второго элемента в строке (движения)
 | 
				
			||||||
 | 
					              _this.#shell.children[1].style[
 | 
				
			||||||
 | 
					                _this.vertical ? "marginTop" : "marginLeft"
 | 
				
			||||||
 | 
					              ] = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (_this.events.get("transfer.start")) {
 | 
				
			||||||
 | 
					                // Запрошен вызов события: "перемещение в начало"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Вызов события: "перемещение в начало"
 | 
				
			||||||
 | 
					                document.dispatchEvent(
 | 
				
			||||||
 | 
					                  new CustomEvent(`hotline.${_this.#id}.transfer.start`, {
 | 
				
			||||||
 | 
					                    detail: {
 | 
				
			||||||
 | 
					                      element: _this.#shell.lastElementChild,
 | 
				
			||||||
 | 
					                      offset:
 | 
				
			||||||
 | 
					                        (_this.vertical ? coords.height : coords.width) +
 | 
				
			||||||
 | 
					                        separator
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  })
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            // Элемент в области видимости
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ((_this.move === null && _this.#move) || _this.move === true) {
 | 
				
			||||||
 | 
					              // Движение разрешено
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Запись новых координат сдвига
 | 
				
			||||||
 | 
					              const offset = first.offset + _this.step;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Запись сдвига (движение)
 | 
				
			||||||
 | 
					              _this.offset(offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (_this.events.get("move")) {
 | 
				
			||||||
 | 
					                // Запрошен вызов события: "движение"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Вызов события: "движение"
 | 
				
			||||||
 | 
					                document.dispatchEvent(
 | 
				
			||||||
 | 
					                  new CustomEvent(`hotline.${_this.#id}.move`, {
 | 
				
			||||||
 | 
					                    detail: {
 | 
				
			||||||
 | 
					                      from: first.offset,
 | 
				
			||||||
 | 
					                      to: offset
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  })
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }, _this.delay);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.hover) {
 | 
				
			||||||
 | 
					        // Запрошена возможность останавливать бегущую строку
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация сдвига
 | 
				
			||||||
 | 
					        let offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация слушателя события при перемещении элемента в бегущей строке
 | 
				
			||||||
 | 
					        const listener = function (e) {
 | 
				
			||||||
 | 
					          // Увеличение сдвига
 | 
				
			||||||
 | 
					          offset += e.detail.offset ?? 0;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация обработчика наведения курсора (остановка движения)
 | 
				
			||||||
 | 
					        this.#shell.onmouseover = function (e) {
 | 
				
			||||||
 | 
					          // Курсор наведён на бегущую строку
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Блокировка движения
 | 
				
			||||||
 | 
					          _this.#move = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (_this.events.get("move.block")) {
 | 
				
			||||||
 | 
					            // Запрошен вызов события: "блокировка движения"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Вызов события: "блокировка движения"
 | 
				
			||||||
 | 
					            document.dispatchEvent(
 | 
				
			||||||
 | 
					              new CustomEvent(`hotline.${_this.#id}.move.block`)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (_this.movable) {
 | 
				
			||||||
 | 
					            // Запрошена возможность двигать бегущую строку
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _this.#shell.onmousedown = function (onmousedown) {
 | 
				
			||||||
 | 
					              // Курсор активирован
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Инициализация слушателей события перемещения элемента в бегущей строке
 | 
				
			||||||
 | 
					              document.addEventListener(
 | 
				
			||||||
 | 
					                `hotline.${_this.#id}.transfer.start`,
 | 
				
			||||||
 | 
					                listener
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					              document.addEventListener(
 | 
				
			||||||
 | 
					                `hotline.${_this.#id}.transfer.end`,
 | 
				
			||||||
 | 
					                listener
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Инициализация буфера для временных данных
 | 
				
			||||||
 | 
					              let buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Инициализация данных первого элемента в строке
 | 
				
			||||||
 | 
					              const first = {
 | 
				
			||||||
 | 
					                offset: isNaN(
 | 
				
			||||||
 | 
					                  (buffer = parseFloat(
 | 
				
			||||||
 | 
					                    _this.vertical
 | 
				
			||||||
 | 
					                      ? _this.#shell.firstElementChild.style.marginTop
 | 
				
			||||||
 | 
					                      : _this.#shell.firstElementChild.style.marginLeft
 | 
				
			||||||
 | 
					                  ))
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                  ? 0
 | 
				
			||||||
 | 
					                  : buffer
 | 
				
			||||||
 | 
					              };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              document.onmousemove = function (onmousemove) {
 | 
				
			||||||
 | 
					                // Курсор движется
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (_this.vertical) {
 | 
				
			||||||
 | 
					                  // Вертикальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  // Инициализация буфера местоположения
 | 
				
			||||||
 | 
					                  const from = _this.#shell.firstElementChild.style.marginTop;
 | 
				
			||||||
 | 
					                  const to = onmousemove.pageY - (onmousedown.pageY + offset - first.offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  // Движение
 | 
				
			||||||
 | 
					                  _this.#shell.firstElementChild.style.marginTop = to +
 | 
				
			||||||
 | 
					                    "px";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  if (_this.events.get("onmousemove")) {
 | 
				
			||||||
 | 
					                    // Запрошен вызов события: "перемещение мышью"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Вызов события: "перемещение мышью"
 | 
				
			||||||
 | 
					                    document.dispatchEvent(
 | 
				
			||||||
 | 
					                      new CustomEvent(`hotline.${_this.#id}.onmousemove`, {
 | 
				
			||||||
 | 
					                        detail: { from, to }
 | 
				
			||||||
 | 
					                      })
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                  // Горизонтальная бегущая строка
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  // Инициализация буфера местоположения
 | 
				
			||||||
 | 
					                  const from = _this.#shell.firstElementChild.style.marginLeft;
 | 
				
			||||||
 | 
					                  const to = onmousemove.pageX - (onmousedown.pageX + offset - first.offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  // Движение
 | 
				
			||||||
 | 
					                  _this.#shell.firstElementChild.style.marginLeft = to + "px";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  if (_this.events.get("onmousemove")) {
 | 
				
			||||||
 | 
					                    // Запрошен вызов события: "перемещение мышью"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // Вызов события: "перемещение мышью"
 | 
				
			||||||
 | 
					                    document.dispatchEvent(
 | 
				
			||||||
 | 
					                      new CustomEvent(`hotline.${_this.#id}.onmousemove`, {
 | 
				
			||||||
 | 
					                        detail: { from, to }
 | 
				
			||||||
 | 
					                      })
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Запись курсора
 | 
				
			||||||
 | 
					                _this.#shell.style.cursor = "grabbing";
 | 
				
			||||||
 | 
					              };
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Перещапись событий браузера (чтобы не дёргалось)
 | 
				
			||||||
 | 
					            _this.#shell.ondragstart = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _this.#shell.onmouseup = function () {
 | 
				
			||||||
 | 
					              // Курсор деактивирован
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Остановка обработки движения
 | 
				
			||||||
 | 
					              document.onmousemove = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Сброс сдвига
 | 
				
			||||||
 | 
					              offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              document.removeEventListener(
 | 
				
			||||||
 | 
					                `hotline.${_this.#id}.transfer.start`,
 | 
				
			||||||
 | 
					                listener
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					              document.removeEventListener(
 | 
				
			||||||
 | 
					                `hotline.${_this.#id}.transfer.end`,
 | 
				
			||||||
 | 
					                listener
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Восстановление курсора
 | 
				
			||||||
 | 
					              _this.#shell.style.cursor = null;
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация обработчика отведения курсора (остановка движения)
 | 
				
			||||||
 | 
					        this.#shell.onmouseleave = function (onmouseleave) {
 | 
				
			||||||
 | 
					          // Курсор отведён от бегущей строки
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (!_this.sticky) {
 | 
				
			||||||
 | 
					            // Отключено прилипание
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Остановка обработки движения
 | 
				
			||||||
 | 
					            document.onmousemove = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.removeEventListener(
 | 
				
			||||||
 | 
					              `hotline.${_this.#id}.transfer.start`,
 | 
				
			||||||
 | 
					              listener
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            document.removeEventListener(
 | 
				
			||||||
 | 
					              `hotline.${_this.#id}.transfer.end`,
 | 
				
			||||||
 | 
					              listener
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Восстановление курсора
 | 
				
			||||||
 | 
					            _this.#shell.style.cursor = null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Сброс сдвига
 | 
				
			||||||
 | 
					          offset = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Разблокировка движения
 | 
				
			||||||
 | 
					          _this.#move = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (_this.events.get("move.unblock")) {
 | 
				
			||||||
 | 
					            // Запрошен вызов события: "разблокировка движения"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Вызов события: "разблокировка движения"
 | 
				
			||||||
 | 
					            document.dispatchEvent(
 | 
				
			||||||
 | 
					              new CustomEvent(`hotline.${_this.#id}.move.unblock`)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.wheel) {
 | 
				
			||||||
 | 
					        // Запрошена возможность прокручивать колесом мыши
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация обработчика наведения курсора (остановка движения)
 | 
				
			||||||
 | 
					        this.#shell.onwheel = function (e) {
 | 
				
			||||||
 | 
					          // Курсор наведён на бегущую
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Инициализация буфера для временных данных
 | 
				
			||||||
 | 
					          let buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Перемещение
 | 
				
			||||||
 | 
					          _this.offset(
 | 
				
			||||||
 | 
					            (isNaN(
 | 
				
			||||||
 | 
					              (buffer = parseFloat(
 | 
				
			||||||
 | 
					                _this.#shell.firstElementChild.style[
 | 
				
			||||||
 | 
					                _this.vertical ? "marginTop" : "marginLeft"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					              ))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					              ? 0
 | 
				
			||||||
 | 
					              : buffer) +
 | 
				
			||||||
 | 
					            (_this.delta === null
 | 
				
			||||||
 | 
					              ? e.wheelDelta
 | 
				
			||||||
 | 
					              : e.wheelDelta > 0
 | 
				
			||||||
 | 
					                ? _this.delta
 | 
				
			||||||
 | 
					                : -_this.delta)
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.observe) {
 | 
				
			||||||
 | 
					      // Запрошено наблюдение за изменениями аттрибутов элемента бегущей строки
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.#observer === null) {
 | 
				
			||||||
 | 
					        // Отсутствует наблюдатель
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация ссылки на ядро
 | 
				
			||||||
 | 
					        const _this = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация наблюдателя
 | 
				
			||||||
 | 
					        this.#observer = new MutationObserver(function (mutations) {
 | 
				
			||||||
 | 
					          for (const mutation of mutations) {
 | 
				
			||||||
 | 
					            if (mutation.type === "attributes") {
 | 
				
			||||||
 | 
					              // Запись параметра в инстанцию бегущей строки
 | 
				
			||||||
 | 
					              _this.write(mutation.attributeName);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Перезапуск бегущей строки
 | 
				
			||||||
 | 
					          _this.restart();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Активация наблюдения
 | 
				
			||||||
 | 
					        this.#observer.observe(this.#shell, {
 | 
				
			||||||
 | 
					          attributes: true
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } else if (this.#observer instanceof MutationObserver) {
 | 
				
			||||||
 | 
					      // Запрошено отключение наблюдения
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Деактивация наблюдения
 | 
				
			||||||
 | 
					      this.#observer.disconnect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Удаление наблюдателя
 | 
				
			||||||
 | 
					      this.#observer = null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.events.get("start")) {
 | 
				
			||||||
 | 
					      // Запрошен вызов события: "запуск"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Вызов события: "запуск"
 | 
				
			||||||
 | 
					      document.dispatchEvent(new CustomEvent(`hotline.${this.#id}.start`));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  stop() {
 | 
				
			||||||
 | 
					    // Остановка бегущей строки
 | 
				
			||||||
 | 
					    clearInterval(this.#instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Удаление инстанции интервала
 | 
				
			||||||
 | 
					    this.#instance = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.events.get("stop")) {
 | 
				
			||||||
 | 
					      // Запрошен вызов события: "остановка"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Вызов события: "остановка"
 | 
				
			||||||
 | 
					      document.dispatchEvent(new CustomEvent(`hotline.${this.#id}.stop`));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  restart() {
 | 
				
			||||||
 | 
					    // Остановка бегущей строки
 | 
				
			||||||
 | 
					    this.stop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Запуск бегущей строки
 | 
				
			||||||
 | 
					    this.start();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  write(attribute) {
 | 
				
			||||||
 | 
					    // Инициализация названия параметра
 | 
				
			||||||
 | 
					    const parameter = (/^data-hotline-(\w+)$/.exec(attribute) ?? [, null])[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeof parameter === "string") {
 | 
				
			||||||
 | 
					      // Параметр найден
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Проверка на разрешение изменения
 | 
				
			||||||
 | 
					      if (this.#block.has(parameter)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Инициализация значения параметра
 | 
				
			||||||
 | 
					      const value = this.#shell.getAttribute(attribute);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Инициализация буфера для временных данных
 | 
				
			||||||
 | 
					      let buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Запись параметра
 | 
				
			||||||
 | 
					      this[parameter] = isNaN((buffer = parseFloat(value)))
 | 
				
			||||||
 | 
					        ? value === "true"
 | 
				
			||||||
 | 
					          ? true
 | 
				
			||||||
 | 
					          : value === "false"
 | 
				
			||||||
 | 
					            ? false
 | 
				
			||||||
 | 
					            : value
 | 
				
			||||||
 | 
					        : buffer;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  offset(value) {
 | 
				
			||||||
 | 
					    // Запись отступа
 | 
				
			||||||
 | 
					    this.#shell.firstElementChild.style[
 | 
				
			||||||
 | 
					      this.vertical ? "marginTop" : "marginLeft"
 | 
				
			||||||
 | 
					    ] = value + "px";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.events.get("offset")) {
 | 
				
			||||||
 | 
					      // Запрошен вызов события: "сдвиг"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Вызов события: "сдвиг"
 | 
				
			||||||
 | 
					      document.dispatchEvent(
 | 
				
			||||||
 | 
					        new CustomEvent(`hotline.${this.#id}.offset`, {
 | 
				
			||||||
 | 
					          detail: {
 | 
				
			||||||
 | 
					            to: value
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static preprocessing(event = false) {
 | 
				
			||||||
 | 
					    // Инициализация счётчиков инстанций горячей строки
 | 
				
			||||||
 | 
					    const success = new Set();
 | 
				
			||||||
 | 
					    let error = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const element of document.querySelectorAll('*[data-hotline="true"]')) {
 | 
				
			||||||
 | 
					      // Перебор бегущих строк
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (typeof element.id === "string") {
 | 
				
			||||||
 | 
					        // Найден идентификатор
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация инстанции бегущей строки
 | 
				
			||||||
 | 
					        const hotline = new this(element.id, element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const attribute of element.getAttributeNames()) {
 | 
				
			||||||
 | 
					          // Перебор аттрибутов
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Запись параметра в инстанцию бегущей строки
 | 
				
			||||||
 | 
					          hotline.write(attribute);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Запуск бегущей строки
 | 
				
			||||||
 | 
					        hotline.start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Запись инстанции бегущей строки в элемент
 | 
				
			||||||
 | 
					        element.hotline = hotline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Запись в счётчик успешных инициализаций
 | 
				
			||||||
 | 
					        success.add(hotline);
 | 
				
			||||||
 | 
					      } else ++error;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (event) {
 | 
				
			||||||
 | 
					      // Запрошен вызов события: "предварительная подготовка"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Вызов события: "предварительная подготовка"
 | 
				
			||||||
 | 
					      document.dispatchEvent(
 | 
				
			||||||
 | 
					        new CustomEvent(`hotline.preprocessed`, {
 | 
				
			||||||
 | 
					          detail: {
 | 
				
			||||||
 | 
					            success,
 | 
				
			||||||
 | 
					            error
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					document.dispatchEvent(
 | 
				
			||||||
 | 
					  new CustomEvent("hotline.loaded", {
 | 
				
			||||||
 | 
					    detail: { hotline }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										2
									
								
								mirzaev/site/rules/system/public/js/js.cookie.min.js
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					/*! js-cookie v3.0.1 | MIT */
 | 
				
			||||||
 | 
					!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,(function(){"use strict";function e(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)e[o]=n[o]}return e}return function t(n,o){function r(t,r,i){if("undefined"!=typeof document){"number"==typeof(i=e({},o,i)).expires&&(i.expires=new Date(Date.now()+864e5*i.expires)),i.expires&&(i.expires=i.expires.toUTCString()),t=encodeURIComponent(t).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var c="";for(var u in i)i[u]&&(c+="; "+u,!0!==i[u]&&(c+="="+i[u].split(";")[0]));return document.cookie=t+"="+n.write(r,t)+c}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var t=document.cookie?document.cookie.split("; "):[],o={},r=0;r<t.length;r++){var i=t[r].split("="),c=i.slice(1).join("=");try{var u=decodeURIComponent(i[0]);if(o[u]=n.read(c,u),e===u)break}catch(e){}}return e?o[e]:o}},remove:function(t,n){r(t,"",e({},n,{expires:-1}))},withAttributes:function(n){return t(this.converter,e({},this.attributes,n))},withConverter:function(n){return t(e({},this.converter,n),this.attributes)}},{attributes:{value:Object.freeze(o)},converter:{value:Object.freeze(n)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"})}));
 | 
				
			||||||
							
								
								
									
										127
									
								
								mirzaev/site/rules/system/public/js/trolling.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class troller {
 | 
				
			||||||
 | 
					    static what = {
 | 
				
			||||||
 | 
					        enable() {
 | 
				
			||||||
 | 
					            document.body.onmouseleave = function () {
 | 
				
			||||||
 | 
					                // if (Math.random() > 0.90) {
 | 
				
			||||||
 | 
					                // 10%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                troller.what.start();
 | 
				
			||||||
 | 
					                // }
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.body.onmouseenter = function () {
 | 
				
			||||||
 | 
					                troller.what.end();
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        disable() {
 | 
				
			||||||
 | 
					            document.body.onmouseleave = document.body.onmouseenter = undefined;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        start() {
 | 
				
			||||||
 | 
					            // Отображение изображения
 | 
				
			||||||
 | 
					            document.getElementById('what_image').classList.add('active');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Инициализация элемента со звуком
 | 
				
			||||||
 | 
					            const what_sound = document.getElementById('what_sound');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Воспроизведение звука
 | 
				
			||||||
 | 
					            what_sound.currentTime = 0;
 | 
				
			||||||
 | 
					            what_sound.play();
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        end() {
 | 
				
			||||||
 | 
					            // Сокрытие изображения
 | 
				
			||||||
 | 
					            document.getElementById('what_image').classList.remove('active');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Остановка звука
 | 
				
			||||||
 | 
					            document.getElementById('what_sound').pause();
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        single(event = 'onmouseleave') {
 | 
				
			||||||
 | 
					            if (typeof event === 'string') {
 | 
				
			||||||
 | 
					                // Получены обязательные входные параметры
 | 
				
			||||||
 | 
					                // Отображение изображения
 | 
				
			||||||
 | 
					                document.getElementById('what_image').classList.add('active');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Инициализация элемента со звуком
 | 
				
			||||||
 | 
					                const what_sound = document.getElementById('what_sound');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Воспроизведение звука
 | 
				
			||||||
 | 
					                what_sound.currentTime = 0;
 | 
				
			||||||
 | 
					                what_sound.play();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                document.body[event] = function () {
 | 
				
			||||||
 | 
					                    troller.what.end();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    document.body[event] = undefined;
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static vk() {
 | 
				
			||||||
 | 
					        setInterval(function () {
 | 
				
			||||||
 | 
					            const sound = document.getElementById('sound_vk');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (Math.random() > 0.95) {
 | 
				
			||||||
 | 
					                // 5%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Воспроизведение звука
 | 
				
			||||||
 | 
					                sound.currentTime = 0;
 | 
				
			||||||
 | 
					                sound.play();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }, 85000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static whatsapp() {
 | 
				
			||||||
 | 
					        setInterval(function () {
 | 
				
			||||||
 | 
					            const sound = document.getElementById('sound_whatsup');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (Math.random() > 0.97) {
 | 
				
			||||||
 | 
					                // 3%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Воспроизведение звука
 | 
				
			||||||
 | 
					                sound.currentTime = 0;
 | 
				
			||||||
 | 
					                sound.play();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }, 125000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static iphone() {
 | 
				
			||||||
 | 
					        setInterval(function () {
 | 
				
			||||||
 | 
					            const sound = document.getElementById('sound_iphone');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (Math.random() > 0.98) {
 | 
				
			||||||
 | 
					                // 2%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Воспроизведение звука
 | 
				
			||||||
 | 
					                sound.currentTime = 0;
 | 
				
			||||||
 | 
					                sound.play();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }, 265000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (Math.random() > 0.90) {
 | 
				
			||||||
 | 
					    // 10%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    troller.what.enable();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (Math.random() > 0.90) {
 | 
				
			||||||
 | 
					    // 10%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    troller.vk();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (Math.random() > 0.90) {
 | 
				
			||||||
 | 
					    // 10%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    troller.whatsapp();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (Math.random() > 0.90) {
 | 
				
			||||||
 | 
					    // 10%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    troller.iphone();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/sounds/iphone.mp3
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/sounds/vk.mp3
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/sounds/what.mp3
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/sounds/whatsup.mp3
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								mirzaev/site/rules/system/public/storage/214547089/avatar/200x200.jpg
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										14
									
								
								mirzaev/site/rules/system/views/account/panel.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<section id="panel">
 | 
				
			||||||
 | 
					    {% if account %}
 | 
				
			||||||
 | 
					    {{ account.getKey() }}
 | 
				
			||||||
 | 
					    {% if vk %}
 | 
				
			||||||
 | 
					    {{ vk.mail }}
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					    {% else %}
 | 
				
			||||||
 | 
					    <button id="login" onclick="return account.authentication(this)">
 | 
				
			||||||
 | 
					        Войти в аккаунт
 | 
				
			||||||
 | 
					    </button>
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										11
									
								
								mirzaev/site/rules/system/views/account/vk.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<img src="/images/truth.jpg" alt="никому не показывай" style="position: absolute; left: 0; top: 0; width: 100%; height: 100%;">
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    setTimeout(fn => {
 | 
				
			||||||
 | 
					        window.opener.vk.close();
 | 
				
			||||||
 | 
					    }, 2000);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										19
									
								
								mirzaev/site/rules/system/views/aside.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					{% use 'hotline/index.html' with css as hotline_css, body as hotline_body, js as hotline_js, js_init as hotline_js_init %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					{# {{ block('hotline_css') }} #}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<aside>
 | 
				
			||||||
 | 
					    {{ block('hotline_body') }}
 | 
				
			||||||
 | 
					</aside>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					{# {{ block('hotline_js') }} #}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					{# {{ block('hotline_js_init') }} #}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										33
									
								
								mirzaev/site/rules/system/views/core.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					<!doctype html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<html lang="ru">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
						{% use 'head.html' with title as head_title, meta as head_meta, css as head_css %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{% block title %}
 | 
				
			||||||
 | 
						{{ block('head_title') }}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{% block meta %}
 | 
				
			||||||
 | 
						{{ block('head_meta') }}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{% block css %}
 | 
				
			||||||
 | 
						{{ block('head_css') }}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
						{% block body %}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{% block js %}
 | 
				
			||||||
 | 
						{% include 'js.html' %}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{% block js_init %}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										4
									
								
								mirzaev/site/rules/system/views/footer.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<footer>
 | 
				
			||||||
 | 
					    <!-- <p><a href="http://www.anybrowser.org/campaign/"><img src="/img/logos/any_browser.gif" width="278" height="44" alt="Доступно на любом браузере" /></a></p> -->
 | 
				
			||||||
 | 
					    <!-- <p><a href="/browsers"><img src="/img/logos/any_browser.gif" width="278" height="44" alt="Доступно на любом браузере" /></a></p> -->
 | 
				
			||||||
 | 
					</footer>
 | 
				
			||||||
							
								
								
									
										15
									
								
								mirzaev/site/rules/system/views/head.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{% block title %}
 | 
				
			||||||
 | 
					<title>{% if head.title != empty %}{{head.title}}{% else %}Правила беседы{% endif %}</title>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block meta %}
 | 
				
			||||||
 | 
					<meta charset="utf-8">
 | 
				
			||||||
 | 
					<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 | 
				
			||||||
 | 
					{% for meta in head.metas %}
 | 
				
			||||||
 | 
					<meta {% for name, value in meta.attributes %}{{name}}="{{value}}" {% endfor %}>
 | 
				
			||||||
 | 
					{% endfor %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					<link rel="stylesheet" type="text/css" href="/css/main.css" />
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										19
									
								
								mirzaev/site/rules/system/views/header.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<div id="wrap" >
 | 
				
			||||||
 | 
					  <img id="masha" src="/images/photo_with_kitten.png" alt="Кошка Маша">
 | 
				
			||||||
 | 
					  <img id="hand" src="/images/photo_with_hand.png" alt="я помню бебра большой">
 | 
				
			||||||
 | 
					  <img id="knife" src="/images/photo_with_knife.png" alt="почему адблок сучара банит мои картинки">
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					<header>
 | 
				
			||||||
 | 
					  <h1 class="unselectable">ПРАВИЛА БЕСЕДЫ</h1>
 | 
				
			||||||
 | 
					</header>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										28
									
								
								mirzaev/site/rules/system/views/hotline/index.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					<link type="text/css" rel="stylesheet" href="/css/hotline.css">
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					{% if hotline.id != empty %}
 | 
				
			||||||
 | 
					<section id="{{ hotline.id }}" class="hotline unselectable" data-hotline="true" {% for name, value in hotline.parameters
 | 
				
			||||||
 | 
					    %} data-hotline-{{ name }}="{{value}}" {% endfor %} {% for name, value in hotline.attributes %} {{ name
 | 
				
			||||||
 | 
					    }}="{{value}}" {% endfor %}>
 | 
				
			||||||
 | 
					    {% for element in hotline.elements %}
 | 
				
			||||||
 | 
					    <{{element.tag??'article'}}>{{ element.content }}</{{element.tag??'article'}}>
 | 
				
			||||||
 | 
					    {% endfor %}
 | 
				
			||||||
 | 
					</section>
 | 
				
			||||||
 | 
					{% endif %}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					<script type="text/javascript" src="/js/hotline.js" defer></script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    document.addEventListener('hotline.loaded', function (e) {
 | 
				
			||||||
 | 
					        // Запуск препроцессора бегущих строк
 | 
				
			||||||
 | 
					        e.detail.hotline.preprocessing();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										37
									
								
								mirzaev/site/rules/system/views/index.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					{% extends "core.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% use "core.html" with css as core_css, body as core_body, js as core_js, js_init as core_js_init %}
 | 
				
			||||||
 | 
					{% use "trolling.html" with css as trolling_css, body as trolling_body, js as trolling_js %}
 | 
				
			||||||
 | 
					{% use "header.html" with css as header_css, body as header_body, js as header_js, js_init as header_js_init %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					{{ block('core_css') }}
 | 
				
			||||||
 | 
					{{ block('trolling_css') }}
 | 
				
			||||||
 | 
					{{ block('header_css') }}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					{{ block('core_body') }}
 | 
				
			||||||
 | 
					{{ block('trolling_body') }}
 | 
				
			||||||
 | 
					{{ block('header_body') }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<main>
 | 
				
			||||||
 | 
						<noscript>К сожалению мой сайт ещё пока не готов для работы без javascript</noscript>
 | 
				
			||||||
 | 
						{% block main %}
 | 
				
			||||||
 | 
					  {% include 'rules.html' %}
 | 
				
			||||||
 | 
						{% endblock %}
 | 
				
			||||||
 | 
					</main>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{# {% include 'footer.html' %} #}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					{{ block('core_js') }}
 | 
				
			||||||
 | 
					{{ block('trolling_js') }}
 | 
				
			||||||
 | 
					{{ block('header_js') }}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					{{ block('core_js_init') }}
 | 
				
			||||||
 | 
					{{ block('header_js_init') }}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										4
									
								
								mirzaev/site/rules/system/views/js.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					<script type="text/javascript" src="/js/js.cookie.min.js" defer></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="/js/account.js" defer></script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										56
									
								
								mirzaev/site/rules/system/views/logo.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,56 @@
 | 
				
			|||||||
 | 
					{% use 'hotline/index.html' with css as hotline_css, body as hotline_body, js as hotline_js %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					<link rel="stylesheet" type="text/css" href="/css/logo.css" />
 | 
				
			||||||
 | 
					{{ block('hotline_css') }}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<div id="logo" class="unselectable">
 | 
				
			||||||
 | 
					    <h1>VIRUS</h1>
 | 
				
			||||||
 | 
					    <h4>Скачать вирусы бесплатно</h4>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% with %}
 | 
				
			||||||
 | 
					    {% set hotline = hotline|merge({'id': 'hotline_logo'}) %}
 | 
				
			||||||
 | 
					    {{ block('hotline_body') }}
 | 
				
			||||||
 | 
					    {% endwith %}
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					{{ block('hotline_js') }}
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js_init %}
 | 
				
			||||||
 | 
					{{ block('hotline_js_init') }}
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    document.addEventListener('hotline.loaded', function (e) {
 | 
				
			||||||
 | 
					        // Запуск препроцессора бегущих строк
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация элемента бегущей строки
 | 
				
			||||||
 | 
					        const element_hotline = document.getElementById('hotline');
 | 
				
			||||||
 | 
					        const element_hotline_logo = document.getElementById('hotline_logo');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Инициализация слушателя
 | 
				
			||||||
 | 
					        element_hotline.hotline.events.set('move.block', true);
 | 
				
			||||||
 | 
					        element_hotline.hotline.events.set('move.unblock', true);
 | 
				
			||||||
 | 
					        element_hotline.hotline.events.set('onmousemove', true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.addEventListener(`hotline.${element_hotline.id}.move.block`, function (e) {
 | 
				
			||||||
 | 
					            // Копирование блокировки
 | 
				
			||||||
 | 
					            element_hotline_logo.hotline.move = false;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.addEventListener(`hotline.${element_hotline.id}.move.unblock`, function (e) {
 | 
				
			||||||
 | 
					            // Копирование блокировки
 | 
				
			||||||
 | 
					            element_hotline_logo.hotline.move = true;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.addEventListener(`hotline.${element_hotline.id}.onmousemove`, function (e) {
 | 
				
			||||||
 | 
					            // Копирование перемещения
 | 
				
			||||||
 | 
					            element_hotline_logo.hotline.offset(e.detail.to);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										25
									
								
								mirzaev/site/rules/system/views/manager.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace mirzaev\site\rules\views;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use mirzaev\minimal\controller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Twig\Loader\FilesystemLoader;
 | 
				
			||||||
 | 
					use Twig\Environment as view;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Менеджер представлений
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package mirzaev\site\rules\controllers
 | 
				
			||||||
 | 
					 * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					final class manager extends controller
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function render(string $file, array $vars = []): ?string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Генерация представления
 | 
				
			||||||
 | 
					        return (new view(new FilesystemLoader(VIEWS)))->render($file, $vars);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								mirzaev/site/rules/system/views/menu.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										163
									
								
								mirzaev/site/rules/system/views/rules.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,163 @@
 | 
				
			|||||||
 | 
					<ol>
 | 
				
			||||||
 | 
					  <li value="0">под ножом нет красной точки</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>чоколад запрещено</li>
 | 
				
			||||||
 | 
					  <li>пажилой запрещено</li>
 | 
				
			||||||
 | 
					  <li>запрещено бдабдабаб</li>
 | 
				
			||||||
 | 
					  <li>чи да запрещено</li>
 | 
				
			||||||
 | 
					  <li>а шо запрещено</li>
 | 
				
			||||||
 | 
					  <li>не быть дебилом</li>
 | 
				
			||||||
 | 
					  <li>Админ всегда прав</li>
 | 
				
			||||||
 | 
					  <li>админа не тролить</li>
 | 
				
			||||||
 | 
					  <li>гоша джикия запрещен</li>
 | 
				
			||||||
 | 
					  <li>Егор Родин запрещен</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>у нас будет сервер майнкрафт</li>
 | 
				
			||||||
 | 
					  <li>рофлить запрещено</li>
 | 
				
			||||||
 | 
					  <li>Мария Мышкина запрещена</li>
 | 
				
			||||||
 | 
					  <li>ПОРНО ЗАПРЕЩЕНО (16+)</li>
 | 
				
			||||||
 | 
					  <li>сиськи запрещены</li>
 | 
				
			||||||
 | 
					  <li>я реально кикну</li>
 | 
				
			||||||
 | 
					  <li>Пишешь не кошку? могу мут выдать 1 час</li>
 | 
				
			||||||
 | 
					  <li>пингуешь меня по хуйне? мут 1 день</li>
 | 
				
			||||||
 | 
					  <li>СПОЙЛЕРИТЬ КОШКУ С ТВИТТЕРА ЗАПРЕЩЕНО</li>
 | 
				
			||||||
 | 
					  <li>ЗАПРЕЩЕНО Я СКАЗАЛ Я НЕ ШУЧУ НАХУЙ</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>Попы тоже запрещено особенно Маши</li>
 | 
				
			||||||
 | 
					  <li>ладно сиси можно</li>
 | 
				
			||||||
 | 
					  <li>чичас запрещено</li>
 | 
				
			||||||
 | 
					  <li>делать что я скажу</li>
 | 
				
			||||||
 | 
					  <li>ладно прошлое правило это шутка)</li>
 | 
				
			||||||
 | 
					  <li>ауе запрещено</li>
 | 
				
			||||||
 | 
					  <li>не оскорблять кошку стикерами</li>
 | 
				
			||||||
 | 
					  <li>жмых запрещен во всех проявлениях</li>
 | 
				
			||||||
 | 
					  <li>жмыхать запрещено</li>
 | 
				
			||||||
 | 
					  <li>ЧСВ запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>попы разрешены только если не видно того самого</li>
 | 
				
			||||||
 | 
					  <li>враньше разрешено потому что это нормально</li>
 | 
				
			||||||
 | 
					  <li>Attentionwhore запрещены</li>
 | 
				
			||||||
 | 
					  <li>картинки в меру будет много убью</li>
 | 
				
			||||||
 | 
					  <li>Саша Синтаров запрещен</li>
 | 
				
			||||||
 | 
					  <li>не обамить</li>
 | 
				
			||||||
 | 
					  <li>аудиоприколы про Арсена запрещены</li>
 | 
				
			||||||
 | 
					  <li>рэп запрещен (законпроект Фурсовой)</li>
 | 
				
			||||||
 | 
					  <li>сказал "говнявила" заблоикрован</li>
 | 
				
			||||||
 | 
					  <li>хуявило употреблять запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>пиздявила употреблять запрещено</li>
 | 
				
			||||||
 | 
					  <li>оскорбление правил запрещено поняли суки? теперь че</li>
 | 
				
			||||||
 | 
					  <li>СРАТЬ ЗАПРЕЩЕНО</li>
 | 
				
			||||||
 | 
					  <li>Спам запрещен</li>
 | 
				
			||||||
 | 
					  <li>На дуэли проебал не вернем никогда</li>
 | 
				
			||||||
 | 
					  <li>Жир запрещен</li>
 | 
				
			||||||
 | 
					  <li>у нас есть сервер майнкрафт</li>
 | 
				
			||||||
 | 
					  <li>Дуэли запрещены</li>
 | 
				
			||||||
 | 
					  <li>ножи запрещены выгоню</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li value="51">пипи эпи запрещен</li>
 | 
				
			||||||
 | 
					  <li>чересчур умничать запрещено</li>
 | 
				
			||||||
 | 
					  <li>быть подписанным на паблик</li>
 | 
				
			||||||
 | 
					  <li>ЛЮБИТЬ КОШКУ МАШКУ</li>
 | 
				
			||||||
 | 
					  <li>демократия запрещена</li>
 | 
				
			||||||
 | 
					  <li>грязнули разрешены</li>
 | 
				
			||||||
 | 
					  <li>брух bruh запрещен</li>
 | 
				
			||||||
 | 
					  <li>oof запрещен</li>
 | 
				
			||||||
 | 
					  <li>чуитс запрещено</li>
 | 
				
			||||||
 | 
					  <li>кринжевать запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>русские националисты не приветствуются</li>
 | 
				
			||||||
 | 
					  <li>любые националисты тоже</li>
 | 
				
			||||||
 | 
					  <li>упоминать правило №50 запрещено</li>
 | 
				
			||||||
 | 
					  <li>будете помогать заблокированным заблокирую</li>
 | 
				
			||||||
 | 
					  <li>не керокерокать</li>
 | 
				
			||||||
 | 
					  <li>На тупые вопросы не отвечаем</li>
 | 
				
			||||||
 | 
					  <li>Так называемые "мемы" запрещены</li>
 | 
				
			||||||
 | 
					  <li>Вопросы по серверу в паблике сервера или беседе сервера</li>
 | 
				
			||||||
 | 
					  <li>спойлерить запрещено суки</li>
 | 
				
			||||||
 | 
					  <li>ЛАДНО кошатник разрешено 6+ но если адекват</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>Мир тьмы разрешен (кодзимов попросил)</li>
 | 
				
			||||||
 | 
					  <li>Вредные советы давать СТРОГО запрещено</li>
 | 
				
			||||||
 | 
					  <li>пропаганда психотропных веществ запрещена наркалыги ёбаные идите долбите анус свой тупые суки</li>
 | 
				
			||||||
 | 
					  <li>за оскорбления извините</li>
 | 
				
			||||||
 | 
					  <li>триган дэ вне закона (законпроект Динозавра)</li>
 | 
				
			||||||
 | 
					  <li>Не ведите себя как быдло</li>
 | 
				
			||||||
 | 
					  <li>объяснять что такое буккаке запрещено</li>
 | 
				
			||||||
 | 
					  <li>веп панк запрещен</li>
 | 
				
			||||||
 | 
					  <li>I Hate Myself For Loving You ЗАПРЕЩЕН</li>
 | 
				
			||||||
 | 
					  <li>доминировать как быдло типо мне похуй хаха мне похуй или ты с кем разговариваешь и картинки кидать запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>друзья Даркью Пельменя и он сам запрещены</li>
 | 
				
			||||||
 | 
					  <li>Носок Террохин запрещен</li>
 | 
				
			||||||
 | 
					  <li>Не оскорблять отель Хасбин</li>
 | 
				
			||||||
 | 
					  <li>Даркью Пельмень запрещен</li>
 | 
				
			||||||
 | 
					  <li>Андрей Останин запрещен</li>
 | 
				
			||||||
 | 
					  <li>НЕ СПОЙЛЕРИТЬ КОШКУ ЕЩЁ РАЗ ГОВОРЮ В ГРУППЕ КОШКА И НАХУЙ ПУБЛИКОВАТЬ ЕСЛИ ЕЁ ВСЕ ВИДЕЛИ. КТО СПОЙЛЕРИТ ВЕЧНЫЙ БАН. БЫЛ ТУТ ОДИН....</li>
 | 
				
			||||||
 | 
					  <li>хамуд запрещён</li>
 | 
				
			||||||
 | 
					  <li>нуждики разрешены (общим голосованием)</li>
 | 
				
			||||||
 | 
					  <li>хамуд теперь разрешён чтобы не было червячков</li>
 | 
				
			||||||
 | 
					  <li>ПОЛИТИКА ЗАПРЕЩЕНА (можно в беседе Альянса З.)</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>Оскорбления не в шутку запрещены</li>
 | 
				
			||||||
 | 
					  <li>Паблик "Оскорбления животных" запрещён</li>
 | 
				
			||||||
 | 
					  <li>Мужские органы может показывать только Дима Горшенин</li>
 | 
				
			||||||
 | 
					  <li>Алибека Захарова не трогать, ему не хочется общаться</li>
 | 
				
			||||||
 | 
					  <li>хрустящий малыш</li>
 | 
				
			||||||
 | 
					  <li>поддерживающим россию в войне с украиной моментальный бан без объяснения причин</li>
 | 
				
			||||||
 | 
					  <li>Random-Favorite Character ни о чём не просить</li>
 | 
				
			||||||
 | 
					  <li>Елизавета Кишкомотина (vk.com/id201222738) запрещена</li>
 | 
				
			||||||
 | 
					  <li>тупить разрешено 1 раз в течение 30 минут</li>
 | 
				
			||||||
 | 
					  <li>срать в группу запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>набивать репутацию друг другу запрещено</li>
 | 
				
			||||||
 | 
					  <li>писать хуйню запрещено</li>
 | 
				
			||||||
 | 
					  <li>толерантность разрешена</li>
 | 
				
			||||||
 | 
					  <li>правила теперь есть</li>
 | 
				
			||||||
 | 
					  <li>я могу выгонять зашедших по поиску долбаёбов</li>
 | 
				
			||||||
 | 
					  <li>про овечек писать только хорошее</li>
 | 
				
			||||||
 | 
					  <li>даркью пельмень и его шпана запрещены</li>
 | 
				
			||||||
 | 
					  <li>клишированные долбаёбы запрещены</li>
 | 
				
			||||||
 | 
					  <li>обсирать анархию ЗАПРЕЩЕНО</li>
 | 
				
			||||||
 | 
					  <li>Влада Грибоедина (vk.com/id368523707) запрещена</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>критиковать правила запрещено</li>
 | 
				
			||||||
 | 
					  <li>лайки ставить в группе партии горничные</li>
 | 
				
			||||||
 | 
					  <li>Любить родину</li>
 | 
				
			||||||
 | 
					  <li>всем девушкам випки</li>
 | 
				
			||||||
 | 
					  <li>читать анарзию</li>
 | 
				
			||||||
 | 
					  <li>Тупить запрещено</li>
 | 
				
			||||||
 | 
					  <li>Тупые вопросы запрещены</li>
 | 
				
			||||||
 | 
					  <li>не употреблять словосочетание ловушка джокера</li>
 | 
				
			||||||
 | 
					  <li>я могу банить за неадекватные публикации, спам и флуд по своему желанию</li>
 | 
				
			||||||
 | 
					  <li>кто зашел намеренно срать не скрывал это и не общался наказание пролом нижней челюсти</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>писать мне похуй запрещено</li>
 | 
				
			||||||
 | 
					  <li>писать ок запрещено</li>
 | 
				
			||||||
 | 
					  <li>писать + запрещено</li>
 | 
				
			||||||
 | 
					  <li>писать + разрешено</li>
 | 
				
			||||||
 | 
					  <li>Администратор имеет право забанить человека если он сам того пожелал</li>
 | 
				
			||||||
 | 
					  <li>15.01.2022 в 20:39 здесь ничего не произошло</li>
 | 
				
			||||||
 | 
					  <li>снюс запрещён (законпроект Никиты Вальбдаузера)</li>
 | 
				
			||||||
 | 
					  <li>мясо запрещено</li>
 | 
				
			||||||
 | 
					  <li>мясо запрещено</li>
 | 
				
			||||||
 | 
					  <li>всех погибших исключают из беседы</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>если чувак видно что зашел насрать а не общаться то я воспринимаю это как флуд и распрояжаюсь по правилу 129</li>
 | 
				
			||||||
 | 
					  <li>Отказался читать правила получишь пизды</li>
 | 
				
			||||||
 | 
					  <li>упоминание непризнанных альянсов запрещено</li>
 | 
				
			||||||
 | 
					  <li>Все группы которые выставляют себя за Альянс Добряков запрещены</li>
 | 
				
			||||||
 | 
					  <li>мнемотехника охуенна</li>
 | 
				
			||||||
 | 
					  <li>главное — БУДЬТЕ БЛЯДЬ ЛЮДЬМИ, серьёзно.</li>
 | 
				
			||||||
 | 
					  <li>играть в аллоды онлайн на сервере приют</li>
 | 
				
			||||||
 | 
					  <li>какого хуя вы не общаетесь весь день и как только я начинаю что-то рассказывать перебиваете меня и рассказываете свою тупую хуйню?</li>
 | 
				
			||||||
 | 
					  <li>мясо запрещено</li>
 | 
				
			||||||
 | 
					  <br>
 | 
				
			||||||
 | 
					  <li>В БЕСЕДЕ ПРАВИЛ НЕТ</li>
 | 
				
			||||||
 | 
					  <li>обсуждение и показ трупов запрещены</li>
 | 
				
			||||||
 | 
					  <li>знать все серии пони ОБЯЗАТЕЛЬНО</li>
 | 
				
			||||||
 | 
					  <li>подисаться на мой ютуб канал</li>
 | 
				
			||||||
 | 
					  <li>сдать тест на знание песен инстасамки</li>
 | 
				
			||||||
 | 
					  <li>шарить за бебру</li>
 | 
				
			||||||
 | 
					  <li>правило номер 129 (связано с 131) было хакировано альянсом злодеев и мы прилагаем все усилия для его восстановления</li>
 | 
				
			||||||
 | 
					</ol>
 | 
				
			||||||
							
								
								
									
										15
									
								
								mirzaev/site/rules/system/views/trolling.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{% block css %}
 | 
				
			||||||
 | 
					<link rel="stylesheet" type="text/css" href="/css/trolling.css" />
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block body %}
 | 
				
			||||||
 | 
					<img id="what_image" class="hide" src="/images/what.png" />
 | 
				
			||||||
 | 
					<audio id="what_sound" class="hide" src="/sounds/what.mp3" controls></audio>
 | 
				
			||||||
 | 
					<audio id="sound_vk" class="hide" src="/sounds/vk.mp3" controls></audio>
 | 
				
			||||||
 | 
					<audio id="sound_whatsup" class="hide" src="/sounds/whatsup.mp3" controls></audio>
 | 
				
			||||||
 | 
					<audio id="sound_iphone" class="hide" src="/sounds/iphone.mp3" controls></audio>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block js %}
 | 
				
			||||||
 | 
					<script src="/js/trolling.js" defer></script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
							
								
								
									
										16
									
								
								psalm.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
 | 
					<psalm
 | 
				
			||||||
 | 
					    errorLevel="7"
 | 
				
			||||||
 | 
					    resolveFromConfigFile="true"
 | 
				
			||||||
 | 
					    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 | 
				
			||||||
 | 
					    xmlns="https://getpsalm.org/schema/config"
 | 
				
			||||||
 | 
					    xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
 | 
				
			||||||
 | 
					    findUnusedBaselineEntry="true"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					    <projectFiles>
 | 
				
			||||||
 | 
					        <directory name="mirzaev/site/rules/system" />
 | 
				
			||||||
 | 
					        <ignoreFiles>
 | 
				
			||||||
 | 
					            <directory name="vendor" />
 | 
				
			||||||
 | 
					        </ignoreFiles>
 | 
				
			||||||
 | 
					    </projectFiles>
 | 
				
			||||||
 | 
					</psalm>
 | 
				
			||||||