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

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", "email": "red@hood.su",
"homepage": "https://hood.su/mirzaev", "homepage": "https://hood.su/mirzaev",
"role": "Programmer" "role": "Programmer"
},
{
"name": "Konstantin Tarashchansky Eleno-Borisovich",
"homepage": "https://hood.su/flower_studios",
"role": "Programmer"
} }
], ],
"support": { "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; namespace mirzaev\vk\api;
use Exception; use Exception;
use mirzaev\vk\core, use mirzaev\vk\core,
mirzaev\vk\robots\robot; mirzaev\vk\robots\robot;

View File

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

View File

@ -4,12 +4,12 @@ declare(strict_types=1);
namespace mirzaev\vk\api; namespace mirzaev\vk\api;
use mirzaev\vk\robots\robot;
use Throwable; use Throwable;
use Exception; use Exception;
use ArrayAccess; use ArrayAccess;
use mirzaev\vk\robots\robot;
/** /**
* Настройки соединения с API * Настройки соединения с 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 { 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) { } catch (Throwable $t) {
throw new Exception('Не удалось инициализировать API', 500, $t->getPrevious()); 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 protected function _init(string $version = self::VK_API_VERSION_DEFAULT): self
{ {
// Ключ
$this->settings['access_token'] = $this->robot->key;
// Версия API // Версия API
$this->settings['v'] = $version; $this->settings['v'] = $version;
@ -116,7 +146,7 @@ class settings implements ArrayAccess
} }
/** /**
* Определить и записать получателя * Инициализация получателя
* *
* @see mirzaev\vk\api\methods\messages Сообщения * @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\traits\singleton;
use mirzaev\vk\loggers\jasmo; use mirzaev\vk\loggers\jasmo;
use Exception; use exception;
/** /**
* Ядро * Ядро
@ -95,7 +95,7 @@ final class core
// Инициализация уникального идентификатора сессии // Инициализация уникального идентификатора сессии
$session = count($this->read($id)); $session = count($this->read($id));
} catch (Exception $e) { } catch (exception $e) {
if ($e->getCode() === 404) { if ($e->getCode() === 404) {
// Робота или сессии не существует // Робота или сессии не существует
@ -139,13 +139,13 @@ final class core
return $this->registry[$id][$session]; return $this->registry[$id][$session];
} }
throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404); throw new exception("Сессия $session робота с идентификатором $id не найдена", 404);
} }
return $this->registry[$id]; return $this->registry[$id];
} else { } else {
throw new Exception("Робот с идентификатором $id не найден", 404); throw new exception("Робот с идентификатором $id не найден", 404);
} }
} }
@ -185,7 +185,7 @@ final class core
return; return;
} }
throw new Exception("Сессия $session робота с идентификатором $id не найдена", 404); throw new exception("Сессия $session робота с идентификатором $id не найдена", 404);
} }
// Вычитание из счётчика количества сессий робота // Вычитание из счётчика количества сессий робота
@ -197,7 +197,7 @@ final class core
return; 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 Значение * @param mixed $value Значение
* *
* @return void * @return void
*/ */
public function __set(mixed $name, mixed $value): void public function __set(string $name, mixed $value): void
{ {
match ($name) { match ($name) {
'timezone' => !isset($this->timezone) ? $this->timezone = $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_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_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) 'path_temp' => !isset($this->path_temp) ? $this->path_temp = $value : throw new exception('Запрещено переопределять каталог временных файлов', 500),
default => throw new exception("Свойство $name не обнаружено", 404)
}; };
} }
/** /**
* Прочитать свойство * Прочитать свойство
* *
* Значение по умолчанию, есле не задано * Записывает значение по умолчанию, если свойство не инициализировано
* *
* @param mixed $name Название * @param mixed $name Название
* *
* @return mixed * @return mixed
*/ */
public function __get(mixed $name): mixed public function __get(string $name): mixed
{ {
return match ($name) { return match ($name) {
'robots' => $this->robots, 'robots' => $this->robots,
@ -239,7 +240,7 @@ final class core
'path_root' => $this->path_root ?? $this->path_root = dirname(__DIR__), 'path_root' => $this->path_root ?? $this->path_root = dirname(__DIR__),
'path_logs' => $this->path_logs ?? $this->path_logs = $this->__get('path_root') . '/logs', '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', '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); return new $robot(...$params);
} else { } 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; namespace mirzaev\vk\robots;
use Throwable;
use Exception;
use mirzaev\vk\robots\robot, use mirzaev\vk\robots\robot,
mirzaev\vk\api\settings as api, mirzaev\vk\api\settings as api,
mirzaev\vk\api\longpoll; mirzaev\vk\api\longpoll;
use Throwable;
use Exception;
/** /**
* Робот-группа * Робот-группа
* *
* @property longpoll $longpoll LongPoll-сессия * @property longpoll $longpoll LongPoll-сессия
* *
* @method public function __construct(int|null $id, string|null $key) Конструктор
* @method public function __set($name, $value) Запись свойства * @method public function __set($name, $value) Запись свойства
* @method public function __get($name) Чтение свойства * @method public function __get($name) Чтение свойства
* @method public function __isset($name) Проверка на инициализированность свойства * @method public function __isset($name) Проверка на инициализированность свойства
@ -41,7 +42,11 @@ final class group extends robot
protected string|null $key = null protected string|null $key = null
) { ) {
parent::__construct($id, $key); 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 api $api API ВКонтакте
* @var account $account Аккаунт * @var account $account Аккаунт
* @var browser $browser Браузер * @var browser $browser Браузер
* @var proxy $proxy Прокси
* @var captcha $captcha Обработчик капчи
* *
* @var int $messages_mode Режим отправки сообщений * @var int $messages_mode Режим отправки сообщений
* *
@ -60,6 +58,11 @@ abstract class robot
*/ */
protected int $messages_mode = 1; 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)); $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;
} }
// Ключ не передан (подразумевается как чтение)
return $this->key;
}
/** /**
* Инициализация аккаунта * Инициализация аккаунта
* *
* @param account $account Аккаунт * @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;
} }
// Аккаунт не передан (подразумевается как чтение)
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) { match ($name) {
'id' => isset($this->id) ? throw new Exception('Запрещено перезаписывать идентификатор', 500) : $this->id = (int) $value, 'id' => isset($this->id) ? throw new Exception('Запрещено перезаписывать идентификатор', 500) : $this->id = (int) $value,
'session' => isset($this->session) ? throw new Exception('Запрещено перезаписывать сессию', 500) : $this->session = (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, 'key' => $this->key((string) $value),
'api' => isset($this->api) ? throw new Exception('Запрещено перезаписывать API', 500) : $this->api = $value, 'account' => $this->account($value),
'account' => isset($this->account) ? throw new Exception('Запрещено перезаписывать аккаунт', 500) : $this->account = $value, 'api' => $this->api(),
'browser' => isset($this->browser) ? throw new Exception('Запрещено перезаписывать браузер', 500) : $this->browser = $value, 'browser' => isset($this->browser) ? throw new Exception('Запрещено перезаписывать браузер', 500) : $this->browser = $value,
'messages_new' => $this->messages_new = (int) $value, 'messages_new' => $this->messages_new = (int) $value,
default => throw new Exception("Свойство $name не найдено", 404) default => throw new Exception("Свойство $name не найдено", 404)
@ -146,9 +206,9 @@ abstract class robot
return match ($name) { return match ($name) {
'id' => $this->id ?? throw new Exception('Идентификатор не инициализирован', 500), 'id' => $this->id ?? throw new Exception('Идентификатор не инициализирован', 500),
'session' => $this->session ?? throw new Exception('Сессия не инициализирована', 500), 'session' => $this->session ?? throw new Exception('Сессия не инициализирована', 500),
'key' => $this->key ?? throw new Exception('Ключ не инициализирован', 500), 'key' => $this->key(),
'api' => $this->api ?? $this->api = new api($this), 'account' => $this->account(),
'account' => $this->account ?? throw new Exception('Аккаунт не инициализирован', 500), 'api' => $this->api(),
'browser' => $this->browser ?? $this->browser = new browser([ 'browser' => $this->browser ?? $this->browser = new browser([
'base_uri' => 'https://api.vk.com/method/', 'base_uri' => 'https://api.vk.com/method/',
'cookies' => true 'cookies' => true

View File

@ -16,19 +16,42 @@ use mirzaev\accounts\vk as account;
*/ */
final class user extends robot 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 Аккаунт * @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);
} }
} }