203 lines
8.7 KiB
PHP
203 lines
8.7 KiB
PHP
<?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();
|