From c61e7a0de5e9fad194725bae26cc30872cc97977 Mon Sep 17 00:00:00 2001 From: Mirzaev Date: Mon, 14 Nov 2022 03:06:52 +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=20messages.getHistory=20=D0=B8=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D1=8B=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirzaev/vk/system/api/methods/messages.php | 378 ++++++++++++++------- mirzaev/vk/system/api/methods/users.php | 5 +- 2 files changed, 248 insertions(+), 135 deletions(-) diff --git a/mirzaev/vk/system/api/methods/messages.php b/mirzaev/vk/system/api/methods/messages.php index e415633..3ff1356 100644 --- a/mirzaev/vk/system/api/methods/messages.php +++ b/mirzaev/vk/system/api/methods/messages.php @@ -65,9 +65,9 @@ final class messages extends method protected random_id $generate_mode = random_id::crypto; /** - * @var int|string|array|null $destination Получатель + * @var int|string|array|null $peer_id Получатель */ - protected int|string|array|null $destination = null; + protected int|string|array|null $peer_id = null; /** * @var string|null $text Текст @@ -120,10 +120,40 @@ final class messages extends method protected ?string $intent = null; /** - * @var ?string $subscribe_id Число, которое будет использоваться для работы с интентами + * @var ?int $subscribe_id Число, которое будет использоваться для работы с интентами */ protected ?int $subscribe_id = null; + /** + * @var ?int $offset Смещение для выбора сообщений + */ + protected ?int $offset = null; + + /** + * @var ?int $count Количество выбираемых сообщений + */ + protected ?int $count = null; + + /** + * @var ?int $start_message_id Идентификатор сообщения от которого начнётся выборка + */ + protected ?int $start_message_id = null; + + /** + * @var bool $rev Получить сообщения в хронологичном порядке? (иначе в обратном) + */ + protected bool $rev = false; + + /** + * @var bool $extended Получить расширенную информацию об авторах сообщений? + */ + protected bool $extended = false; + + /** + * @var ?array $fields Дополнительные запрашиваемые поля (для $extended) + */ + protected ?array $fields = null; + /** * Конструктор * @@ -168,14 +198,14 @@ final class messages extends method /** * Записать: получатель * - * @param int|string|array|null $destination Получатель + * @param int|string|array|null $peer_id Получатель * * @return static */ - public function destination(int|string|array|null $destination): static + public function peer_id(int|string|array|null $peer_id): static { // Запись в свойство - $this->__set('destination', $destination); + $this->__set('peer_id', $peer_id); return $this; } @@ -240,36 +270,6 @@ final class messages extends method return $this; } - /** - * Записать: идентификатор сообщения, на которое требуется ответить - * - * @param ?int $reply Идентификатор сообщения, на которое требуется ответить - * - * @return static - */ - public function reply(?int $reply): static - { - // Запись в свойство - $this->__set('reply_to', $reply); - - return $this; - } - - /** - * Записать: идентификатор сообщения, на которое требуется ответить - * - * @param ?int $to Идентификатор сообщения, на которое требуется ответить - * - * @return static - */ - public function to(?int $to): static - { - // Запись в свойство - $this->__set('reply_to', $to); - - return $this; - } - /** * Записать: идентификаторы пересылаемых сообщений * @@ -315,21 +315,6 @@ final class messages extends method return $this; } - /** - * Записать: идентификатор стикера - * - * @param ?string $sticker Идентификатор стикера - * - * @return static - */ - public function sticker(?string $sticker): static - { - // Запись в свойство - $this->__set('sticker_id', $sticker); - - return $this; - } - /** * Записать: полезная нагрузка * @@ -360,21 +345,6 @@ final class messages extends method return $this; } - /** - * Записать: создавать представление ссылки в сообщении? - * - * @param bool $payload Cоздавать представление ссылки в сообщении? - * - * @return static - */ - public function links(bool $links): static - { - // Запись в свойство - $this->__set('dont_parse_links', !$links); - - return $this; - } - /** * Записать: отключить уведомление об упоминании в сообщении? * @@ -390,21 +360,6 @@ final class messages extends method return $this; } - /** - * Записать: включить уведомление об упоминании в сообщении? - * - * @param bool $mentions Включить уведомление об упоминании в сообщении? - * - * @return static - */ - public function mentions(bool $mentions): static - { - // Запись в свойство - $this->__set('disable_mentions', !$mentions); - - return $this; - } - /** * Записать: интент * @@ -436,26 +391,118 @@ final class messages extends method } /** - * Записать: число, которое будет использоваться для работы с интентами + * Записать: смещение для выбора сообщений * - * @param ?int $subscribe Число, которое будет использоваться для работы с интентами + * @param ?int $offset Смещение для выбора сообщений * * @return static */ - public function subscribe(?int $subscribe): static + public function offset(?int $offset): static { // Запись в свойство - $this->__set('subscribe_id', $subscribe); + $this->__set('offset', $offset); return $this; } + /** + * Записать: количество выбираемых сообщений + * + * @param ?int $count Количество выбираемых сообщений + * + * @return static + */ + public function count(?int $count): static + { + // Запись в свойство + $this->__set('count', $count); + + return $this; + } + + /** + * Записать: идентификатор сообщения от которого начнётся выборка + * + * @param ?int $start_message_id Идентификатор сообщения от которого начнётся выборка + * + * @return static + */ + public function start_message_id(?int $start_message_id): static + { + // Запись в свойство + $this->__set('start_message_id', $start_message_id); + + return $this; + } + + /** + * Записать: получить сообщения в хронологичном порядке? + * + * @param bool $rev Получить сообщения в хронологичном порядке? (иначе в обратном) + * + * @return static + */ + public function rev(bool $rev): static + { + // Запись в свойство + $this->__set('rev', $rev); + + return $this; + } + + /** + * Записать: получить расширенную информацию об авторах сообщений? + * + * @param bool $extended Получить расширенную информацию об авторах сообщений? + * + * @return static + */ + public function extended(bool $extended): static + { + // Запись в свойство + $this->__set('extended', $extended); + + return $this; + } + + /** + * Записать: дополнительные запрашиваемые поля + * + * @param ?array $fields Дополнительные запрашиваемые поля (для static::$extended) + * + * @return static + */ + public function fields(?array $fields): static + { + // Запись в свойство + $this->__set('fields', $fields); + + return $this; + } + + /** + * Инициализировать получателя + * + * Записывает получателя в буфер API робота + * + * @param int|string|array|null $peer_id Получатель (группа, чат, пользователь и пользователи) + * + * @return void + */ + public function receiver(int|string|array|null $peer_id = null): void + { + if (isset($peer_id)) $this->peer_id = $peer_id; + if (is_int($this->peer_id)) ($id = $this->peer_id - 2000000000) > 0 ? $this->robot->api['peer_id'] = $this->peer_id : $this->robot->api['chat_id'] = $id; + else if (is_array($this->peer_id)) $this->robot->api['peer_ids'] = implode(',', $this->peer_id); + else if (is_string($this->peer_id)) $this->robot->api['domain'] = $this->peer_id; + } + /** * Отправить сообщение * - * @see https://vk.com/dev/messages.send + * @see https://dev.vk.com/method/messages.send * - * @param int|string|null $destination Получатель + * @param int|string|null $peer_id Получатель (группа, чат, пользователь и пользователи) * @param ?string $message Сообщение * @param ?int $lat Географическая ширина * @param ?int $long Географическая долгота @@ -483,7 +530,7 @@ final class messages extends method * 5. Добавить content_source */ public function send( - int|string|null $destination = null, + int|string|null $peer_id = null, ?string $message = null, ?int $lat = null, ?int $long = null, @@ -505,10 +552,7 @@ final class messages extends method $this->robot->api->reinit(); // Инициализация получателя - if (isset($destination)) $this->destination = $destination; - if (is_int($this->destination)) ($id = $this->destination - 2000000000) > 0 ? $this->robot->api['peer_id'] = $this->destination : $this->robot->api['chat_id'] = $id; - else if (is_array($this->destination)) $this->robot->api['peer_ids'] = implode(',',$this->destination); - else if (is_string($this->destination)) $this->robot->api['domain'] = $this->destination; + $this->receiver($peer_id); // Инициализация идентификатора сессии доставки сообщения (защита от повторных отправок) $this->robot->api['random_id'] = $random_id ?? match ($this->generate_mode) { @@ -519,55 +563,43 @@ final class messages extends method }; // Инициализация текста в настройках API - if (isset($message)) $this->text = $message; - if (isset($this->text)) $this->robot->api['message'] = $this->text; + if (!empty($message ??= $this->text)) $this->robot->api['message'] = $message; // Инициализация широты - if (isset($lat)) $this->lat = $lat; - if (isset($this->lat)) $this->robot->api['lat'] = $this->lat; + if (!empty($lat ??= $this->lat)) $this->robot->api['lat'] = $lat; // Инициализация долготы - if (isset($long)) $this->long = $long; - if (isset($this->long)) $this->robot->api['long'] = $this->long; + if (!empty($long ??= $this->long)) $this->robot->api['long'] = $long; // Инициализация вложений - if (isset($attachments)) $this->robot->api->data = $attachments; - if (isset($this->robot->api->data) && $this->robot->api->__get('data') !== []) $this->robot->api['attachment'] = implode(',', $this->robot->api->__get('data')); + if (!empty($attachments ??= $this->robot->api->data)) $this->robot->api['attachment'] = implode(',', $attachments); // Инициализация сообщения, на которое требуется ответить - if (isset($reply_to)) $this->reply = $reply_to; - if (isset($this->reply)) $this->robot->api['reply_to'] = $this->reply; + if (!empty($reply_to ??= $this->reply_to)) $this->robot->api['reply_to'] = $reply_to; // Инициализация пересылаемых сообщений - if (isset($forward_messages)) $this->forward_messages = $forward_messages; - if (isset($this->forward_messages)) $this->robot->api['forward_messages'] = implode(',', $this->forward_messages); + if (!empty($forward_messages ??= $this->forward_messages)) $this->robot->api['forward_messages'] = implode(',', $forward_messages); // Инициализация стикера - if (isset($sticker_id)) $this->robot->api['sticker_id'] = $sticker_id; - if (isset($this->sticker_id)) $this->robot->api['sticker_id'] = $this->sticker_id; + if (!empty($sticker_id ??= $this->sticker_id)) $this->robot->api['sticker_id'] = $sticker_id; // Инициализация полезной нагрузки - if (isset($payload)) $this->payload = $payload; - if (isset($this->payload)) $this->robot->api['payload'] = $this->payload; + if (!empty($payload ??= $this->payload)) $this->robot->api['payload'] = $payload; // Инициализация пользовательского соглашения // $this->robot->api['content_source'] = $this->robot->content_source; // Инициализация "не создавать представление ссылки в сообщении?" - if (isset($dont_parse_links)) $this->dont_parse_links = $dont_parse_links; - if ($this->dont_parse_links) $this->robot->api['dont_parse_links'] = 1; + if ($dont_parse_links || $this->dont_parse_links) $this->robot->api['dont_parse_links'] = 1; // Инициализация "отключить уведомление об упоминании в сообщении?" - if (isset($disable_mentions)) $this->disable_mentions = $disable_mentions; - if ($this->disable_mentions) $this->robot->api['disable_mentions'] = 1; + if ($disable_mentions || $this->disable_mentions) $this->robot->api['disable_mentions'] = 1; // Инициализация интентов - if (isset($intent)) $this->robot->api['intent'] = $intent; - if (isset($this->intent)) $this->robot->api['intent'] = $this->intent; + if (!empty($intent ??= $this->intent)) $this->robot->api['intent'] = $intent; // Инициализация числа, которое будет использоваться для работы с интентами - if (isset($subscribe_id)) $this->subscribe_id = $subscribe_id; - if (isset($this->subscribe_id)) $this->robot->api['subscribe_id'] = $this->subscribe_id; + if (!empty($subscribe_id ??= $this->subscribe_id)) $this->robot->api['subscribe_id'] = $subscribe_id; // Проверка сформированного сообщения if (!$this->robot->api->offsetExists('message') && !$this->robot->api->offsetExists('attachment')) throw new Exception('Сообщение должно содержать текст, либо вложение'); @@ -575,10 +607,8 @@ final class messages extends method // Запрос $request = json_decode($this->robot->browser->request('POST', 'messages.send', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); - // Если в ответе ошибка - if (isset($request->error)) { - throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); - } + // Проверка на наличие ошибок в ответе от ВКонтакте + if (isset($request->error)) throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); if ($this->send_mode === message_send::check) { // Надёжная доставка сообщения @@ -599,7 +629,7 @@ final class messages extends method //!!!!!!!!!!!!!!!!!!!!!!!!! // Повторная отправка - $this->send($destination); + $this->send(); } } else { } @@ -611,7 +641,7 @@ final class messages extends method /** * Удалить сообщение * - * @see https://vk.com/dev/messages.delete + * @see https://dev.vk.com/method/messages.delete * * @param int|string|array|null $messages Получатель (message_ids + cmids) * @param int|string|null $peer_id Идентификатор беседы @@ -620,7 +650,9 @@ final class messages extends method * * @return int|array Идентификатор успешно отправленного сообщения или ответ сервера (подразумевается ошибка) * - * @todo Написать обработчик ошибок возвращаемых ВКонтакте + * @todo + * 1. Переделать под новую версию + * 2. Написать обработчик ошибок возвращаемых ВКонтакте */ public function delete(string|int|array|null $messages = null, int|string|null $peer_id = null, bool $spam = false, bool $delete_for_all = false): stdClass { @@ -667,11 +699,10 @@ final class messages extends method * @param string $message_ids Идентификатор сообщения * * @return object Информация о сообщении + * + * @todo + * 1. Доделать, а лучше полностью переделать */ - - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // доделать - public function getById(int $message_ids): object { // Реиницилазиция @@ -691,11 +722,82 @@ final class messages extends method // Запрос $request = json_decode(($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])->getBody()->getContents())); - // Если в ответе ошибка - if (isset($request->error)) { - throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + // Проверка на наличие ошибок в ответе от ВКонтакте + if (isset($request->error)) throw new Exception('ВКонтакте: ' . $request->error->error_msg, $request->error->error_code); + + return $request->response; + } + + /** + * Получить историю сообщений + * + * @see https://dev.vk.com/method/messages.getHistory + * + * @param ?int $offset Смещение для выбора сообщений + * @param ?int $count Количество выбираемых сообщений + * @param int|string|null $peer_id Получатель (группа, чат, пользователь и пользователи) + * @param ?int $start_message_id Идентификатор сообщения от которого начнётся выборка + * @param bool $rev Получить сообщения в хронологичном порядке? (иначе в обратном) + * @param bool $extended Получить расширенную информацию об авторах сообщений? + * @param ?array $fields Дополнительные запрашиваемые поля (для $extended) + * + * @return int|array Идентификатор успешно отправленного сообщения или ответ сервера (подразумевается ошибка) + * + * @todo Написать обработчик ошибок возвращаемых ВКонтакте + */ + public function getHistory( + ?int $offset = null, + ?int $count = null, + int|string|null $peer_id = null, + ?int $start_message_id = null, + bool $rev = false, + bool $extended = false, + ?array $fields = null + ): object { + // Реиницилазиция + $this->robot->api->reinit(); + + // Инициализация смещения для выбора сообщений + if (!empty($offset ??= $this->offset)) $this->robot->api['offset'] = $offset; + + // Инициализация количества выбираемых сообщений + if (!empty($count ??= $this->count)) $this->robot->api['count'] = $count; + + // Инициализация получателя + $this->receiver($peer_id); + + // Инициализация идентификатора сообщения от которого начнётся выборка + if (!empty($start_message_id ??= $this->start_message_id)) $this->robot->api['start_message_id'] = $start_message_id; + + // Инициализация "получить сообщения в хронологичном порядке?" + if ($rev || $this->rev) $this->robot->api['rev'] = 1; + + // Инициализация "получить расширенную информацию об авторах сообщений?" + if ($extended || $this->extended) $this->robot->api['extended'] = 1; + + if (!empty($fields ??= $this->fields)) { + // Инициализация дополнительных запрашиваемых полей + + // Инициализация значения в буфере запроса к API + $this->robot->api['fields'] = ''; + + foreach ($fields as $key => $field) { + // Перебор дополнительных запрашиваемых полей + + // Запись в буфер запроса к API + $this->robot->api['fields'] .= $field; + + // Запись разделителя + if ($key !== array_key_last($fields)) $this->robot->api['fields'] .= ', '; + } } + // Запрос + $request = json_decode(($this->robot->browser->request('POST', 'messages.getHistory', ['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; } @@ -712,7 +814,7 @@ final class messages extends method match ($name) { 'send_mode' => $this->send_mode = $value, 'generate_mode' => $this->generate_mode = $value, - 'destination' => $this->destination = $value, + 'peer_id', 'destination' => $this->peer_id = $value, 'text' => $this->text = $value, 'lat', 'latitude' => $this->lat = $value, 'long', 'longitude' => $this->long = $value, @@ -726,6 +828,12 @@ final class messages extends method 'mentions' => $this->disable_mentions = !$value, 'intent' => $this->intent = $value, 'subscribe_id' => $this->subscribe_id = $value, + 'offset' => $this->offset = $value, + 'count', 'amount' => $this->count = $value, + 'start_message_id' => $this->start_message_id = $value, + 'rev' => $this->rev = $value, + 'extended' => $this->extended = $value, + 'fields' => $this->fields = $value, default => throw new Exception("Свойство $name не найдено", 404) }; } @@ -742,7 +850,7 @@ final class messages extends method return match ($name) { 'send_mode' => $this->send_mode, 'generate_mode' => $this->generate_mode, - 'destination' => $this->destination, + 'peer_id', 'destination' => $this->peer_id, 'text' => $this->text, 'lat', 'latitude' => $this->lat, 'long', 'longitude' => $this->long, @@ -754,6 +862,12 @@ final class messages extends method 'disable_mentions', 'mentions' => $this->disable_mentions, 'intent' => $this->intent, 'subscribe_id' => $this->subscribe_id, + 'offset' => $this->offset, + 'count', 'amount' => $this->count, + 'start_message_id' => $this->start_message_id, + 'rev' => $this->rev, + 'extended' => $this->extended, + 'fields' => $this->fields, default => throw new Exception("Свойство $name не найдено", 404) }; } diff --git a/mirzaev/vk/system/api/methods/users.php b/mirzaev/vk/system/api/methods/users.php index 0307fce..9d5709f 100644 --- a/mirzaev/vk/system/api/methods/users.php +++ b/mirzaev/vk/system/api/methods/users.php @@ -38,7 +38,7 @@ final class users extends method * @see https://dev.vk.com/method/users.get * * @param array $receiver Выбор пользователей для запроса информации (user_ids) - * @param array $fields Выбор дополнительных запрашиваемых полей + * @param array $fields Дополнительные запрашиваемые поля * @param string $name_case Падеж * * @return stdClass|array|null Информация об аккаунте или массив с информацией об аккаунтах, если найдена @@ -93,8 +93,7 @@ final class users extends method $this->robot->api['fields'] .= $field; // Запись разделителя - if ($key === array_key_last($fields)) break; - else $this->robot->api['fields'] .= ', '; + if ($key !== array_key_last($fields)) $this->robot->api['fields'] .= ', '; } }