3 Commits
0.6.0 ... 1.0.1

Author SHA1 Message Date
16b0361268 submodules fix 2026-04-19 12:58:59 +05:00
5a7edafee2 created 2026-04-19 12:39:16 +05:00
c631428699 dots replaced with three.js shader 2026-01-08 18:04:40 +05:00
291 changed files with 8193 additions and 1645 deletions

10
.gitmodules vendored
View File

@@ -2,11 +2,15 @@
path = hotline.mjs path = hotline.mjs
url = https://git.svoboda.works/mirzaev/hotline.mjs url = https://git.svoboda.works/mirzaev/hotline.mjs
branch = stable branch = stable
[submodule "womb3-simplex.mjs"] [submodule "damper.mjs"]
path = womb3-simplex.mjs path = damper.mjs
url = https://git.svoboda.works/mirzaev/womb3-simplex.mjs url = https://git.svoboda.works/mirzaev/damper.mjs.git
branch = stable branch = stable
[submodule "icons"] [submodule "icons"]
path = icons path = icons
url = https://git.svoboda.works/mirzaev/icons url = https://git.svoboda.works/mirzaev/icons
branch = stable branch = stable
[submodule "womb3-simplex.mjs"]
path = womb3-simplex.mjs
url = https://git.svoboda.works/mirzaev/womb3-simplex.mjs
branch = stable

View File

