Первая инициализация

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-11-07 22:22:12 +10:00
parent 542642d983
commit 3f8cbcd1e2
4 changed files with 281 additions and 0 deletions

45
composer.json Normal file
View File

@ -0,0 +1,45 @@
{
"name": "mirzaev/vk-chat",
"description": "Module for mirzaev/vk framework to build a chat robot",
"readme": "README.md",
"keywords": [
"chat",
"vk",
"module"
],
"type": "vk-module",
"license": "WTFPL",
"homepage": "https://git.mirzaev.sexy/mirzaev/vk-chat",
"authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Programmer"
}
],
"support": {
"email": "arsen@mirzaev.sexy",
"wiki": "https://git.mirzaev.sexy/mirzaev/vk-chat/wiki",
"issues": "https://git.mirzaev.sexy/mirzaev/vk-chat/issues"
},
"funding": [
{
"type": "funding",
"url": "https://fund.mirzaev.sexy"
}
],
"require": {
"php": "^8.1"
},
"autoload": {
"psr-4": {
"mirzaev\\vk\\chat\\": "mirzaev/vk/chat/system"
}
},
"autoload-dev": {
"psr-4": {
"mirzaev\\vk\\chat\\tests\\": "mirzaev/vk/chat/tests"
}
}
}

View File

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace mirzaev\vk\chat;
// Встроенные библиотеки
use Closure;
/**
* Команда
*
* @package mirzaev\vk\chat
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class command
{
/**
* Конструктор
*
* @param callable $program Программа выполняемая командой
* @param array $accounts Реестр аккаунтов которым разрешено выполнять команду
*/
public function __construct(
public Closure $program,
public array $accounts
) {
}
/**
* Проверить наличие доступа к команде
*
* @param int $id Идентификатор аккаунта
*
* @return bool Имеет ли аккаунт доступ к команде?
*/
public function access(int $id): bool
{
// Перебор реестра аккаунтов
foreach ($this->accounts as $account) if ($account === $id) return true;
return false;
}
/**
* Выполнить команду
*
* @param string ...$parameters Параметры команды
*
* @return bool
*/
public function execute(string ...$parameters): bool
{
return ($this->program)(...$parameters);
}
}

View File

@ -0,0 +1,91 @@
<?php
declare(strict_types=1);
namespace mirzaev\vk\chat;
// Файлы проекта
use mirzaev\vk\chat\pattern,
mirzaev\vk\chat\command;
/**
* Ядро
*
* @package mirzaev\vk\chat
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class core
{
/**
* @var string|null $prefix Префикс
*/
protected ?string $prefix;
/**
* @var array $patterns Реестр шаблонов
*/
protected array $patterns = [];
/**
* Записать шаблон в реестр
*
* @param string|pattern $pattern Текст или инстанция шаблона
* @param command ...$commands Команды
*
* @return pattern Инстанция шаблона
*/
public function pattern(string|pattern $pattern, command ...$commands): pattern
{
// Инициализация шаблона
if (is_string($pattern)) $pattern = new pattern($pattern);
foreach ($commands as $command) {
// Перебор команд
// Подключение команд к шаблону
$pattern->command($command);
}
// Запись в реестр
$this->patterns .= [$pattern];
return $pattern;
}
/**
* Обработать сообщение
*
* Проверяет наличие совпадений с шаблонами, после чего проверяет
* все связанные с шаблоном команды и выполняет при совпадении
*
* @param array $update Событие
*
* @return bool Статус сохранения
*/
public function handle(array $update): bool
{
// Инициализация текста
$text = $update['object']['message']['text'];
// Проверка на наличие текста и на использование префикса
if (empty($text) or isset($this->prefix) && !str_starts_with($text, $this->prefix)) return false;
foreach ($this->patterns as $pattern) {
// Перебор шаблонов
// Инициализация буфера параметров
$parameters = [];
if($pattern->check($text, $parameters)) {
// Пройдена проверка на совпадение с шаблоном
// Выполнение команд связанных с шаблоном
$pattern->handle($update['object']['message']['from_id'], $parameters);
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,89 @@
<?php
declare(strict_types=1);
namespace mirzaev\vk\chat;
// Файлы проекта
use mirzaev\vk\chat\command;
/**
* Шаблон
*
* @package mirzaev\vk\chat
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class pattern
{
/**
* @var array $commands Команды
*/
protected array $commands = [];
/**
* Конструктор
*
* @param string $text Текст
*/
public function __construct(public string $text)
{
}
/**
* Записать команду в реестр
*
* @param command $command Инстанция команды
*
* @return static
*/
public function command(command $command): static
{
// Запись в реестр
$this->commands .= [$command];
return $this;
}
/**
* Проверить текст на совпадение с шаблоном
*
* @param string $text Текст
* @param array &$parameters Буфер параметров для команды
*
* @return bool Текст совпадает с шаблоном?
*/
public function check(string $text, array &$parameters = []): bool
{
// Проверка на совпадение с шаблоном
preg_match_all($this->text, $text, $matches);
// Простой шаблон
if (count($matches) === 1) return !empty($matches[0]);
// Удаление первого значения (текст для проверки)
unset($matches[0]);
// Сложный шаблон
foreach ($matches as $match) if (!empty($match[0])) $parameters []= $match[0]; else return false;
return true;
}
/**
* Обработать подключенные команды
*
* @param int $id Идентификатор аккаунта вызывающего выполнение
* @param string ...$parameters Параметры команды
*
* @return void
*/
public function handle(int $id, string ...$parameters): void
{
foreach ($this->commands as $command) {
// Перебор команд
// Выполнение команды
if (!empty($command->accounts) && $command->access($id)) $command->execute(...$parameters);
}
}
}