Исправления, на доработку вложений

This commit is contained in:
tarashyanskiy 2021-03-16 18:16:30 +08:00
parent 3c1e4a5b15
commit 0bdf754405
11 changed files with 243 additions and 179 deletions

41
composer.lock generated
View File

@ -106,16 +106,16 @@
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "1.4.0", "version": "1.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "60d379c243457e073cff02bc323a2a86cb355631" "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
"reference": "60d379c243457e073cff02bc323a2a86cb355631", "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -153,7 +153,7 @@
"keywords": [ "keywords": [
"promise" "promise"
], ],
"time": "2020-09-30T07:37:28+00:00" "time": "2021-03-07T09:25:29+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
@ -824,16 +824,16 @@
}, },
{ {
"name": "phar-io/version", "name": "phar-io/version",
"version": "3.0.4", "version": "3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phar-io/version.git", "url": "https://github.com/phar-io/version.git",
"reference": "e4782611070e50613683d2b9a57730e9a3ba5451" "reference": "bae7c545bef187884426f042434e561ab1ddb182"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
"reference": "e4782611070e50613683d2b9a57730e9a3ba5451", "reference": "bae7c545bef187884426f042434e561ab1ddb182",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -867,7 +867,7 @@
} }
], ],
"description": "Library for handling version information and constraints", "description": "Library for handling version information and constraints",
"time": "2020-12-13T23:18:30+00:00" "time": "2021-02-23T14:00:09+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
@ -2499,30 +2499,35 @@
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
"version": "1.9.1", "version": "1.10.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/webmozarts/assert.git", "url": "https://github.com/webmozarts/assert.git",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^5.3.3 || ^7.0 || ^8.0", "php": "^7.2 || ^8.0",
"symfony/polyfill-ctype": "^1.8" "symfony/polyfill-ctype": "^1.8"
}, },
"conflict": { "conflict": {
"phpstan/phpstan": "<0.12.20", "phpstan/phpstan": "<0.12.20",
"vimeo/psalm": "<3.9.1" "vimeo/psalm": "<4.6.1 || 4.6.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^4.8.36 || ^7.5.13" "phpunit/phpunit": "^8.5.13"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Webmozart\\Assert\\": "src/" "Webmozart\\Assert\\": "src/"
@ -2544,7 +2549,7 @@
"check", "check",
"validate" "validate"
], ],
"time": "2020-07-08T17:02:28+00:00" "time": "2021-03-09T10:59:23+00:00"
} }
], ],
"aliases": [], "aliases": [],

View File

@ -121,6 +121,7 @@ class api implements ArrayAccess
{ {
match ($name) { match ($name) {
'settings' => !isset($this->settings) ? $this->settings = $value : throw new Exception('Запрещено перезаписывать настройки'), 'settings' => !isset($this->settings) ? $this->settings = $value : throw new Exception('Запрещено перезаписывать настройки'),
'robot' => !isset($this->robot) ? $this->robot = $value : throw new Exception('Запрещено перезаписывать Робота'),
default => $this->settings[$name] = $value default => $this->settings[$name] = $value
}; };
} }
@ -134,6 +135,7 @@ class api implements ArrayAccess
{ {
return match ($name) { return match ($name) {
'settings' => $this->settings ?? throw new Exception('Настройки не инициализированы'), 'settings' => $this->settings ?? throw new Exception('Настройки не инициализированы'),
'robot' => $this->robot,
default => $this->settings[$name] ?? throw new Exception('Параметр не найден: settings[\'' . $name . '\']') default => $this->settings[$name] ?? throw new Exception('Параметр не найден: settings[\'' . $name . '\']')
}; };
} }

View File

@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
namespace hood\vk\api;
use Exception;
use hood\vk\robots\robot;
/**
* Вложения
*/
class attachments
{
/**
* @var array $attachments Вложения
*/
protected array $attachments = [];
/**
* Конструктор
*
* @var robot $robot Робот
*/
public function __construct(
protected robot $robot
) {
}
/**
* Записать вложения
*
* @param string|array $attachments Вложения
*
* @return self
*/
public function attachment(string ...$attachments): self
{
// Если вложений больше 10
if (count($this->attachments) + count($attachments) > 10) {
throw new Exception('Превышен лимит вложений (10)');
}
// Запись вложений
$this->attachments = array_merge($this->attachments, $attachments);
return $this;
}
/**
* Очистить вложения
*/
public function Clear(): self
{
// Очистка вложений
$this->attachments = [];
return $this;
}
/**
* Прочитать свойство
*
* @param string $name Название
*
* @return mixed
*/
public function __get(string $name): mixed
{
return match ($name) {
'attachments' => $this->attachments,
default => throw new Exception('Свойство не найдено: ' . $name)
};
}
}

