переделка 20к под аранго

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2024-05-05 15:57:19 +07:00
parent a9be62e136
commit bc0945d96c
3 changed files with 465 additions and 181 deletions

98
composer.lock generated
View File

@ -308,7 +308,7 @@
}, },
{ {
"name": "flow-php/array-dot", "name": "flow-php/array-dot",
"version": "0.7.3", "version": "0.7.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/flow-php/array-dot.git", "url": "https://github.com/flow-php/array-dot.git",
@ -350,22 +350,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/flow-php/array-dot/issues", "issues": "https://github.com/flow-php/array-dot/issues",
"source": "https://github.com/flow-php/array-dot/tree/0.7.3" "source": "https://github.com/flow-php/array-dot/tree/0.7.4"
}, },
"time": "2024-03-10T14:05:42+00:00" "time": "2024-03-10T14:05:42+00:00"
}, },
{ {
"name": "flow-php/etl", "name": "flow-php/etl",
"version": "0.7.3", "version": "0.7.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/flow-php/etl.git", "url": "https://github.com/flow-php/etl.git",
"reference": "ba942170d44b9034edbf0ebea71a9241b92a755b" "reference": "277033c341f9fa4cb64e7acdb66a190ffb3198ad"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/flow-php/etl/zipball/ba942170d44b9034edbf0ebea71a9241b92a755b", "url": "https://api.github.com/repos/flow-php/etl/zipball/277033c341f9fa4cb64e7acdb66a190ffb3198ad",
"reference": "ba942170d44b9034edbf0ebea71a9241b92a755b", "reference": "277033c341f9fa4cb64e7acdb66a190ffb3198ad",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -417,9 +417,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/flow-php/etl/issues", "issues": "https://github.com/flow-php/etl/issues",
"source": "https://github.com/flow-php/etl/tree/0.7.3" "source": "https://github.com/flow-php/etl/tree/0.7.4"
}, },
"time": "2024-03-29T21:50:09+00:00" "time": "2024-04-18T09:51:27+00:00"
}, },
{ {
"name": "flow-php/etl-adapter-google-sheet", "name": "flow-php/etl-adapter-google-sheet",
@ -473,13 +473,13 @@
], ],
"support": { "support": {
"issues": "https://github.com/flow-php/etl-adapter-google-sheet/issues", "issues": "https://github.com/flow-php/etl-adapter-google-sheet/issues",
"source": "https://github.com/flow-php/etl-adapter-google-sheet/tree/1.x" "source": "https://github.com/flow-php/etl-adapter-google-sheet/tree/0.7.4"
}, },
"time": "2024-04-02T18:26:10+00:00" "time": "2024-04-02T18:26:10+00:00"
}, },
{ {
"name": "flow-php/rdsl", "name": "flow-php/rdsl",
"version": "0.7.3", "version": "0.7.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/flow-php/rdsl.git", "url": "https://github.com/flow-php/rdsl.git",
@ -519,37 +519,37 @@
], ],
"support": { "support": {
"issues": "https://github.com/flow-php/rdsl/issues", "issues": "https://github.com/flow-php/rdsl/issues",
"source": "https://github.com/flow-php/rdsl/tree/0.7.3" "source": "https://github.com/flow-php/rdsl/tree/0.7.4"
}, },
"time": "2024-03-10T14:06:05+00:00" "time": "2024-03-10T14:06:05+00:00"
}, },
{ {
"name": "google/apiclient", "name": "google/apiclient",
"version": "v2.15.3", "version": "v2.16.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client.git", "url": "https://github.com/googleapis/google-api-php-client.git",
"reference": "e70273c06d18824de77e114247ae3102f8aec64d" "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/e70273c06d18824de77e114247ae3102f8aec64d", "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/017400f609c1fb71ab5ad824c50eabd4c3eaf779",
"reference": "e70273c06d18824de77e114247ae3102f8aec64d", "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"firebase/php-jwt": "~6.0", "firebase/php-jwt": "~6.0",
"google/apiclient-services": "~0.200", "google/apiclient-services": "~0.350",
"google/auth": "^1.33", "google/auth": "^1.37",
"guzzlehttp/guzzle": "^6.5.8||^7.4.5", "guzzlehttp/guzzle": "^6.5.8||^7.4.5",
"guzzlehttp/psr7": "^1.8.4||^2.2.1", "guzzlehttp/psr7": "^1.9.1||^2.2.1",
"monolog/monolog": "^2.9||^3.0", "monolog/monolog": "^2.9||^3.0",
"php": "^7.4|^8.0", "php": "^7.4|^8.0",
"phpseclib/phpseclib": "^3.0.34" "phpseclib/phpseclib": "^3.0.36"
}, },
"require-dev": { "require-dev": {
"cache/filesystem-adapter": "^1.1", "cache/filesystem-adapter": "^1.1",
"composer/composer": "^1.10.22", "composer/composer": "^1.10.23",
"phpcompatibility/php-compatibility": "^9.2", "phpcompatibility/php-compatibility": "^9.2",
"phpspec/prophecy-phpunit": "^2.0", "phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5", "phpunit/phpunit": "^9.5",
@ -588,22 +588,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client/issues", "issues": "https://github.com/googleapis/google-api-php-client/issues",
"source": "https://github.com/googleapis/google-api-php-client/tree/v2.15.3" "source": "https://github.com/googleapis/google-api-php-client/tree/v2.16.0"
}, },
"time": "2024-01-04T19:15:22+00:00" "time": "2024-04-24T00:59:47+00:00"
}, },
{ {
"name": "google/apiclient-services", "name": "google/apiclient-services",
"version": "v0.344.0", "version": "v0.351.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git", "url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "d5813b1a64a8a73daf7ab307dc640e2efb046131" "reference": "a053f7dd118e46845fcefa9036c5b97b1050dfaa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d5813b1a64a8a73daf7ab307dc640e2efb046131", "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/a053f7dd118e46845fcefa9036c5b97b1050dfaa",
"reference": "d5813b1a64a8a73daf7ab307dc640e2efb046131", "reference": "a053f7dd118e46845fcefa9036c5b97b1050dfaa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -632,40 +632,42 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues", "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.344.0" "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.351.0"
}, },
"time": "2024-04-12T01:04:09+00:00" "time": "2024-04-23T21:58:18+00:00"
}, },
{ {
"name": "google/auth", "name": "google/auth",
"version": "v1.37.1", "version": "v1.39.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-auth-library-php.git", "url": "https://github.com/googleapis/google-auth-library-php.git",
"reference": "1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46" "reference": "23e8e696d87f8d7dfefbd347ca1c99ce17ecb368"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46", "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/23e8e696d87f8d7dfefbd347ca1c99ce17ecb368",
"reference": "1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46", "reference": "23e8e696d87f8d7dfefbd347ca1c99ce17ecb368",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"firebase/php-jwt": "^6.0", "firebase/php-jwt": "^6.0",
"guzzlehttp/guzzle": "^6.5.8||^7.4.5", "guzzlehttp/guzzle": "^7.4.5",
"guzzlehttp/psr7": "^2.4.5", "guzzlehttp/psr7": "^2.4.5",
"php": "^7.4||^8.0", "php": "^8.0",
"psr/cache": "^1.0||^2.0||^3.0", "psr/cache": "^2.0||^3.0",
"psr/http-message": "^1.1||^2.0" "psr/http-message": "^1.1||^2.0"
}, },
"require-dev": { "require-dev": {
"guzzlehttp/promises": "^2.0", "guzzlehttp/promises": "^2.0",
"kelvinmo/simplejwt": "0.7.1", "kelvinmo/simplejwt": "0.7.1",
"phpseclib/phpseclib": "^3.0", "phpseclib/phpseclib": "^3.0.35",
"phpspec/prophecy-phpunit": "^2.0", "phpspec/prophecy-phpunit": "^2.1",
"phpunit/phpunit": "^9.0.0", "phpunit/phpunit": "^9.6",
"sebastian/comparator": ">=1.2.3", "sebastian/comparator": ">=1.2.3",
"squizlabs/php_codesniffer": "^3.5" "squizlabs/php_codesniffer": "^3.5",
"symfony/process": "^6.0||^7.0",
"webmozart/assert": "^1.11"
}, },
"suggest": { "suggest": {
"phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
@ -690,9 +692,9 @@
"support": { "support": {
"docs": "https://googleapis.github.io/google-auth-library-php/main/", "docs": "https://googleapis.github.io/google-auth-library-php/main/",
"issues": "https://github.com/googleapis/google-auth-library-php/issues", "issues": "https://github.com/googleapis/google-auth-library-php/issues",
"source": "https://github.com/googleapis/google-auth-library-php/tree/v1.37.1" "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.39.0"
}, },
"time": "2024-04-03T18:41:12+00:00" "time": "2024-05-02T16:03:51+00:00"
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
@ -3047,16 +3049,16 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.4.0", "version": "v3.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3065,7 +3067,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@ -3094,7 +3096,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
}, },
"funding": [ "funding": [
{ {
@ -3110,7 +3112,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "triagens/arangodb", "name": "triagens/arangodb",

View File

@ -1,5 +1,15 @@
<?php <?php
// Фреймворк ArangoDB
use mirzaev\arangodb\connection,
mirzaev\arangodb\collection,
mirzaev\arangodb\document;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document,
ArangoDBClient\Cursor,
ArangoDBClient\Statement as _statement;
// Фреймворк Telegram // Фреймворк Telegram
use Zanzara\Zanzara; use Zanzara\Zanzara;
use Zanzara\Context; use Zanzara\Context;
@ -25,177 +35,441 @@ use Google\Client,
require __DIR__ . '/../../../../../../../vendor/autoload.php'; require __DIR__ . '/../../../../../../../vendor/autoload.php';
ini_set('error_reporting', E_ALL); $arangodb = new connection(require __DIR__ . '/../settings/arangodb.php');
/* ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1); ini_set('display_errors', 1);
ini_set('display_startup_errors', 1); ini_set('display_startup_errors', 1); */
$config = new Config(); $config = new Config();
$config->setParseMode(Config::PARSE_MODE_MARKDOWN); $config->setParseMode(Config::PARSE_MODE_MARKDOWN);
$bot = new Zanzara(require(__DIR__ . '/../settings/key.php'), $config); $bot = new Zanzara(require(__DIR__ . '/../settings/key.php'), $config);
$bot->onMessage(function (Context $ctx) { $bot->onMessage(function (Context $ctx) use ($arangodb) {
// Инициализация сообщения
$message = $ctx->getMessage();
if ($members = $ctx->getMessage()->getNewChatMembers()) { 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; // Инициализация идентификатора сотрудника
$id = $members[0]->getId();
$ctx->getGlobalDataItem("member_{$id}_request") } else if ($ctx->getMessage()->getLeftChatMember()) return;
->then( else {
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(); $id = $message->getFrom()->getId();
}
$ctx->getGlobalDataItem("member_{$id}_request") if (collection::init($arangodb->session, 'telegram')) {
->then( // Инициализирована коллекция telegram-аккаунтов в ArangoDB
function ($_message) use ($ctx, $id, $message) {
if ($_message) {
// Инициализация переданного идентификатора (только цифры)
$worker = preg_replace('/[^\d]/', '', $message->getText() ?? '');
$settings = json_decode(require(__DIR__ . '/../settings/workers/google.php'), true); if (!$telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s && !d.deleted RETURN d", $id))) {
$document = require(__DIR__ . '/../settings/workers/document.php'); // Не найден telegram-аккаунт в базе данных
$sheets = require(__DIR__ . '/../settings/workers/sheets.php');
$client = new Client(); // Запись telegram-аккаунта в базу данных (не привязан сотрудник и активность - прямо сейчас)
$client->setScopes(Sheets::SPREADSHEETS); document::write($arangodb->session, 'telegram', ['id' => $id, 'worker' => null, 'activity' => time(), 'welcome' => false]);
$client->setAuthConfig($settings);
$api = new Sheets($client);
foreach ($sheets as $sheet) { if (!$telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s && !d.deleted RETURN d", $id))) {
$rows = (new Flow())->read(new GoogleSheetExtractor($api, $document, new Columns($sheet, 'A', 'A'), true, 1000)); // Не найден telegram-аккаунт в базе данных
foreach ($rows->fetch(10000) as $row) { throw new exception('чё бля происходит');
// Перебор строк }
}
if ($worker === $row->toArray()['ID']) { if ($telegram->worker === null) {
$ctx->sendMessage("✅ Авторизован сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()]) // Не авторизован telegram-аккаунт
if ($telegram->welcome && $telegram->activity - time() < 0 && !$telegram->ban) {
// Повторный запрос авторизации + прошло более 10800 секунд (3 часа) с последней активности (подразумевается отправка сообщения)
// Подразумевается, что если $telegram->ban === true, то уже идёт процесс авторизации и это сообщение уже было отправлено
$ctx->sendMessage("⚠️ Введите ваш табельный номер\nТребуется дополнительная проверка", ['reply_to_message_id' => $ctx->getMessage()->getMessageId()])
->then(function ($message) use ($ctx, $id, $arangodb, $telegram) {
// Запись в реестр сообщений
$telegram->messages = [
$message->getChat()->getId() => [
$message->getMessageId() => $message->getText()
] + ($telegram->messages[$message->getChat()->getId()] ?? [])
] + ($telegram->messages ?? []);
// Инициализация таймера изгнания из чата (180 секунд - 3 минуты)
$telegram->ban = time() + 180;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
// Инициализация таймера изгнания сотрудника и удаления сообщения
React\Promise\Timer\sleep(180)->then(
function () use ($ctx, $id, $message, $arangodb) {
if ($telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s RETURN d", $id))) {
// Найден telegram-аккаунт в базе данных (повторное чтение для обновления буфера сообщений)
if ($telegram->messages[(string) $message->getChat()->getId()][(string) $message->getMessageId()]) {
// Найдено сообщение в ArangoDB (подразумевается, что оно есть и в чате)
// Удаление сообщения из чата
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
// Удаление сообщения из ArangoDB
$buffer = $telegram->messages;
unset($buffer[(string) $message->getChat()->getId()][(string) $message->getMessageId()]);
// По первому уровню массива (чату) ArangoDB думает, что изменений нет и не перезаписывает (лень разбираться)
$telegram->messages = [];
document::update($arangodb->session, $telegram);
$telegram->messages = $buffer;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
}
if ($telegram->ban) {
// Прошло более 180 секунд (3 минуты) без авторизации после запроса
// Изгнание из чата
$ctx->kickChatMember($message->getChat()->getId(), $id)
->then(function () use ($ctx, $id, $message, $arangodb, $telegram) {
// Изгнан из чата
// Удаление всех сообщений из чата
foreach ($telegram->messages ?? [] as $chat => $messages)
foreach ($messages as $_message => $text)
$ctx->deleteMessage($chat, $_message);
// Удаление всех сообщений в чате из ArangoDB
$telegram->messages = [(string) $message->getChat()->getId() => []] + ($telegram->messages ?? []);
// Запись статуса удаления в ArangoDB
$telegram->deleted = true;
// Запись таймера изгнания
$telegram->ban = false;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
});
}
}
},
fn () => null
);
});
// Возврат (успех)
return;
} else if (!$telegram->welcome) {
// Первый запрос авторизации
$ctx->sendMessage("⚠️ Введите ваш табельный номер", ['reply_to_message_id' => $ctx->getMessage()->getMessageId()])
->then(function ($message) use ($ctx, $id, $arangodb, $telegram) {
// Запись статуса первого запроса авторизации
$telegram->welcome = true;
// Запись в реестр сообщений
$telegram->messages = [
$message->getChat()->getId() => [
$message->getMessageId() => $message->getText()
] + ($telegram->messages[$message->getChat()->getId()] ?? [])
] + ($telegram->messages ?? []);
// Инициализация таймера изгнания из чата (180 секунд - 3 минуты)
$telegram->ban = time() + 180;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
// Инициализация таймера изгнания сотрудника и удаления сообщения
React\Promise\Timer\sleep(180)->then(
function () use ($ctx, $id, $message, $arangodb) {
if ($telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s RETURN d", $id))) {
// Найден telegram-аккаунт в базе данных (повторное чтение для обновления буфера сообщений)
if ($telegram->messages[(string) $message->getChat()->getId()][(string) $message->getMessageId()]) {
// Найдено сообщение в ArangoDB (подразумевается, что оно есть и в чате)
// Удаление сообщения из чата
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
// Удаление сообщения из ArangoDB
$buffer = $telegram->messages;
unset($buffer[(string) $message->getChat()->getId()][(string) $message->getMessageId()]);
// По первому уровню массива (чату) ArangoDB думает, что изменений нет и не перезаписывает (лень разбираться)
$telegram->messages = [];
document::update($arangodb->session, $telegram);
$telegram->messages = $buffer;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
}
if ($telegram->ban) {
// Прошло более 180 секунд (3 минуты) без авторизации после завпроса
// Изгнание из чата
$ctx->kickChatMember($message->getChat()->getId(), $id)
->then(function () use ($ctx, $id, $message, $arangodb, $telegram) {
// Изгнан из чата
// Удаление всех сообщений из чата
foreach ($telegram->messages ?? [] as $chat => $messages)
foreach ($messages as $_message => $text)
$ctx->deleteMessage($chat, $_message);
// Удаление всех сообщений в чате из ArangoDB
$telegram->messages = [(string) $message->getChat()->getId() => []] + ($telegram->messages ?? []);
// Запись статуса удаления в ArangoDB
$telegram->deleted = true;
// Запись таймера изгнания
$telegram->ban = false;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
});
}
}
},
fn () => null
);
});
// Возврат (успех)
return;
}
if ($telegram->ban && $telegram->ban - time() < 0) {
// Прошло более 180 секунд (3 минуты) без авторизации после завпроса
// Изгнание из чата
$ctx->kickChatMember($message->getChat()->getId(), $id)
->then(function () use ($ctx, $id, $message, $arangodb, $telegram) {
// Изгнан из чата
// Удаление всех сообщений из чата
foreach ($telegram->messages ?? [] as $chat => $messages)
foreach ($messages as $_message => $text)
$ctx->deleteMessage($chat, $_message);
// Удаление всех сообщений в чате из ArangoDB
$telegram->messages = [(string) $message->getChat()->getId() => []] + ($telegram->messages ?? []);
// Запись статуса удаления в ArangoDB
$telegram->deleted = true;
// Запись таймера изгнания
$telegram->ban = false;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
});
// Возврат (успех)
return;
} else {
// Не прошло 180 секунд (3 минуты) без авторизации после запроса (либо запроса ещё не было)
// Инициализация переданного идентификатора (только цифры)
$worker = preg_replace('/[^\d]/', '', $message->getText() ?? '');
if (!empty($worker)) {
// Инициализирован идентификатор сотрудника для поиска
$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']) {
// Найден идентификатор
if (collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.worker == %s RETURN d", $worker)))
$ctx->sendMessage("🪪 Сотрудник \\($worker\\) уже привязан к другому telegram\\-аккаунту", ['reply_to_message_id' => $message->getMessageId()])
->then( ->then(
function ($message) use ($ctx, $id) { function ($message) use ($ctx, $id, $arangodb, $telegram) {
// Инициализация таймера // Запись в реестр сообщений
React\Promise\Timer\sleep(10)->then( $telegram->messages = [
function () use ($ctx, $id, $message) { $message->getChat()->getId() => [
// Удаление сообщения $message->getMessageId() => $message->getText()
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId()); ] + ($telegram->messages[$message->getChat()->getId()] ?? [])
] + ($telegram->messages ?? []);
echo "Удалено сообщение ({$message->getMessageId()}) с подтверждением авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL; // Запись в ArangoDB
document::update($arangodb->session, $telegram);
// Инициализация таймера удаления сообщения
React\Promise\Timer\sleep(10)->then(
function () use ($ctx, $id, $message, $arangodb) {
if ($telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s RETURN d", $id))) {
// Найден telegram-аккаунт в базе данных (повторное чтение для обновления буфера сообщений)
if ($telegram->messages[(string) $message->getChat()->getId()][(string) $message->getMessageId()]) {
// Найдено сообщение в ArangoDB (подразумевается, что оно есть и в чате)
// Удаление сообщения из чата
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
// Удаление сообщения из ArangoDB
$buffer = $telegram->messages;
unset($buffer[(string) $message->getChat()->getId()][(string) $message->getMessageId()]);
// По первому уровню массива (чату) ArangoDB думает, что изменений нет и не перезаписывает (лень разбираться)
$telegram->messages = [];
document::update($arangodb->session, $telegram);
$telegram->messages = $buffer;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
}
}
}, },
function () { fn () => null
}
); );
} }
); );
echo "Авторизован сотрудник ($id) по идентификатору ($worker)" . PHP_EOL; else {
// Не занят идентификатор
// Удаление сообщения из сессионного хранилища // Запись статуса изгнания (остановка процесса)
$ctx->deleteGlobalDataItem("member_{$id}_request"); $telegram->ban = false;
echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из сессионного хранилища после успешной авторизации" . PHP_EOL; // Запись сотрудника (привязка)
$telegram->worker = (int) $worker;
// Удаление сообщения // Удаление всех сообщений из чата
$ctx->deleteMessage($_message->getChat()->getId(), $_message->getMessageId()); foreach ($telegram->messages ?? [] as $chat => $messages)
foreach ($messages as $_message => $text)
$ctx->deleteMessage($chat, $_message);
echo "Удалено сообщение ({$_message->getMessageId()}) с запросом ID у сотрудника ($id) из чата ({$_message->getChat()->getId()}) после успешной авторизации" . PHP_EOL; // Удаление всех сообщений в чате из ArangoDB
$telegram->messages = [(string) $message->getChat()->getId() => []] + ($telegram->messages ?? []);
return; // Запись в ArangoDB
} document::update($arangodb->session, $telegram);
}
}
if (!empty($worker)) { $ctx->sendMessage("✅ Авторизован сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()])
echo "Не удалось авторизовать сотрудника ($id) по номеру ($worker)" . PHP_EOL; ->then(
$ctx->sendMessage("Не найден сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()]) function ($message) use ($ctx, $id, $arangodb, $telegram) {
->then( // Запись в реестр сообщений
function ($message) use ($ctx, $id) { $telegram->messages = [
// Инициализация таймера $message->getChat()->getId() => [
React\Promise\Timer\sleep(10)->then( $message->getMessageId() => $message->getText()
function () use ($ctx, $id, $message) { ] + ($telegram->messages[$message->getChat()->getId()] ?? [])
// Удаление сообщения ] + ($telegram->messages ?? []);
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
echo "Удалено сообщение ({$message->getMessageId()}) с провалом авторизации сотрудника ($id) в чате ({$message->getChat()->getId()})" . PHP_EOL; // Запись в ArangoDB
}, document::update($arangodb->session, $telegram);
function () {
// Инициализация таймера удаления сообщения
React\Promise\Timer\sleep(10)->then(
function () use ($ctx, $id, $message, $arangodb) {
if ($telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s RETURN d", $id))) {
// Найден telegram-аккаунт в базе данных (повторное чтение для обновления буфера сообщений)
if ($telegram->messages[(string) $message->getChat()->getId()][(string) $message->getMessageId()]) {
// Найдено сообщение в ArangoDB (подразумевается, что оно есть и в чате)
// Удаление сообщения из чата
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
// Удаление сообщения из ArangoDB
$buffer = $telegram->messages;
unset($buffer[(string) $message->getChat()->getId()][(string) $message->getMessageId()]);
// По первому уровню массива (чату) ArangoDB думает, что изменений нет и не перезаписывает (лень разбираться)
$telegram->messages = [];
document::update($arangodb->session, $telegram);
$telegram->messages = $buffer;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
}
}
},
fn () => null
);
} }
); );
} }
);
// Возврат (успех)
return;
}
} }
} }
$ctx->sendMessage("Не найден сотрудник: $worker", ['reply_to_message_id' => $message->getMessageId()])
->then(
function ($message) use ($ctx, $id, $arangodb, $telegram) {
// Запись в реестр сообщений
$telegram->messages = [
$message->getChat()->getId() => [
$message->getMessageId() => $message->getText()
] + ($telegram->messages[$message->getChat()->getId()] ?? [])
] + ($telegram->messages ?? []);
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
// Инициализация таймера
React\Promise\Timer\sleep(10)->then(
function () use ($ctx, $id, $message, $arangodb) {
if ($telegram = collection::search($arangodb->session, sprintf("FOR d IN telegram FILTER d.id == %s RETURN d", $id))) {
// Найден telegram-аккаунт в базе данных (повторное чтение для обновления буфера сообщений)
if ($telegram->messages[(string) $message->getChat()->getId()][(string) $message->getMessageId()]) {
// Найдено сообщение в ArangoDB (подразумевается, что оно есть и в чате)
// Удаление сообщения из чата
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
// Удаление сообщения из ArangoDB
$buffer = $telegram->messages;
unset($buffer[(string) $message->getChat()->getId()][(string) $message->getMessageId()]);
// По первому уровню массива (чату) ArangoDB думает, что изменений нет и не перезаписывает (лень разбираться)
$telegram->messages = [];
document::update($arangodb->session, $telegram);
$telegram->messages = $buffer;
// Запись в ArangoDB
document::update($arangodb->session, $telegram);
}
}
},
fn () => null
);
}
);
// Возврат (успех)
return;
} }
); }
}
// Запись активности
$telegram->activity = time();
document::update($arangodb->session, $telegram);
} }
}); });

View File

@ -0,0 +1,8 @@
<?php
return [
'endpoint' => 'unix:///var/run/arangodb3/arango.sock',
'database' => '',
'name' => '',
'password' => ''
];