vk-chat/mirzaev/vk/chat/system/core.php

92 lines
2.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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