diff --git a/composer.json b/composer.json index 101971b..aaff927 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "triagens/arangodb": "~3.8", "guzzlehttp/guzzle": "^7.4", "mirzaev/arangodb": "^1.0", - "mirzaev/vk": "^4.2", + "mirzaev/vk": "^4.4", "mirzaev/vk-arangodb": "^1.0.1", "mirzaev/vk-chat": "^1.0" }, diff --git a/composer.lock b/composer.lock index 8d9debe..b1ce23c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ab14cf737c9cf81d65b0e8bb20a7c4f8", + "content-hash": "6779413522c40533861a4ffbaf0c3eb2", "packages": [ { "name": "guzzlehttp/guzzle", @@ -500,22 +500,25 @@ }, { "name": "mirzaev/vk", - "version": "4.2.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://git.mirzaev.sexy/mirzaev/vk", - "reference": "5bd94e5ca3ceeb73aeaa5d6db9fdef1586cfb155" + "reference": "e670be5816177260626f43d1795f6180320395b8" }, "require": { - "guzzlehttp/guzzle": "~7.5", - "jasny/error-handler": "~0.2", - "mirzaev/accounts": "~1.2.0", - "monolog/monolog": "~1.6", - "php": "~8.1", - "psr/log": "~1.0" + "guzzlehttp/guzzle": "^7.5", + "jasny/error-handler": "^0.2", + "mirzaev/accounts": "^1.2.0", + "monolog/monolog": "^1.6", + "php": "^8.1", + "psr/log": "^1.0" }, "require-dev": { - "phpunit/phpunit": "~9.5" + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ext-sodium": "Can be selected in some conditions to increase security" }, "type": "framework", "autoload": { @@ -545,11 +548,11 @@ "docs": "https://git.mirzaev.sexy/mirzaev/vk/wiki", "issues": "https://git.mirzaev.sexy/mirzaev/vk/issues" }, - "time": "2022-11-07T16:06:13+00:00" + "time": "2022-11-08T15:12:50+00:00" }, { "name": "mirzaev/vk-arangodb", - "version": "1.0.1", + "version": "1.0.x-dev", "source": { "type": "git", "url": "https://git.mirzaev.sexy/mirzaev/vk-arangodb", @@ -603,11 +606,11 @@ }, { "name": "mirzaev/vk-chat", - "version": "1.0.x-dev", + "version": "1.1.0", "source": { "type": "git", "url": "https://git.mirzaev.sexy/mirzaev/vk-chat", - "reference": "40ceb7a86c38a0b878adca44c5729407631e7e82" + "reference": "dae9b2b5b19796029e0e67f2194f74b21041741f" }, "require": { "php": "^8.1" @@ -648,7 +651,7 @@ "type": "funding" } ], - "time": "2022-11-07T13:01:09+00:00" + "time": "2022-11-08T15:10:17+00:00" }, { "name": "monolog/monolog", diff --git a/mirzaev/vk/robot/bobby/system/public/index.php.template b/mirzaev/vk/robot/bobby/system/public/index.php.template index 2aa3c77..e850118 100644 --- a/mirzaev/vk/robot/bobby/system/public/index.php.template +++ b/mirzaev/vk/robot/bobby/system/public/index.php.template @@ -27,7 +27,7 @@ require SYSTEM_PATH_ROOT . '../../../../../vendor/autoload.php'; $core = core::init(); // Инициализция робота -$robot = $core->group('group id here')->key('group key here'); +$robot = $core->group(217012993)->key(''); // Инициализация обработчика LongPoll API $longpoll = new longpoll($robot); @@ -42,52 +42,141 @@ $database->truncate(); $chat = new chat; // Инициализация команды "ролевое действие" -$chat->pattern('/(*UTF8)\*([A-яё\w\s]+)\*/', new command(function (array $update, string $text) use ($robot) { +$chat->pattern('/(*UTF8)^\*([^\*]*)\*$/', new command(function (array $update, string $text) use ($robot) { try { // Удаление сообщения $robot->message()->delete($update['object']['message']['conversation_message_id'], $update['object']['message']['peer_id']); } catch (Exception $e) { } - // Конвертация кодировки текста сообщения - // $text = mb_convert_encoding($text, 'UTF-8'); + // Обработка ссылок на аккаунты + $text = preg_replace_callback('/(*UTF8)(?=[^\[]+)[^\[]+|\[(id\d+)\|([^\]]+)\]/', fn (array $matches) => isset($matches[2]) ? '@' . $matches[1] . ' (' . $matches[2] . ')' : $matches[0] ?? $text, $text, 500); - // Инициализация данных аккаунта отправителя - $sender = $robot->user()->get($update['object']['message']['from_id']); + // Инициализация индикаторов наличия изменённого псевдонима у получателя и отпрвителя + $sender_changed = $receiver_changed = false; + + // Инициализация псевдонима получателя + $receiver_alias = ''; if (isset($update['object']['message']['reply_message'])) { // Найдено сообщение для ответа - // Инициализация данных аккаунта отправившего сообщение для ответа (получателя) - $receiver = $robot->user()->get($update['object']['message']['reply_message']['from_id']); + if ($update['object']['message']['reply_message']['from_id'] > 0) { + // Ответ на сообщение пользователя - // Поиск падежей для получателя - preg_match_all('/(*UTF8)\s\|([А-яё\w]+)$/', $text, $matches); + // Инициализация данных аккаунта получателя + $receiver = $robot->user()->get($update['object']['message']['reply_message']['from_id']); - // Инициализация падежа получателя - $receiver_case = $matches[1][0]; + if (isset($receiver)) { + // Найден получатель - // Инициализация цели для ролевого действия - $target = " @id$receiver->id ($receiver->first_name$receiver_case)"; - } else $target = ''; + // Обработка падежа получателя + $text = preg_replace_callback('/(*UTF8)^(.*)\|([^$]+)$/', function (array $matches) use ($text, &$receiver_alias, $receiver): string { + // Инициализация псевдонима отправителя + $alias = preg_replace('/\)/', ')', $matches[2], 300); - // Поиск падежей для отправителя - preg_match_all('/(*UTF8)^\|([А-яё\w]+)\s/', $text, $matches); + // Инициализация псевдонима получателя + $receiver_alias = " @id$receiver->id ($receiver->first_name" . (empty($alias) ? '' : $alias) . ')'; - // Инициализация падежа отправителя - $sender_case = $matches[1][0]; + return $matches[1] ?? $matches[0] ?? $text; + }, $text, 1); + + if (empty($receiver_alias)) { + // Не найден псевдоним получателя + + // Обработка псевдонима получателя + $text = preg_replace_callback('/(*UTF8)^(.*)\(([^\)]*)\)$/', function (array $matches) use ($text, &$receiver_alias, $receiver): string { + // Инициализация псевдонима отправителя + $alias = preg_replace('/\)/', ')', $matches[2], 300); + + // Инициализация псевдонима получателя + $receiver_alias = " @id$receiver->id (" . (empty($alias) ? $receiver->first_name : $alias) . ')'; + + return $matches[1] ?? $matches[0] ?? $text; + }, $text, 1); + } + } + + // Проверка на пустого получателя + if (empty(trim($receiver_alias))) { + // Пустой текст получателя + + // Реинициализация текста получателя + $receiver_alias = " @id$receiver->id ($receiver->first_name)"; + } else $receiver_changed = true; + } else { + // Ответ на сообщение группы (подразумевается $update['object']['message']['reply_message']['from_id'] < 0) + + // Инициализация данных аккаунта отправителя + $sender = $robot->user()->get($update['object']['message']['from_id'], name_case: 'gen'); + + // Отправка сообщения с ролевым действием + $robot->message()->send($update['object']['message']['peer_id'], "@club217012993 (Бобби) избил @id$sender->id ($sender->first_name) до полусмерти", disable_mentions: true); + + return; + } + } + + // Инициализация псевдонима отправителя + $sender_alias = ''; + + // Инициализация данных аккаунта отправителя + $sender = $robot->user()->get($update['object']['message']['from_id']); + + // Обработка падежа отправителя + $text = preg_replace_callback('/(*UTF8)^\|([^\s]+)(.*)$/', function (array $matches) use ($text, $sender, &$sender_alias): string { + // Инициализация псевдонима отправителя + $alias = preg_replace('/\)/', ')', $matches[1], 300); + + // Инициализация ссылки на отправителя + $sender_alias = "@id$sender->id ($sender->first_name" . (empty($alias) ? '' : $alias) . ') '; + + return $matches[2] ?? $matches[0] ?? $text; + }, $text, 1); + + if (empty($sender_alias)) { + // Не найден псевдоним отправителя + + // Обработка псевдонима отправителя + $text = preg_replace_callback('/(*UTF8)^\(([^\)]*)\)(.*)$/', function (array $matches) use ($text, $sender, &$sender_alias): string { + // Инициализация псевдонима отправителя + $alias = preg_replace('/\)/', ')', $matches[1], 300); + + // Инициализация ссылки на отправителя + $sender_alias = "@id$sender->id (" . (empty($alias) ? $sender->first_name : $alias) . ') '; + + return $matches[2] ?? $matches[0] ?? $text; + }, $text, 1); + } + + if (empty(trim($sender_alias))) { + // Пустой текст отправителя + + // Реинициализация текста отправителя + $sender_alias = "@id$sender->id ($sender->first_name) "; + } else $sender_changed = true; // Удаление команд падежей из строки - $text = preg_replace('/(*UTF8)\s?\|[А-яё\w]+\s?/', '', $text, 500); + $text = preg_replace('/(*UTF8)\|[А-яё\w]+/', '', $text, 500); + + if (empty($text = trim($text)) && !$sender_changed && !$receiver_changed) { + // Пустой текст сообщения, а у получателя и отправителя не изменены псевдонимы + + // Удаление пробела у отправителя + $sender_alias = trim($sender_alias); + + // Реинициализация текста сообщения + $text = ', мне @club191417381 (Шамиля) позвать?'; + } // Отправка сообщения с ролевым действием - $robot->message($update['object']['message']['peer_id'], "@id$sender->id ($sender->first_name$sender_case) $text$target"); + $robot->message()->send($update['object']['message']['peer_id'], "$sender_alias$text$receiver_alias", disable_mentions: true); })); $longpoll->handle(function (array $update) use ($robot, $database, $chat) { // Обработка события - var_dump($update); + // var_dump($update); // Сохранение события в базе данных // $database->save($update);