From 615518a7b2a72847ab4d91993a77640ddc4cf08c Mon Sep 17 00:00:00 2001 From: Kostya Kalimagin Date: Sat, 16 Jan 2021 12:18:29 +0800 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B0=20php=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hood/vk/system/api/longpoll.php | 15 +- hood/vk/system/api/methods/messages.php | 118 +++++---------- hood/vk/system/api/methods/method.php | 7 - hood/vk/system/api/methods/photos.php | 37 +++-- hood/vk/system/core.php | 95 ++++++------ hood/vk/system/robots/group.php | 11 +- hood/vk/system/robots/robot.php | 192 +++++++++--------------- hood/vk/system/traits/singleton.php | 4 +- 8 files changed, 191 insertions(+), 288 deletions(-) diff --git a/hood/vk/system/api/longpoll.php b/hood/vk/system/api/longpoll.php index 2354399..8593b0c 100644 --- a/hood/vk/system/api/longpoll.php +++ b/hood/vk/system/api/longpoll.php @@ -30,13 +30,6 @@ use hood\vk\core, */ final class longpoll { - /** - * Робот - * - * @var string - */ - private robot $robot; - /** * Ключ к серверу * @@ -71,7 +64,7 @@ final class longpoll * * @param robot $robot Робот */ - public function __construct(robot $robot) + public function __construct(private robot $robot) { // Инициализация робота if (!isset($robot->id)) { @@ -82,7 +75,6 @@ final class longpoll throw new Exception('Необходимо указать версию используемого API ВКонтакте'); } - $this->robot = $robot; // Остановка процессов-дубликатов 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-сервера - echo 'запрос на получение данных лонгполл'; - $response = json_decode($this->robot->browser->request('POST', 'groups.getLongPollServer', [ + $response = json_decode($this->robot->browser->request(method: 'POST', uri: 'groups.getLongPollServer', options: [ 'form_params' => [ 'group_id' => $this->robot->id, 'v' => $this->robot->version, diff --git a/hood/vk/system/api/methods/messages.php b/hood/vk/system/api/methods/messages.php index e8221ea..64cbfa3 100644 --- a/hood/vk/system/api/methods/messages.php +++ b/hood/vk/system/api/methods/messages.php @@ -23,21 +23,6 @@ use hood\vk\robots\robot, */ 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 Режим отправки */ @@ -51,34 +36,16 @@ final class messages extends method * @param robot $robot Робот * @param string $message Текст * @param int|string|array|null $destination Получатель - * @param string|null ...$attachments Вложения + * @param array $attachments Вложения * * @return self */ - public function __construct(robot $robot, string $message, $destination = null, string ...$attachments) - { - // Инициализация параметров - - // Робот - $this->robot = $robot; - - // Сообщение - $this->message = $message; - - // Получатель - if (isset($destination)) { - $this->destination = $destination; - } else { - return; - } - - // Вложения - if (isset($attachments)) { - $this->attachments = $attachments; - } else { - return; - } - + public function __construct( + protected robot $robot, + protected string $message, + protected int|string|array|null $destination = null, + protected array $attachments = [] + ) { // Отправка, если все параметры инициализированы return $this->send($destination); } @@ -92,7 +59,7 @@ final class messages extends method * * @return array Ответ сервера */ - public function send($destination): array + public function send(int|string|array $destination): array { // Идентификатор сообщения $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; - } else if ($this->robot instanceof User) { + $this->robot instanceof group => $settings['access_token'] = $this->robot->key, // Робот-пользователь - $settings['access_token'] = $this->robot->key; - } + $this->robot instanceof User => $settings['access_token'] = $this->robot->key + }; // Версия API $settings['v'] = $this->robot->version; // Цель отправки - if (is_int($destination)) { + match (true) { // Отправить по идентификатору - $settings['peer_id'] = $destination; - } else if (is_array($destination)) { + is_int($destination) => $settings['peer_id'] = $destination, // Массовая отправка по идентификаторам - $settings['user_ids'] = $destination; - } else { - // Отправить по домену - $settings['domain'] = $destination; - } + is_array($destination) => $settings['user_ids'] = $destination, + // Отправить по домену + default => $settings['domain'] = $destination + }; // Сообщение $settings['message'] = $this->message; @@ -135,7 +99,7 @@ final class messages extends method // Фильтрация вложений $forward_messages = []; 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; unset($attachment); @@ -144,17 +108,17 @@ final class messages extends method if (!empty($forward_messages)) { // Если есть пересылаемые сообщения - $settings['forward_messages'] = implode(',', $forward_messages); + $settings['forward_messages'] = implode(glue: ',', pieces: $forward_messages); } 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); @@ -165,13 +129,12 @@ final class messages extends method // Если пришел ID сообщения // Ключ - if ($this->robot instanceof Group) { + match (true) { // Робот-группа - $settings['access_token'] = $this->robot->key; - } else if ($this->robot instanceof User) { + $this->robot instanceof Group => $settings['access_token'] = $this->robot->key, // Робот-пользователь - $settings['access_token'] = $this->robot->key; - } + $this->robot instanceof User => $settings['access_token'] = $this->robot->key + }; // Версия API $settings['v'] = $this->robot->version; @@ -180,7 +143,7 @@ final class messages extends method $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); } @@ -200,25 +163,22 @@ final class messages extends method public function info(): array { # Ключ - if ($this->robot instanceof group) { + match (true) { // Робот-группа - $settings['access_token'] = $this->robot->key; - } else if ($this->robot instanceof User) { + $this->robot instanceof group => $settings['access_token'] = $this->robot->key, // Робот-пользователь - $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; - } else if (is_array($this->destination)) { + is_int($this->destination) => $settings['peer_id'] = $this->destination, // Массовая отправка по идентификаторам - $settings['user_ids'] = $this->destination; - } else { - // Отправить по домену - $settings['domain'] = $this->destination; - } + is_array($this->destination) => $settings['user_ids'] = $this->destination, + // Отправить по домену + default => $settings['domain'] = $this->destination + }; // Версия API $settings['v'] = $this->robot->version; @@ -232,7 +192,7 @@ final class messages extends method // Фильтрация вложений $forward_messages = []; 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; unset($attachment); diff --git a/hood/vk/system/api/methods/method.php b/hood/vk/system/api/methods/method.php index 0435eaa..7caf90c 100644 --- a/hood/vk/system/api/methods/method.php +++ b/hood/vk/system/api/methods/method.php @@ -19,13 +19,6 @@ use hood\vk\robots\robot; */ abstract class method { - /** - * Робот - * - * @param robot $robot Робот - */ - protected robot $robot; - /** * Создать * diff --git a/hood/vk/system/api/methods/photos.php b/hood/vk/system/api/methods/photos.php index 49e638f..1a53709 100644 --- a/hood/vk/system/api/methods/photos.php +++ b/hood/vk/system/api/methods/photos.php @@ -40,7 +40,7 @@ final class photos * * @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)) { // Если инициализирован аккаунт @@ -61,7 +61,8 @@ final class photos $settings['group_id'] = $group_id; } - $upload = self::upload(...$images); + //загрузить + $upload = self::uploadMessage($robot, $upload_url, ...$images); // Сервер $settings['server'] = $upload['server']; @@ -104,10 +105,27 @@ final class photos 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); + } + + /** + * Отправить фото сообщение + */ + 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 Ответ сервера */ - 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)) { // Если инициализирован аккаунт @@ -133,11 +151,10 @@ final class photos $settings['v'] = $robot->version; // Альбом - if (isset($album_id)) { - $settings['album_id'] = $album_id; - } else { - $settings['album_id'] = self::getAlbums($robot); - } + match (true) { + isset($album_id) => $settings['album_id'] = $album_id, + default => $settings['album_id'] = self::getAlbums($robot) + }; // Группа if (isset($group_id)) { diff --git a/hood/vk/system/core.php b/hood/vk/system/core.php index ee2b6ba..96a84e4 100644 --- a/hood/vk/system/core.php +++ b/hood/vk/system/core.php @@ -124,7 +124,7 @@ final class core * * @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)) { // Робот передан и найден @@ -147,7 +147,7 @@ final class core * * @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)) { // Робот передан @@ -195,31 +195,24 @@ final class core */ public function __set($name, $value): void { - if ($name === 'timezone') { - if (!isset($this->timezone)) { - $this->timezone = $value; - } else { - throw new Exception('Запрещено переопределять часовой пояс'); - } - } else if ($name === 'path_root') { - if (!isset($this->path_root)) { - $this->path_root = $value; - } else { - throw new Exception('Запрещено переопределять корневой каталог'); - } - } else if ($name === 'path_logs') { - if (!isset($this->path_logs)) { - $this->path_logs = $value; - } else { - throw new Exception('Запрещено переопределять каталог журналов'); - } - } else if ($name === 'path_temp') { - if (!isset($this->path_temp)) { - $this->path_temp = $value; - } else { - throw new Exception('Запрещено переопределять каталог временных файлов'); - } - } + match ($name) { + 'timezone' => match (true) { + !isset($this->timezone) => $this->timezone = $value, + default => throw new Exception('Запрещено переопределять часовой пояс') + }, + 'path_root' => match (true) { + !isset($this->path_root) => $this->path_root = $value, + default => throw new Exception('Запрещено переопределять корневой каталог') + }, + 'path_logs' => match (true) { + !isset($this->path_logs) => $this->path_logs = $value, + default => throw new Exception('Запрещено переопределять каталог журналов') + }, + 'path_temp' => match (true) { + !isset($this->path_temp) => $this->path_temp = $value, + default => throw new Exception('Запрещено переопределять каталог временных файлов') + }, + }; } /** @@ -231,33 +224,29 @@ final class core */ public function __get($name) { - if ($name === 'robots') { - return $this->robots; - } else if ($name === 'timezone') { - if (!isset($this->timezone)) { - // Значение по умолчанию - $this->timezone = 'Europe/Moscow'; + return match ($name) { + 'robots' => $this->robots, + 'timezone' => match (true) { + // Значение по умолчанию + !isset($this->timezone) => $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; - } + }; } /** diff --git a/hood/vk/system/robots/group.php b/hood/vk/system/robots/group.php index 93c18a6..ac2b791 100644 --- a/hood/vk/system/robots/group.php +++ b/hood/vk/system/robots/group.php @@ -46,13 +46,12 @@ final class group extends robot } catch (Throwable $e) { // Если свойство не найдено в родительском методе - if ($name === 'longpoll') { - if ($value instanceof LongPoll) { - $this->longpoll = $value; - } else { - $this->longpoll = new LongPoll($this); + match ($name) { + 'longpoll' => match (true) { + $value instanceof LongPoll => $this->longpoll = $value, + default => $this->longpoll = new LongPoll($this) } - } + }; throw new Exception($e->getMessage(), $e->getCode(), $e->getPrevious()); } diff --git a/hood/vk/system/robots/robot.php b/hood/vk/system/robots/robot.php index a0e0a2e..e7f9f0b 100644 --- a/hood/vk/system/robots/robot.php +++ b/hood/vk/system/robots/robot.php @@ -91,7 +91,7 @@ abstract class robot * @param int|null $id Идентификатор * @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(); @@ -185,61 +185,37 @@ abstract class robot */ public function __set(string $name, $value): void { - if ($name === 'id') { - if (!isset($this->id)) { - $this->id = (int) $value; - return; - } else { - throw new Exception('Запрещено перезаписывать идентификатор'); - } - } else if ($name === 'session') { - if (!isset($this->session)) { - $this->session = (int) $value; - return; - } else { - throw new Exception('Запрещено перезаписывать сессию'); - } - } else if ($name === 'key') { - if (!isset($this->key)) { - $this->key = (string) $value; - return; - } else { - throw new Exception('Запрещено перезаписывать ключ'); - } - } else if ($name === 'version') { - if (!isset($this->version)) { - $this->version = (float) $value; - return; - } else { - throw new Exception('Запрещено перезаписывать версию API'); - } - } else if ($name === 'account') { - if (!isset($this->account) && $value instanceof account) { - $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); + match ($name) { + 'id' => match (true) { + !isset($this->id) => $this->id = (int) $value, + default => throw new Exception('Запрещено перезаписывать идентификатор') + }, + 'session' => match (true) { + !isset($this->session) => $this->session = (int) $value, + default => throw new Exception('Запрещено перезаписывать сессию') + }, + 'key' => match (true) { + !isset($this->key) => $this->key = (string) $value, + default => throw new Exception('Запрещено перезаписывать ключ') + }, + 'version' => match (true) { + !isset($this->version) => $this->version = (float) $value, + default => throw new Exception('Запрещено перезаписывать версию API') + }, + 'account' => match (true) { + !isset($this->account) && $value instanceof account => $this->account = $value, + default => throw new Exception('Запрещено перезаписывать аккаунт') + }, + 'browser' => match (true) { + !isset($this->browser) && $value instanceof browser => $this->browser = $value, + default => throw new Exception('Запрещено перезаписывать браузер') + }, + 'proxy' => $this->proxy = $value, + 'captcha' => $this->captcha = $value, + 'messages_new' => $this->messages_new = (int) $value, + // Если свойство не найдено: + default => throw new Exception('Свойство не найдено: ' . $name) + }; } /** @@ -251,50 +227,37 @@ abstract class robot */ public function __get(string $name) { - if ($name === 'id') { - if (isset($this->id)) { - return $this->id; - } else { - throw new Exception('Идентификатор не инициализирован'); - } - } else if ($name === 'session') { - if (isset($this->session)) { - return $this->session; - } else { - throw new Exception('Сессия не инициализирована'); - } - } else if ($name === 'key') { - if (isset($this->key)) { - return $this->key; - } else { - throw new Exception('Ключ не инициализирован'); - } - } else if ($name === 'account') { - if (isset($this->account)) { - return $this->account; - } else { - 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([ + return match ($name) { + 'id' => match (true) { + isset($this->id) => $this->id, + default => throw new Exception('Идентификатор не инициализирован') + }, + 'session' => match (true) { + isset($this->session) => $this->session, + default => throw new Exception('Сессия не инициализирована') + }, + 'key' => match (true) { + isset($this->key) => $this->key, + default => throw new Exception('ключ не инициализирован') + }, + 'version' => match (true) { + isset($this->version) => $this->version, + default => throw new Exception('Версия не инициализирована') + }, + 'account' => match (true) { + isset($this->account) => $this->account, + default => throw new Exception('Аккаунт не инициализирован') + }, + 'browser' => $this->browser ?? $this->browser = new browser([ 'base_uri' => 'https://api.vk.com/method/', 'cookies' => true - ]); - } else if ($name === 'proxy') { - return $this->proxy; - } else if ($name === 'captcha') { - return $this->captcha; - } else if ($name === 'messages_new') { - return $this->messages_new; - } - - throw new Exception('Свойство не найдено: ' . $name); + ]), + 'proxy' => $this->proxy, + 'captcha' => $this->captcha, + 'messages_new' => $this->messages_new, + // Если свойство не найдено: + default => throw new Exception('Свойство не найдено: ' . $name) + }; } /** @@ -306,27 +269,18 @@ abstract class robot */ public function __isset(string $name) { - if ($name === 'id') { - return isset($this->id); - } else if ($name === 'session') { - return isset($this->session); - } else if ($name === 'key') { - return isset($this->key); - } else if ($name === 'account') { - return isset($this->account); - } else if ($name === 'version') { - return isset($this->version); - } else if ($name === 'browser') { - 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); + return match ($name) { + 'id' => isset($this->id), + 'session' => isset($this->session), + 'key' => isset($this->key), + 'account' => isset($this->account), + 'version' => isset($this->version), + 'browser' => isset($this->browser), + 'proxy' => isset($this->proxy), + 'captcha' => isset($this->captcha), + 'messages_new' => isset($this->messages_new), + default => throw new Exception('Свойство не найдено: ' . $name) + }; } /** diff --git a/hood/vk/system/traits/singleton.php b/hood/vk/system/traits/singleton.php index 32b9433..bcb92b2 100644 --- a/hood/vk/system/traits/singleton.php +++ b/hood/vk/system/traits/singleton.php @@ -52,7 +52,7 @@ trait singleton /** * Заблокирован */ - private function __sleep() + public function __sleep() { throw new Exception('Сериализация запрещена'); } @@ -60,7 +60,7 @@ trait singleton /** * Заблокирован */ - private function __wakeup() + public function __wakeup() { throw new Exception('Десериализация запрещена'); }