Исправления для сообщений и фото

This commit is contained in:
tarashyanskiy 2021-03-19 18:58:53 +08:00
parent 0bdf754405
commit 469838cdcd
7 changed files with 349 additions and 193 deletions

View File

@ -6,12 +6,11 @@ namespace hood\vk\api;
use Exception; use Exception;
use hood\vk\robots\robot; use hood\vk\robots\robot;
use ArrayAccess;
/** /**
* Вложения * Вложения
*/ */
class data implements ArrayAccess class data
{ {
/** /**
* @var array $data Вложения * @var array $data Вложения
@ -35,7 +34,7 @@ class data implements ArrayAccess
* *
* @return self * @return self
*/ */
public function addData(string ...$data): self public function addData(...$data): self
{ {
// Если вложений больше 10 // Если вложений больше 10
if (count($this->data) + count($data) > 10) { if (count($this->data) + count($data) > 10) {
@ -73,44 +72,4 @@ class data implements ArrayAccess
default => throw new Exception('Свойство не найдено: ' . $name) 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

@ -9,6 +9,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\data; use hood\vk\api\data;
use hood\vk\robots\group;
/** /**
* Сообщение * Сообщение
@ -39,6 +40,16 @@ final class messages extends method
*/ */
protected data $data; 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; 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 Вложения * @param $attachments Вложения
*
* @return self
*/ */
public function attachments(string ...$attachments): 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 { } else {
// Если вложения не инициализированны // Если вложения не инициализированны
@ -110,7 +155,9 @@ final class messages extends method
$this->data = new data($this->robot); $this->data = new data($this->robot);
// Записать вложение // Записать вложение
$this->data->addData(...$attachments); foreach ($attachments as $attachment) {
$this->data->addData($attachment);
}
} }
return $this; return $this;
@ -142,42 +189,36 @@ final class messages extends method
$this->robot->api->chooseDestination($destination); $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 = []; $this->robot->api['forward_messages'] = implode(',', $this->forwardMessages);
$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') {
// Если среди вложений найдено сообщение для пересылки
$forward_messages[] = $attachment;
unset($attachment);
}
} */
if (!empty($forward_messages)) {
// Если есть пересылаемые сообщения
$this->robot->api['forward_messages'] = implode(',', $forward_messages);
} }
//if (!empty($this->attachment->attachments)) { // Ответные сообщения
// Если есть вложения if (isset($this->ReplyMessage)) {
//throw new Exception('СУКАААА');
$this->robot->api['attachment'] = implode(',', $this->data->data); $this->robot->api['reply_to'] = $this->ReplyMessage;
//} }
// Вложения
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) { if ($this->mode >= 2) {
// Если установлен режим 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) { if ($this->robot->browser->request('POST', 'messages.getById', ['form_params' => $this->robot->api->settings])['response']['count'] === 0) {
// Сообщения не существует // Сообщения не существует
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!
// Повторная отправка // Повторная отправка
$this->send($destination); $this->send($destination);
} }
} else { } 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 public function __set(string $name, mixed $value): void
{ {
match ($name) { 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) default => throw new Exception('Свойство не найдено: ' . $name)
}; };
} }
@ -233,52 +280,48 @@ final class messages extends method
{ {
return match ($name) { return match ($name) {
'text' => $this->text ?? throw new Exception('Текст не инициализирован'), '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) default => throw new Exception('Свойство не найдено: ' . $name)
}; };
} }
/** /**
* Получить информацию о сообщении * Получить информацию о сообщении по id
* *
* @return array Информация о сообщении * @param string $message_ids Идентификатор сообщения
*
* @return object Информация о сообщении
*/ */
public function info()/* : array */
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// доделать
public function getById(int $message_ids): object
{ {
//Инициализация // Реиницилазиция
//$settings = $this->init(); $this->robot->api->reinit();
$this->robot->api->init();
// Цель отправки // Идентификаторы сообщений. Максимум 100 идентификаторов
$this->robot->api->chooseDestination($this->destination); $this->robot->api['message_ids'] = $message_ids;
// Сообщение
$this->robot->api['message'] = $this->message;
// Режим отправки if ($this->robot instanceof group) {
$this->robot->api['mode'] = $this->mode; // Если это группа
// Фильтрация вложений // Идентификатор группы
$forward_messages = []; isset($this->robot->id) ? $this->robot->api['group_id'] = $this->robot->id : throw new Exception('Необходимо указать идентификатор сообщества');
foreach ($this->attachments as &$attachment) {
if (iconv_substr(str: $attachment, offset: 0, length: 7, charset: "UTF-8") === 'message') {
// Если среди вложений найдено сообщение для пересылки
$forward_messages[] = $attachment;
unset($attachment);
}
} }
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)) { return $request->response;
// Если есть вложения
$this->robot->api['attachment'] = implode(',', $this->attachments);
}
} }
} }

View File

