Перенос на php 8

This commit is contained in:
Kostya Kalimagin 2021-01-16 12:18:29 +08:00
parent e07b82ddde
commit 615518a7b2
8 changed files with 191 additions and 288 deletions

View File

@ -30,13 +30,6 @@ use hood\vk\core,
*/ */
final class longpoll final class longpoll
{ {
/**
* Робот
*
* @var string
*/
private robot $robot;
/** /**
* Ключ к серверу * Ключ к серверу
* *
@ -71,7 +64,7 @@ final class longpoll
* *
* @param robot $robot Робот * @param robot $robot Робот
*/ */
public function __construct(robot $robot) public function __construct(private robot $robot)
{ {
// Инициализация робота // Инициализация робота
if (!isset($robot->id)) { if (!isset($robot->id)) {
@ -82,7 +75,6 @@ final class longpoll
throw new Exception('Необходимо указать версию используемого API ВКонтакте'); throw new Exception('Необходимо указать версию используемого API ВКонтакте');
} }
$this->robot = $robot;
// Остановка процессов-дубликатов // Остановка процессов-дубликатов
if (!file_exists(core::init()->path_temp)) { if (!file_exists(core::init()->path_temp)) {
@ -186,7 +178,7 @@ final class longpoll
} }
} }
return $this->robot->browser->request('POST', 'groups.setLongPollSettings', $settings); return $this->robot->browser->request(method: 'POST', uri: 'groups.setLongPollSettings', options: $settings);
} }
/** /**
@ -202,8 +194,7 @@ final class longpoll
// Если не инициализирован LongPoll-сервер // Если не инициализирован LongPoll-сервер
// Запрос на получение доступа и данных LongPoll-сервера // Запрос на получение доступа и данных LongPoll-сервера
echo 'запрос на получение данных лонгполл'; $response = json_decode($this->robot->browser->request(method: 'POST', uri: 'groups.getLongPollServer', options: [
$response = json_decode($this->robot->browser->request('POST', 'groups.getLongPollServer', [
'form_params' => [ 'form_params' => [
'group_id' => $this->robot->id, 'group_id' => $this->robot->id,
'v' => $this->robot->version, 'v' => $this->robot->version,

View File

@ -23,21 +23,6 @@ use hood\vk\robots\robot,
*/ */
final class messages extends method final class messages extends method
{ {
/**
* @param string $message Сообщение
*/
protected string $message;
/**
* @param int|string|array|null $destination Получатель
*/
protected $destination;
/**
* @param array $attachments Вложения
*/
protected array $attachments = [];
/** /**
* @param int $mode Режим отправки * @param int $mode Режим отправки
*/ */
@ -51,34 +36,16 @@ final class messages extends method
* @param robot $robot Робот * @param robot $robot Робот
* @param string $message Текст * @param string $message Текст
* @param int|string|array|null $destination Получатель * @param int|string|array|null $destination Получатель
* @param string|null ...$attachments Вложения * @param array $attachments Вложения
* *
* @return self * @return self
*/ */
public function __construct(robot $robot, string $message, $destination = null, string ...$attachments) public function __construct(
{ protected robot $robot,
// Инициализация параметров protected string $message,
protected int|string|array|null $destination = null,
// Робот protected array $attachments = []
$this->robot = $robot; ) {
// Сообщение
$this->message = $message;
// Получатель
if (isset($destination)) {
$this->destination = $destination;
} else {
return;
}
// Вложения
if (isset($attachments)) {
$this->attachments = $attachments;
} else {
return;
}
// Отправка, если все параметры инициализированы // Отправка, если все параметры инициализированы
return $this->send($destination); return $this->send($destination);
} }
@ -92,7 +59,7 @@ final class messages extends method
* *
* @return array Ответ сервера * @return array Ответ сервера
*/ */
public function send($destination): array public function send(int|string|array $destination): array
{ {
// Идентификатор сообщения // Идентификатор сообщения
$random_id = time(); $random_id = time();
@ -103,28 +70,25 @@ final class messages extends method
} }
# Ключ # Ключ
if ($this->robot instanceof group) { match (true) {
// Робот-группа // Робот-группа
$settings['access_token'] = $this->robot->key; $this->robot instanceof group => $settings['access_token'] = $this->robot->key,
} else if ($this->robot instanceof User) {
// Робот-пользователь // Робот-пользователь
$settings['access_token'] = $this->robot->key; $this->robot instanceof User => $settings['access_token'] = $this->robot->key
} };
// Версия API // Версия API
$settings['v'] = $this->robot->version; $settings['v'] = $this->robot->version;
// Цель отправки // Цель отправки
if (is_int($destination)) { match (true) {
// Отправить по идентификатору // Отправить по идентификатору
$settings['peer_id'] = $destination; is_int($destination) => $settings['peer_id'] = $destination,
} else if (is_array($destination)) {
// Массовая отправка по идентификаторам // Массовая отправка по идентификаторам
$settings['user_ids'] = $destination; is_array($destination) => $settings['user_ids'] = $destination,
} else { // Отправить по домену
// Отправить по домену default => $settings['domain'] = $destination
$settings['domain'] = $destination; };
}
// Сообщение // Сообщение
$settings['message'] = $this->message; $settings['message'] = $this->message;
@ -135,7 +99,7 @@ final class messages extends method
// Фильтрация вложений // Фильтрация вложений
$forward_messages = []; $forward_messages = [];
foreach ($this->attachments as &$attachment) { foreach ($this->attachments as &$attachment) {
if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') { if (iconv_substr(str: $attachment, offset: 0, length: 7, charset: "UTF-8") === 'message') {
// Если среди вложений найдено сообщение для пересылки // Если среди вложений найдено сообщение для пересылки
$forward_messages[] = $attachment; $forward_messages[] = $attachment;
unset($attachment); unset($attachment);
@ -144,17 +108,17 @@ final class messages extends method
if (!empty($forward_messages)) { if (!empty($forward_messages)) {
// Если есть пересылаемые сообщения // Если есть пересылаемые сообщения
$settings['forward_messages'] = implode(',', $forward_messages); $settings['forward_messages'] = implode(glue: ',', pieces: $forward_messages);
} }
if (!empty($attachments)) { if (!empty($attachments)) {
// Если есть вложения // Если есть вложения
$settings['attachment'] = implode(',', $attachments); $settings['attachment'] = implode(glue: ',', pieces: $attachments);
} }
// Запрос // Запрос
$request = $this->robot->browser->request('POST', 'messages.send', ['form_params' => $settings]); $request = $this->robot->browser->request(method: 'POST', uri: 'messages.send', options: ['form_params' => $settings]);
// Очистка // Очистка
unset($settings); unset($settings);
@ -165,13 +129,12 @@ final class messages extends method
// Если пришел ID сообщения // Если пришел ID сообщения
// Ключ // Ключ
if ($this->robot instanceof Group) { match (true) {
// Робот-группа // Робот-группа
$settings['access_token'] = $this->robot->key; $this->robot instanceof Group => $settings['access_token'] = $this->robot->key,
} else if ($this->robot instanceof User) {
// Робот-пользователь // Робот-пользователь
$settings['access_token'] = $this->robot->key; $this->robot instanceof User => $settings['access_token'] = $this->robot->key
} };
// Версия API // Версия API
$settings['v'] = $this->robot->version; $settings['v'] = $this->robot->version;
@ -180,7 +143,7 @@ final class messages extends method
$settings['message_ids'] = $request["response"]; $settings['message_ids'] = $request["response"];
// Запрос // Запрос
if ($this->robot->browser()->post('https://api.vk.com/method/messages.getById', $settings)['response']['count'] === 0) { if ($this->robot->browser->post(uri: 'https://api.vk.com/method/messages.getById', options: $settings)['response']['count'] === 0) {
// Если сообщения не существует, то повторить отправку // Если сообщения не существует, то повторить отправку
$this->send($destination); $this->send($destination);
} }
@ -200,25 +163,22 @@ final class messages extends method
public function info(): array public function info(): array
{ {
# Ключ # Ключ
if ($this->robot instanceof group) { match (true) {
// Робот-группа // Робот-группа
$settings['access_token'] = $this->robot->key; $this->robot instanceof group => $settings['access_token'] = $this->robot->key,
} else if ($this->robot instanceof User) {
// Робот-пользователь // Робот-пользователь
$settings['access_token'] = $this->robot->key; $this->robot instanceof User => $settings['access_token'] = $this->robot->key
} };
// Цель отправки // Цель отправки
if (is_int($this->destination)) { match (true) {
// Отправить по идентификатору // Отправить по идентификатору
$settings['peer_id'] = $this->destination; is_int($this->destination) => $settings['peer_id'] = $this->destination,
} else if (is_array($this->destination)) {
// Массовая отправка по идентификаторам // Массовая отправка по идентификаторам
$settings['user_ids'] = $this->destination; is_array($this->destination) => $settings['user_ids'] = $this->destination,
} else { // Отправить по домену
// Отправить по домену default => $settings['domain'] = $this->destination
$settings['domain'] = $this->destination; };
}
// Версия API // Версия API
$settings['v'] = $this->robot->version; $settings['v'] = $this->robot->version;
@ -232,7 +192,7 @@ final class messages extends method
// Фильтрация вложений // Фильтрация вложений
$forward_messages = []; $forward_messages = [];
foreach ($this->attachments as &$attachment) { foreach ($this->attachments as &$attachment) {
if (iconv_substr($attachment, 0, 7, "UTF-8") === 'message') { if (iconv_substr(str: $attachment, offset: 0, length: 7, charset: "UTF-8") === 'message') {
// Если среди вложений найдено сообщение для пересылки // Если среди вложений найдено сообщение для пересылки
$forward_messages[] = $attachment; $forward_messages[] = $attachment;
unset($attachment); unset($attachment);

View File

@ -19,13 +19,6 @@ use hood\vk\robots\robot;
*/ */
abstract class method abstract class method
{ {
/**
* Робот
*
* @param robot $robot Робот
*/
protected robot $robot;
/** /**
* Создать * Создать
* *

View File

@ -40,7 +40,7 @@ final class photos
* *
* @return array|null Ответ сервера * @return array|null Ответ сервера
*/ */
public static function save(robot $robot, int $album_id, array $images, ?string $caption = null, ?int $group_id = null, ?float $latitude = null, ?float $longitude = null): ?array public static function save(robot $robot, int $album_id, array $images,string $upload_url = null, string|null $caption = null, int|null $group_id = null, float|null $latitude = null, float|null $longitude = null): ?array
{ {
if (isset($robot->account)) { if (isset($robot->account)) {
// Если инициализирован аккаунт // Если инициализирован аккаунт
@ -61,7 +61,8 @@ final class photos
$settings['group_id'] = $group_id; $settings['group_id'] = $group_id;
} }
$upload = self::upload(...$images); //загрузить
$upload = self::uploadMessage($robot, $upload_url, ...$images);
// Сервер // Сервер
$settings['server'] = $upload['server']; $settings['server'] = $upload['server'];
@ -104,10 +105,27 @@ final class photos
if (count($images) > 5) { if (count($images) > 5) {
throw new Exception('Запрещено отправлять более 5 фотографий'); throw new Exception('Запрещено отправлять более 5 фотографий');
} }
} }
/**
* загрузить фото сообщение
*/
public static function uploadMessage(robot $robot, string $upload_url, string ...$images)
{
return $robot->browser->api($upload_url, ...$images);
}
/**
* Отправить фото сообщение
*/
public function sendPhoto(robot $robot, string $message = '', $destination, $photo)
{
$robot->message(robot: $robot,message: $message, destination: $destination,attachments: $photo);
}
/** /**
* Получить сервер для загрузки изображений * Получить сервер для загрузки изображений
* *
@ -119,7 +137,7 @@ final class photos
* *
* @return array|null Ответ сервера * @return array|null Ответ сервера
*/ */
public static function getUploadServer(robot $robot, ?int $album_id = null, $group_id = null): ?array public static function getUploadServer(robot $robot, int|null $album_id = null, int|group|null $group_id = null): ?array
{ {
if (isset($robot->account)) { if (isset($robot->account)) {
// Если инициализирован аккаунт // Если инициализирован аккаунт
@ -133,11 +151,10 @@ final class photos
$settings['v'] = $robot->version; $settings['v'] = $robot->version;
// Альбом // Альбом
if (isset($album_id)) { match (true) {
$settings['album_id'] = $album_id; isset($album_id) => $settings['album_id'] = $album_id,
} else { default => $settings['album_id'] = self::getAlbums($robot)
$settings['album_id'] = self::getAlbums($robot); };
}
// Группа // Группа
if (isset($group_id)) { if (isset($group_id)) {

View File

@ -124,7 +124,7 @@ final class core
* *
* @return mixed * @return mixed
*/ */
public function get(int $id = null, int $session = null) public function get(int|null $id = null, int|null $session = null)
{ {
if (isset($id) && array_key_exists($id, $this->registry)) { if (isset($id) && array_key_exists($id, $this->registry)) {
// Робот передан и найден // Робот передан и найден
@ -147,7 +147,7 @@ final class core
* *
* @return void * @return void
*/ */
public function delete(int $id = null, int $session = null): void public function delete(int|null $id = null, int|null $session = null): void
{ {
if (isset($id)) { if (isset($id)) {
// Робот передан // Робот передан
@ -195,31 +195,24 @@ final class core
*/ */
public function __set($name, $value): void public function __set($name, $value): void
{ {
if ($name === 'timezone') { match ($name) {
if (!isset($this->timezone)) { 'timezone' => match (true) {
$this->timezone = $value; !isset($this->timezone) => $this->timezone = $value,
} else { default => throw new Exception('Запрещено переопределять часовой пояс')
throw new Exception('Запрещено переопределять часовой пояс'); },
} 'path_root' => match (true) {
} else if ($name === 'path_root') { !isset($this->path_root) => $this->path_root = $value,
if (!isset($this->path_root)) { default => throw new Exception('Запрещено переопределять корневой каталог')
$this->path_root = $value; },
} else { 'path_logs' => match (true) {
throw new Exception('Запрещено переопределять корневой каталог'); !isset($this->path_logs) => $this->path_logs = $value,
} default => throw new Exception('Запрещено переопределять каталог журналов')
} else if ($name === 'path_logs') { },
if (!isset($this->path_logs)) { 'path_temp' => match (true) {
$this->path_logs = $value; !isset($this->path_temp) => $this->path_temp = $value,
} else { default => throw new Exception('Запрещено переопределять каталог временных файлов')
throw new Exception('Запрещено переопределять каталог журналов'); },
} };
} else if ($name === 'path_temp') {
if (!isset($this->path_temp)) {
$this->path_temp = $value;
} else {
throw new Exception('Запрещено переопределять каталог временных файлов');
}
}
} }
/** /**
@ -231,33 +224,29 @@ final class core
*/ */
public function __get($name) public function __get($name)
{ {
if ($name === 'robots') { return match ($name) {
return $this->robots; 'robots' => $this->robots,
} else if ($name === 'timezone') { 'timezone' => match (true) {
if (!isset($this->timezone)) { // Значение по умолчанию
// Значение по умолчанию !isset($this->timezone) => $this->timezone = 'Europe/Moscow',
$this->timezone = 'Europe/Moscow'; default => $this->timezone
},
'path_root' => match (true) {
// Значение по умолчанию
!isset($this->path_root) => $this->path_root = dirname(__DIR__),
default => $this->path_root
},
'path_logs' => match (true) {
// Значение по умолчанию
!isset($this->path_logs) => $this->path_logs = $this->path_root . '/logs',
default => $this->path_logs
},
'path_temp' => match (true) {
// Значение по умолчанию
!isset($this->path_temp) => $this->path_temp = $this->path_root . '/temp',
default => $this->path_temp
} }
return $this->timezone; };
} else if ($name === 'path_root') {
if (!isset($this->path_root)) {
// Значение по умолчанию
$this->path_root = dirname(__DIR__);
}
return $this->path_root;
} else if ($name === 'path_logs') {
if (!isset($this->path_logs)) {
// Значение по умолчанию
$this->path_logs = $this->path_root . '/logs';
}
return $this->path_logs;
} else if ($name === 'path_temp') {
if (!isset($this->path_temp)) {
// Значение по умолчанию
$this->path_temp = $this->path_root . '/temp';
}
return $this->path_temp;
}
} }
/** /**

View File

@ -46,13 +46,12 @@ final class group extends robot
} catch (Throwable $e) { } catch (Throwable $e) {
// Если свойство не найдено в родительском методе // Если свойство не найдено в родительском методе
if ($name === 'longpoll') { match ($name) {
if ($value instanceof LongPoll) { 'longpoll' => match (true) {
$this->longpoll = $value; $value instanceof LongPoll => $this->longpoll = $value,
} else { default => $this->longpoll = new LongPoll($this)
$this->longpoll = new LongPoll($this);
} }
} };
throw new Exception($e->getMessage(), $e->getCode(), $e->getPrevious()); throw new Exception($e->getMessage(), $e->getCode(), $e->getPrevious());
} }

View File

@ -91,7 +91,7 @@ abstract class robot
* @param int|null $id Идентификатор * @param int|null $id Идентификатор
* @param float|null $version Версия API * @param float|null $version Версия API
*/ */
public function __construct(int $id = null, float $version = null) public function __construct(int|null $id = null, float|null $version = null)
{ {
// Инициализация ядра // Инициализация ядра
$core = core::init(); $core = core::init();
@ -185,61 +185,37 @@ abstract class robot
*/ */
public function __set(string $name, $value): void public function __set(string $name, $value): void
{ {
if ($name === 'id') { match ($name) {
if (!isset($this->id)) { 'id' => match (true) {
$this->id = (int) $value; !isset($this->id) => $this->id = (int) $value,
return; default => throw new Exception('Запрещено перезаписывать идентификатор')
} else { },
throw new Exception('Запрещено перезаписывать идентификатор'); 'session' => match (true) {
} !isset($this->session) => $this->session = (int) $value,
} else if ($name === 'session') { default => throw new Exception('Запрещено перезаписывать сессию')
if (!isset($this->session)) { },
$this->session = (int) $value; 'key' => match (true) {
return; !isset($this->key) => $this->key = (string) $value,
} else { default => throw new Exception('Запрещено перезаписывать ключ')
throw new Exception('Запрещено перезаписывать сессию'); },
} 'version' => match (true) {
} else if ($name === 'key') { !isset($this->version) => $this->version = (float) $value,
if (!isset($this->key)) { default => throw new Exception('Запрещено перезаписывать версию API')
$this->key = (string) $value; },
return; 'account' => match (true) {
} else { !isset($this->account) && $value instanceof account => $this->account = $value,
throw new Exception('Запрещено перезаписывать ключ'); default => throw new Exception('Запрещено перезаписывать аккаунт')
} },
} else if ($name === 'version') { 'browser' => match (true) {
if (!isset($this->version)) { !isset($this->browser) && $value instanceof browser => $this->browser = $value,
$this->version = (float) $value; default => throw new Exception('Запрещено перезаписывать браузер')
return; },
} else { 'proxy' => $this->proxy = $value,
throw new Exception('Запрещено перезаписывать версию API'); 'captcha' => $this->captcha = $value,
} 'messages_new' => $this->messages_new = (int) $value,
} else if ($name === 'account') { // Если свойство не найдено:
if (!isset($this->account) && $value instanceof account) { default => throw new Exception('Свойство не найдено: ' . $name)
$this->account = $value; };
return;
} else {
throw new Exception('Запрещено перезаписывать аккаунт');
}
} else if ($name === 'browser') {
if (!isset($this->browser) && $value instanceof browser) {
$this->browser = $value;
return;
} else {
throw new Exception('Запрещено перезаписывать браузер');
}
} else if ($name === 'proxy') {
$this->proxy = $value;
return;
} else if ($name === 'captcha') {
$this->captcha = $value;
return;
} else if ($name === 'messages_new') {
$this->messages_new = (int) $value;
return;
}
// Если свойство не найдено
throw new Exception('Свойство не найдено: ' . $name);
} }
/** /**
@ -251,50 +227,37 @@ abstract class robot
*/ */
public function __get(string $name) public function __get(string $name)
{ {
if ($name === 'id') { return match ($name) {
if (isset($this->id)) { 'id' => match (true) {
return $this->id; isset($this->id) => $this->id,
} else { default => throw new Exception('Идентификатор не инициализирован')
throw new Exception('Идентификатор не инициализирован'); },
} 'session' => match (true) {
} else if ($name === 'session') { isset($this->session) => $this->session,
if (isset($this->session)) { default => throw new Exception('Сессия не инициализирована')
return $this->session; },
} else { 'key' => match (true) {
throw new Exception('Сессия не инициализирована'); isset($this->key) => $this->key,
} default => throw new Exception('ключ не инициализирован')
} else if ($name === 'key') { },
if (isset($this->key)) { 'version' => match (true) {
return $this->key; isset($this->version) => $this->version,
} else { default => throw new Exception('Версия не инициализирована')
throw new Exception('Ключ не инициализирован'); },
} 'account' => match (true) {
} else if ($name === 'account') { isset($this->account) => $this->account,
if (isset($this->account)) { default => throw new Exception('Аккаунт не инициализирован')
return $this->account; },
} else { 'browser' => $this->browser ?? $this->browser = new browser([
throw new Exception('Аккаунт не инициализирован');
}
} else if ($name === 'version') {
if (isset($this->version)) {
return $this->version;
} else {
throw new Exception('Версия не инициализирована');
}
} else if ($name === 'browser') {
return $this->browser ?? $this->browser = new browser([
'base_uri' => 'https://api.vk.com/method/', 'base_uri' => 'https://api.vk.com/method/',
'cookies' => true 'cookies' => true
]); ]),
} else if ($name === 'proxy') { 'proxy' => $this->proxy,
return $this->proxy; 'captcha' => $this->captcha,
} else if ($name === 'captcha') { 'messages_new' => $this->messages_new,
return $this->captcha; // Если свойство не найдено:
} else if ($name === 'messages_new') { default => throw new Exception('Свойство не найдено: ' . $name)
return $this->messages_new; };
}
throw new Exception('Свойство не найдено: ' . $name);
} }
/** /**
@ -306,27 +269,18 @@ abstract class robot
*/ */
public function __isset(string $name) public function __isset(string $name)
{ {
if ($name === 'id') { return match ($name) {
return isset($this->id); 'id' => isset($this->id),
} else if ($name === 'session') { 'session' => isset($this->session),
return isset($this->session); 'key' => isset($this->key),
} else if ($name === 'key') { 'account' => isset($this->account),
return isset($this->key); 'version' => isset($this->version),
} else if ($name === 'account') { 'browser' => isset($this->browser),
return isset($this->account); 'proxy' => isset($this->proxy),
} else if ($name === 'version') { 'captcha' => isset($this->captcha),
return isset($this->version); 'messages_new' => isset($this->messages_new),
} else if ($name === 'browser') { default => throw new Exception('Свойство не найдено: ' . $name)
return isset($this->browser); };
} else if ($name === 'proxy') {
return isset($this->proxy);
} else if ($name === 'captcha') {
return isset($this->captcha);
} else if ($name === 'messages_new') {
return isset($this->messages_new);
}
throw new Exception('Свойство не найдено: ' . $name);
} }
/** /**

View File

@ -52,7 +52,7 @@ trait singleton
/** /**
* Заблокирован * Заблокирован
*/ */
private function __sleep() public function __sleep()
{ {
throw new Exception('Сериализация запрещена'); throw new Exception('Сериализация запрещена');
} }
@ -60,7 +60,7 @@ trait singleton
/** /**
* Заблокирован * Заблокирован
*/ */
private function __wakeup() public function __wakeup()
{ {
throw new Exception('Десериализация запрещена'); throw new Exception('Десериализация запрещена');
} }