diff --git a/hood/vk/system/api/data.php b/hood/vk/system/api/data.php index 28ce2fa..79ff9a7 100644 --- a/hood/vk/system/api/data.php +++ b/hood/vk/system/api/data.php @@ -6,12 +6,11 @@ namespace hood\vk\api; use Exception; use hood\vk\robots\robot; -use ArrayAccess; /** * Вложения */ -class data implements ArrayAccess +class data { /** * @var array $data Вложения @@ -35,7 +34,7 @@ class data implements ArrayAccess * * @return self */ - public function addData(string ...$data): self + public function addData(...$data): self { // Если вложений больше 10 if (count($this->data) + count($data) > 10) { @@ -73,44 +72,4 @@ class data implements ArrayAccess default => throw new Exception('Свойство не найдено: ' . $name) }; } - - /** - * Записать по смещению - */ - public function offsetSet(mixed $offset = null, ...$value): void - { - if ($offset == null) { - $this->addData($value); - } - } - - /** - * Прочитать по смещению - */ - public function offsetGet(mixed $offset = null): mixed - { - if ($offset == 0) { - return $this; - } - } - - /** - * Проверка существования смещения - */ - public function offsetExists(mixed $offset): bool - { - if ($offset == 'data') { - return empty($this->data); - } - } - - /** - * Удалить по смещению - */ - public function offsetUnset(mixed $offset = null): void - { - if ($offset == null) { - $this->settings = []; - } - } } diff --git a/hood/vk/system/api/methods/messages.php b/hood/vk/system/api/methods/messages.php index c632b90..7ee698d 100644 --- a/hood/vk/system/api/methods/messages.php +++ b/hood/vk/system/api/methods/messages.php @@ -9,6 +9,7 @@ use Exception; use hood\accounts\vk; use hood\vk\robots\robot; use hood\vk\api\data; +use hood\vk\robots\group; /** * Сообщение @@ -39,6 +40,16 @@ final class messages extends method */ protected data $data; + /** + * @var array Пересылаемые сообщения + */ + protected array $forwardMessages = []; + + /** + * @var int $ReplyMessage Ответное сообщение + */ + protected int $ReplyMessage; + /** * Создать сообщение * @@ -69,6 +80,36 @@ final class messages extends method return $this; } + /** + * Записать пересылаемые сообщения + * + * @param $messageIds id пересылаемых сообщений + * + * @return self + */ + public function forward(...$messageIds): self + { + // Запись пересылаемых сообщений + $this->forwardMessages = array_merge($this->forwardMessages, $messageIds); + + return $this; + } + + /** + * Записать ответное сообщение + * + * @param $messageId id ответного сообщения + * + * @return self + */ + public function reply(int $messageId): self + { + // Запись ответного сообщения + $this->ReplyMessage = $messageId; + + return $this; + } + /** * Записать фото * @@ -95,6 +136,8 @@ final class messages extends method * Записать вложение * * @param $attachments Вложения + * + * @return self */ public function attachments(string ...$attachments): self { @@ -102,7 +145,9 @@ final class messages extends method // Если вложения инициализированны // Записать вложение - $this->data->addData(...$attachments); + foreach ($attachments as $attachment) { + $this->data->addData($attachment); + } } else { // Если вложения не инициализированны @@ -110,7 +155,9 @@ final class messages extends method $this->data = new data($this->robot); // Записать вложение - $this->data->addData(...$attachments); + foreach ($attachments as $attachment) { + $this->data->addData($attachment); + } } return $this; @@ -142,42 +189,36 @@ final class messages extends method $this->robot->api->chooseDestination($destination); // Идентификатор сообщения - $this->robot->api->random_id = $random_id; + $this->robot->api['random_id'] = $random_id; // Текст - $this->robot->api->message = $this->text; + $this->robot->api['message'] = $this->text; - // Фильтрация вложений, если они инициализированны - if (isset($this->data)) { + // Пересылаемые сообщения + if (!empty($this->forwardMessages)) { - /* $forward_messages = []; - $attachments = $this->attachment->attachments; //Indirect modification of overloaded property hood\vk\api\attachments::$attachments has no effect - foreach ($attachments as &$attachment) { - if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') { + $this->robot->api['forward_messages'] = implode(',', $this->forwardMessages); + } - // Если среди вложений найдено сообщение для пересылки - $forward_messages[] = $attachment; - unset($attachment); - } - } */ + // Ответные сообщения + if (isset($this->ReplyMessage)) { - if (!empty($forward_messages)) { - // Если есть пересылаемые сообщения - $this->robot->api['forward_messages'] = implode(',', $forward_messages); - } + $this->robot->api['reply_to'] = $this->ReplyMessage; + } - //if (!empty($this->attachment->attachments)) { - // Если есть вложения - //throw new Exception('СУКАААА'); - $this->robot->api['attachment'] = implode(',', $this->data->data); - //} + // Вложения + if ( isset($this->data) && $this->__get('data') !== []) { // !empty($this->data->data) почемуто не работает + + $this->robot->api['attachment'] = implode(',', $this->__get('data')); } // Запрос - $request = $this->robot->browser->request('POST', 'messages.send', ['form_params' => $this->robot->api->settings]); + $request = json_decode($this->robot->browser->request('POST', 'messages.send', ['form_params' => $this->robot->api->settings])->getBody()->getContents()); - // Очистка - //unset($settings); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } if ($this->mode >= 2) { // Если установлен режим 2 (усиленная проверка отправленного сообщения) @@ -194,16 +235,22 @@ final class messages extends method // Запрос if ($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])['response']['count'] === 0) { // Сообщения не существует + //!!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!!! + //!!!!!!!!!!!!!!!!!!!!!!!!! // Повторная отправка $this->send($destination); } } else { // Что-то придумать :) + // наверно throw new exception($request->error->error_msg) + // А стоп. Ничего не нужно, просто возвращаем объект с ошибкой, где всё будет написано + // Костя ты тупой? } } - return $request->getBody(); + return $request->response; } /** @@ -217,7 +264,7 @@ final class messages extends method public function __set(string $name, mixed $value): void { match ($name) { - 'data' => !isset($this->data) ? $this->data[0]->addData($value) : throw new Exception('Вложения не инициализированны'), + 'data' => !isset($this->data) ? $this->data->addData($value) : throw new Exception('Вложения не инициализированны'), default => throw new Exception('Свойство не найдено: ' . $name) }; } @@ -233,52 +280,48 @@ final class messages extends method { return match ($name) { 'text' => $this->text ?? throw new Exception('Текст не инициализирован'), - 'data' => isset($this->data) ? $this->data[0]->data : throw new Exception('Вложения не инициализированны'), + 'data' => isset($this->data) ? $this->data->data : throw new Exception('Вложения не инициализированны'), + 'forwardMessages' => !empty($this->forwardMessages) ? $this->forwardMessages : throw new Exception('Пересылаемые сообщения не инициализированны'), + 'ReplyMessage' => isset($this->ReplyMessage) ? $this->ReplyMessage : throw new Exception('Ответное сообщение не инициализированно'), default => throw new Exception('Свойство не найдено: ' . $name) }; } /** - * Получить информацию о сообщении + * Получить информацию о сообщении по id + * + * @param string $message_ids Идентификатор сообщения * - * @return array Информация о сообщении + * @return object Информация о сообщении */ - public function info()/* : array */ + + //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // доделать + + public function getById(int $message_ids): object { - //Инициализация - //$settings = $this->init(); - $this->robot->api->init(); + // Реиницилазиция + $this->robot->api->reinit(); - // Цель отправки - $this->robot->api->chooseDestination($this->destination); + // Идентификаторы сообщений. Максимум 100 идентификаторов + $this->robot->api['message_ids'] = $message_ids; - // Сообщение - $this->robot->api['message'] = $this->message; - // Режим отправки - $this->robot->api['mode'] = $this->mode; + if ($this->robot instanceof group) { + // Если это группа - // Фильтрация вложений - $forward_messages = []; - foreach ($this->attachments as &$attachment) { - if (iconv_substr(str: $attachment, offset: 0, length: 7, charset: "UTF-8") === 'message') { - // Если среди вложений найдено сообщение для пересылки - - $forward_messages[] = $attachment; - unset($attachment); - } + // Идентификатор группы + isset($this->robot->id) ? $this->robot->api['group_id'] = $this->robot->id : throw new Exception('Необходимо указать идентификатор сообщества'); } - if (!empty($forward_messages)) { - // Если есть пересылаемые сообщения + // Запрос + $request = json_decode(($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])->getBody()->getContents())); - $this->robot->api['forward_messages'] = implode(',', $forward_messages); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); } - if (!empty($this->attachments)) { - // Если есть вложения - - $this->robot->api['attachment'] = implode(',', $this->attachments); - } + return $request->response; } } diff --git a/hood/vk/system/api/methods/photos.php b/hood/vk/system/api/methods/photos.php index 2ba5540..6c32312 100644 --- a/hood/vk/system/api/methods/photos.php +++ b/hood/vk/system/api/methods/photos.php @@ -26,11 +26,6 @@ use Exception; */ final class photos extends method { - /** - * $url - */ - protected $url; - /** * Создать сообщение * @@ -109,27 +104,6 @@ final class photos extends method throw new Exception('Аккаунт не инициализирован'); } - /** - * Загрузить - * - * @param Type $var - * @return void - */ - public static function upload(string ...$images): void - { - if (count($images) > 5) { - throw new Exception('Запрещено отправлять более 5 фотографий'); - } - } - - /** - * загрузить - */ - public static function uploadMessage(robot $robot, string $upload_url, string ...$images) - { - return $robot->browser->api($upload_url, ...$images); - } - /** * Получить сервер для загрузки изображений * @@ -218,15 +192,12 @@ final class photos extends method return (array) $request; } - /** - * Загрузить фото и получить его id - * - * $robot робот - * - * $pathPhoto Путь к фото + /** + * Получить адрес сервера сообщений + * + * @return object */ - - public function getPhoto(string $pathPhoto): string + public function getMessageServer(): object { // Реиницилазиция $this->robot->api->reinit(); @@ -237,25 +208,60 @@ final class photos extends method // Идентификатор назначения (0 Для ботов) $this->robot->api['peer_id'] = 0; - // Получить адрес сервера для загрузки фотографии в личное сообщение - $url = json_decode($this->robot->browser->request('POST', 'photos.getMessagesUploadServer', [ + // Получить адрес сервера + $request = json_decode($this->robot->browser->request('POST', 'photos.getMessagesUploadServer', [ 'form_params' => $this->robot->api['settings'] - ])->getBody()->getContents())->response->upload_url; + ])->getBody()->getContents()); - // Открыть фото - $pathPhoto = fopen($pathPhoto, 'r'); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + return $request->response; + } + + /** + * Загрузить фото + */ + public function upload($photo, string $url): object + { // Загрузить фото - $response = json_decode($this->robot->browser->request('POST', $url, [ + $request = json_decode($this->robot->browser->request('POST', $url, [ 'multipart' => [ [ 'Content-type' => 'multipart/form-data', 'name' => 'photo', - 'contents' => $pathPhoto + 'contents' => $photo ] ] ])->getBody()->getContents()); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); + } + + return $request; + } + + /** + * Получить id фото для сообщения + * + * $robot робот + * + * $pathPhoto Путь к фото + */ + public function getPhoto(string $pathPhoto): string + { + // Получить адрес сервера сообщений + $url = $this->getMessageServer()->upload_url; + + // Открыть фото + $pathPhoto = fopen($pathPhoto, 'r'); + + //Загрузить фото + $response = $this->upload($pathPhoto, $url); // Реинициализация $this->robot->api->reinit(); @@ -274,15 +280,17 @@ final class photos extends method $this->robot->api['hash'] = $response->hash; // Сохранить фото - $response = json_decode($this->robot->browser->request('POST', 'photos.saveMessagesPhoto', [ + $request = json_decode($this->robot->browser->request('POST', 'photos.saveMessagesPhoto', [ 'form_params' => $this->robot->api['settings'] ])->getBody()->getContents()); - // Ссылка на фото - if (isset($response->response[0]->id)) { - return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id; - } else { - throw new Exception('Фото не загружено'); + // Если в ответе ошибка + if (isset($request->error)) { + throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code); } + $request; + // Ссылка на фото + return 'photo' . $request->response[0]->owner_id . '_' . $request->response[0]->id; + } } diff --git a/hood/vk/tests/api/apiTest.php b/hood/vk/tests/api/apiTest.php index 61ee5cc..081cffc 100644 --- a/hood/vk/tests/api/apiTest.php +++ b/hood/vk/tests/api/apiTest.php @@ -117,10 +117,14 @@ final class apiTest extends TestCase /** * @testdox Инициализация (безопасная) */ - public function testInit(): void + public function testSafeInit(): void { - // Безопасная инициализация - self::$robot->key(self::$group_key)->api->init(); + // Инициализация + $settings = self::$robot->key(self::$group_key)->api->init(); + + // Проверка + $this->assertNotNull($settings['access_token']); + $this->assertNotNull($settings['v']); } /** diff --git a/hood/vk/tests/api/dataTest.php b/hood/vk/tests/api/dataTest.php index 6b182d9..dd95e3f 100644 --- a/hood/vk/tests/api/dataTest.php +++ b/hood/vk/tests/api/dataTest.php @@ -126,7 +126,10 @@ final class dataTest extends TestCase */ public function testDataInit(): void { + if (isset(self::$robot)) { + + // Инициализация вложений self::$data = new data(self::$robot); } } @@ -152,18 +155,6 @@ final class dataTest extends TestCase $this->assertNotEmpty(self::$data->data); } - /** - * @testdox Запись вложения методом - */ - public function testWriteAttachmentUsingMethod(): void - { - // Запись вложения - self::$data->addData('Вложение'); - - // Проверка - $this->assertNotEmpty(self::$data->data); - } - /** * @testdox Запись вложения (повторная) */ @@ -188,7 +179,7 @@ final class dataTest extends TestCase $this->expectExceptionMessage('Превышен лимит вложений (10)'); //Запись вложений - self::$data->addData('Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение'); + self::$data->addData('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11'); } /** @@ -196,9 +187,13 @@ final class dataTest extends TestCase */ public function testClearAttachments(): void { + //Запись вложения + self::$data->addData('Вложение'); + // Очистка вложений self::$data->clear(); + // Проверка $this->assertEmpty(self::$data->data); } } diff --git a/hood/vk/tests/api/methods/messagesTest.php b/hood/vk/tests/api/methods/messagesTest.php index 76825e0..a2201b4 100644 --- a/hood/vk/tests/api/methods/messagesTest.php +++ b/hood/vk/tests/api/methods/messagesTest.php @@ -9,6 +9,7 @@ use hood\vk\robots\robot; use hood\vk\tests\settings; use hood\accounts\vk as account; +use hood\accounts\vk; /** * @testdox Сообщения @@ -132,7 +133,10 @@ final class messagesTest extends TestCase public function testWriteText(): void { // Запись текста - self::$robot->message()->text('text'); + $message = self::$robot->message()->text('text'); + + // Проверка + $this->assertNotNull($message->text); } /** @@ -147,21 +151,37 @@ final class messagesTest extends TestCase $message->text('text'); // Проверка - $this->assertSame('texttext', $message->text); + $this->assertEquals('texttext', $message->text); } /** - * @testdox Запись фото + * @testdox Отправка текста */ - public function testWriteImage(): void + public function testSendText(): void { - // Запись фото - $message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo); + // Отправка сообщения + $response = self::$robot->key(self::$group_key)->message('Тестовое сообщение')->send(self::$target_id); // Проверка - $this->assertNotEmpty($message->data); + $this->assertIsInt($response, 'Сообщение не отправленно'); } + /** + * @testdox Получение информации о сообщении + */ + public function testgetById(): void + { + // Отправка сообщения + $id = self::$robot->key(self::$group_key)->message('Теста метода getByID')->send(self::$target_id); + + // Получение информации + $response = self::$robot->message()->getById($id); + + // Проверка + $this->assertIsArray($response->items, 'Информация не получена'); + } + + /** * @testdox Чтение Вложений */ @@ -175,37 +195,139 @@ final class messagesTest extends TestCase } /** - * @testdox Запись вложений методом + * @testdox Запись вложений (методом) */ public function testWriteAttachments(): void { // Запись вложений - $message = self::$robot->message(); - - $message->attachments('Вложение'); + $message = self::$robot->message()->attachments('Вложение'); // Проверка $this->assertEquals(['Вложение'], $message->data); } /** - * @testdox Отправка текста + * @testdox Запись фото */ - public function testSend(): void - { - // Отправка сообщения - self::$robot->key(self::$group_key)->message('Тестовое сообщение')->send(self::$target_id); - } - - /** - * @testdox Отправка фотографии - */ - public function testSendPhoto(): void + public function testWriteImage(): void { // Запись фото $message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo); + // Проверка + $this->assertNotEmpty($message->data); + } + + + /** + * @testdox Отправка фото + */ + public function testSendPhoto(): void + { + // Запись фото + $message = self::$robot->key(self::$group_key)->message('Тест отправки фото')->image(self::$path_photo); + // Отправка сообщения - $message->send(self::$target_id); + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = $message->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->attachments, 'Фото не отправлено'); + } + + /** + * @testdox Чтение пересылаемых сообщений + */ + public function testReadForward(): void + { + // Проверка выброса исключеия + $this->expectExceptionMessage('Пересылаемые сообщения не инициализированны'); + + // Проверка + self::$robot->message()->forwardMessages; + } + + /** + * @testdox Запись пересылаемых сообщений + */ + public function testWriteForward(): void + { + // Запись пересылаемых сообщений + $message = self::$robot->message()->forward(123456); + + // Проверка + $this->assertNotEmpty($message->forwardMessages); + + } + + /** + * @testdox Пересылка сообщений + */ + public function testSendForward(): void + { + // Отправка пересылаемого сообщения + $id = self::$robot->key(self::$group_key)->message('Это сообщение будет переслано')->send(self::$target_id); + + // Запись пересылаемых сообщений + $message = self::$robot->message('Тест пересылки сообщений')->forward($id); + + // Отпрравка пересылки сообщения + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = self::$robot->message()->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->fwd_messages, 'Сообщение не пересланно'); + + } + + /** + * @testdox Чтение ответного сообщения + */ + public function testReadReply(): void + { + // Проверка выброса исключеия + $this->expectExceptionMessage('Ответное сообщение не инициализированно'); + + // Проверка + self::$robot->message()->ReplyMessage; + } + + /** + * @testdox Запись ответного сообщения + */ + public function testWriteReply(): void + { + // Запись ответного сообщения + $message = self::$robot->message()->Reply(123456); + + // Проверка + $this->assertNotNull($message->ReplyMessage); + + } + + /** + * @testdox Ответ на сообщение + */ + public function testSendReply(): void + { + // Отправка ответного сообщения + $id = self::$robot->key(self::$group_key)->message('Будет ответ на это сообщение')->send(self::$target_id); + + // Запись ответного сообщения + $message = self::$robot->message('Тест ответа на сообщение')->reply($id); + + // Отправка ответа на сообщение + $id = $message->send(self::$target_id); + + // Получене информации для проверки + $message = self::$robot->message()->getById($id); + + // Проверка + $this->assertNotEmpty($message->items[0]->reply_message, 'Сообщение не пересланно'); + } } diff --git a/hood/vk/tests/api/methods/photosTest.php b/hood/vk/tests/api/methods/photosTest.php index b9c4ef9..83a644d 100644 --- a/hood/vk/tests/api/methods/photosTest.php +++ b/hood/vk/tests/api/methods/photosTest.php @@ -115,14 +115,39 @@ final class photosTest extends TestCase } /** - * @testdox Загрузка фото и получение его id + * @testdox Получение адреса сервера сообщений + */ + public function testGetMessageServer(): void + { + // Получение адреса сервера + $response = self::$robot->key(self::$group_key)->photo()->getMessageServer(); + + // Проверка + $this->assertIsString($response->upload_url, 'Адрес сервера не получен'); + + } + + /** + * @testdox Загрузка фото + */ + public function testUpload(): void + { + // Получение адреса сервера + $url = self::$robot->key(self::$group_key)->photo()->getMessageServer()->upload_url; + + // Загрузка фото + $response = self::$robot->photo()->upload(fopen(self::$path_photo, 'r'), $url); + + // Проверка + $this->assertIsString($response->hash, 'Фото не загружено'); + } + + /** + * @testdox Получение id фото для сообщения */ public function testGetPhoto(): void { - // Ожидаемое исключение (это временно) - //$this->expectExceptionMessage('Фото не загружено'); - // Проверка - //self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo); + self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo); } }