Compare commits

...

No commits in common. "494a8dc41c2b95a70b7d08166ecf256357ac2f89" and "76ff89af861fd40a10d7267ecf85481ab168b0fb" have entirely different histories.

70 changed files with 2482 additions and 3492 deletions

0
.gitignore vendored Normal file → Executable file
View File

0
LICENSE Normal file → Executable file
View File

0
README.md Normal file → Executable file
View File

23
composer.json Normal file → Executable file
View File

@ -1,16 +1,13 @@
{ {
"name": "mirzaev/site-virus", "name": "mirzaev/site-rules",
"description": "Site with viruses and scary pictures", "description": "Site with rules of our chat in VK",
"readme": "README.md", "readme": "README.md",
"keywords": [ "keywords": [
"virus", "rules",
"download",
"Evil Alliance",
"imageboard",
"site" "site"
], ],
"type": "site", "type": "site",
"homepage": "https://git.mirzaev.sexy/mirzaev/site-virus", "homepage": "https://git.mirzaev.sexy/mirzaev/site-rules",
"license": "WTFPL", "license": "WTFPL",
"authors": [ "authors": [
{ {
@ -21,12 +18,12 @@
} }
], ],
"support": { "support": {
"docs": "https://git.mirzaev.sexy/mirzaev/site-virus/manual", "docs": "https://git.mirzaev.sexy/mirzaev/site-rules/manual",
"issues": "https://git.mirzaev.sexy/mirzaev/site-virus/issues" "issues": "https://git.mirzaev.sexy/mirzaev/site-rules/issues"
}, },
"require": { "require": {
"php": "~8.1", "php": "~8.2",
"ext-sodium": "~8.1", "ext-sodium": "~8.2",
"mirzaev/minimal": "^2.0.x-dev", "mirzaev/minimal": "^2.0.x-dev",
"mirzaev/accounts": "~1.2.x-dev", "mirzaev/accounts": "~1.2.x-dev",
"mirzaev/arangodb": "^1.0.0", "mirzaev/arangodb": "^1.0.0",
@ -40,12 +37,12 @@
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"mirzaev\\site\\virus\\": "mirzaev/site/virus/system" "mirzaev\\site\\rules\\": "mirzaev/site/rules/system"
} }
}, },
"autoload-dev": { "autoload-dev": {
"psr-4": { "psr-4": {
"mirzaev\\site\\virus\\tests\\": "mirzaev/site/virus/tests" "mirzaev\\site\\rules\\tests\\": "mirzaev/site/rules/tests"
} }
} }
} }