@ -26,11 +26,6 @@ use Exception;
*/ */
final class photos extends method final class photos extends method
{ {
/**
* $url
*/
protected $url;
/** /**
* Создать сообщение * Создать сообщение
* *
@ -109,27 +104,6 @@ final class photos extends method
throw new Exception('Аккаунт не инициализирован'); 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);
}
/** /**
* Получить сервер для загрузки изображений * Получить сервер для загрузки изображений
* *
@ -219,14 +193,11 @@ final class photos extends method
} }
/** /**
* Загрузить фото и получить его id * Получить адрес сервера сообщений
* *
* $robot робот * @return object
*
* $pathPhoto Путь к фото
*/ */
public function getMessageServer(): object
public function getPhoto(string $pathPhoto): string
{ {
// Реиницилазиция // Реиницилазиция
$this->robot->api->reinit(); $this->robot->api->reinit();
@ -237,25 +208,60 @@ final class photos extends method
// Идентификатор назначения (0 Для ботов) // Идентификатор назначения (0 Для ботов)
$this->robot->api['peer_id'] = 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'] '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' => [ 'multipart' => [
[ [
'Content-type' => 'multipart/form-data', 'Content-type' => 'multipart/form-data',
'name' => 'photo', 'name' => 'photo',
'contents' => $pathPhoto 'contents' => $photo
] ]
] ]
])->getBody()->getContents()); ])->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(); $this->robot->api->reinit();
@ -274,15 +280,17 @@ final class photos extends method
$this->robot->api['hash'] = $response->hash; $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'] 'form_params' => $this->robot->api['settings']
])->getBody()->getContents()); ])->getBody()->getContents());
// Ссылка на фото // Если в ответе ошибка
if (isset($response->response[0]->id)) { if (isset($request->error)) {
return 'photo' . $response->response[0]->owner_id . '_' . $response->response[0]->id; throw new Exception('Вконтакте: ' . $request->error->error_msg, $request->error->error_code);
} else {
throw new Exception('Фото не загружено');
} }
$request;
// Ссылка на фото
return 'photo' . $request->response[0]->owner_id . '_' . $request->response[0]->id;
} }
} }

View File

@ -117,10 +117,14 @@ final class apiTest extends TestCase
/** /**
* @testdox Инициализация (безопасная) * @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']);
} }
/** /**

View File

@ -126,7 +126,10 @@ final class dataTest extends TestCase
*/ */
public function testDataInit(): void public function testDataInit(): void
{ {
if (isset(self::$robot)) { if (isset(self::$robot)) {
// Инициализация вложений
self::$data = new data(self::$robot); self::$data = new data(self::$robot);
} }
} }
@ -152,18 +155,6 @@ final class dataTest extends TestCase
$this->assertNotEmpty(self::$data->data); $this->assertNotEmpty(self::$data->data);
} }
/**
* @testdox Запись вложения методом
*/
public function testWriteAttachmentUsingMethod(): void
{
// Запись вложения
self::$data->addData('Вложение');
// Проверка
$this->assertNotEmpty(self::$data->data);
}
/** /**
* @testdox Запись вложения (повторная) * @testdox Запись вложения (повторная)
*/ */
@ -188,7 +179,7 @@ final class dataTest extends TestCase
$this->expectExceptionMessage('Превышен лимит вложений (10)'); $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 public function testClearAttachments(): void
{ {
//Запись вложения
self::$data->addData('Вложение');
// Очистка вложений // Очистка вложений
self::$data->clear(); self::$data->clear();
// Проверка
$this->assertEmpty(self::$data->data); $this->assertEmpty(self::$data->data);
} }
} }

View File

@ -9,6 +9,7 @@ use hood\vk\robots\robot;
use hood\vk\tests\settings; use hood\vk\tests\settings;
use hood\accounts\vk as account; use hood\accounts\vk as account;
use hood\accounts\vk;
/** /**
* @testdox Сообщения * @testdox Сообщения
@ -132,7 +133,10 @@ final class messagesTest extends TestCase
public function testWriteText(): void 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'); $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 Чтение Вложений * @testdox Чтение Вложений
*/ */
@ -175,37 +195,139 @@ final class messagesTest extends TestCase
} }
/** /**
* @testdox Запись вложений методом * @testdox Запись вложений (методом)
*/ */
public function testWriteAttachments(): void public function testWriteAttachments(): void
{ {
// Запись вложений // Запись вложений
$message = self::$robot->message(); $message = self::$robot->message()->attachments('Вложение');
$message->attachments('Вложение');
// Проверка // Проверка
$this->assertEquals(['Вложение'], $message->data); $this->assertEquals(['Вложение'], $message->data);
} }
/** /**
* @testdox Отправка текста * @testdox Запись фото
*/ */
public function testSend(): void public function testWriteImage(): void
{
// Отправка сообщения
self::$robot->key(self::$group_key)->message('Тестовое сообщение')->send(self::$target_id);
}
/**
* @testdox Отправка фотографии
*/
public function testSendPhoto(): void
{ {
// Запись фото // Запись фото
$message = self::$robot->key(self::$group_key)->message()->image(self::$path_photo); $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, 'Сообщение не пересланно');
} }
} }

View File

@ -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 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);
} }
} }