<?php // Фреймворк Telegram use Zanzara\Zanzara; use Zanzara\Context; use Zanzara\Config; // Фреймворк для Google Sheets use Flow\ETL\Adapter\GoogleSheet\GoogleSheetRange, Flow\ETL\Adapter\GoogleSheet\GoogleSheetExtractor, Flow\ETL\Adapter\GoogleSheet\Columns, Flow\ETL\Flow, Flow\ETL\Config as _config, Flow\ETL\FlowContext, Flow\ETL\Row\Entry, Flow\ETL\Row, Flow\ETL\DSL\To, Flow\ETL\DSL\From; // Фреймворк для Google API use Google\Client, Google\Service\Sheets, Google\Service\Sheets\ValueRange; require __DIR__ . '/../../../../../../../vendor/autoload.php'; ini_set('error_reporting', E_ALL); ini_set('display_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); $bot->onMessage(function (Context $ctx) { if ($members = $ctx->getMessage()->getNewChatMembers()) { // Новый аккаунт в чате echo "Обнаружен новый участник в чате" . PHP_EOL; $ctx->sendMessage("⚠️ Введите ваш табельный номер", ['reply_to_message_id' => $ctx->getMessage()->getMessageId()]) ->then(function ($message) use ($ctx, $members) { // Инициализация идентификатора сотрудника $id = $members[0]->getId(); echo "Отправлено сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id)" . PHP_EOL; $ctx->getGlobalDataItem("member_{$id}_request") ->then( function ($old) use ($ctx, $id, $message) { $timer = function ($ctx, $id, $message) { $ctx->setGlobalDataItem("member_{$id}_request", $message) ->then(function () use ($ctx, $id, $message) { echo "Записано сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id) в сессионное хранилище" . PHP_EOL; // Инициализация таймера React\Promise\Timer\sleep(180)->then( function () use ($ctx, $id) { $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) { echo "Сотрудник ($id) изгнан из чата ({$message->getChat()->getId()})" . PHP_EOL; // Удаление сообщения из сессионного хранилища $ctx->deleteGlobalDataItem("member_{$id}_request"); echo "Удалено сообщение ({$message->getMessageId()}?) (member_{$id}_request) с запросом ID у сотрудника ($id) из сессионного хранилища" . PHP_EOL; // Удаление сообщения $ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId()); echo "Удалено сообщение ({$message->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$message->getChat()->getId()})" . PHP_EOL; }); } }, function () { } ); } ); echo "Инициализирован таймер изгнания сотрудника ($id)" . PHP_EOL; }); }; if ($old) { echo "Найдено сообщение ({$old->getMessageId()}) с запросом ID у сотрудника ($id) в сессионном хранилище" . PHP_EOL; $ctx->deleteGlobalDataItem("member_{$id}_request") ->then(function () use ($ctx, $id, $message, $timer, $old) { echo "Удалено сообщение ({$old->getMessageId()}?) (member_{$id}_request) с запросом ID у сотрудника ($id) из сессионного хранилища" . PHP_EOL; $ctx->deleteMessage($old->getChat()->getId(), $old->getMessageId()) ->then(function () use ($ctx, $id, $message, $timer, $old) { echo "Удалено сообщение ({$old->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$old->getChat()->getId()})" . PHP_EOL; $timer($ctx, $id, $message); }); }); } else { echo "Не найдено сообщение с запросом ID у сотрудника ($id) в сессионном хранилище" . PHP_EOL; $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()]) ->then( function ($message) use ($ctx, $id) { // Инициализация таймера React\Promise\Timer\sleep(10)->then( function () use ($ctx, $id, $message) { // Удаление сообщения $ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId()); echo "Удалено сообщение ({$message->getMessageId()}) с подтверждением авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL; }, function () { } ); } ); echo "Авторизован сотрудник ($id) по идентификатору ($worker)" . PHP_EOL; // Удаление сообщения из сессионного хранилища $ctx->deleteGlobalDataItem("member_{$id}_request"); echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из сессионного хранилища после успешной авторизации" . PHP_EOL; // Удаление сообщения $ctx->deleteMessage($_message->getChat()->getId(), $_message->getMessageId()); echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$_message->getChat()->getId()}) после успешной авторизации" . PHP_EOL; return; } } } if (!empty($worker)) { echo "Не удалось авторизовать сотрудника ($id) по номеру ($worker)" . PHP_EOL; $ctx->sendMessage("⛔ Не найден сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()]) ->then( function ($message) use ($ctx, $id) { // Инициализация таймера React\Promise\Timer\sleep(10)->then( function () use ($ctx, $id, $message) { // Удаление сообщения $ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId()); echo "Удалено сообщение ({$message->getMessageId()}) с провалом авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL; }, function () { } ); } ); } } } ); } }); $bot->run();