296
composer.lock generated Normal file → Executable file
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "c9aa4923402d9b36006f18de102cdda0", "content-hash": "9b8186615d97b2bad3b83ba79c939875",
"packages": [ "packages": [
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
@ -220,16 +220,16 @@
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.4.2", "version": "2.4.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "3148458748274be1546f8f2809a6c09fe66f44aa" "reference": "67c26b443f348a51926030c83481b85718457d3d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/3148458748274be1546f8f2809a6c09fe66f44aa", "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d",
"reference": "3148458748274be1546f8f2809a6c09fe66f44aa", "reference": "67c26b443f348a51926030c83481b85718457d3d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -319,7 +319,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.4.2" "source": "https://github.com/guzzle/psr7/tree/2.4.3"
}, },
"funding": [ "funding": [
{ {
@ -335,7 +335,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-10-25T13:49:28+00:00" "time": "2022-10-26T14:07:24+00:00"
}, },
{ {
"name": "jasny/error-handler", "name": "jasny/error-handler",
@ -395,14 +395,14 @@
"version": "1.2.x-dev", "version": "1.2.x-dev",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://git.hood.su/mirzaev/accounts", "url": "https://git.mirzaev.sexy/mirzaev/accounts",
"reference": "4b0a1a1c34128c281b83485cde53d97df6c82a49" "reference": "aa93c4d26395025fa16bb65e8a40332ac352a742"
}, },
"require": { "require": {
"ext-dom": "20031129", "ext-dom": "*",
"ext-libxml": "~8.0", "ext-libxml": "*",
"guzzlehttp/guzzle": "~7.2", "guzzlehttp/guzzle": "^7.5",
"php": "~8.0" "php": "~8.2"
}, },
"require-dev": { "require-dev": {
"phpdocumentor/phpdocumentor": ">=2.9", "phpdocumentor/phpdocumentor": ">=2.9",
@ -420,31 +420,37 @@
], ],
"authors": [ "authors": [
{ {
"name": "Arsen Mirzaev", "name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "red@hood.su", "email": "arsen@mirzaev.sexy",
"homepage": "https://hood.su/sex", "homepage": "https://mirzaev.sexy",
"role": "Programmer" "role": "Programmer"
} }
], ],
"description": "Менеджер аккаунтов", "description": "Simple accounts manager",
"homepage": "https://git.hood.su/mirzaev/accounts", "homepage": "https://git.mirzaev.sexy/mirzaev/accounts",
"keywords": [ "keywords": [
"accounts" "accounts"
], ],
"support": { "support": {
"chat": "https://vk.me/darkweb228", "email": "arsen@mirzaev.sexy",
"docs": "https://git.hood.su/mirzaev/accounts/manual", "issues": "https://git.mirzaev.sexy/mirzaev/accounts/issues",
"issues": "https://git.hood.su/mirzaev/accounts/issues" "wiki": "https://git.mirzaev.sexy/mirzaev/accounts/wiki"
}, },
"time": "2021-07-31T11:12:52+00:00" "funding": [
{
"url": "https://fund.mirzaev.sexy",
"type": "funding"
}
],
"time": "2023-02-17T08:36:36+00:00"
}, },
{ {
"name": "mirzaev/arangodb", "name": "mirzaev/arangodb",
"version": "1.0.0", "version": "1.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://git.hood.su/mirzaev/arangodb", "url": "https://git.mirzaev.sexy/mirzaev/arangodb",
"reference": "0012a31e6bea1050385f6b740581f32b9e366128" "reference": "e7da9978d01d3f8bdef6c74809dfb4eb8989f92c"
}, },
"require": { "require": {
"php": "^8.1", "php": "^8.1",
@ -471,26 +477,37 @@
"role": "Developer" "role": "Developer"
} }
], ],
"description": "Реализация управления хранилищем данных ArangoDB", "description": "Simple PHP-framework for ArangoDB",
"homepage": "https://git.hood.su/mirzaev/arangodb", "homepage": "https://git.hood.su/mirzaev/arangodb",
"keywords": [ "keywords": [
"ArangoDb" "ArangoDb"
], ],
"time": "2022-10-25T20:16:30+00:00" "support": {
"email": "arsen@mirzaev.sexy",
"issues": "https://git.mirzaev.sexy/mirzaev/arangodb/issues",
"wiki": "https://git.mirzaev.sexy/mirzaev/arangodb/manual"
},
"funding": [
{
"url": "https://fund.mirzaev.sexy",
"type": "funding"
}
],
"time": "2022-11-06T00:03:56+00:00"
}, },
{ {
"name": "mirzaev/minimal", "name": "mirzaev/minimal",
"version": "2.0.x-dev", "version": "2.0.x-dev",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://git.hood.su/mirzaev/minimal", "url": "https://git.mirzaev.sexy/mirzaev/minimal",
"reference": "7777d7af1733d661a36551a0fdcf27a972e4ef81" "reference": "1f5685a20d41c1c11742f33138764b835ddd0198"
}, },
"require": { "require": {
"php": "~8.0" "php": "~8.1"
}, },
"suggest": { "suggest": {
"ext-PDO": "Для работы с базами данных на SQL (MySQL, PostreSQL...)" "ext-PDO": "To work with SQL-based databases (MySQL, PostreSQL...)"
}, },
"type": "framework", "type": "framework",
"autoload": { "autoload": {
@ -510,36 +527,39 @@
"role": "Developer" "role": "Developer"
} }
], ],
"description": "Легковесный MVC фреймворк который следует твоим правилам, а не диктует свои", "description": "Lightweight MVC framework that manages only the basic mechanisms, leaving the development of the programmer and not overloading the project",
"homepage": "https://git.hood.su/mirzaev/minimal", "homepage": "https://git.mirzaev.sexy/mirzaev/minimal",
"keywords": [ "keywords": [
"framework", "framework",
"mvc" "mvc"
], ],
"support": { "support": {
"docs": "https://git.hood.su/mirzaev/minimal/manual", "docs": "https://git.mirzaev.sexy/mirzaev/minimal/wiki",
"issues": "https://git.hood.su/mirzaev/minimal/issues" "issues": "https://git.mirzaev.sexy/mirzaev/minimal/issues"
}, },
"time": "2022-03-03T21:15:52+00:00" "time": "2022-11-03T06:09:32+00:00"
}, },
{ {
"name": "mirzaev/vk", "name": "mirzaev/vk",
"version": "4.0.1", "version": "4.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://git.hood.su/mirzaev/vk", "url": "https://git.mirzaev.sexy/mirzaev/vk",
"reference": "850a4bbd8ef6ba232c0e810eba5f118345a862fa" "reference": "39d13d9020c41d03f389254a4c2cda97cb61b8de"
}, },
"require": { "require": {
"guzzlehttp/guzzle": "~7.5", "guzzlehttp/guzzle": "^7.5",
"jasny/error-handler": "~0.2", "jasny/error-handler": "^0.2",
"mirzaev/accounts": "~1.2.x-dev", "mirzaev/accounts": "^1.2.0",
"monolog/monolog": "~1.6", "monolog/monolog": "^1.6",
"php": "~8.1", "php": "^8.1",
"psr/log": "~1.0" "psr/log": "^1.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~9.5" "phpunit/phpunit": "^9.5"
},
"suggest": {
"ext-sodium": "Can be selected in some conditions to increase security"
}, },
"type": "framework", "type": "framework",
"autoload": { "autoload": {
@ -555,21 +575,21 @@
{ {
"name": "Arsen Mirzaev Tatyano-Muradovich", "name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy", "email": "arsen@mirzaev.sexy",
"homepage": "https://hood.su/mirzaev", "homepage": "https://mirzaev.sexy/mirzaev",
"role": "Programmer" "role": "Programmer"
} }
], ],
"description": "Фреймворк VK API", "description": "Framework for vk.com API",
"homepage": "https://git.hood.su/mirzaev/vk", "homepage": "https://git.mirzaev.sexy/mirzaev/vk",
"keywords": [ "keywords": [
"api", "api",
"vk" "vk"
], ],
"support": { "support": {
"docs": "https://git.hood.su/mirzaev/vk/manual", "docs": "https://git.mirzaev.sexy/mirzaev/vk/wiki",
"issues": "https://git.hood.su/mirzaev/vk/issues" "issues": "https://git.mirzaev.sexy/mirzaev/vk/issues"
}, },
"time": "2022-10-23T17:22:42+00:00" "time": "2022-11-10T13:15:06+00:00"
}, },
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
@ -913,16 +933,16 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.1.1", "version": "v3.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
"reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -931,7 +951,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.1-dev" "dev-main": "3.3-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@ -960,7 +980,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
}, },
"funding": [ "funding": [
{ {
@ -976,20 +996,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-25T11:15:52+00:00" "time": "2022-11-25T10:21:52+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.26.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
"reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1004,7 +1024,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.26-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -1042,7 +1062,7 @@
"portable" "portable"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@ -1058,20 +1078,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-05-24T11:49:31+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.26.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1086,7 +1106,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "1.26-dev" "dev-main": "1.27-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
@ -1125,7 +1145,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@ -1141,7 +1161,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-05-24T11:49:31+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "triagens/arangodb", "name": "triagens/arangodb",
@ -1149,12 +1169,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/arangodb/arangodb-php.git", "url": "https://github.com/arangodb/arangodb-php.git",
"reference": "de14fbcf8390e3ae1e706c52695386218eeba151" "reference": "21c460dbbd75eb5c066f9abcc3a9adf4487d6e48"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/arangodb/arangodb-php/zipball/de14fbcf8390e3ae1e706c52695386218eeba151", "url": "https://api.github.com/repos/arangodb/arangodb-php/zipball/21c460dbbd75eb5c066f9abcc3a9adf4487d6e48",
"reference": "de14fbcf8390e3ae1e706c52695386218eeba151", "reference": "21c460dbbd75eb5c066f9abcc3a9adf4487d6e48",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1202,20 +1222,20 @@
"issues": "https://github.com/arangodb/arangodb-php/issues", "issues": "https://github.com/arangodb/arangodb-php/issues",
"source": "https://github.com/arangodb/arangodb-php/tree/3.9" "source": "https://github.com/arangodb/arangodb-php/tree/3.9"
}, },
"time": "2022-02-03T09:42:22+00:00" "time": "2022-10-21T15:30:53+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.4.3", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58" "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/c38fd6b0b7f370c198db91ffd02e23b517426b58", "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15",
"reference": "c38fd6b0b7f370c198db91ffd02e23b517426b58", "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1230,7 +1250,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.4-dev" "dev-master": "3.5-dev"
} }
}, },
"autoload": { "autoload": {
@ -1266,7 +1286,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/twigphp/Twig/issues", "issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.4.3" "source": "https://github.com/twigphp/Twig/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -1278,36 +1298,36 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-28T08:42:51+00:00" "time": "2023-02-08T07:49:20+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
{ {
"name": "doctrine/instantiator", "name": "doctrine/instantiator",
"version": "1.4.1", "version": "2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/instantiator.git", "url": "https://github.com/doctrine/instantiator.git",
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
"reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^8.1"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9", "doctrine/coding-standard": "^11",
"ext-pdo": "*", "ext-pdo": "*",
"ext-phar": "*", "ext-phar": "*",
"phpbench/phpbench": "^0.16 || ^1", "phpbench/phpbench": "^1.2",
"phpstan/phpstan": "^1.4", "phpstan/phpstan": "^1.9.4",
"phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-phpunit": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^9.5.27",
"vimeo/psalm": "^4.22" "vimeo/psalm": "^5.4"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -1334,7 +1354,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/instantiator/issues", "issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.1" "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
}, },
"funding": [ "funding": [
{ {
@ -1350,7 +1370,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-03-03T08:28:38+00:00" "time": "2022-12-30T00:23:10+00:00"
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
@ -1413,16 +1433,16 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.15.1", "version": "v4.15.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
"reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1463,9 +1483,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3"
}, },
"time": "2022-09-04T07:30:47+00:00" "time": "2023-01-16T22:05:37+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
@ -1580,16 +1600,16 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.17", "version": "9.2.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed",
"reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1645,7 +1665,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24"
}, },
"funding": [ "funding": [
{ {
@ -1653,7 +1673,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-08-30T12:24:04+00:00" "time": "2023-01-26T08:26:55+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -1898,20 +1918,20 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.5.25", "version": "9.6.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555",
"reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/instantiator": "^1.3.1", "doctrine/instantiator": "^1.3.1 || ^2",
"ext-dom": "*", "ext-dom": "*",
"ext-json": "*", "ext-json": "*",
"ext-libxml": "*", "ext-libxml": "*",
@ -1949,7 +1969,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "9.5-dev" "dev-master": "9.6-dev"
} }
}, },
"autoload": { "autoload": {
@ -1980,7 +2000,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3"
}, },
"funding": [ "funding": [
{ {
@ -1996,7 +2016,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-09-25T03:44:45+00:00" "time": "2023-02-04T13:37:15+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -2364,16 +2384,16 @@
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
"version": "5.1.4", "version": "5.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/environment.git", "url": "https://github.com/sebastianbergmann/environment.git",
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2415,7 +2435,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/environment/issues", "issues": "https://github.com/sebastianbergmann/environment/issues",
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
}, },
"funding": [ "funding": [
{ {
@ -2423,7 +2443,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-04-03T09:37:03+00:00" "time": "2023-02-03T06:03:51+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
@ -2737,16 +2757,16 @@
}, },
{ {
"name": "sebastian/recursion-context", "name": "sebastian/recursion-context",
"version": "4.0.4", "version": "4.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git", "url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2785,10 +2805,10 @@
} }
], ],
"description": "Provides functionality to recursively process PHP variables", "description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context", "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues", "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
}, },
"funding": [ "funding": [
{ {
@ -2796,7 +2816,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-10-26T13:17:30+00:00" "time": "2023-02-03T06:07:39+00:00"
}, },
{ {
"name": "sebastian/resource-operations", "name": "sebastian/resource-operations",
@ -2855,16 +2875,16 @@
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "3.2.0", "version": "3.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2899,7 +2919,7 @@
"homepage": "https://github.com/sebastianbergmann/type", "homepage": "https://github.com/sebastianbergmann/type",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.2.0" "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
}, },
"funding": [ "funding": [
{ {
@ -2907,7 +2927,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-09-12T14:47:03+00:00" "time": "2023-02-03T06:13:03+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
@ -3023,8 +3043,8 @@
"prefer-stable": false, "prefer-stable": false,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": "~8.1", "php": "~8.2",
"ext-sodium": "~8.1" "ext-sodium": "~8.2"
}, },
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "2.3.0" "plugin-api-version": "2.3.0"

View 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;
}
}

View File

@ -2,15 +2,15 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus\controllers; namespace mirzaev\site\rules\controllers;
// Файлы проекта // Файлы проекта
use mirzaev\site\virus\controllers\core; use mirzaev\site\rules\controllers\core;
/** /**
* Контроллер ошибок * Контроллер ошибок
* *
* @package mirzaev\site\virus\controllers * @package mirzaev\site\rules\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class error_controller extends core final class error_controller extends core

View File

@ -2,15 +2,15 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus\controllers; namespace mirzaev\site\rules\controllers;
// Файлы проекта // Файлы проекта
use mirzaev\site\virus\controllers\core; use mirzaev\site\rules\controllers\core;
/** /**
* Контроллер бегущей строки * Контроллер бегущей строки
* *
* @package mirzaev\site\virus\controllers * @package mirzaev\site\rules\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class hotline_controller extends core final class hotline_controller extends core

View File

@ -2,15 +2,15 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus\controllers; namespace mirzaev\site\rules\controllers;
// Файлы проекта // Файлы проекта
use mirzaev\site\virus\controllers\core; use mirzaev\site\rules\controllers\core;
/** /**
* Контроллер основной страницы * Контроллер основной страницы
* *
* @package mirzaev\site\virus\controllers * @package mirzaev\site\rules\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class index_controller extends core final class index_controller extends core

View File

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus\models; namespace mirzaev\site\rules\models;
use mirzaev\minimal\model; use mirzaev\minimal\model;
@ -13,36 +13,11 @@ use exception;
/** /**
* Ядро моделей * Ядро моделей
* *
* @package mirzaev\site\virus\models * @package mirzaev\site\rules\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
class core extends model class core extends model
{ {
/**
* Коллекция в которой хранятся аккаунты
*/
public const SETTINGS = '../settings/arangodb.php';
/**
* Соединение с базой данных
*/
protected static connection $db;
public function __construct(connection $db = null)
{
if (isset($db)) {
// Получена инстанция соединения с базой данных
// Запись и инициализация соединения с базой данных
$this->__set('db', $db);
} else {
// Не получена инстанция соединения с базой данных
// Инициализация соединения с базой данных по умолчанию
$this->__get('db');
}
}
/** /**
* Записать свойство * Записать свойство
* *
@ -136,7 +111,6 @@ class core extends model
public static function __callStatic(string $name, array $arguments): mixed public static function __callStatic(string $name, array $arguments): mixed
{ {
match ($name) { match ($name) {
'db' => (new static)->__get('db'),
default => throw new exception("Не найдено свойство или функция: $name", 500) default => throw new exception("Не найдено свойство или функция: $name", 500)
}; };
} }

View File

@ -0,0 +1,131 @@
@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;
}
div#wrap {
margin-left: 50vw;
position: relative;
display: flex;
}
div#wrap>img#masha {
z-index: 1500;
width: 333px;
height: 394px;
}
div#wrap>img#hand{
z-index: 500;
left: -30px;
bottom: -10px;
width: 70px;
height: 88px;
position: absolute;
display: flex;
}
div#wrap>img#knife {
z-index: 100500;
left: calc(-112px + 70px - 40px);
bottom: calc(-273px + 88px + 30px);
width: 112px;
height: 273px;
position: absolute;
}
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;
}

View File

Before

Width:  |  Height:  |  Size: 552 B

After

Width:  |  Height:  |  Size: 552 B

View File

Before

Width:  |  Height:  |  Size: 328 B

After

Width:  |  Height:  |  Size: 328 B

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 537 B

View File

Before

Width:  |  Height:  |  Size: 825 B

After

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 397 KiB

View File

Before

Width:  |  Height:  |  Size: 295 KiB

After

Width:  |  Height:  |  Size: 295 KiB

View File

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus; namespace mirzaev\site\rules;
use mirzaev\minimal\core; use mirzaev\minimal\core;
use mirzaev\minimal\router; use mirzaev\minimal\router;
@ -24,9 +24,6 @@ $router = new router;
// Запись маршрутов // Запись маршрутов
$router->write('/', 'index', 'index'); $router->write('/', 'index', 'index');
$router->write('/system/hotline', 'hotline', 'index'); $router->write('/system/hotline', 'hotline', 'index');
$router->write('/account/initialization', 'account', 'initialization', 'PUT');
$router->write('/account/vk/connect', 'account', 'connect');
$router->write('/account/panel', 'account', 'panel');
// Инициализация ядра // Инициализация ядра
$core = new core(namespace: __NAMESPACE__, router: $router); $core = new core(namespace: __NAMESPACE__, router: $router);

View File

@ -3,7 +3,7 @@
class account { class account {
static async initialization() { static async initialization() {
// Запрос // Запрос
return fetch('https://virus.mirzaev.sexy/account/initialization', { return fetch('https://rules.mirzaev.sexy/account/initialization', {
method: 'PUT' method: 'PUT'
}); });
} }
@ -52,8 +52,8 @@ class account {
// Открытие окна с аунтентификацией ВКонтакте // Открытие окна с аунтентификацией ВКонтакте
window.vk = window.open( window.vk = window.open(
'https://oauth.vk.com/authorize?client_id=51447080&redirect_uri=https://virus.mirzaev.sexy/account/vk/connect&display=popup&response_type=code&scope=4521990&state=' + response.headers.get('session'), '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'),
'virus_vk', 'rules_vk',
'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',resizable=no,status=no,toolbar=no,menubar=no,scrollbars=no,location=no,directories=no' 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',resizable=no,status=no,toolbar=no,menubar=no,scrollbars=no,location=no,directories=no'
); );
@ -91,7 +91,7 @@ class account {
if (shell instanceof HTMLElement) { if (shell instanceof HTMLElement) {
// Получены обязательные входные параметры // Получены обязательные входные параметры
fetch('https://virus.mirzaev.sexy/account/panel', { fetch('https://rules.mirzaev.sexy/account/panel', {
method: 'GET' method: 'GET'
}).then( }).then(
(response) => { (response) => {
@ -116,7 +116,7 @@ class account {
if (shell instanceof HTMLElement) { if (shell instanceof HTMLElement) {
// Получены обязательные входные параметры // Получены обязательные входные параметры
fetch('https://virus.mirzaev.sexy/account/panel', { fetch('https://rules.mirzaev.sexy/account/panel', {
method: 'GET' method: 'GET'
}).then( }).then(
(response) => { (response) => {

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,5 +1,5 @@
{% block title %} {% block title %}
<title>{% if head.title != empty %}{{head.title}}{% else %}Скачать вирусы бесплатно{% endif %}</title> <title>{% if head.title != empty %}{{head.title}}{% else %}Правила беседы{% endif %}</title>
{% endblock %} {% endblock %}
{% block meta %} {% block meta %}

View 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 %}

View File

@ -3,24 +3,22 @@
{% use "core.html" with css as core_css, body as core_body, js as core_js, js_init as core_js_init %} {% 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 "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 %} {% use "header.html" with css as header_css, body as header_body, js as header_js, js_init as header_js_init %}
{% use "aside.html" with css as aside_css, body as aside_body, js as aside_js, js_init as aside_js_init %}
{% block css %} {% block css %}
{{ block('core_css') }} {{ block('core_css') }}
{{ block('trolling_css') }} {{ block('trolling_css') }}
{{ block('header_css') }} {{ block('header_css') }}
{{ block('aside_css') }}
{% endblock %} {% endblock %}
{% block body %} {% block body %}
{{ block('core_body') }} {{ block('core_body') }}
{{ block('trolling_body') }} {{ block('trolling_body') }}
{{ block('aside_body') }}
{{ block('header_body') }} {{ block('header_body') }}
<main> <main>
<noscript>К сожалению мой сайт ещё пока не готов для работы без javascript</noscript> <noscript>К сожалению мой сайт ещё пока не готов для работы без javascript</noscript>
{% block main %} {% block main %}
{% include 'rules.html' %}
{% endblock %} {% endblock %}
</main> </main>
@ -31,11 +29,9 @@
{{ block('core_js') }} {{ block('core_js') }}
{{ block('trolling_js') }} {{ block('trolling_js') }}
{{ block('header_js') }} {{ block('header_js') }}
{{ block('aside_js') }}
{% endblock %} {% endblock %}
{% block js_init %} {% block js_init %}
{{ block('core_js_init') }} {{ block('core_js_init') }}
{{ block('header_js_init') }} {{ block('header_js_init') }}
{{ block('aside_js_init') }}
{% endblock %} {% endblock %}

View File

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace mirzaev\site\virus\views; namespace mirzaev\site\rules\views;
use mirzaev\minimal\controller; use mirzaev\minimal\controller;
@ -12,7 +12,7 @@ use Twig\Environment as view;
/** /**
* Менеджер представлений * Менеджер представлений
* *
* @package mirzaev\site\virus\controllers * @package mirzaev\site\rules\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy> * @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/ */
final class manager extends controller final class manager extends controller

View File

@ -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>

View File

@ -1,147 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\virus\controllers;
// Файлы проекта
use mirzaev\site\virus\controllers\core;
use mirzaev\site\virus\models\account_model as account;
use mirzaev\site\virus\models\session_model as session;
use mirzaev\site\virus\models\vk_model as vk;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
use SebastianBergmann\Type\ObjectType;
use stdClass;
// Фреймворк для ВКонтакте
use mirzaev\vk\core as api;
/**
* Контроллер аккаунтов
*
* @package mirzaev\site\virus\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class account_controller extends core
{
/**
* Страница профиля
*
* @param array $parameters Параметры запроса
*/
public function index(array $parameters = []): ?string
{
return null;
}
/**
* Инициализация
*
* @param array $parameters Параметры запроса
*/
public function initialization(array $parameters = []): ?string
{
if ($this->variables['account'] instanceof _document) {
// Найден аккаунт
if ($this->variables['vk'] instanceof _document) {
// Найден аккаунт ВКонтакте
// Инициализация данных аккаунта ВКонтакте
vk::parse($this->variables['vk'], $this->variables['errors']['vk']);
}
// Запись кода ответа
http_response_code(200);
return null;
} else {
// Не найден аккаунт
// Запись кода ответа
http_response_code(401);
// Запись заголовка ответа с ключом аккаунта
header('session: ' . $this->variables['session']->hash);
return null;
}
// Запись кода ответа
http_response_code(500);
return null;
}
/**
* Связь аккаунта с аккаунтом ВКонтакте
*
* @param array $parameters Параметры запроса
*/
public function connect(array $parameters = []): ?string
{
if ($this->variables['session']->hash === $parameters['state']) {
// Совпадает хеш сессии с полученным хешем из ответа ВКонтакте
if (!empty($response = vk::key($parameters['code'], $this->variables['errors']['vk']))) {
// Получены данные аккаунта ВКонтакте
if (($this->variables['vk'] = vk::initialization($response, $this->variables['errors']['vk'])) instanceof _document) {
// Инициализирован аккаунт ВКонтакте
if (($this->variables['account'] = vk::account($this->variables['vk'])) instanceof _document) {
// Найден аккаунт (существующий)
if (session::connect($this->variables['session'], $this->variables['account'], $this->variables['errors']['session'])) {
// Связана сессия с аккаунтом
}
} else if (($this->variables['account'] = account::create($this->variables['errors']['account'])) instanceof _document) {
// Найден аккаунт (создан новый)
if (session::connect($this->variables['session'], $this->variables['account'], $this->variables['errors']['session'])) {
// Связана сессия с аккаунтом
if (account::connect($this->variables['account'], $this->variables['vk'], $this->variables['errors']['account'])) {
// Связан аккаунт с аккаунтом ВКонтакте
}
}
}
// Инициализация робота для аккаунта ВКонтакте
$this->vk = api::init()->user(key: $this->variables['vk']->access['key']);
if ($this->variables['vk'] instanceof _document) {
// Инициализирован робот для аккаунта ВКонтакте
// Инициализация данных аккаунта ВКонтакте
$data = vk::parse($this->vk, $this->variables['errors']['vk']);
var_dump($data); die;
if ($data instanceof stdClass) {
// Получены данные ВКонтакте
// Запись в базу данных
vk::update($this->variables['vk'], $data, $this->variables['errors']['vk']);
}
}
}
}
}
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'account' . DIRECTORY_SEPARATOR . 'vk.html', $this->variables);
}
/**
* Генерация панели аккаунта
*
* @param array $parameters Параметры запроса
*/
public function panel(array $parameters = []): ?string
{
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'account' . DIRECTORY_SEPARATOR . 'panel.html', $this->variables);
}
}

View File

@ -1,100 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\virus\controllers;
// Файлы проекта
use mirzaev\site\virus\views\manager;
use mirzaev\site\virus\models\core as models;
use mirzaev\site\virus\models\account_model as account;
use mirzaev\site\virus\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\virus\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'] = [
'session' => [],
'account' => [],
'vk' => []
];
// Инициализация даты до которой будет активна сессия
$expires = time() + 604800;
// Инициализация сессии (без журналирования)
$this->variables['session'] = session::initialization($_COOKIE["session"] ?? null, $expires) ?? header('Location: https://virus.mirzaev.sexy/error?code=500&text=Не+удалось+инициализировать+сессию');
if ($_COOKIE["session"] ?? null !== $this->variables['session']->hash) {
// Изменился хеш сессии (подразумевается, что сессия устарела)
// Запись хеша новой сессии
setcookie('session', $this->variables['session']->hash, [
'expires' => $expires,
'domain' => 'virus.mirzaev.sexy',
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'strict'
]);
}
// Инициализация аккаунта (без журналирования)
$this->variables['account'] = session::account($this->variables['session']);
if ($this->variables['account'] instanceof _document) {
// Инициализирован аккаунт
// Инициализация аккаунта ВКонтакте (без журналирования)
$this->variables['vk'] = account::vk($this->variables['account']);
if ($this->variables['vk'] instanceof _document) {
// Инициализирован аккаунт ВКонтакте
// Инициализация робота для аккаунта ВКонтакте
$this->vk = vk::init()->user(key: $this->variables['vk']->access['key']);
} else unset($this->variables['account'], $this->variables['vk']);
}
// Инициализация препроцессора представления
$this->view = new manager;
}
}

