Compare commits
4 Commits
d7ccbcd57f
...
bcb58b7a78
Author | SHA1 | Date | |
---|---|---|---|
bcb58b7a78 | |||
![]() |
d51640030a | ||
![]() |
f0a4517c1a | ||
344398c4f4 |
@@ -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
|
||||
|
||||
😼 Developed in 1 days for 100000 rubles ($1200)
|
||||
~~😼 Developed in 1 day for 100000 rubles ($1200)~~ shit happens
|
||||
|
||||
|
2
composer.lock
generated
2
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "3fd69eb362accef047acf98bf5aa1405",
|
||||
"content-hash": "436a21927a120a646fa0e2f127f72421",
|
||||
"packages": [
|
||||
{
|
||||
"name": "bogdaan/viber-bot-php",
|
||||
|
4210
mirzaev/spetsresurs/viber/registry/requests/system/emojis.txt
Normal file
4210
mirzaev/spetsresurs/viber/registry/requests/system/emojis.txt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -33,7 +33,7 @@ $botSender = new Sender([
|
||||
]);
|
||||
|
||||
$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])
|
||||
)
|
||||
)) return false;
|
||||
else throw new exception('Не удалось создать аккаунт или записать номер в существующий');
|
||||
|
||||
// Инициализация ребра: workers -> viber
|
||||
if (($worker = collection::search(
|
||||
if (
|
||||
collection::init($arangodb->session, 'workers')
|
||||
&& ($worker = collection::search(
|
||||
$arangodb->session,
|
||||
sprintf(
|
||||
"FOR d IN workers FILTER d.phone == '%d' RETURN d",
|
||||
@@ -142,7 +143,7 @@ function generateMenuKeyboard(): Keyboard
|
||||
(new Button())
|
||||
->setBgColor('#97d446')
|
||||
->setActionType('reply')
|
||||
->setActionBody('btn-search')
|
||||
->setActionBody('btn-search-1')
|
||||
->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;
|
||||
|
||||
// Фильтрация номера страницы
|
||||
if ($page < 1) $page = 1;
|
||||
|
||||
// Инициализация номера страницы для вычислний
|
||||
--$page;
|
||||
|
||||
// Инициализация сдвига
|
||||
$offset = $page === 0 ? 0 : $page * $amount;
|
||||
|
||||
return (new _statement(
|
||||
$arangodb->session,
|
||||
[
|
||||
'query' => sprintf(
|
||||
"FOR d IN works FILTER d.confirmed != 'да' LIMIT %d RETURN d",
|
||||
$amount
|
||||
"FOR d IN works FILTER d.confirmed != 'да' SORT d.created DESC LIMIT %d, %d RETURN d",
|
||||
$offset,
|
||||
$amount + $offset
|
||||
),
|
||||
"batchSize" => 1000,
|
||||
"sanitize" => true
|
||||
@@ -182,7 +198,7 @@ try {
|
||||
$bot = new Bot(['token' => require('../settings/key.php')]);
|
||||
|
||||
$bot
|
||||
->onText('|btn-request-choose-*|s', function ($event) use ($bot, $botSender, $log) {
|
||||
->onText('|btn-request-choose-*|s', function ($event) use ($bot, $botSender) {
|
||||
global $arangodb;
|
||||
|
||||
$id = $event->getSender()->getId();
|
||||
@@ -200,6 +216,12 @@ try {
|
||||
// Запись о том, что задание подтверждено (в будущем здесь будет отправка на потдверждение модераторам)
|
||||
$work->confirmed = 'да';
|
||||
|
||||
// Запись о том, что необходимо перенести изменения в Google Sheets
|
||||
$work->transfer_to_sheets = 'да';
|
||||
|
||||
// Запись идентификатора Google Sheets нового сотрудника
|
||||
$work->worker = $worker->id;
|
||||
|
||||
if (document::update($arangodb->session, $work)) {
|
||||
// Записано обновление в базу данных
|
||||
|
||||
@@ -209,8 +231,7 @@ try {
|
||||
"FOR d IN readinesses FILTER d._id == '%s' RETURN d",
|
||||
document::write($arangodb->session, 'readinesses', ['_from' => $worker->getId(), '_to' => $work->getId()])
|
||||
)
|
||||
)
|
||||
) {
|
||||
)) {
|
||||
// Записано ребро: worker -> work (принятие заявки)
|
||||
|
||||
$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;
|
||||
|
||||
// Инициализация номера страницы
|
||||
preg_match('/btn-search-(\d+)/', $event->getMessage()->getText(), $matches);
|
||||
$page = $matches[1] ?? 1;
|
||||
|
||||
$id = $event->getSender()->getId();
|
||||
|
||||
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(
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
@@ -267,6 +300,26 @@ try {
|
||||
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) {
|
||||
// Перебор найденных заявок
|
||||
|
||||
@@ -279,31 +332,33 @@ try {
|
||||
)) instanceof _document) {
|
||||
// Найден магазин
|
||||
|
||||
// Генерация эмодзи
|
||||
/* $emoji = generateEmojis(); */
|
||||
|
||||
// Отправка сообщения с данной заявки
|
||||
$bot->getClient()->sendMessage(
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->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())
|
||||
->setBgColor(sprintf("#%02x%02x%02x", mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)))
|
||||
->setTextSize('small')
|
||||
->setTextSize('large')
|
||||
->setActionType('reply')
|
||||
->setActionBody("btn-request-choose-{$request->getKey()}")
|
||||
->setText("#{$request->getKey()}");
|
||||
}
|
||||
}
|
||||
|
||||
$bot->getClient()->sendMessage(
|
||||
(new Text())
|
||||
$bot->getClient()->sendMessage((new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setMinApiVersion(3)
|
||||
->setText("🔍 Выберите заявку")
|
||||
->setKeyboard((new Keyboard())->setButtons($keyboard ?? []))
|
||||
->setKeyboard((new Keyboard())->setButtons($keyboard))
|
||||
);
|
||||
} else if ($worker === null) {
|
||||
// Не подключен
|
||||
@@ -323,7 +378,7 @@ try {
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔️ **Вы не авторизованы**')
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
})
|
||||
@@ -358,7 +413,7 @@ try {
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔️ **Вы не авторизованы**')
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
})
|
||||
@@ -393,7 +448,7 @@ try {
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔️ **Вы не авторизованы**')
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
})
|
||||
@@ -428,16 +483,17 @@ try {
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔️ **Вы не авторизованы**')
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
})
|
||||
->on(function ($event) {
|
||||
return ($event instanceof Message && $event->getMessage() instanceof Contact);
|
||||
}, function ($event) use ($bot, $botSender, $log) {
|
||||
}, function ($event) use ($bot, $botSender) {
|
||||
$id = $event->getSender()->getId();
|
||||
|
||||
if (registration($id, $event->getMessage()->getPhoneNumber())) {
|
||||
// Зарегистрирован
|
||||
|
||||
$bot->getClient()->sendMessage(
|
||||
(new Text())
|
||||
@@ -463,9 +519,18 @@ try {
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔️ **Вы не авторизованы**')
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Не зарегистрирован
|
||||
|
||||
$bot->getClient()->sendMessage(
|
||||
(new Text())
|
||||
->setSender($botSender)
|
||||
->setReceiver($id)
|
||||
->setText('⛔ **Вы не авторизованы**')
|
||||
);
|
||||
}
|
||||
})
|
||||
->run();
|
||||
|
Reference in New Issue
Block a user