116
hood/vk/system/api/data.php Normal file
View File

@ -0,0 +1,116 @@
<?php
declare(strict_types=1);
namespace hood\vk\api;
use Exception;
use hood\vk\robots\robot;
use ArrayAccess;
/**
* Вложения
*/
class data implements ArrayAccess
{
/**
* @var array $data Вложения
*/
protected array $data = [];
/**
* Конструктор
*
* @var robot $robot Робот
*/
public function __construct(
protected robot $robot
) {
}
/**
* Записать вложения
*
* @param string|array $data Вложения
*
* @return self
*/
public function addData(string ...$data): self
{
// Если вложений больше 10
if (count($this->data) + count($data) > 10) {
throw new Exception('Превышен лимит вложений (10)');
}
// Запись вложений
$this->data = array_merge($this->data, $data);
return $this;
}
/**
* Очистить вложения
*/
public function clear(): self
{
// Очистка вложений
$this->data = [];
return $this;
}
/**
* Прочитать свойство
*
* @param string $name Название
*
* @return mixed
*/
public function __get(string $name): mixed
{
return match ($name) {
'data' => $this->data,
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 = [];
}
}
}

View File

@ -8,7 +8,7 @@ use Exception;
use hood\accounts\vk; use hood\accounts\vk;
use hood\vk\robots\robot; use hood\vk\robots\robot;
use hood\vk\api\attachments; use hood\vk\api\data;
/** /**
* Сообщение * Сообщение
@ -35,14 +35,9 @@ final class messages extends method
*/ */
/** /**
* @var array Массив вложений * @var data Вложения
*/ */
protected array $attachments; protected data $data;
/**
* @var attachments Вложения
*/
protected attachments $attachment;
/** /**
* Создать сообщение * Создать сообщение
@ -81,16 +76,16 @@ final class messages extends method
* *
* @return self * @return self
*/ */
public function image(...$imgs): self public function image(...$pathPhoto): self
{ {
// Перебор фото // Перебор фото
foreach ($imgs as $img) { foreach ($pathPhoto as $photo) {
// Загрузить фото // Загрузить фото
$id = $this->robot->photo->getPhoto($img); $id = $this->robot->photo()->getPhoto($photo);
// Записать к вложениям // Записать к вложениям
$this->attachment($id); $this->attachments($id);
} }
return $this; return $this;
@ -101,21 +96,21 @@ final class messages extends method
* *
* @param $attachments Вложения * @param $attachments Вложения
*/ */
public function attachment(string ...$attachments): self public function attachments(string ...$attachments): self
{ {
if (isset($this->attachment)) { if (isset($this->data)) {
// Если вложения инициализированны // Если вложения инициализированны
// Записать вложение // Записать вложение
$this->attachment->attachment(...$attachments); $this->data->addData(...$attachments);
} else { } else {
// Если вложения не инициализированны // Если вложения не инициализированны
// Инициализация вложений // Инициализация вложений
$this->attachment = new attachments($this->robot); $this->data = new data($this->robot);
// Записать вложение // Записать вложение
$this->attachment->attachment(...$attachments); $this->data->addData(...$attachments);
} }
return $this; return $this;
@ -153,26 +148,29 @@ final class messages extends method
$this->robot->api->message = $this->text; $this->robot->api->message = $this->text;
// Фильтрация вложений, если они инициализированны // Фильтрация вложений, если они инициализированны
if (isset($this->attachments)) { if (isset($this->data)) {
$forward_messages = [];
foreach ($this->attachments as &$attachment) { /* $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') { if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') {
// Если среди вложений найдено сообщение для пересылки // Если среди вложений найдено сообщение для пересылки
$forward_messages[] = $attachment; $forward_messages[] = $attachment;
unset($attachment); unset($attachment);
} }
} } */
if (!empty($forward_messages)) { if (!empty($forward_messages)) {
// Если есть пересылаемые сообщения // Если есть пересылаемые сообщения
$this->robot->api['forward_messages'] = implode(',', $forward_messages); $this->robot->api['forward_messages'] = implode(',', $forward_messages);
} }
if (!empty($this->attachments)) { //if (!empty($this->attachment->attachments)) {
// Если есть вложения // Если есть вложения
$this->robot->api['attachment'] = implode(',', $this->attachments); //throw new Exception('СУКАААА');
} $this->robot->api['attachment'] = implode(',', $this->data->data);
//}
} }
// Запрос // Запрос
@ -219,8 +217,7 @@ final class messages extends method
public function __set(string $name, mixed $value): void public function __set(string $name, mixed $value): void
{ {
match ($name) { match ($name) {
'attachment' => !isset($this->attachments) ? $this->attachments = $value : throw new Exception('Запрещено перезаписывать вложения'), 'data' => !isset($this->data) ? $this->data[0]->addData($value) : throw new Exception('Вложения не инициализированны'),
'attachments' => !isset($this->attachments) ? $this->attachments = $value : throw new Exception('Запрещено перезаписывать массив вложений'),
default => throw new Exception('Свойство не найдено: ' . $name) default => throw new Exception('Свойство не найдено: ' . $name)
}; };
} }
@ -236,8 +233,7 @@ final class messages extends method
{ {
return match ($name) { return match ($name) {
'text' => $this->text ?? throw new Exception('Текст не инициализирован'), 'text' => $this->text ?? throw new Exception('Текст не инициализирован'),
'attachment' => $this->attachment->attachments ?? $this->attachment = new attachments($this->robot), 'data' => isset($this->data) ? $this->data[0]->data : throw new Exception('Вложения не инициализированны'),
'attachments' => isset($this->attachment) ? $this->attachment->attachments : throw new Exception('Вложения не инициализированны'),
default => throw new Exception('Свойство не найдено: ' . $name) default => throw new Exception('Свойство не найдено: ' . $name)
}; };
} }
@ -247,7 +243,7 @@ final class messages extends method
* *
* @return array Информация о сообщении * @return array Информация о сообщении
*/ */
public function info(): array public function info()/* : array */
{ {
//Инициализация //Инициализация
//$settings = $this->init(); //$settings = $this->init();
@ -279,13 +275,10 @@ final class messages extends method
$this->robot->api['forward_messages'] = implode(',', $forward_messages); $this->robot->api['forward_messages'] = implode(',', $forward_messages);
} }
if (!empty($attachments)) { if (!empty($this->attachments)) {
// Если есть вложения // Если есть вложения
$this->robot->api['attachment'] = implode(',', $this->attachments); $this->robot->api['attachment'] = implode(',', $this->attachments);
} }
/////////////////////////////////////////////////............................ Что это?
return $settings ?? [];
} }
} }

View File

@ -223,10 +223,10 @@ final class photos extends method
* *
* $robot робот * $robot робот
* *
* $img фото * $pathPhoto Путь к фото
*/ */
public function getPhoto($img) public function getPhoto(string $pathPhoto): string
{ {
// Реиницилазиция // Реиницилазиция
$this->robot->api->reinit(); $this->robot->api->reinit();
@ -242,13 +242,16 @@ final class photos extends method
'form_params' => $this->robot->api['settings'] 'form_params' => $this->robot->api['settings']
])->getBody()->getContents())->response->upload_url; ])->getBody()->getContents())->response->upload_url;
// Открыть фото
$pathPhoto = fopen($pathPhoto, 'r');
// Загрузить фото // Загрузить фото
$response = json_decode($this->robot->browser->request('POST', $url, [ $response = json_decode($this->robot->browser->request('POST', $url, [
'multipart' => [ 'multipart' => [
[ [
'Content-type' => 'multipart/form-data', 'Content-type' => 'multipart/form-data',
'name' => 'photo', 'name' => 'photo',
'contents' => $img 'contents' => $pathPhoto
] ]
] ]
])->getBody()->getContents()); ])->getBody()->getContents());
@ -276,7 +279,7 @@ final class photos extends method
])->getBody()->getContents()); ])->getBody()->getContents());
// Ссылка на фото // Ссылка на фото
if (isset($response->response)) { if (isset($response->response[0]->id)) {
return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id; return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id;
} else { } else {
throw new Exception('Фото не загружено'); throw new Exception('Фото не загружено');

View File

@ -133,19 +133,7 @@ final class apiTest extends TestCase
} }
/** /**
* @testdox Запись робота (повторная) * @testdox Чтение робота
*/
public function testWriteRobot(): void
{
// Проверка выброса исключения
$this->expectExceptionMessage('Запрещено перезаписывать робота');
// Повторная запись робота
self::$robot->key(self::$group_key)->api->robot = 'robot';
}
/**
* @tesetdox Чтение робота
*/ */
public function testReadRobot(): void public function testReadRobot(): void
{ {
@ -162,7 +150,10 @@ final class apiTest extends TestCase
$this->expectExceptionMessage('Запрещено перезаписывать настройки'); $this->expectExceptionMessage('Запрещено перезаписывать настройки');
// Запись настроек // Запись настроек
self::$robot->key(self::$group_key)->api['settings'] = 'settings'; self::$robot->key(self::$group_key)->api['settings'] = ['settings'];
// Проверка
$this->assertTrue(!empty(self::$robot->api(['settings'])));
} }
/** /**
@ -171,7 +162,7 @@ final class apiTest extends TestCase
public function testReadSettingsElement(): void public function testReadSettingsElement(): void
{ {
// Проверка выброса исключения // Проверка выброса исключения
$this->expectExceptionMessage('Не инициализировано: settings[\'element\']'); $this->expectExceptionMessage('Не найдено: settings[\'element\']');
// Чтение элемента настроек // Чтение элемента настроек
self::$robot->key(self::$group_key)->api['element']; self::$robot->key(self::$group_key)->api['element'];

View File

@ -7,14 +7,14 @@ use PHPUnit\Framework\TestCase;
use hood\vk\core; use hood\vk\core;
use hood\vk\robots\robot; use hood\vk\robots\robot;
use hood\vk\tests\settings; use hood\vk\tests\settings;
use hood\vk\api\attachments; use hood\vk\api\data;
use hood\accounts\vk as account; use hood\accounts\vk as account;
/** /**
* @testdox Вложения * @testdox Вложения
*/ */
final class attachmentsTest extends TestCase final class dataTest extends TestCase
{ {
use settings; use settings;
@ -34,9 +34,9 @@ final class attachmentsTest extends TestCase
private static robot $robot; private static robot $robot;
/** /**
* @var attachments $attachments Вложения * @var data $data Вложения
*/ */
private static attachments $attachments; private static data $data;
/** /**
* @testdox Инициализация аккаунта * @testdox Инициализация аккаунта
@ -124,10 +124,10 @@ final class attachmentsTest extends TestCase
* @testdox Инициализация вложений * @testdox Инициализация вложений
* @before * @before
*/ */
public function testAttachmentsInit(): void public function testDataInit(): void
{ {
if (isset(self::$robot)) { if (isset(self::$robot)) {
self::$attachments = new Attachments(self::$robot); self::$data = new data(self::$robot);
} }
} }
@ -137,7 +137,7 @@ final class attachmentsTest extends TestCase
public function testReadAttachments(): void public function testReadAttachments(): void
{ {
// Проверка // Проверка
$this->assertNotNull(self::$attachments->attachments); $this->assertIsArray(self::$data->data);
} }
/** /**
@ -146,7 +146,22 @@ final class attachmentsTest extends TestCase
public function testWriteAttachment(): void public function testWriteAttachment(): void
{ {
// Запись вложения // Запись вложения
self::$attachments->attachment('text'); self::$data->addData('Вложение');
// Проверка
$this->assertNotEmpty(self::$data->data);
}
/**
* @testdox Запись вложения методом
*/
public function testWriteAttachmentUsingMethod(): void
{
// Запись вложения
self::$data->addData('Вложение');
// Проверка
$this->assertNotEmpty(self::$data->data);
} }
/** /**
@ -155,13 +170,13 @@ final class attachmentsTest extends TestCase
public function testWriteAttachmentWhenItIsAlreadyWrited(): void public function testWriteAttachmentWhenItIsAlreadyWrited(): void
{ {
//Запись вложения //Запись вложения
self::$attachments->attachment('text'); self::$data->addData('Вложение');
// Повторная запись вложения // Повторная запись вложения
self::$attachments->attachment('text'); self::$data->addData('Вложение');
// Проверка // Проверка
$this->assertSame(['text', 'text'], self::$attachments->attachments); $this->assertSame(['Вложение', 'Вложение'], self::$data->data);
} }
/** /**
@ -173,7 +188,7 @@ final class attachmentsTest extends TestCase
$this->expectExceptionMessage('Превышен лимит вложений (10)'); $this->expectExceptionMessage('Превышен лимит вложений (10)');
//Запись вложений //Запись вложений
self::$attachments->attachment('text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text'); self::$data->addData('Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение', 'Вложение');
} }
/** /**
@ -182,6 +197,8 @@ final class attachmentsTest extends TestCase
public function testClearAttachments(): void public function testClearAttachments(): void
{ {
// Очистка вложений // Очистка вложений
self::$attachments->clear(); self::$data->clear();
$this->assertEmpty(self::$data->data);
} }
} }

View File

@ -156,7 +156,10 @@ final class messagesTest extends TestCase
public function testWriteImage(): void public function testWriteImage(): void
{ {
// Запись фото // Запись фото
self::$robot->message()->text('img'); $message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo);
// Проверка
$this->assertNotEmpty($message->data);
} }
/** /**
@ -168,20 +171,25 @@ final class messagesTest extends TestCase
$this->expectExceptionMessage('Вложения не инициализированны'); $this->expectExceptionMessage('Вложения не инициализированны');
// Проверка // Проверка
self::$robot->message()->attachments; self::$robot->message()->data;
} }
/** /**
* @testdox Запись вложений * @testdox Запись вложений методом
*/ */
public function testWriteAttachments(): void public function testWriteAttachments(): void
{ {
// Запись вложений // Запись вложений
self::$robot->message()->attachment('text'); $message = self::$robot->message();
$message->attachments('Вложение');
// Проверка
$this->assertEquals(['Вложение'], $message->data);
} }
/** /**
* @testdox Отправка сообщения * @testdox Отправка текста
*/ */
public function testSend(): void public function testSend(): void
{ {
@ -190,20 +198,14 @@ final class messagesTest extends TestCase
} }
/** /**
* @testdox Отправка сообщеий (с вложениями) * @testdox Отправка фотографии
*/ */
// public function testSendWithAttachments(): void public function testSendPhoto(): void
// { {
// // Запись вложений // Запись фото
// $message = self::$robot->key(self::$group_key)->message()->attachment('text'); $message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo);
// // Отправка сообщения // Отправка сообщения
// $message->send('Тестовое сообщение'); $message->send(self::$target_id);
// } }
/**
* @t estdox Отправка сообщеий (с пересылаемым сообщением)
*
* что это?
*/
} }

View File

@ -120,9 +120,9 @@ final class photosTest extends TestCase
public function testGetPhoto(): void public function testGetPhoto(): void
{ {
// Ожидаемое исключение (это временно) // Ожидаемое исключение (это временно)
$this->expectExceptionMessage('Фото не загружено'); //$this->expectExceptionMessage('Фото не загружено');
// Проверка // Проверка
self::$robot->key(self::$group_key)->photo()->getPhoto('img'); //self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo);
} }
} }

View File

@ -6,6 +6,11 @@ namespace hood\vk\tests;
trait settings trait settings
{ {
/**
* @var string $path_account папка для куки
*/
protected static string $path_accounts = null;
/** /**
* @var int $id Идентификатор аккаунта * @var int $id Идентификатор аккаунта
*/ */
@ -65,4 +70,9 @@ trait settings
* @var bool $ssl SSL-протокол * @var bool $ssl SSL-протокол
*/ */
protected static bool $ssl = false; protected static bool $ssl = false;
/**
* @var string $path_photo Путь к Фото
*/
protected static string $path_photo = null;
} }