Compare commits

...

4 Commits

4 changed files with 4306 additions and 31 deletions

View File

@ -2,5 +2,5 @@
Sending requests from [mirzaev/spetsresurs-google_sheets-parser](https://git.mirzaev.sexy/mirzaev/spetsresurs-google_sheets-parser) to [mirzaev/arangodb](https://git.mirzaev.sexy/mirzaev/arangodb) and vice versa Sending requests from [mirzaev/spetsresurs-google_sheets-parser](https://git.mirzaev.sexy/mirzaev/spetsresurs-google_sheets-parser) to [mirzaev/arangodb](https://git.mirzaev.sexy/mirzaev/arangodb) and vice versa
😼 Developed in 1 days for 100000 rubles ($1200) ~~😼 Developed in 1 day for 100000 rubles ($1200)~~ shit happens

2
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "3fd69eb362accef047acf98bf5aa1405", "content-hash": "436a21927a120a646fa0e2f127f72421",
"packages": [ "packages": [
{ {
"name": "bogdaan/viber-bot-php", "name": "bogdaan/viber-bot-php",

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,7 @@ $botSender = new Sender([
]); ]);
$log = new Logger('bot'); $log = new Logger('bot');
$log->pushHandler(new StreamHandler('../bot.log')); $log->pushHandler(new StreamHandler('../logs/robot.txt'));
/** /**
* Авторизация * Авторизация
@ -93,10 +93,11 @@ function registration(string $id, string $number): bool
document::write($arangodb->session, 'viber', ['id' => $id, 'status' => 'inactive', 'number' => $number]) document::write($arangodb->session, 'viber', ['id' => $id, 'status' => 'inactive', 'number' => $number])
) )
)) return false; )) return false;
else throw new exception('Не удалось создать аккаунт или записать номер в существующий');
// Инициализация ребра: workers -> viber // Инициализация ребра: workers -> viber
if (($worker = collection::search( if (
collection::init($arangodb->session, 'workers')
&& ($worker = collection::search(
$arangodb->session, $arangodb->session,
sprintf( sprintf(
"FOR d IN workers FILTER d.phone == '%d' RETURN d", "FOR d IN workers FILTER d.phone == '%d' RETURN d",
@ -142,7 +143,7 @@ function generateMenuKeyboard(): Keyboard
(new Button()) (new Button())
->setBgColor('#97d446') ->setBgColor('#97d446')
->setActionType('reply') ->setActionType('reply')
->setActionBody('btn-search') ->setActionBody('btn-search-1')
->setText('🔍 Активные заявки') ->setText('🔍 Активные заявки')
]); ]);
} }
@ -161,16 +162,31 @@ function generateNumberKeyboard(): Keyboard
]); ]);
} }
function requests(int $amount = 5): Cursor function generateEmojis(): string
{
return '&#' . hexdec(trim(array_rand(file(__DIR__ . '/../emojis.txt')))) . ';';
}
function requests(int $amount = 5, int $page = 1): Cursor
{ {
global $arangodb; global $arangodb;
// Фильтрация номера страницы
if ($page < 1) $page = 1;
// Инициализация номера страницы для вычислний
--$page;
// Инициализация сдвига
$offset = $page === 0 ? 0 : $page * $amount;
return (new _statement( return (new _statement(
$arangodb->session, $arangodb->session,
[ [
'query' => sprintf( 'query' => sprintf(
"FOR d IN works FILTER d.confirmed != 'да' LIMIT %d RETURN d", "FOR d IN works FILTER d.confirmed != 'да' SORT d.created DESC LIMIT %d, %d RETURN d",
$amount $offset,
$amount + $offset
), ),
"batchSize" => 1000, "batchSize" => 1000,
"sanitize" => true "sanitize" => true
@ -182,7 +198,7 @@ try {
$bot = new Bot(['token' => require('../settings/key.php')]); $bot = new Bot(['token' => require('../settings/key.php')]);
$bot $bot
->onText('|btn-request-choose-*|s', function ($event) use ($bot, $botSender, $log) { ->onText('|btn-request-choose-*|s', function ($event) use ($bot, $botSender) {
global $arangodb; global $arangodb;
$id = $event->getSender()->getId(); $id = $event->getSender()->getId();
@ -200,6 +216,12 @@ try {
// Запись о том, что задание подтверждено (в будущем здесь будет отправка на потдверждение модераторам) // Запись о том, что задание подтверждено (в будущем здесь будет отправка на потдверждение модераторам)
$work->confirmed = 'да'; $work->confirmed = 'да';
// Запись о том, что необходимо перенести изменения в Google Sheets
$work->transfer_to_sheets = 'да';
// Запись идентификатора Google Sheets нового сотрудника
$work->worker = $worker->id;
if (document::update($arangodb->session, $work)) { if (document::update($arangodb->session, $work)) {
// Записано обновление в базу данных // Записано обновление в базу данных
@ -209,8 +231,7 @@ try {
"FOR d IN readinesses FILTER d._id == '%s' RETURN d", "FOR d IN readinesses FILTER d._id == '%s' RETURN d",
document::write($arangodb->session, 'readinesses', ['_from' => $worker->getId(), '_to' => $work->getId()]) document::write($arangodb->session, 'readinesses', ['_from' => $worker->getId(), '_to' => $work->getId()])
) )
) )) {
) {
// Записано ребро: worker -> work (принятие заявки) // Записано ребро: worker -> work (принятие заявки)
$bot->getClient()->sendMessage( $bot->getClient()->sendMessage(
@ -244,19 +265,31 @@ try {
); );
} }
}) })
->onText('|btn-search|s', function ($event) use ($bot, $botSender) { ->onText('|btn-search-*|s', function ($event) use ($bot, $botSender) {
global $arangodb; global $arangodb;
// Инициализация номера страницы
preg_match('/btn-search-(\d+)/', $event->getMessage()->getText(), $matches);
$page = $matches[1] ?? 1;
$id = $event->getSender()->getId(); $id = $event->getSender()->getId();
if (($worker = authorization($id)) instanceof _document) { if (($worker = authorization($id)) instanceof _document) {
// Авторизован // Авторизован
$keyboard = []; // Поиск заявок из базы данных
$requests = requests(6, $page);
$requests = requests(5); // Подсчёт количества прочитанных заявок из базы данных
$count = $requests->getCount();
if ($requests->getCount() < 1) { // Проверка существования избытка
$excess = $count === 6;
// Обрезка заявок до размера страницы
$requests = array_slice($requests->getAll(), 0, 5);
if ($count === 0) {
$bot->getClient()->sendMessage( $bot->getClient()->sendMessage(
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
@ -267,6 +300,26 @@ try {
return; return;
} }
// Инициализация буфера клавиатуры для ответа
$keyboard = [];
// Генерация кнопки: "Следующая страница"
if ($excess) $keyboard[] = (new Button())
->setBgColor('#dce537')
->setTextSize('large')
->setActionType('reply')
->setActionBody('btn-search-' . $page + 1)
->setText('Следующая страница');
// Генерация кнопки: "Предыдущая страница"
if ($page > 1) $keyboard[] =
(new Button())
->setBgColor('#dce537')
->setTextSize('large')
->setActionType('reply')
->setActionBody('btn-search-' . $page - 1)
->setText('Предыдущая страница');
foreach ($requests as $request) { foreach ($requests as $request) {
// Перебор найденных заявок // Перебор найденных заявок
@ -279,31 +332,33 @@ try {
)) instanceof _document) { )) instanceof _document) {
// Найден магазин // Найден магазин
// Генерация эмодзи
/* $emoji = generateEmojis(); */
// Отправка сообщения с данной заявки // Отправка сообщения с данной заявки
$bot->getClient()->sendMessage( $bot->getClient()->sendMessage(
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText("**#{$request->getKey()}**\n\n$request->date ($request->start - $request->end)\n**Работа:** \"$request->work\"\n\n**Город:** $market->city\n**Адрес:** $market->address") ->setText("**#{$request->getKey()}**\n\n" . $request->date['converted'] . " (" . $request->start['converted'] . " - " . $request->end['converted'] . ")\n**Работа:** \"$request->work\"\n\n**Город:** $market->city\n**Адрес:** $market->address")
); );
// Запись выбора заявки в клавиатуру // Запись выбора заявки в клавиатуру
$keyboard[] = (new Button()) $keyboard[] = (new Button())
->setBgColor(sprintf("#%02x%02x%02x", mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255))) ->setBgColor(sprintf("#%02x%02x%02x", mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)))
->setTextSize('small') ->setTextSize('large')
->setActionType('reply') ->setActionType('reply')
->setActionBody("btn-request-choose-{$request->getKey()}") ->setActionBody("btn-request-choose-{$request->getKey()}")
->setText("#{$request->getKey()}"); ->setText("#{$request->getKey()}");
} }
} }
$bot->getClient()->sendMessage( $bot->getClient()->sendMessage((new Text())
(new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setMinApiVersion(3) ->setMinApiVersion(3)
->setText("🔍 Выберите заявку") ->setText("🔍 Выберите заявку")
->setKeyboard((new Keyboard())->setButtons($keyboard ?? [])) ->setKeyboard((new Keyboard())->setButtons($keyboard))
); );
} else if ($worker === null) { } else if ($worker === null) {
// Не подключен // Не подключен
@ -323,7 +378,7 @@ try {
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText('⛔ **Вы не авторизованы**') ->setText('⛔ **Вы не авторизованы**')
); );
} }
}) })
@ -358,7 +413,7 @@ try {
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText('⛔ **Вы не авторизованы**') ->setText('⛔ **Вы не авторизованы**')
); );
} }
}) })
@ -393,7 +448,7 @@ try {
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText('⛔ **Вы не авторизованы**') ->setText('⛔ **Вы не авторизованы**')
); );
} }
}) })
@ -428,16 +483,17 @@ try {
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText('⛔ **Вы не авторизованы**') ->setText('⛔ **Вы не авторизованы**')
); );
} }
}) })
->on(function ($event) { ->on(function ($event) {
return ($event instanceof Message && $event->getMessage() instanceof Contact); return ($event instanceof Message && $event->getMessage() instanceof Contact);
}, function ($event) use ($bot, $botSender, $log) { }, function ($event) use ($bot, $botSender) {
$id = $event->getSender()->getId(); $id = $event->getSender()->getId();
if (registration($id, $event->getMessage()->getPhoneNumber())) { if (registration($id, $event->getMessage()->getPhoneNumber())) {
// Зарегистрирован
$bot->getClient()->sendMessage( $bot->getClient()->sendMessage(
(new Text()) (new Text())
@ -463,9 +519,18 @@ try {
(new Text()) (new Text())
->setSender($botSender) ->setSender($botSender)
->setReceiver($id) ->setReceiver($id)
->setText('⛔ **Вы не авторизованы**') ->setText('⛔ **Вы не авторизованы**')
); );
} }
} else {
// Не зарегистрирован
$bot->getClient()->sendMessage(
(new Text())
->setSender($botSender)
->setReceiver($id)
->setText('⛔ **Вы не авторизованы**')
);
} }
}) })
->run(); ->run();