diff --git a/mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php b/mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php index a1dfec0..259e2a9 100644 --- a/mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php +++ b/mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php @@ -25,96 +25,121 @@ use Google\Client, require __DIR__ . '/../../../../../../../vendor/autoload.php'; -/* ini_set('error_reporting', E_ALL); +ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); -ini_set('display_startup_errors', 1); */ +ini_set('display_startup_errors', 1); $config = new Config(); $config->setParseMode(Config::PARSE_MODE_MARKDOWN); $bot = new Zanzara(require(__DIR__ . '/../settings/key.php'), $config); -$timer; - -$member; - $bot->onMessage(function (Context $ctx) { if ($members = $ctx->getMessage()->getNewChatMembers()) { // Новый аккаунт в чате $ctx->sendMessage('⚠️ Введите ваш табельный номер для авторизации', ['reply_to_message_id' => $ctx->getMessage()->getMessageId()]) - ->then(function () use ($ctx, $members) { - - global $member; - + ->then(function ($message) use ($ctx, $members) { // Инициализация идентификатора сотрудника - $member = $id = $members[0]->getId(); + $id = $members[0]->getId(); - global $timer; + $ctx->getGlobalDataItem("member_{$id}_request") + ->then( + function ($old) use ($ctx, $id, $message) { - $timer = React\Promise\Timer\sleep(180); + $timer = function ($ctx, $id, $message) { + $ctx->setGlobalDataItem("member_{$id}_request", $message) + ->then(function () use ($ctx, $id) { - // @todo Если сотрудник вышел из чата и снова зашёл, ответил правильно и его оставило, то всё равно забанит из-за прошлой сессии - $timer->then( - function ($value) use ($ctx, $id) { - // Изгнание из чата - $ctx->kickChatMember($ctx->getMessage()->getChat()->getId(), $id); + // Инициализация таймера + React\Promise\Timer\sleep(180)->then( + function () use ($ctx, $id) { - $ctx->wipeCache(); + $ctx->getGlobalDataItem("member_{$id}_request") + ->then( + function ($message) use ($ctx, $id) { + if ($message) { + // Изгнание из чата + $ctx->kickChatMember($message->getChat()->getId(), $id) + ->then(function () use ($ctx, $id, $message) { + // Удаление сообщения из сессионного хранилища + $ctx->deleteGlobalDataItem("member_{$id}_request"); - $ctx->endConversation(); - }, - function () { - } - ); + // Удаление сообщения + $ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId()); + }); + } + }, + function () { + } + ); + } + ); + }); + }; - $ctx->nextStep('check'); + if ($old) { + $ctx->deleteGlobalDataItem("member_{$id}_request") + ->then(function () use ($ctx, $id, $message, $timer, $old) { + $ctx->deleteMessage($old->getChat()->getId(), $old->getMessageId()) + ->then(function () use ($ctx, $id, $message, $timer) { + $timer($ctx, $id, $message); + }); + }); + } else $timer($ctx, $id, $message); + } + ); }); + } else { + // Любое сообщение + + // Инициализация сообщения + $message = $ctx->getMessage(); + + // Инициализация идентификатора отправителя сообщения + $id = $message->getFrom()->getId(); + + $ctx->getGlobalDataItem("member_{$id}_request") + ->then( + function ($_message) use ($ctx, $id, $message) { + if ($_message) { + // Инициализация переданного идентификатора (только цифры) + $worker = preg_replace('/[^\d]/', '', $message->getText() ?? ''); + + $settings = json_decode(require(__DIR__ . '/../settings/workers/google.php'), true); + $document = require(__DIR__ . '/../settings/workers/document.php'); + $sheets = require(__DIR__ . '/../settings/workers/sheets.php'); + + $client = new Client(); + $client->setScopes(Sheets::SPREADSHEETS); + $client->setAuthConfig($settings); + $api = new Sheets($client); + + foreach ($sheets as $sheet) { + $rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'A'), true, 1000)); + + foreach ($rows->fetch(10000) as $row) { + // Перебор строк + + if ($worker === $row->toArray()['ID']) { + $ctx->sendMessage("✅ Авторизован сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()]); + + // Удаление сообщения из сессионного хранилища + $ctx->deleteGlobalDataItem("member_{$id}_request"); + + // Удаление сообщения + $ctx->deleteMessage($_message->getChat()->getId(), $_message->getMessageId()); + + return; + } + } + } + + if (!empty($worker)) $ctx->sendMessage("⛔ Не найден сотрудник: $id", ['reply_to_message_id' => $message->getMessageId()]); + } + } + ); } }); -function check(Context $ctx) -{ - global $member; - - if ($member === $ctx->getMessage()->getFrom()->getId()) { - // Отправителем табельного номера является тот кто подключился к серверу - - // Инициализация идентификатора (только цифры) - $id = preg_replace('/[^\d]/', '', $ctx->getMessage()->getText()); - - $settings = json_decode(require(__DIR__ . '/../settings/workers/google.php'), true); - $document = require(__DIR__ . '/../settings/workers/document.php'); - $sheets = require(__DIR__ . '/../settings/workers/sheets.php'); - - $client = new Client(); - $client->setScopes(Sheets::SPREADSHEETS); - $client->setAuthConfig($settings); - $api = new Sheets($client); - - foreach ($sheets as $sheet) { - $rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'A'), true, 1000)); - - foreach ($rows->fetch(10000) as $row) { - // Перебор строк - - if ($id === $row->toArray()['ID']) { - $ctx->sendMessage("✅ Авторизован сотрудник: $id"); - - global $timer; - - // Отмена блокировки - $timer->cancel(); - - $ctx->endConversation(); - - return; - } - } - - if (!empty($id)) $ctx->sendMessage("⛔ Не найден сотрудник: $id"); - } - } -} - $bot->run();