Какое-то старое говно не помню

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-04-06 04:11:51 +10:00
parent 64a88c9f4e
commit 07ace039c9
9 changed files with 382 additions and 3207 deletions

View File

@ -14,11 +14,6 @@
"email": "red@hood.su",
"homepage": "https://hood.su/mirzaev",
"role": "Programmer"
},
{
"name": "Konstantin Tarashchansky Eleno-Borisovich",
"homepage": "https://hood.su/flower_studios",
"role": "Programmer"
}
],
"support": {

3325
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace mirzaev\vk\api;
use Exception;
use mirzaev\vk\core,
mirzaev\vk\robots\robot;

View File

@ -45,13 +45,13 @@ final class messages extends method
* Конструктор
*
* @param robot $robot Робот
* @param int|string|array|null $destination Получатель
* @param string|null $text Текст
* @param int|string|array $destination = null
*/
public function __construct(
protected robot $robot,
protected string|null $text = null,
int|string|array $destination = null
int|string|array|null $destination = null,
protected string|null $text = null
) {
if (isset($this->text, $destination)) {
// Быстрая отправка
@ -106,15 +106,15 @@ final class messages extends method
/**
* Отправить сообщение
*
* @param int|string|array $destination Получатель
*
* @see https://vk.com/dev/messages.send
*
* @return array Ответ сервера
* @param int|string|array|null $destination Получатель
*
* @return int|array Идентификатор успешно отправленного сообщения или ответ сервера (подразумевается ошибка)
*
* @todo Написать обработчик ошибок возвращаемых ВКонтакте
*/
public function send(int|string|array $destination): array
public function send(int|string|array|null $destination): int|array
{
// Идентификатор
$random_id = time();
@ -128,29 +128,32 @@ final class messages extends method
$this->robot->api->reinit();
// Цель отправки
$this->robot->api->chooseDestination($destination);
$this->robot->api->destination($destination);
// Идентификатор сообщения
// Инициализация идентификатора (защита от повторных отправок) в настройках API
$this->robot->api['random_id'] = $random_id;
// Текст
// Инициализация текста в настройках API
$this->robot->api['message'] = $this->text;
// Пересылаемые сообщения
if (!empty($this->forwardMessages)) {
// Инициализация пересылаемых сообщений в настройках API
$this->robot->api['forward_messages'] = implode(',', $this->forwardMessages);
}
// Ответные сообщения
if (isset($this->ReplyMessage)) {
// Инициализация идентификатора сообщения на которое обрабатывается ответ в настройках API
$this->robot->api['reply_to'] = $this->ReplyMessage;
}
// Вложения
if (isset($this->data) && $this->__get('data') !== []) { // !empty($this->data->data) почемуто не работает
// Инициализация вложений в настройках API
$this->robot->api['attachment'] = implode(',', $this->__get('data'));
}

View File

@ -4,12 +4,12 @@ declare(strict_types=1);
namespace mirzaev\vk\api;
use mirzaev\vk\robots\robot;
use Throwable;
use Exception;
use ArrayAccess;
use mirzaev\vk\robots\robot;
/**
* Настройки соединения с API
*
@ -79,19 +79,52 @@ class settings implements ArrayAccess
/**
* Реинициализация
*
* @var float $version Версия API (переопределять не рекомендуется)
* @param bool $purge Полная очистка
*/
public function reinit(string $version = null): self
public function reinit(bool $purge = false): self
{
// Буфер
$version = $version ?? $this->settings['v'] ?? null;
// Деинициализация
$this->settings = [];
// Инициализация
// Реинициализация
try {
$this->_init($version);
if ($purge) {
// Полная очистка
// Очистка
$this->settings = [];
} else {
// Инициализация буфера
$buffer = [];
if (isset($this->settings['v'])) {
// Найдена версия API (подразумевается использование робота-группы)
// Запись в буфер
$buffer['v'] = $this->settings['v'];
}
if (isset($this->settings['access_token'])) {
// Найден ключ группы (подразумевается использование робота-группы)
// Запись в буфер
$buffer['access_token'] = $this->settings['access_token'];
}
if (isset($this->settings['group_id'])) {
// Найден идентификатор группы (подразумевается использование робота-группы)
// Запись в буфер
$buffer['group_id'] = $this->settings['group_id'];
}
if (isset($this->settings['user_id'])) {
// Найден идентификатор пользователя (подразумевается использование робота-пользователя)
// Запись в буфер
$buffer['user_id'] = $this->settings['user_id'];
}
// Перенос данных из буфера
$this->settings = $buffer;
}
} catch (Throwable $t) {
throw new Exception('Не удалось инициализировать API', 500, $t->getPrevious());
}
@ -106,9 +139,6 @@ class settings implements ArrayAccess
*/
protected function _init(string $version = self::VK_API_VERSION_DEFAULT): self
{
// Ключ
$this->settings['access_token'] = $this->robot->key;
// Версия API
$this->settings['v'] = $version;
@ -116,7 +146,7 @@ class settings implements ArrayAccess
}
/**
* Определить и записать получателя
* Инициализация получателя
*
* @see mirzaev\vk\api\methods\messages Сообщения
*/

View File

@ -8,7 +8,7 @@ use mirzaev\vk\robots\robot;
use mirzaev\vk\traits\singleton;
use mirzaev\vk\loggers\jasmo;
use Exception;
use exception;
/**
* Ядро
@ -95,7 +95,7 @@ final class core
// Инициализация уникального идентификатора сессии
$session = count($this->read($id));
} catch (Exception $e) {
} catch (exception $e) {
if ($e->getCode() === 404) {
// Робота или сессии не существует
@ -139,13 +139,13 @@ final class core
return $this->registry[$id][$session];
}
throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404);
throw new exception("Сессия $session робота с идентификатором $id не найдена", 404);
}
return $this->registry[$id];
} else {
throw new Exception("Робот с идентификатором $id не найден", 404);
throw new exception("Робот с идентификатором $id не найден", 404);
}
}
@ -185,7 +185,7 @@ final class core
return;
}
throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404);
throw new exception("Сессия $session робота с идентификатором $id не найдена", 404);
}
// Вычитание из счётчика количества сессий робота
@ -197,7 +197,7 @@ final class core
return;
}
throw new Exception("Робот с идентификатором $id не найден", 404);
throw new exception("Робот с идентификатором $id не найден", 404);
}
// Полная очистка
@ -207,31 +207,32 @@ final class core
/**
* Записать свойство
*
* @param mixed $name Название
* @param string $name Название
* @param mixed $value Значение
*
* @return void
*/
public function __set(mixed $name, mixed $value): void
public function __set(string $name, mixed $value): void
{
match ($name) {
'timezone' => !isset($this->timezone) ? $this->timezone = $value : throw new Exception('Запрещено переопределять часовой пояс', 500),
'path_root' => !isset($this->path_root) ? $this->path_root = $value : throw new Exception('Запрещено переопределять корневой каталог', 500),
'path_logs' => !isset($this->path_logs) ? $this->path_logs = $value : throw new Exception('Запрещено переопределять каталог журналов', 500),
'path_temp' => !isset($this->path_temp) ? $this->path_temp = $value : throw new Exception('Запрещено переопределять каталог временных файлов', 500)
'timezone' => !isset($this->timezone) ? $this->timezone = $value : throw new exception('Запрещено переопределять часовой пояс', 500),
'path_root' => !isset($this->path_root) ? $this->path_root = $value : throw new exception('Запрещено переопределять корневой каталог', 500),
'path_logs' => !isset($this->path_logs) ? $this->path_logs = $value : throw new exception('Запрещено переопределять каталог журналов', 500),
'path_temp' => !isset($this->path_temp) ? $this->path_temp = $value : throw new exception('Запрещено переопределять каталог временных файлов', 500),
default => throw new exception("Свойство $name не обнаружено", 404)
};
}
/**
* Прочитать свойство
*
* Значение по умолчанию, есле не задано
* Записывает значение по умолчанию, если свойство не инициализировано
*
* @param mixed $name Название
*
* @return mixed
*/
public function __get(mixed $name): mixed
public function __get(string $name): mixed
{
return match ($name) {
'robots' => $this->robots,
@ -239,7 +240,7 @@ final class core
'path_root' => $this->path_root ?? $this->path_root = dirname(__DIR__),
'path_logs' => $this->path_logs ?? $this->path_logs = $this->__get('path_root') . '/logs',
'path_temp' => $this->path_temp ?? $this->path_temp = $this->__get('path_root') . '/temp',
default => null
default => throw new exception("Свойство \"\$$name\" не обнаружено", 404)
};
}
@ -260,7 +261,7 @@ final class core
// Если найден класс реализующий запрошенного робота
return new $robot(...$params);
} else {
throw new Exception("Робот $method не найден", 404);
throw new exception("Робот $method не найден", 404);
}
}
}

View File

@ -4,18 +4,19 @@ declare(strict_types=1);
namespace mirzaev\vk\robots;
use Throwable;
use Exception;
use mirzaev\vk\robots\robot,
mirzaev\vk\api\settings as api,
mirzaev\vk\api\longpoll;
use Throwable;
use Exception;
/**
* Робот-группа
*
* @property longpoll $longpoll LongPoll-сессия
*
* @method public function __construct(int|null $id, string|null $key) Конструктор
* @method public function __set($name, $value) Запись свойства
* @method public function __get($name) Чтение свойства
* @method public function __isset($name) Проверка на инициализированность свойства
@ -41,7 +42,11 @@ final class group extends robot
protected string|null $key = null
) {
parent::__construct($id, $key);
// Инициализация данных API
$this->api['group_id'] = $this->id;
}
/**
* Запись свойства
*

View File

@ -25,8 +25,6 @@ use GuzzleHttp\Client as browser;
* @var api $api API ВКонтакте
* @var account $account Аккаунт
* @var browser $browser Браузер
* @var proxy $proxy Прокси
* @var captcha $captcha Обработчик капчи
*
* @var int $messages_mode Режим отправки сообщений
*
@ -60,6 +58,11 @@ abstract class robot
*/
protected int $messages_mode = 1;
/**
* @var api API ВКонтакте
*/
protected api $api;
/**
* Конструктор
*
@ -81,37 +84,94 @@ abstract class robot
// Идентификация сессии робота
$this->session = count($core->read($this->id));
// Инициализация настроек API
$this->api();
}
/**
* Инициализация ключа
*
* @param string $key Ключ
* @param string|null $key Ключ
*
* @return self
* @return string|self Ключ при чтении или инстанцию робота при записи
*/
public function key(string $key): self
public function key(string|null $key = null): string|self
{
$this->__set('key', $key);
if (isset($key)) {
// Ключ передан (подразумевается как запись)
if (isset($this->key)) {
// Ключ уже инициализирован
throw new Exception('Запрещено перезаписывать ключ', 500);
} else {
// Ключ ещё не инициализирован
// Запись ключа
$this->key = $key;
// Инициализация данных в настройках API
$this->api()['access_token'] = $key;
}
return $this;
}
// Ключ не передан (подразумевается как чтение)
return $this->key;
}
/**
* Инициализация аккаунта
*
* @param account $account Аккаунт
*
* @return self
* @return account|self Аккаунт при чтении или инстанцию робота при записи
*/
public function account(account $account): self
public function account(account|null $account = null): account|self
{
$this->__set('account', $account);
if (isset($account)) {
// Аккаунт передан (подразумевается как запись)
if (isset($this->account)) {
// Аккаунт уже инициализирован
throw new Exception('Запрещено перезаписывать аккаунт', 500);
} else {
// Аккаунт ещё не инициализирован
// Запись аккаунта
$this->account = $account;
}
return $this;
}
// Аккаунт не передан (подразумевается как чтение)
return $this->account;
}
/**
* Инициализация API
*
* @return api Инстанция настроек API
*/
public function api(): api
{
if (!isset($this->api)) {
// Настройки API ещё не инициализированы
// Запись инстанции настроек API
$this->api = new api($this);
}
return $this->api;
}
/**
* Записать свойство
*
@ -125,9 +185,9 @@ abstract class robot
match ($name) {
'id' => isset($this->id) ? throw new Exception('Запрещено перезаписывать идентификатор', 500) : $this->id = (int) $value,
'session' => isset($this->session) ? throw new Exception('Запрещено перезаписывать сессию', 500) : $this->session = (int) $value,
'key' => isset($this->key) ? throw new Exception('Запрещено перезаписывать ключ', 500) : $this->key = (string) $value,
'api' => isset($this->api) ? throw new Exception('Запрещено перезаписывать API', 500) : $this->api = $value,
'account' => isset($this->account) ? throw new Exception('Запрещено перезаписывать аккаунт', 500) : $this->account = $value,
'key' => $this->key((string) $value),
'account' => $this->account($value),
'api' => $this->api(),
'browser' => isset($this->browser) ? throw new Exception('Запрещено перезаписывать браузер', 500) : $this->browser = $value,
'messages_new' => $this->messages_new = (int) $value,
default => throw new Exception("Свойство $name не найдено", 404)
@ -146,9 +206,9 @@ abstract class robot
return match ($name) {
'id' => $this->id ?? throw new Exception('Идентификатор не инициализирован', 500),
'session' => $this->session ?? throw new Exception('Сессия не инициализирована', 500),
'key' => $this->key ?? throw new Exception('Ключ не инициализирован', 500),
'api' => $this->api ?? $this->api = new api($this),
'account' => $this->account ?? throw new Exception('Аккаунт не инициализирован', 500),
'key' => $this->key(),
'account' => $this->account(),
'api' => $this->api(),
'browser' => $this->browser ?? $this->browser = new browser([
'base_uri' => 'https://api.vk.com/method/',
'cookies' => true

View File

@ -16,19 +16,42 @@ use mirzaev\accounts\vk as account;
*/
final class user extends robot
{
/**
* Конструктор
*
* @param int|null $id Идентификатор
* @param string|null $key Ключ
*/
public function __construct(
protected int|null $id = null,
protected string|null $key = null
) {
parent::__construct($id, $key);
// Инициализация данных API
$this->api['user_id'] = $this->id;
}
/**
* Инициализация аккаунта
*
* @param account $account Аккаунт
*
* @return self
* @return account|self Аккаунт при чтении или инстанцию робота при записи
*/
public function account(account $account): self
public function account(account|null $account = null): account|self
{
parent::account($account);
if (isset($account)) {
// Передан аккаунт
$this->key = $account->key;
if (isset($account->key)) {
// Ключ инициализирован
return $this;
// Инициализация данных в настройках API
$this->api()['access_token'] = $account->key;
}
}
return parent::account($account);
}
}