diff --git a/hood/vk/system/api/api.php b/hood/vk/system/api/api.php index e5a612d..f67c78a 100644 --- a/hood/vk/system/api/api.php +++ b/hood/vk/system/api/api.php @@ -93,7 +93,7 @@ class api implements ArrayAccess * * @see hood\vk\api\methods\messages Сообщения */ - public function chooseDestination(string|array $destination): void + public function chooseDestination(string|array|int $destination): void { if (is_int($destination)) { // Идентификатор diff --git a/hood/vk/system/api/methods/messages.php b/hood/vk/system/api/methods/messages.php index 9e9752e..1ef0742 100644 --- a/hood/vk/system/api/methods/messages.php +++ b/hood/vk/system/api/methods/messages.php @@ -4,6 +4,9 @@ declare(strict_types=1); namespace hood\vk\api\methods; +use Exception; + +use hood\accounts\vk; use hood\vk\robots\robot; /** @@ -26,26 +29,77 @@ final class messages extends method */ protected int $mode = 1; + /** + * @param int|string|array $destination Получатель + */ + protected int|string|array $destination; + + /** + * @param string|null $text Текст + */ + protected string|null $text = null; + + /** + * @param array $attachments Вложения + */ + protected array $attachments = []; + /** * Создать сообщение * - * Если переданы все параметры, то сразу отправляет - * * @param robot $robot Робот - * @param string $message Текст - * @param int|string|array|null $destination Получатель - * @param array $attachments Вложения - * - * @return self */ public function __construct( - protected robot $robot, - protected string $message, - protected int|string|array|null $destination = null, - protected array $attachments = [] + protected robot $robot ) { - // Отправка, если все параметры инициализированы - return $this->send($destination); + } + + /** + * Добавить текст + * + * @param string $text Текст + */ + public function text(string $text): self + { + if (!isset($this->text)) { + $this->text = $text; + } else { + $this->text .= $text; + } + + return $this; + } + + /** + * Добавить Фото + * + * @param $img Фото + */ + public function image($img): self + { + //загрузить фото + $id = $this->robot->photo()->get_photo($img); + + //добавить к вложениям + $this->add($id); + + return $this; + } + + /** + * Добавить вложения + * + * @param string|array $attachments Вложения + */ + public function add(string|array $attachments): self + { + if (is_array($attachments)) { + $this->attachments = array_merge($this->attachments, $attachments); + } else { + array_push($this->attachments, $attachments); + } + + return $this; } /** @@ -98,7 +152,6 @@ final class messages extends method //var_dump($attachments); if (!empty($this->attachments)) { // Если есть вложения - //echo 'lol'; $this->robot->api['attachment'] = implode(',', $this->attachments); } @@ -133,6 +186,15 @@ final class messages extends method return (array) $request; } + public function __get($name) + { + return match ($name) { + 'text' => $this->text ?? throw new Exception('Текст не задан'), + 'attachments' => !empty($this->attachments) ? $this->attachments : throw new Exception('Вложения не заданы'), + default => throw new Exception('Свойство не найдено: ' . $name) + }; + } + /** * Получить информацию о сообщении * diff --git a/hood/vk/system/api/methods/photos.php b/hood/vk/system/api/methods/photos.php index a602178..634bbf8 100644 --- a/hood/vk/system/api/methods/photos.php +++ b/hood/vk/system/api/methods/photos.php @@ -216,7 +216,7 @@ final class photos extends method * $img фото */ - public function get_photo(robot $robot, $img) + public function get_photo(robot $robot, $img) //Добавить проверку формата фото { // Реиницилазиция $this->robot->api->reinit(); @@ -225,13 +225,10 @@ final class photos extends method $this->robot->api['group_id'] = $robot->id; $this->robot->api['peer_id'] = 0; - if (!isset($this->url)) { - - // Получить адрес сервера для загрузки фотографии в личное сообщение - $this->url = json_decode($robot->browser->request('POST', 'photos.getMessagesUploadServer', [ - 'form_params' => $this->robot->api['settings'] - ])->getBody()->getContents())->response->upload_url; - } + // Получить адрес сервера для загрузки фотографии в личное сообщение + $this->url = json_decode($robot->browser->request('POST', 'photos.getMessagesUploadServer', [ + 'form_params' => $this->robot->api['settings'] + ])->getBody()->getContents())->response->upload_url; //загрузить $response = json_decode($robot->browser->request('POST', $this->url, [ diff --git a/hood/vk/tests/api/methods/messagesTest.php b/hood/vk/tests/api/methods/messagesTest.php index 285a292..fc8ccd7 100644 --- a/hood/vk/tests/api/methods/messagesTest.php +++ b/hood/vk/tests/api/methods/messagesTest.php @@ -113,4 +113,92 @@ final class messagesTest extends TestCase // Проверка $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); } + + /** + * @testdox Чтение текста + */ + public function testReadText(): void + { + $this->expectExceptionMessage('Текст не задан'); + + self::$robot->message()->text; + } + + /** + * @testdox Чтение вложений + */ + public function testReadAttachments(): void + { + $this->expectExceptionMessage('Вложения не заданы'); + + self::$robot->message()->attachments; + } + + + /** + * @testdox Добавление текста + */ + public function testWriteText() //: hood\vk\api\methods\messages + { + //self::$robot->key(self::$group_key); + return self::$robot->message()->text('text'); + } + + /** + * @testdox Повторное добавление текста + * + * @depends testWriteText + */ + public function testWriteTextWhenHeIsAlreadyWrited($messages) + { + $messages->text('text'); + + $this->assertSame('text' . 'text', $messages->text); + + return $messages; + } + + /** + * @testdox Добавление массива вложений + * + * @depends testWriteTextWhenHeIsAlreadyWrited + */ + public function testAddAttAttachments($messages) + { + return $messages->add(['text']); + } + + /** + * @testdox Повторное добавление текста вложения + * + * @depends testAddAttAttachments + */ + public function testAddAttachmentsWhenTheyIsAlreadyWrited($messages) + { + //временный код + $this->assertSame(['text', 'text'], $messages->add('text')->attachments); + + return $messages; + } + + /** + * @testdox Отправка сообщения + * + * @depends testAddAttachmentsWhenTheyIsAlreadyWrited + */ + //public function testSend($messages) + //{ + //Проверка выбрса исключения + //$this->expectExceptionMessage('Ключ не инициализирован'); + + //Отправка по идентификатору + //$messages->send(self::$peer_id); + + //Отправка по идентификаторам + //$messages->send(self::$peer_ids); + + //Отправка по домену + //$messages->send(self::$domain); + + //} } diff --git a/hood/vk/tests/api/methods/photosTest.php b/hood/vk/tests/api/methods/photosTest.php new file mode 100644 index 0000000..cc02f78 --- /dev/null +++ b/hood/vk/tests/api/methods/photosTest.php @@ -0,0 +1,116 @@ +ssl = self::$ssl ?? true; + + if (empty(self::$key)) { + // Если не указан ключ + + // Проверка входных данных + if (empty(self::$login)) { + self::$markTestSkipped('Не найден входной аккаунта'); + } else if (empty(self::$password)) { + self::$markTestSkipped('Не найден пароль аккаунта'); + } + + // Деаутентификация (на всякий случай) + self::$account->deauth(); + + // Аутентификация и генерация ключа + self::$key = self::$account->auth(self::$login, self::$password)->key(self::$project_id); + } + + $this->assertNotNull(self::$key, 'Ошибка при инициализации ключа аккаунта'); + } + + /** + * @testdox Деинициализация аккаунта + * @afterClass + */ + public static function testAccountDeinit(): void + { + // Инициализация аккаунта + self::$account = new account(empty(self::$id) ? rand(0, 10) : self::$id, __DIR__ . '../../../accounts'); + + // Деаутентификация + self::$account->deauth(); + } + + /** + * @testdox Инициализация робота + * @before + */ + public function testRobotGroupInit(): void + { + // Инициализация ядра + self::$core = core::init(); + + // Сохранение количества роботов + $count = self::$core->robots; + + // Инициализация робота + self::$robot = self::$core->group(empty(self::$group_id) ? rand(0, 10) : self::$group_id); + + // Проверка + $this->assertEquals(self::$core->robots, $count + 1, 'Ошибка при инициализации робота'); + } + + /** + * @testdox Деинициализация робота + * @after + */ + public function testRobotGroupDeinit(): void + { + // Очистка реестра + self::$core->delete(); + + // Проверка + $this->assertEmpty(self::$core->get(self::$robot->id), 'Ошибка при деинициализации робота'); + } +} \ No newline at end of file diff --git a/hood/vk/tests/robots/groupTest.php b/hood/vk/tests/robots/groupTest.php index 5df4943..1eda3ea 100644 --- a/hood/vk/tests/robots/groupTest.php +++ b/hood/vk/tests/robots/groupTest.php @@ -225,6 +225,16 @@ final class groupTest extends TestCase $key = self::$robot->key; } + /** + * @testdox Чтение api + */ + public function testRobotGroupReadApi(): void + { + $this->expectExceptionMessage('Ключ не инициализирован'); + + $api = self::$robot->api; + } + /** * @testdox Запись версии API */ @@ -232,17 +242,21 @@ final class groupTest extends TestCase { // Проверка выброса исключения $this->expectExceptionMessage('Запрещено перезаписывать версию API'); + $this->expectExceptionMessage('Ключ не инициализирован'); // Запись версии - self::$robot->version = empty(self::$robot->version) ? rand(0, 10) : self::$robot->version; + self::$robot->api->version = empty(self::$robot->api->version) ? rand(0, 10) : self::$robot->api->version; } /** - * @testdox Чтение версии + * @testdox Чтение версии API */ public function testRobotGroupReadVersion(): void { + // Проверка выброса исключения + $this->expectExceptionMessage('Ключ не инициализирован'); + // Проверка - $this->assertNotNull(self::$robot->version, 'Не удалось прочитать версию'); + $this->assertNotNull(self::$robot->api->version, 'Не удалось прочитать версию'); } } diff --git a/hood/vk/tests/robots/userTest.php b/hood/vk/tests/robots/userTest.php index aed7b5f..af9a69e 100644 --- a/hood/vk/tests/robots/userTest.php +++ b/hood/vk/tests/robots/userTest.php @@ -232,17 +232,21 @@ final class userTest extends TestCase { // Проверка выброса исключения $this->expectExceptionMessage('Запрещено перезаписывать версию API'); + $this->expectExceptionMessage('Ключ не инициализирован'); // Запись версии - self::$robot->version = empty(self::$robot->version) ? rand(0, 10) : self::$robot->version; + self::$robot->api->version = empty(self::$robot->api->version) ? rand(0, 10) : self::$robot->api->version; } /** - * @testdox Чтение версии + * @testdox Чтение версии API */ public function testRobotGroupReadVersion(): void { + // Проверка выброса исключения + $this->expectExceptionMessage('Ключ не инициализирован'); + // Проверка - $this->assertNotNull(self::$robot->version, 'Не удалось прочитать версию'); + $this->assertNotNull(self::$robot->api->version, 'Не удалось прочитать версию'); } }