Первая инициализация
This commit is contained in:
parent
542642d983
commit
3f8cbcd1e2
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue