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

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 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 = [];
}
}
}

View File

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

View File

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

View File

@ -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']);
}
/**

View File

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

View File

@ -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, 'Сообщение не пересланно');
}
}

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
{
// Ожидаемое исключение (это временно)
//$this->expectExceptionMessage('Фото не загружено');
// Проверка
//self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo);
self::$robot->key(self::$group_key)->photo()->getPhoto(self::$path_photo);
}
}