@@ -25,12 +25,14 @@
}, },
"require": { "require": {
"php": "^8.5", "php": "^8.5",
"ext-blake3": "^0.1",
"mirzaev/minimal": "^3.8", "mirzaev/minimal": "^3.8",
"mirzaev/baza": "^3.4", "mirzaev/baza": "^3.4",
"mirzaev/languages": "^1", "mirzaev/languages": "^1",
"twig/twig": "^3.2", "twig/twig": "^3.2",
"twig/extra-bundle": "^3.7", "twig/extra-bundle": "^3.7",
"twig/intl-extra": "^3.10" "twig/intl-extra": "^3.10",
"phpmailer/phpmailer": "^7.0"
}, },
"suggest": { "suggest": {
"mirzaev/files": "Easy working with files", "mirzaev/files": "Easy working with files",

508
composer.lock generated

File diff suppressed because it is too large Load Diff

1
damper.mjs Submodule

Submodule damper.mjs added at 81d208b964

View File

@@ -8,16 +8,22 @@ if [ -d author ]; then
mv author kodorvan mv author kodorvan
fi fi
if [ -e kodorvan/perm/system/settings/*.sample ]; then for i in kodorvan/perm/system/settings/*.sample; do
for i in kodorvan/perm/system/settings/*.sample; do echo $i;
cp "$i" "${i/.sample/}"; if [ ! -f "${i/.sample/}" ]; then
done cp -n "$i" "${i/.sample/}";
fi echo ${i/.sample/};
fi
done
if ! [ -d kodorvan/perm/system/public/js/modules ]; then if ! [ -d kodorvan/perm/system/public/js/modules ]; then
mkdir kodorvan/perm/system/public/js/modules -p mkdir kodorvan/perm/system/public/js/modules -p
fi fi
if ! [ -L kodorvan/perm/system/public/js/modules/damper.mjs ]; then
ln -s ../../../../../../damper.mjs/damper.mjs kodorvan/perm/system/public/js/modules/damper.mjs;
fi
if ! [ -L kodorvan/perm/system/public/js/modules/hotline.mjs ]; then if ! [ -L kodorvan/perm/system/public/js/modules/hotline.mjs ]; then
ln -s ../../../../../../hotline.mjs/hotline.mjs kodorvan/perm/system/public/js/modules/hotline.mjs; ln -s ../../../../../../hotline.mjs/hotline.mjs kodorvan/perm/system/public/js/modules/hotline.mjs;
fi fi

View File

@@ -65,7 +65,7 @@ final class index extends core
'buttons' => [ 'buttons' => [
[ [
'icon' => 'comment', 'icon' => 'comment',
'link' => '' 'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=telegram voronka'
] ]
], ],
'theses' => [ 'theses' => [
@@ -88,7 +88,8 @@ final class index extends core
], ],
'background_image_src' => '/themes/default/images/telegram_voronka.png', 'background_image_src' => '/themes/default/images/telegram_voronka.png',
'background_image_alt' => 'Телеграм воронка КОДОРВАНЬ', 'background_image_alt' => 'Телеграм воронка КОДОРВАНЬ',
'cost' => '2000' 'cost' => '2000',
'canceled' => 'ЗАБЛОКИРОВАН'
], ],
[ [
'class' => 'parser', 'class' => 'parser',
@@ -115,7 +116,8 @@ final class index extends core
'buttons' => [ 'buttons' => [
[ [
'icon' => 'comment', 'icon' => 'comment',
'link' => '' /* 'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=parser' */
'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=parser'
] ]
], ],
'theses' => [ 'theses' => [
@@ -156,7 +158,7 @@ final class index extends core
'buttons' => [ 'buttons' => [
[ [
'icon' => 'comment', 'icon' => 'comment',
'link' => '' 'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=calculator'
] ]
], ],
'theses' => [ 'theses' => [
@@ -187,8 +189,89 @@ final class index extends core
// Sending the cookie with the team workload (1800 = 30min) // Sending the cookie with the team workload (1800 = 30min)
setcookie('workload', $this->view->workload, time() + 1800, '/'); setcookie('workload', $this->view->workload, time() + 1800, '/');
// Initializing the project constructor data
$this->view->project = [
'architectures' => [
'site' => 'Сайт',
'chat_robot' => 'Чат-робот',
'program' => 'Программа',
'module' => 'Модуль',
'parser' => 'Парсер',
'script' => 'Скрипт',
'game' => 'Видеоигра',
/* 'site' => 'Сайты и браузерные расширения',
'chat_robot' => 'Чат-роботы (любой мессенджер)',
'program' => 'Программа (Android, iOS, Windows)',
'module' => 'Модуль для любой программы',
'parser' => 'Парсер данных API, HTTP и эмуляция',
'script' => 'Скрипт (автоматизация процессов)',
'game' => 'Видеоигра (Android, iOS, Windows)' */
],
'purposes' => [
'funnel' => 'Воронка',
'contacts' => 'Контакты',
'neural_network' => 'Нейросети',
'gallery' => 'Галерея',
'crm' => 'CRM',
'landing' => 'Лендинг',
'marketplace' => 'Маркетплейс',
'search' => 'Поиск',
'calculate' => 'Расчёты',
'logic' => 'Логика',
'game' => 'Игра',
'special' => 'Особенный',
],
'integrations' => [
'one_c' => '1C',
'bitrix24' => 'Битрикс24',
'moy_sklad' => 'Мой Склад',
'telegram' => 'Телеграм',
'mail' => 'Почта',
'excel' => 'Excel'
]
];
// Initializing contacts data
$this->view->contacts = [
'sim' => [
'requests' => [
'full' => PROJECT_CONTACTS_SIM_REQUESTS ?? 'Ошибка',
'country' => PROJECT_CONTACTS_SIM_REQUESTS_COUNTRY ?? 'Ошибка',
'operator' => PROJECT_CONTACTS_SIM_REQUESTS_OPERATOR ?? 'Ошибка',
'number' => [
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_1 ?? 'Ошибка',
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_2 ?? 'Ошибка',
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_3 ?? 'Ошибка'
]
]
]
];
// Initializing contacts data
$this->view->integrations = [
'Мой Склад' => 'moy_sklad',
'1С Предприятие' => '1c',
'Битрикс 24' => 'bitrix24',
'ВКонтакте' => 'vk',
'МАКС' => 'max',
/* 'yandex_direct', */
'Яндекс Директ' => 'yandex_market',
'ОЗОН' => 'ozon',
'Вайлдберриз' => 'wildberries',
'Авито' => 'avito',
'YClients' => 'yclients',
'ЮКасса' => 'yookassa',
'OpenAI' => 'openai'
];
// Render page // Render page
$page = $this->view->render('main/index.html'); $page = $this->view->render(
'main/index.html',
[
'smartphone' => $this->request->smartphone,
'tablet' => $this->request->tablet
]
);
// Sending response // Sending response
$this->response $this->response

View File

@@ -0,0 +1,92 @@
<?php
declare(strict_types=1);
namespace kodorvan\perm\controllers;
// Files of the project
use kodorvan\perm\controllers\core;
// Framework for PHP
use mirzaev\minimal\http\enumerations\content,
mirzaev\minimal\http\enumerations\status;
/**
* Offer
*
* @package kodorvan\perm\controllers
*
* @param array $errors Registry of errors
*
* @method null index() Main page
*
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class offer extends core
{
/**
* Errors
*
* @var array $errors Registry of errors
*/
protected array $errors = [
'system' => []
];
/**
* Page: offer
*
* @return null
*/
public function index(): null
{
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
// Request for HTML response
// Initializing contacts data
$this->view->contacts = [
'sim' => [
'requests' => [
'full' => PROJECT_CONTACTS_SIM_REQUESTS ?? 'Ошибка',
'country' => PROJECT_CONTACTS_SIM_REQUESTS_COUNTRY ?? 'Ошибка',
'operator' => PROJECT_CONTACTS_SIM_REQUESTS_OPERATOR ?? 'Ошибка',
'number' => [
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_1 ?? 'Ошибка',
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_2 ?? 'Ошибка',
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_3 ?? 'Ошибка'
]
]
]
];
// Render page
$page = $this->view->render(
'main/offer.html',
[
'smartphone' => $this->request->smartphone,
'tablet' => $this->request->tablet
]
);
// Sending response
$this->response
->start()
->clean()
->sse()
->write($page)
->validate($this->request)
?->body()
->end();
// Deinitializing rendered page
unset($page);
// Exit (success)
return null;
}
// Exit (fail)
return null;
}
}

View File

@@ -0,0 +1,126 @@
<?php
declare(strict_types=1);
namespace kodorvan\perm\controllers;
// Files of the project
use kodorvan\perm\controllers\core;
// PHP framework
use mirzaev\minimal\http\enumerations\content,
mirzaev\minimal\http\enumerations\status;
// Mail server
use PHPMailer\PHPMailer\PHPMailer as mail,
PHPMailer\PHPMailer\SMTP as smtp,
PHPMailer\PHPMailer\Exception as mail_exception;
/**
* Index
*
* @package kodorvan\perm\controllers
*
* @param array $errors Registry of errors
*
* @method null index() Main page
*
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class project extends core
{
/**
* Errors
*
* @var array $errors Registry of errors
*/
protected array $errors = [
'system' => []
];
/**
*
*
* @return null
*/
public function request(string $request): null
{
// Initializing the project identifier (temporary solution)
$identifier = blake3($request, 20);
// Initializing the project storage path
$path = STORAGE . DIRECTORY_SEPARATOR . 'projects' . DIRECTORY_SEPARATOR . $identifier;
// Initializing the project storage directory in the storage
if (!file_exists($path)) mkdir($path, 0775, true);
// Declaring the project storage files registry
$files = [];
foreach ($this->request->files as $file) {
// Iterating over files
// Initializing the file destination path
$destination = $path . DIRECTORY_SEPARATOR . $file['name'];
// Writing the file into the project storage
copy($file['tmp_name'], $destination);
// Writing the file destination path into the project storage files registry
$files[$file['name']] = $destination;
}
// Decoding the request JSON argument
$request = json_decode(json: $request, associative: true, depth: 5);
// Initializing the mail server
$mail = new mail(true);
try {
// Writing the mail server parameters
/* $mail->SMTPDebug = smtp::DEBUG_SERVER; */
$mail->setLanguage('ru');
$mail->CharSet = mail::CHARSET_UTF8;
$mail->isSMTP();
$mail->Host = 'smtp.mail.ru';
$mail->SMTPAuth = true;
$mail->Username = 'system@kodorvan.tech';
$mail->Password = 'c6oQF2nY0javI312eDS0';
$mail->SMTPSecure = mail::ENCRYPTION_SMTPS;
$mail->Port = 465;
$mail->setFrom('system@kodorvan.tech', 'Система');
$mail->addAddress('request@kodorvan.tech', 'Заявки');
// The message
$mail->isHTML(true);
$mail->Subject = empty($request['project']['name']) ? 'Заказ' : 'Заказ: ' . $request['project']['name'];
$mail->Body = $this->view->render('messages/request.html', $request);
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
// Attachments
foreach ($files as $name => $file) {
// Iterating of project storage files registry
// Writing the attachment into the message
$mail->addAttachment($file, $name);
}
// Sending the message
$mail->send();
} catch (mail_exception $exception) {
}
// Sending response
$this->response
->start()
->clean()
->sse()
->validate($this->request)
?->body()
->end();
// Exit (fail)
return null;
}
}

View File

@@ -0,0 +1,8 @@
@charset "UTF-8";
@font-face {
font-family: 'Akony';
src: url("/fonts/akony/AKONY.ttf");
font-weight: normal;
font-style: normal;
}

View File

@@ -28,7 +28,7 @@
font-style: normal; font-style: normal;
} }
@font-face { @font-face {
font-family: 'Bahnschrift'; font-family: 'Bahnschrift';
src: url("/fonts/bahnschrift/BAHNSCHRIFT 5.TTF"); src: url("/fonts/bahnschrift/BAHNSCHRIFT 5.TTF");
font-weight: 500; font-weight: 500;

View File

@@ -0,0 +1,50 @@
@charset "UTF-8";
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-ExtraLight.woff2");
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-Light.woff2");
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-SemiLight.woff2");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-Regular.woff2");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-Regular.woff2");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-SemiBold.woff2");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Cascadia Code';
src: url("/fonts/cascadia_code/CascadiaCode-Bold.woff2");
font-weight: 700;
font-style: normal;
}

