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

165 lines
5.2 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\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;
}
}