View File

@ -1,169 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\virus\models;
// Файлы проекта
use mirzaev\site\virus\models\vk_model as vk;
// Фреймворк ArangoDB
use mirzaev\arangodb\collection,
mirzaev\arangodb\document;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
// Встроенные библиотеки
use exception;
/**
* Модель регистрации, аутентификации и авторизации
*
* @package mirzaev\site\virus\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class account_model extends core
{
/**
* Коллекция
*/
public const COLLECTION = 'account';
/**
* Создать
*
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта, если удалось создать
*/
public static function create(array &$errors = []): ?_document
{
try {
if (collection::init(static::$db->session, self::COLLECTION)) {
// Инициализирована коллекция
// Запись аккаунта в базу данных
$_id = document::write(static::$db->session, self::COLLECTION);
if ($account = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d._id == '$_id'
RETURN d
AQL,
self::COLLECTION
))) {
// Найден созданный аккаунт
return $account;
} else throw new exception('Не удалось создать аккаунт');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Связь аккаунта с аккаунтом ВКонтакте
*
* @param _document $account Инстанция аккаунта
* @param _document $vk Инстанция аккаунта ВКонтакте
* @param array &$errors Журнал ошибок
*
* @return bool Статус выполнения
*/
public static function connect(_document $account, _document $vk, array &$errors = []): bool
{
try {
if (
collection::init(static::$db->session, self::COLLECTION)
&& collection::init(static::$db->session, vk::COLLECTION)
&& collection::init(static::$db->session, self::COLLECTION . '_edge_' . vk::COLLECTION, true)
) {
// Инициализированы коллекции
if (document::write(static::$db->session, self::COLLECTION . '_edge_' . vk::COLLECTION, [
'_from' => $account->getId(),
'_to' => $vk->getId()
])) {
// Создано ребро: account -> vk
return true;
} else throw new exception('Не удалось создать ребро: account -> vk');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return false;
}
/**
* Поиск связанного аккаунта ВКонтакте
*
* @param _document $account Инстанция аккаунта
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта, если удалось найти
*/
public static function vk(_document $account, array &$errors = []): ?_document
{
try {
if (
collection::init(static::$db->session, self::COLLECTION)
&& collection::init(static::$db->session, vk::COLLECTION)
&& collection::init(static::$db->session, self::COLLECTION . '_edge_' . vk::COLLECTION, true)
) {
// Инициализирована коллекция
if ($vk = collection::search(static::$db->session, sprintf(
<<<AQL
FOR document IN %s
LET edge = (
FOR edge IN %s
FILTER edge._from == '%s'
SORT edge._key DESC
LIMIT 1
RETURN edge
)
FILTER document._id == edge[0]._to
LIMIT 1
RETURN document
AQL,
vk::COLLECTION,
self::COLLECTION . '_edge_' . vk::COLLECTION,
$account->getId()
))) {
// Найден аккаунт ВКонтакте
return $vk;
} else throw new exception('Не удалось найти аккаунт ВКонтакте');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
}

View File

@ -1,213 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\virus\models;
// Файлы проекта
use mirzaev\site\virus\models\account_model as account;
// Фреймворк ArangoDB
use mirzaev\arangodb\collection,
mirzaev\arangodb\document;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
// Встроенные библиотеки
use exception;
/**
* Модель сессий
*
* @package mirzaev\site\virus\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class session_model extends core
{
/**
* Коллекция
*/
public const COLLECTION = 'session';
/**
* Инициализация
*
* @param ?string $hash Хеш сессии в базе данных
* @param ?int $expires Дата окончания работы сессии (используется при создании новой сессии)
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция сессии, если удалось найти или создать
*/
public static function initialization(?string $hash = null, ?int $expires = null, array &$errors = []): ?_document
{
try {
if (collection::init(static::$db->session, self::COLLECTION)) {
// Инициализирована коллекция
if (isset($hash) && $session = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d.hash == '$hash' && d.expires > %d
RETURN d
AQL,
self::COLLECTION,
time()
))) {
// Найдена сессия по хешу
// Возврат сессии
return $session;
} else if ($session = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d.ip == '%s' && d.expires > %d
RETURN d
AQL,
self::COLLECTION,
$_SERVER['REMOTE_ADDR'],
time()
))) {
// Найдена сессия по данным пользователя
// Возврат сессии
return $session;
} else {
// Не найдена сессия
// Запись сессии в базу данных
$_id = document::write(static::$db->session, self::COLLECTION, [
'ip' => $_SERVER['REMOTE_ADDR'],
'expires' => $expires ?? time() + 604800
]);
if ($session = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d._id == '$_id' && d.expires > %d
RETURN d
AQL,
self::COLLECTION,
time()
))) {
// Найдена созданная сессия
// Запись хеша
$session->hash = sodium_bin2hex(sodium_crypto_generichash($_id));
if (document::update(static::$db->session, $session)) {
// Записано обновление
return $session;
} else throw new exception('Не удалось записать данные сессии');
} else throw new exception('Не удалось создать или найти созданную сессию');
}
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Связь сессии с аккаунтом
*
* @param _document $session Инстанция сессии
* @param _document $account Инстанция аккаунта
* @param array &$errors Журнал ошибок
*
* @return bool Статус выполнения
*/
public static function connect(_document $session, _document $account, array &$errors = []): bool
{
try {
if (
collection::init(static::$db->session, self::COLLECTION)
&& collection::init(static::$db->session, account::COLLECTION)
&& collection::init(static::$db->session, self::COLLECTION . '_edge_' . account::COLLECTION, true)
) {
// Инициализирована коллекция
if (document::write(static::$db->session, self::COLLECTION . '_edge_' . account::COLLECTION, [
'_from' => $session->getId(),
'_to' => $account->getId()
])) {
// Создано ребро: session -> account
return true;
} else throw new exception('Не удалось создать ребро: session -> account');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return false;
}
/**
* Поиск связанного аккаунта
*
* @param _document $session Инстанция сессии
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта, если удалось найти
*/
public static function account(_document $session, array &$errors = []): ?_document
{
try {
if (
collection::init(static::$db->session, self::COLLECTION)
&& collection::init(static::$db->session, account::COLLECTION)
&& collection::init(static::$db->session, self::COLLECTION . '_edge_' . account::COLLECTION, true)
) {
// Инициализированы коллекции
if ($account = collection::search(static::$db->session, sprintf(
<<<AQL
FOR document IN %s
LET edge = (
FOR edge IN %s
FILTER edge._from == '%s'
SORT edge._key DESC
LIMIT 1
RETURN edge
)
FILTER document._id == edge[0]._to
LIMIT 1
RETURN document
AQL,
account::COLLECTION,
self::COLLECTION . '_edge_' . account::COLLECTION,
$session->getId()
))) {
// Найден аккаунт
return $account;
} else throw new exception('Не удалось найти аккаунт');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
}

View File

@ -1,555 +0,0 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\virus\models;
// Файлы проекта
use mirzaev\site\virus\models\account_model as account;
// Фреймворк ArangoDB
use mirzaev\arangodb\collection,
mirzaev\arangodb\document;
// Фреймворк ВКонтакте
use mirzaev\vk\robots\user as robot;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
// Библиотека браузера
use GuzzleHttp\Client as browser;
// Встроенные библиотеки
use exception;
use stdClass;
/**
* Модель аккаунта ВКонтакте
*
* @package mirzaev\site\virus\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class vk_model extends core
{
/**
* Коллекция
*/
public const COLLECTION = 'vk';
/**
* Инициализация
*
* @param string $response Ответ сервера ВКонтакте с данными аккаунта
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта ВКонтакте, если удалось создать
*/
public static function initialization(string $response = '', array &$errors = []): ?_document
{
try {
if (collection::init(static::$db->session, self::COLLECTION)) {
// Инициализирована коллекция
// Инициализация данных аккаунта ВКонтакте
$data = json_decode($response);
if ($account = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d.id == $data->user_id
RETURN d
AQL,
self::COLLECTION
))) {
// Найден аккаунт ВКонтакте
return $account;
} else {
// Не найден аккаунт ВКонтакте
return self::create($response, $errors);
}
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Создание
*
* @param string $response Ответ сервера ВКонтакте с данными аккаунта
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта ВКонтакте, если удалось создать
*/
public static function create(string $response = '', array &$errors = []): ?_document
{
try {
if (collection::init(static::$db->session, self::COLLECTION)) {
// Инициализирована коллекция
// Запись аккаунта в базу данных
$_id = document::write(static::$db->session, self::COLLECTION);
if ($account = collection::search(static::$db->session, sprintf(
<<<AQL
FOR d IN %s
FILTER d._id == '$_id'
RETURN d
AQL,
self::COLLECTION
))) {
// Найден созданный аккаунт ВКонтакте
if (document::update(static::$db->session, $account)) {
// Записано обновление
// Запись данных об аккаунте ВКонтакте и возврат (bool)
return self::update($account, json_decode($response), $errors);
}
}
throw new exception('Не удалось создать аккаунт ВКонтакте');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Запросить ключ
*
* @param string $code Код полученный от ВКонтакте
* @param array &$errors Журнал ошибок
*
* @return ?string Тело ответа, если получен код ответа 200
*/
public static function key(string $code = '', array &$errors = []): ?string
{
try {
// Инициализация браузера
$browser = new browser();
// Запрос
$response = $browser->request('GET', "https://oauth.vk.com/access_token?client_id=51447080&client_secret=KYlk0nGELW0A9ds7NQi6&redirect_uri=https://virus.mirzaev.sexy/account/vk/connect&code=$code");
if ($response->getStatusCode() === 200) {
// Ответ сервера: 200
return (string) $response->getBody();
} else throw new exception('Не удалось получить ключ ВКонтакте (' . $response->getStatusCode() . ')');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Поиск связанного аккаунта
*
* @param _document $vk Инстанция аккаунта ВКонтакте
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта, если удалось найти
*/
public static function account(_document $vk, array &$errors = []): ?_document
{
try {
if (
collection::init(static::$db->session, self::COLLECTION)
&& collection::init(static::$db->session, account::COLLECTION)
&& collection::init(static::$db->session, account::COLLECTION . '_edge_' . self::COLLECTION, true)
) {
// Инициализированы коллекции
if ($account = collection::search(static::$db->session, sprintf(
<<<AQL
FOR document IN %s
LET edge = (
FOR edge IN %s
FILTER edge._to == '%s'
SORT edge._key DESC
LIMIT 1
RETURN edge
)
FILTER document._id == edge[0]._from
LIMIT 1
RETURN document
AQL,
account::COLLECTION,
account::COLLECTION . '_edge_' . self::COLLECTION,
$vk->getId()
))) {
// Найден аккаунт
return $account;
} else throw new exception('Не удалось найти аккаунт');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Запрос данных аккаунта ВКонтакте с серверов ВКонтакте
*
* @param robot $vk Инстанция аккаунта ВКонтакте
* @param array &$errors Журнал ошибок
*
* @return ?stdClass Данные аккаунта ВКонтакте, если получены
*/
public static function parse(robot $vk, array &$errors = []): ?stdClass
{
try {
// Запрос к API-серверу ВКонтакте
$response = $vk->user->get(fields: [
'activities',
'about',
// 'blacklisted',
// 'blacklisted_by_me',
'books',
'bdate',
'can_be_invited_group',
'can_post',
'can_see_all_posts',
'can_see_audio',
'can_send_friend_request',
'can_write_private_message',
'career',
'common_count',
'connections',
'contacts',
'city',
'country',
'crop_photo',
'domain',
'education',
'exports',
'followers_count',
'friend_status',
'has_photo',
'has_mobile',
'home_town',
'photo_50',
'photo_100',
'photo_200',
'photo_200_orig',
'photo_400_orig',
'photo_max',
'photo_max_orig',
'sex',
'site',
'schools',
'screen_name',
'status',
'verified',
'games',
'interests',
'is_favorite',
'is_friend',
'is_hidden_from_feed',
'last_seen',
'maiden_name',
'military',
'movies',
'music',
'nickname',
'occupation',
'online',
'personal',
'photo_id',
'quotes',
'relation',
'relatives',
'timezone',
'tv',
'universities'
])[0];
if (!empty($response)) {
// Получен ответ
return $response;
}
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
/**
* Обновление данных аккаунта ВКонтакте
*
* Все файлы (аватар, например) будут скачаны на сервер
*
* @param _document $vk Инстанция аккаунта ВКонтакте
* @param stdClass $data Информация об аккаунте (self::parse() или json_decode())
* @param array &$errors Журнал ошибок
*
* @return ?_document Инстанция аккаунта ВКонтакте, если удалось обновить
*/
public static function update(_document $vk, stdClass $data, array &$errors = []): ?_document
{
try {
if (collection::init(static::$db->session, self::COLLECTION)) {
// Инициализирована коллекция
if (empty($vk->id) and isset($data->user_id) || isset($data->id)) {
// Получен идентификатор
// Запись
$vk->id = $data->user_id ?? $data->id;
// Удаление из списка необработанных
unset($data->user_id, $data->id);
} else if (empty($vk->id)) throw new exception('Не удалось найти идентификатор аккаунта ВКонтакте');
if (isset($data->access_token, $data->expires_in)) {
// Получен ключ
// Запись
$vk->access = [
'key' => $data->access_token,
'expires' => $data->expires_in
];
// Удаление из списка необработанных
unset($data->access_token, $data->expires_in);
}
// Инициализация браузера
$browser = new browser();
// Инициализация директории с обложкой
if (!file_exists($path = INDEX . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . $vk->id . DIRECTORY_SEPARATOR . 'cover' . DIRECTORY_SEPARATOR))
mkdir($path, 0775, true);
if (isset($data->photo_50)) {
// Получено изображение 50x50
if ($browser->get($data->photo_50, ['sink' => $file = "$path/50x50.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'50x50' => ($vk->cover['50x50'] ?? []) +
[
'source' => $data->photo_50,
'public' => "/storage/$vk->id/cover/50x50.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение 50x50 с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_50);
}
// Инициализация директории с обложкой
if (!file_exists($path = INDEX . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . $vk->id . DIRECTORY_SEPARATOR . 'cover' . DIRECTORY_SEPARATOR))
mkdir($path, 0775, true);
if (isset($data->photo_100)) {
// Получено изображение 100x100
if ($browser->get($data->photo_100, ['sink' => $file = "$path/100x100.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'100x100' => ($vk->cover['100x100'] ?? []) +
[
'source' => $data->photo_100,
'public' => "/storage/$vk->id/cover/100x100.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение 100x100 с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_100);
}
// Инициализация директории с обложкой
if (!file_exists($path = INDEX . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . $vk->id . DIRECTORY_SEPARATOR . 'cover' . DIRECTORY_SEPARATOR))
mkdir($path, 0775, true);
if (isset($data->photo_200)) {
// Получено изображение 200x200
if ($browser->get($data->photo_200, ['sink' => $file = "$path/200x200.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'200x200' => ($vk->cover['200x200'] ?? []) +
[
'source' => $data->photo_200,
'public' => "/storage/$vk->id/cover/200x200.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение 200x200 с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_200);
}
if (isset($data->photo_200_orig)) {
// Получено изображение 200x
if ($browser->get($data->photo_200_orig, ['sink' => $file = "$path/200x.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'200x' => ($vk->cover['200x'] ?? []) +
[
'source' => $data->photo_200_orig,
'public' => "/storage/$vk->id/cover/200x.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение 200x с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_200_orig);
}
if (isset($data->photo_400_orig)) {
// Получено изображение 400x
if ($browser->get($data->photo_400_orig, ['sink' => $file = "$path/400x.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'400x' => ($vk->cover['400x'] ?? []) +
[
'source' => $data->photo_400_orig,
'public' => "/storage/$vk->id/cover/400x.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение 400x с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_400_orig);
}
if (isset($data->photo_max)) {
// Получено изображение MAXxMAX
if ($browser->get($data->photo_max, ['sink' => $file = "$path/MAXxMAX.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'MAXxMAX' => ($vk->cover['MAXxMAX'] ?? []) +
[
'source' => $data->photo_max,
'public' => "/storage/$vk->id/cover/MAXxMAX.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение MAXxMAX с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_max);
}
if (isset($data->photo_max_orig)) {
// Получено изображение MAXx
if ($browser->get($data->photo_max_orig, ['sink' => $file = "$path/MAXx.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'MAXx' => ($vk->cover['MAXx'] ?? []) +
[
'source' => $data->photo_max_orig,
'public' => "/storage/$vk->id/cover/MAXx.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение MAXx с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_max_orig);
}
if (isset($data->crop_photo)) {
// Получено изображение MAXx
if ($browser->get($data->photo_max_orig, ['sink' => $file = "$path/MAXx.jpg"])->getStatusCode() === 200)
$vk->cover =
($vk->cover ?? []) +
[
'MAXx' => ($vk->cover['MAXx'] ?? []) +
[
'source' => $data->photo_max_orig,
'public' => "/storage/$vk->id/cover/MAXx.jpg",
'local' => $file,
]
];
else throw new exception('Не удалось получить изображение MAXx с серверов ВКонтакте');
// Удаление из списка необработанных
unset($data->photo_max_orig);
}
// Перебор оставшихся параметров
foreach ($data as $key => $value) $vk->{$key} = $value;
if (document::update(static::$db->session, $vk)) {
// Записано обновление
return $vk;
} else throw new exception('Не удалось записать данные аккаунта ВКонтакте');
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в журнал ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
}

View File

@ -1,165 +0,0 @@
@import url('/fonts/comissioner.ttf');
@media (prefers-color-scheme: light) {
:root {
--background: #eee;
--text : 'dark';
}
}
@media (prefers-color-scheme: dark) {
:root {
--background-light-3: #403939;
--background-light-2: #322d2d;
--background-light-1: #2b2525;
--background-light : #252020;
--background : #221e1e;
--background-dark : ;
--text : #e6e6e6;
--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', 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 {
height : 100vh;
margin : 0;
display : grid;
grid-template-rows : 10px 200px auto 10px;
grid-template-columns: 250px auto 300px;
grid-row-gap : 20px;
grid-column-gap : 15px;
overflow: hidden;
background-color : var(--background);
}
aside {
z-index : 500;
grid-column: 1/ 4;
grid-row : 2;
overflow : hidden;
}
header {
z-index : 5000;
grid-column : 1;
grid-row : 1 / 5;
display : flex;
flex-direction: column;
box-shadow : 2px 0 5px rgba(0, 0, 0, 0.3);
}
header>menu {
margin : unset;
padding : 20px;
display : flex;
flex-direction : column;
flex-grow : 1;
background-color: var(--background-light-1);
}
header>#account>button#login {
z-index : 1500;
}
header>menu a {
margin-bottom: 8px;
display : flex;
align-items : center;
}
header>menu a:last-child {
margin-bottom: unset;
}
header>menu a svg {
margin-right: 8px;
height : 1.2rem;
position : relative;
}
header>menu a:hover svg {
margin-left : -5px;
margin-right: 13px;
}
header>menu a svg path {
fill: var(--text);
}
header>section {
background-color: var(--background-light-1);
}
header :is(button, a[type="button"]) {
width : 100%;
height : 40px;
display : flex;
justify-content : center;
align-items : center;
cursor : pointer;
background-color: var(--red);
transition : unset;
}
header button {
font-weight : bold;
text-transform: uppercase;
}
header :is(button, a[type="button"]):hover {
background-color: var(--red-light);
}
header :is(button, a[type="button"]):active {
background-color: var(--red-dark);
}
header>nav {
margin-top : auto;
display : flex;
flex-direction: column;
}
main {
z-index : 1000;
grid-column: 2;
grid-row : 3;
}
footer {
z-index : 3000;
grid-column: 3;
grid-row : 1 / 5;
}

View File

@ -1 +0,0 @@
arangodb.php

View File

@ -1,8 +0,0 @@
<?php
return [
'endpoint' => 'unix:///var/run/arangodb3/arango.sock',
'database' => '',
'name' => '',
'password' => ''
];

View File

@ -1,22 +0,0 @@
{% use 'logo.html' with css as logo_css, body as logo_body, js as logo_js, js_init as logo_js_init %}
{% use 'account/panel.html' with body as panel_body %}
{% block css %}
{{ block('logo_css') }}
{% endblock %}
{% block body %}
<header>
{{ block('logo_body') }}
{% include 'menu.html' %}
{{ block('panel_body') }}
</header>
{% endblock %}
{% block js %}
{{ block('logo_js') }}
{% endblock %}
{% block js_init %}
{{ block('logo_js_init') }}
{% endblock %}

16
psalm.xml Normal file
View 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>