копия от mirzaev/site-virus
|
@ -0,0 +1,3 @@
|
|||
!.gitignore
|
||||
composer.phar
|
||||
vendor
|
|
@ -0,0 +1,11 @@
|
|||
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.
|
|
@ -0,0 +1,3 @@
|
|||
# site-virus
|
||||
|
||||
Site with viruses and scary pictures
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
};
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
@import url('/fonts/comissioner.ttf');
|
||||
|
||||
: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: 20vh;
|
||||
padding-bottom: 10vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color : var(--background);
|
||||
}
|
||||
|
||||
aside {
|
||||
z-index : 500;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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 |
|
@ -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 |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 5.6 KiB |
|
@ -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 |
|
@ -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 |
After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 397 KiB |
After Width: | Height: | Size: 295 KiB |
|
@ -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();
|
|
@ -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,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 }
|
||||
})
|
||||
);
|
|
@ -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:"/"})}));
|
|
@ -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();
|
||||
}
|
After Width: | Height: | Size: 16 KiB |
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 %}
|
|
@ -0,0 +1,14 @@
|
|||
{% block css %}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<header>
|
||||
<h1 class="unselectable">ПРАВИЛА БЕСЕДЫ</h1>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
{% endblock %}
|
||||
|
||||
{% block js_init %}
|
||||
{% endblock %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,160 @@
|
|||
<ol>
|
||||
<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>
|
||||
<li>В БЕСЕДЕ ПРАВИЛ НЕТ</li>
|
||||
<br>
|
||||
<li>обсуждение и показ трупов запрещены</li>
|
||||
<li>знать все серии пони ОБЯЗАТЕЛЬНО</li>
|
||||
<li>подисаться на мой ютуб канал</li>
|
||||
<li>сдать тест на знание песен инстасамки</li>
|
||||
<li>шарить за бебру</li>
|
||||
</ol>
|
|
@ -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 %}
|
|
@ -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>
|