This repository has been archived on 2024-10-16. You can view files and clone it, but cannot push or open issues or pull requests.
spetsresurs-telegram-robot-.../mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php

203 lines
8.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();