View File

@@ -0,0 +1,6 @@
@charset "UTF-8";
@font-face {
font-family: 'Commissioner';
src: url('/fonts/commissioner.ttf');
}

View File

@@ -0,0 +1,6 @@
@charset "UTF-8";
@font-face {
font-family: 'Compacta';
src: url("/fonts/compacta/compacta_lt_light_compress.otf");
}

View File

@@ -0,0 +1,8 @@
@charset "UTF-8";
@font-face {
font-family: 'Eitai';
src: url("/fonts/eitai/eitai.otf");
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,15 @@
@charset "UTF-8";
@font-face {
font-family: 'GOST';
src: url("/fonts/gost/GOST 2.304-81 type A.ttf");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'GOST';
src: url("/fonts/gost/GOST 2.304-81 type B.ttf");
font-weight: 400;
font-style: normal;
}

View File

@@ -0,0 +1,8 @@
@charset "UTF-8";
@font-face {
font-family: 'Industry';
src: url("/fonts/industry/Industry-Bold_RUS.ttf");
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,63 @@
@charset "UTF-8";
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-LightCondensed.ttf");
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-LightCondensed.ttf");
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-LightCondensed.ttf");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-RegularCondensed.ttf");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-RegularCondensed.ttf");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-Bold.ttf");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-BoldCondensed.ttf");
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-BlackCondensed.ttf");
font-weight: 800;
font-style: normal;
}
@font-face {
font-family: 'MT Sans';
src: url("/fonts/mt_sans/MTSans-BlackExtended.ttf");
font-weight: 900;
font-style: normal;
}

