165 lines
5.2 KiB
PHP
165 lines
5.2 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace mirzaev\vk\chat;
|
||
|
||
// Файлы проекта
|
||
use mirzaev\vk\chat\command,
|
||
mirzaev\vk\chat\program;
|
||
|
||
// Фреймворк ВКонтакте
|
||
use mirzaev\vk\api\methods\messages;
|
||
|
||
/**
|
||
* Ядро
|
||
*
|
||
* @package mirzaev\vk\chat
|
||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||
*/
|
||
class core
|
||
{
|
||
/**
|
||
* @var string|null $prefix Префикс
|
||
*/
|
||
protected ?string $prefix;
|
||
|
||
/**
|
||
* @var array $commands Реестр команд
|
||
*/
|
||
protected array $commands = [];
|
||
|
||
/**
|
||
* @var array $commands Реестр сообщений для отправки
|
||
*/
|
||
protected array $messages = [];
|
||
|
||
/**
|
||
* @var bool $break Завершить выполнение?
|
||
*/
|
||
protected bool $break = false;
|
||
|
||
/**
|
||
* Записать команду в реестр
|
||
*
|
||
* @param string|command $command Текст или инстанция команды
|
||
* @param program ...$programs Программы
|
||
*
|
||
* @return command Инстанция команда
|
||
*/
|
||
public function command(string|command $command, program ...$programs): command
|
||
{
|
||
// Инициализация команды
|
||
if (is_string($command)) $command = new command($command);
|
||
|
||
foreach ($programs as $program) {
|
||
// Перебор программ
|
||
|
||
// Подключение программ к команде
|
||
$command->program($program);
|
||
}
|
||
|
||
// Запись в реестр
|
||
$this->commands[] = $command;
|
||
|
||
return $command;
|
||
}
|
||
|
||
/**
|
||
* Обработать сообщение
|
||
*
|
||
* Проверяет наличие совпадений с командами, после чего проверяет
|
||
* все связанные с командой программы и выполняет при совпадении
|
||
*
|
||
* @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->commands as $command) {
|
||
// Перебор команд
|
||
|
||
// Проверка на запрос завершения выполнения
|
||
if ($this->break) break;
|
||
|
||
// Инициализация буфера параметров
|
||
$parameters = [];
|
||
|
||
if ($command->check($text, $parameters)) {
|
||
// Пройдена проверка на совпадение с командой
|
||
|
||
// Выполнение программ связанных с командой
|
||
$command->handle($this, $update['object']['message']['from_id'], $update, ...$parameters);
|
||
}
|
||
}
|
||
|
||
// Отправка сообщений
|
||
foreach ($this->messages as $key => $message) {
|
||
// Перебор сообщений
|
||
|
||
if (is_array($message)) {
|
||
// Группа сообщений
|
||
|
||
foreach ($message as $_key => $_message) {
|
||
// Перебор сообщений в группе
|
||
|
||
// Отправка сообщения
|
||
$_message->send();
|
||
|
||
// Удаление сообщения из реестра
|
||
unset($this->messages[$key][$_key]);
|
||
}
|
||
} else {
|
||
// Сообщение (подрзумевается)
|
||
|
||
// Отправка сообщения
|
||
$message->send();
|
||
|
||
// Удаление сообщения из реестра
|
||
unset($this->messages[$key]);
|
||
}
|
||
}
|
||
|
||
// Реинициализация блокировщика
|
||
$this->break = false;
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* Инициализировать сообщение
|
||
*
|
||
* Сообщение будет передано в последующие программы для обработки, а
|
||
* после завершения работы всех команд выполнится отправка
|
||
*
|
||
* @param messages $message Инстанция сообщения
|
||
* @param ?string $category Категория
|
||
*
|
||
* @return void
|
||
*/
|
||
public function message(messages $message, ?string $category = null): void
|
||
{
|
||
if (isset($category) && $this->messages[$category] = []) $this->messages[$category][] = $message;
|
||
else $this->messages[] = $message;
|
||
}
|
||
|
||
/**
|
||
* Завершить работу ядра
|
||
*
|
||
* Вместо обработки следующей команды работы ядра будет завершена
|
||
*
|
||
* @return void
|
||
*/
|
||
public function break(): void
|
||
{
|
||
$this->break = true;
|
||
}
|
||
}
|