From 5bd94e5ca3ceeb73aeaa5d6db9fdef1586cfb155 Mon Sep 17 00:00:00 2001 From: Mirzaev Date: Tue, 8 Nov 2022 02:06:13 +1000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?,=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=B1=20=D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=20=D0=B8=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirzaev/vk/system/api/methods/account.php | 115 +++++++++++++++++++++ mirzaev/vk/system/api/methods/messages.php | 98 +++++++++++++++--- mirzaev/vk/system/api/methods/method.php | 48 +-------- mirzaev/vk/system/api/methods/photos.php | 2 +- mirzaev/vk/system/api/methods/users.php | 95 +++++++++++++++++ mirzaev/vk/system/api/settings.php | 30 ------ 6 files changed, 296 insertions(+), 92 deletions(-) create mode 100644 mirzaev/vk/system/api/methods/account.php create mode 100644 mirzaev/vk/system/api/methods/users.php diff --git a/mirzaev/vk/system/api/methods/account.php b/mirzaev/vk/system/api/methods/account.php new file mode 100644 index 0000000..a5c6a41 --- /dev/null +++ b/mirzaev/vk/system/api/methods/account.php @@ -0,0 +1,115 @@ + + */ +final class account extends method +{ + /** + * Конструктор + * + * @param user $user Робот + */ + public function __construct( + protected user $robot + ) { + } + + /** + * Запросить информацию об аккаунте + * + * @see https://dev.vk.com/method/account.getInfo + * + * @param array $fields Выбор полей с запрашиваемой информацией (оставить пустым, если нужны все) + * + * @return ?array Информация об аккаунте, если получена + * + * @todo + * 1. Доделать + * 2. Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function getInfo(array $fields = []): array + { + // Реиницилазиция + $this->robot->api->reinit(); + + foreach ($fields as $key => $field) { + // Перебор запрашиваемых полей с информацией + + // Запись запрашиваемого поля + $this->robot->api['fields'] .= $field; + + // Запись разделителя + if ($key === array_key_last($fields)) break; + else $this->robot->api['fields'] .= ', '; + } + + // Запрос + $request = json_decode($this->robot->browser->request('POST', 'account.getInfo', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); + + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request->response; + } + + /** + * Запросить информацию о профиле + * + * @see https://dev.vk.com/method/account.getProfileInfo + * + * @param array $fields Выбор полей с запрашиваемой информацией (оставить пустым, если нужны все) + * + * @return ?array Информация об аккаунте, если получена + * + * @todo + * 1. Доделать + * 2. Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function getProfileInfo(array $fields = []): array + { + // Реиницилазиция + $this->robot->api->reinit(); + + foreach ($fields as $key => $field) { + // Перебор запрашиваемых полей с информацией + + // Запись запрашиваемого поля + $this->robot->api['fields'] .= $field; + + // Запись разделителя + if ($key === array_key_last($fields)) break; + else $this->robot->api['fields'] .= ', '; + } + + // Запрос + $request = json_decode($this->robot->browser->request('POST', 'account.getProfileInfo', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); + + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request->response; + } +} diff --git a/mirzaev/vk/system/api/methods/messages.php b/mirzaev/vk/system/api/methods/messages.php index 470475a..7a23327 100644 --- a/mirzaev/vk/system/api/methods/messages.php +++ b/mirzaev/vk/system/api/methods/messages.php @@ -4,12 +4,15 @@ declare(strict_types=1); namespace mirzaev\vk\api\methods; -use Exception; +// Файлы проекта +use mirzaev\accounts\vk, + mirzaev\vk\robots\robot, + mirzaev\vk\api\data, + mirzaev\vk\robots\group; -use mirzaev\accounts\vk; -use mirzaev\vk\robots\robot; -use mirzaev\vk\api\data; -use mirzaev\vk\robots\group; +// Встроенные библиотеки +use stdClass, + Exception; /** * Режимы отправки сообщений @@ -57,18 +60,18 @@ final class messages extends method * Конструктор * * @param robot $robot Робот - * @param int|string|array|null $destination Получатель + * @param int|string|array|null $receiver Получатель * @param string|null $text Текст */ public function __construct( protected robot $robot, - int|string|array|null $destination = null, + int|string|array|null $receiver = null, protected string|null $text = null ) { - if (isset($this->text, $destination)) { + if (isset($this->text, $receiver)) { // Быстрая отправка - $this->send($destination); + $this->send($receiver); } } @@ -120,13 +123,13 @@ final class messages extends method * * @see https://vk.com/dev/messages.send * - * @param int|string|array|null $destination Получатель + * @param int|string|array|null $receiver Получатель * * @return int|array Идентификатор успешно отправленного сообщения или ответ сервера (подразумевается ошибка) * * @todo Написать обработчик ошибок возвращаемых ВКонтакте */ - public function send(int|string|array|null $destination): int|array + public function send(int|string|array|null $receiver): int|array { // Идентификатор $random_id = time(); @@ -140,8 +143,22 @@ final class messages extends method // Реиницилазиция $this->robot->api->reinit(); - // Цель отправки - $this->robot->api->destination($destination); + if (is_int($receiver)) { + // Идентификатор + + // Инициализация получателя + $this->robot->api['peer_id'] = $receiver; + } else if (is_array($receiver)) { + // Идентификаторы + + // Инициализация получателя + $this->robot->api['user_ids'] = $receiver; + } else if (is_string($receiver)) { + // Домен + + // Инициализация получателя + $this->robot->api['domain'] = $receiver; + } // Инициализация идентификатора сообщения (защита от повторных отправок) в настройках API $this->robot->api['random_id'] = $random_id; @@ -197,7 +214,7 @@ final class messages extends method //!!!!!!!!!!!!!!!!!!!!!!!!! // Повторная отправка - $this->send($destination); + $this->send($receiver); } } else { } @@ -206,6 +223,59 @@ final class messages extends method return $request->response; } + /** + * Удалить сообщение + * + * @see https://vk.com/dev/messages.delete + * + * @param int|string|array|null $messages Получатель (message_ids + cmids) + * @param int|string|null $peer_id Идентификатор беседы + * @param bool $spam Пометить как спам? + * @param bool $delete_for_all Удалить для всех? + * + * @return int|array Идентификатор успешно отправленного сообщения или ответ сервера (подразумевается ошибка) + * + * @todo Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function delete(string|int|array|null $messages = null, int|string|null $peer_id = null, bool $spam = false, bool $delete_for_all = false): stdClass + { + // Реиницилазиция настроек + $this->robot->api->reinit(); + + if (isset($peer_id)) { + // Получен идентификатор беседы + + // Инициализация идентификатора беседы + $this->robot->api['peer_id'] = $peer_id; + + // Инициализация идентификаторов сообщений + $this->robot->api['cmids'] = $messages; + + // Инициализация: "удалить для всех?" + $this->robot->api['delete_for_all'] = 1; + } else { + // Не получен идентификатор беседы + + // Инициализация идентификаторов сообщений + $this->robot->api['message_ids'] = $messages; + + // Инициализация: "удалить для всех?" + if ($delete_for_all) $this->robot->api['delete_for_all'] = 1; + } + + // Инициализация: "сообщить о спаме?" + if ($spam) $this->robot->api['spam'] = $spam; + + // Запрос + $request = json_decode($this->robot->browser->request('POST', 'messages.delete', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); + + // Проверка на наличие ошибок в ответе от ВКонтакте + if (isset($request->error)) throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); + + + return $request->response; + } + /** * Записать свойство * diff --git a/mirzaev/vk/system/api/methods/method.php b/mirzaev/vk/system/api/methods/method.php index dba93fd..860c95b 100644 --- a/mirzaev/vk/system/api/methods/method.php +++ b/mirzaev/vk/system/api/methods/method.php @@ -4,58 +4,12 @@ declare(strict_types=1); namespace mirzaev\vk\api\methods; -use mirzaev\vk\robots\robot; - /** - * Абстракция метода API - * - * @method protected static put(string $url, ...$params) Создать - * @method protected static post(string $url, ...$params) Изменить - * @method protected static get(string $url, ...$params) Получить - * @method protected static delete(string $url, ...$params) Удалить + * Абстракция метода API ВКонтакте * * @package mirzaev\vk\api\methods * @author Arsen Mirzaev Tatyano-Muradovich */ abstract class method { - /** - * Создать - * - * @return array Ответ сервера - */ - public static function put(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Изменить - * - * @return array Ответ сервера - */ - public static function post(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Получить - * - * @return array Ответ сервера - */ - public static function get(): array - { - return ['error' => 'Метод не поддерживается']; - } - - /** - * Удалить - * - * @return array Ответ сервера - */ - public static function delete(): array - { - return ['error' => 'Метод не поддерживается']; - } } diff --git a/mirzaev/vk/system/api/methods/photos.php b/mirzaev/vk/system/api/methods/photos.php index 8b13a34..d1c7e3c 100644 --- a/mirzaev/vk/system/api/methods/photos.php +++ b/mirzaev/vk/system/api/methods/photos.php @@ -27,7 +27,7 @@ use mirzaev\accounts\vk as account; final class photos extends method { /** - * Создать сообщение + * Конструктор * * @param robot $robot Робот */ diff --git a/mirzaev/vk/system/api/methods/users.php b/mirzaev/vk/system/api/methods/users.php new file mode 100644 index 0000000..5bf2acc --- /dev/null +++ b/mirzaev/vk/system/api/methods/users.php @@ -0,0 +1,95 @@ + + */ +final class users extends method +{ + /** + * Конструктор + * + * @param user $user Робот + */ + public function __construct( + protected user $robot + ) { + } + + /** + * Запросить информацию о пользователе + * + * @see https://dev.vk.com/method/users.get + * + * @param array $user_ids Выбор пользователей для запроса информации + * @param array $fields Выбор дополнительных запрашиваемых полей + * @param string $name_case Падеж + * + * @return ?array Информация об аккаунте, если получена + * + * @todo + * 1. Доделать + * 2. Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function get(array $user_ids = [], array $fields = [], string $name_case = ''): array + { + // Реиницилазиция + $this->robot->api->reinit(); + + // Инициализация пользователей для запроса информации + if (!empty($user_ids)) $this->robot->api['user_ids'] = ''; + + foreach ($user_ids as $key => $user_id) { + // Перебор пользователей для получения информации + + // Запись пользователя + $this->robot->api['user_ids'] .= $user_id; + + // Запись разделителя + if ($key === array_key_last($user_ids)) break; + else $this->robot->api['user_ids'] .= ', '; + } + + // Инициализация дополнительных запрашиваемых полей + if (!empty($fields)) $this->robot->api['fields'] = ''; + + foreach ($fields as $key => $field) { + // Перебор дополнительных запрашиваемых полей + + // Запись запрашиваемого дополнительного поля + $this->robot->api['fields'] .= $field; + + // Запись разделителя + if ($key === array_key_last($fields)) break; + else $this->robot->api['fields'] .= ', '; + } + + // Инициализация падежа + if (!empty($name_case)) $this->robot->api['name_case'] = $name_case; + + // Запрос + $request = json_decode($this->robot->browser->request('POST', 'users.get', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); + + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request->response; + } +} diff --git a/mirzaev/vk/system/api/settings.php b/mirzaev/vk/system/api/settings.php index 28ee29f..539db21 100644 --- a/mirzaev/vk/system/api/settings.php +++ b/mirzaev/vk/system/api/settings.php @@ -145,36 +145,6 @@ class settings implements ArrayAccess return $this; } - /** - * Инициализация получателя - * - * @see mirzaev\vk\api\methods\messages Сообщения - */ - public function destination(string|array|int $target): self - { - if (is_int($target)) { - // Идентификатор - - $this->settings['peer_id'] = $target; - - return $this; - } else if (is_array($target)) { - // Идентификаторы - - $this->settings['user_ids'] = $target; - - return $this; - } else if (is_string($target)) { - // Домен - - $this->settings['domain'] = $target; - - return $this; - } - - throw new Exception('Не удалось определить получателя', 500); - } - /** * Записать свойство *