View File

@@ -0,0 +1,64 @@
@charset "UTF-8";
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-ExtraLight.ttf");
font-weight: 100;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Light.ttf");
font-weight: 200;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Regular.ttf");
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Regular.ttf");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Medium.ttf");
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Bold.ttf");
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-ExtraBold.ttf");
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Black.ttf");
font-weight: 800;
font-style: normal;
}
@font-face {
font-family: 'Nunito';
src: url("/fonts/nunito/Nunito-Black.ttf");
font-weight: 900;
font-style: normal;
}

View File

@@ -0,0 +1,8 @@
@charset "UTF-8";
@font-face {
font-family: 'Palui';
src: url("/fonts/palui/PaluiSPDemo-Bold.otf");
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,6 @@
@charset "UTF-8";
@font-face {
font-family: 'Slifted';
src: url("/fonts/slifted/slifted.otf");
}

View File

@@ -0,0 +1,6 @@
@charset "UTF-8";
@font-face {
font-family: 'Urban Slavic';
src: url("/fonts/urban_slavic/UrbanSlavic.otf");
}

View File

@@ -0,0 +1,6 @@
@charset "UTF-8";
@font-face {
font-family: 'Vredina';
src: url("/fonts/vredina/SAVredina-ThinUltraCondensed.woff");
}

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More