6 Commits
1.0.0 ... 1.2.0

Author SHA1 Message Date
57ea64d261 added logging 2024-04-19 17:01:18 +07:00
69c34bb9f9 fix 2024-04-17 22:59:59 +07:00
b1f3be28e0 fix + only digitals 2024-04-17 10:22:42 +07:00
23ccfcdc93 fix 2024-04-15 23:58:37 +07:00
31022e24af systemd service 2024-04-15 23:54:18 +07:00
ac7db327bd fix 2024-04-15 23:47:14 +07:00
13 changed files with 190 additions and 119 deletions

View File

@@ -4,7 +4,7 @@
"license": "WTFPL",
"autoload": {
"psr-4": {
"mirzaev\\spetsresurs\\\\telegram\\robot\\entry\\": "mirzaev/spetsresurs/telegram/robot/entry/system/"
"mirzaev\\spetsresurs\\telegram\\robot\\entry\\": "mirzaev/spetsresurs/telegram/robot/entry/system/"
}
},
"authors": [

View File

@@ -0,0 +1,172 @@
<?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()]);
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("Не найден сотрудник: $id", ['reply_to_message_id' => $message->getMessageId()]);
}
}
}
);
}
});
$bot->run();

View File

@@ -1,118 +0,0 @@
<?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);
$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;
// Инициализация идентификатора сотрудника
$member = $id = $members[0]->getId();
global $timer;
$timer = React\Promise\Timer\sleep(30);
$timer->then(
function ($value) use ($ctx, $id) {
// Изгнание из чата
$ctx->kickChatMember($ctx->getMessage()->getChat()->getId(), $id);
$ctx->wipeCache();
$ctx->endConversation();
},
function () {
}
);
$ctx->nextStep('check');
});
}
});
function check(Context $ctx)
{
global $member;
if ($member === $ctx->getMessage()->getFrom()->getId()) {
// Отправителем табельного номера является тот кто подключился к серверу
$id = $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;
}
}
$ctx->sendMessage("Не найден сотрудник: $id");
}
}
}
$bot->run();

Binary file not shown.

Binary file not shown.

Binary file not shown.

17
telegram-robot-entry.service Executable file
View File

@@ -0,0 +1,17 @@
[Unit]
Description=Telegram-robot-entry
Wants=network.target
After=syslog.target network-online.target
[Service]
ExecStart=sudo -u www-data /usr/bin/php /var/www/spetsresurs-telegram-robot-entry/mirzaev/spetsresurs/telegram/robot/entry/system/public/robot.php
PIDFile=/var/run/php/telegram-robot-entry.pid
RemainAfterExit=no
RuntimeMaxSec=3600s
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target