подтверждение заявки
This commit is contained in:
parent
a1855a8d09
commit
8df2ce73c7
|
@ -23,6 +23,41 @@ $arangodb = new connection(require __DIR__ . '/../settings/arangodb.php');
|
|||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1); */
|
||||
|
||||
function escape(string $text)
|
||||
{
|
||||
return str_replace(
|
||||
[
|
||||
'#',
|
||||
'*',
|
||||
'_',
|
||||
'=',
|
||||
'.',
|
||||
'[',
|
||||
']',
|
||||
'(',
|
||||
')',
|
||||
'-',
|
||||
'>',
|
||||
'<'
|
||||
],
|
||||
[
|
||||
'\#',
|
||||
'\*',
|
||||
'\_',
|
||||
'\\=',
|
||||
'\.',
|
||||
'\[',
|
||||
'\]',
|
||||
'\(',
|
||||
'\)',
|
||||
'\-',
|
||||
'\>',
|
||||
'\<'
|
||||
],
|
||||
$text
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Авторизация
|
||||
*
|
||||
|
@ -79,7 +114,7 @@ function worker(string $id): _document|null|false
|
|||
LIMIT 1
|
||||
RETURN e
|
||||
)
|
||||
FILTER d._id == e[0]._to && d.active == true
|
||||
FILTER d._id == e[0]._to
|
||||
SORT d.created DESC, d._key DESC
|
||||
LIMIT 1
|
||||
RETURN d
|
||||
|
@ -172,6 +207,13 @@ function generateMenu(Context $ctx): void
|
|||
if ($account = authorization($ctx->getMessage()?->getFrom()?->getId() ?? $ctx->getCallbackQuery()->getFrom()->getId())) {
|
||||
// Успешная авторизация
|
||||
|
||||
if (!$account->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($account->banned) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if (!($worker = worker($account->getId()))->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($worker->fired) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else {
|
||||
// Активен аккаунт
|
||||
|
||||
$ctx->sendMessage('👋 Здравствуйте, ' . preg_replace('/([._\-()!#])/', '\\\$1', $account->name['first']), [
|
||||
'reply_markup' => [
|
||||
'inline_keyboard' => [
|
||||
|
@ -185,6 +227,7 @@ function generateMenu(Context $ctx): void
|
|||
$ctx->setChatDataItem("menu", $message);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -255,20 +298,55 @@ function requests_previous(Context $ctx): void
|
|||
}
|
||||
|
||||
function request_choose(Context $ctx): void
|
||||
{
|
||||
if (($account = authorization($ctx->getCallbackQuery()->getFrom()->getId())) instanceof _document) {
|
||||
// Авторизован
|
||||
|
||||
if (!$account->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($account->banned) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if (!($worker = worker($account->getId()))->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($worker->fired) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else {
|
||||
// Активен аккаунт
|
||||
|
||||
// Инициализация ключа инстанции task в базе данных
|
||||
preg_match('/\->\s#(\d+)\n/', $ctx->getCallbackQuery()->getMessage()->getText(), $matches);
|
||||
|
||||
// Запись ключа инстанции task (заявка на которую регистрируется сотрудник)
|
||||
$ctx->setChatDataItem("request_confirmation_target", $matches[1]);
|
||||
|
||||
// Запрос подтверждения
|
||||
$ctx->sendMessage("⚡ *Подтверждение записи*\n\n" . preg_replace('/(^[^:\s\n\r]+:)/m', '*$1*', preg_replace('/(\\\#\d+)/', '*$1*', escape($ctx->getCallbackQuery()->getMessage()->getText()))) . "\n\n*⚠️ Вы подтверждаете отправку запроса?*", [
|
||||
'reply_markup' => [
|
||||
'inline_keyboard' => [
|
||||
[
|
||||
['text' => 'Подтвердить', 'callback_data' => 'request_confirmed'],
|
||||
['text' => 'Отменить', 'callback_data' => 'request_rejected']
|
||||
]
|
||||
]
|
||||
]
|
||||
])->then(function ($message) use ($ctx) {
|
||||
// Запись сообщения в кеш (на случай необходимости его удаления)
|
||||
$ctx->setChatDataItem("request_confirmation", $message);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function request_confirmed(Context $ctx): void
|
||||
{
|
||||
global $arangodb;
|
||||
|
||||
if (($account = authorization($ctx->getCallbackQuery()->getFrom()->getId())) instanceof _document) {
|
||||
// Авторизован
|
||||
|
||||
// Инициализация ключа инстанции task в базе данных
|
||||
preg_match('/\->\s#(\d+)\n/', $ctx->getCallbackQuery()->getMessage()->getText(), $matches);
|
||||
$_key = $matches[1];
|
||||
$ctx->getChatDataItem("request_confirmation_target")->then(function ($_key) use ($ctx, $arangodb, $account) {
|
||||
// Прочитана запрашиваемая заявка
|
||||
|
||||
// Инициализация инстанции task в базе данных (выбранного задания)
|
||||
$task = collection::search($arangodb->session, sprintf("FOR d IN task FILTER d._key == '%s' && d.published == true && d.completed != true RETURN d", $_key));
|
||||
|
||||
if ($worker = worker($account->getId())) {
|
||||
if ($worker ??= worker($account->getId())) {
|
||||
// Найден сотрудник
|
||||
|
||||
// Запись идентификатора нового сотрудника
|
||||
|
@ -280,32 +358,64 @@ function request_choose(Context $ctx): void
|
|||
if (document::update($arangodb->session, $task)) {
|
||||
// Записано обновление в базу данных
|
||||
|
||||
$ctx->getChatDataItem("request_all")->then(function ($requests = []) use ($ctx, $_key) {
|
||||
$ctx->getChatDataItem("request_all")->then(function ($requests = []) use ($ctx) {
|
||||
// Удаление сообщений связанных с запросом
|
||||
foreach ($requests ?? [] as $_message) $ctx->deleteMessage($_message->getChat()->getId(), $_message->getMessageId());
|
||||
});
|
||||
$ctx->setChatDataItem("request_all", []);
|
||||
|
||||
$ctx->sendMessage("✅ *Заявка принята:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
$ctx->getChatDataItem("request_confirmation")->then(function ($message) use ($ctx) {
|
||||
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
|
||||
});
|
||||
$ctx->setChatDataItem("request_confirmation_target", null);
|
||||
|
||||
$ctx->sendMessage("✅ *Вы зарегистрировались на заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
|
||||
// End of the process
|
||||
$ctx->endConversation();
|
||||
} else $ctx->sendMessage("❎ *Не удалось принять заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
} else $ctx->sendMessage("❎ *Не удалось принять заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function request_rejected(Context $ctx): void
|
||||
{
|
||||
$ctx->getChatDataItem("request_confirmation_target")->then(function ($_key) use ($ctx) {
|
||||
// Прочитана запрашиваемая заявка
|
||||
|
||||
$ctx->getChatDataItem("request_confirmation")->then(function ($message) use ($ctx) {
|
||||
$ctx->deleteMessage($message->getChat()->getId(), $message->getMessageId());
|
||||
});
|
||||
$ctx->setChatDataItem("request_confirmation_target", null);
|
||||
|
||||
$ctx->sendMessage("✅ *Вы отменили регистрацию на заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
|
||||
// End of the process
|
||||
$ctx->endConversation();
|
||||
});
|
||||
} else $ctx->sendMessage("❎ *Не удалось принять заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
} else $ctx->sendMessage("❎ *Не удалось принять заявку:* \#$_key", ['reply_markup' => ['remove_keyboard' => true]])->then(function () use ($ctx) {
|
||||
generateMenu($ctx);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function day(Context $ctx): void
|
||||
{
|
||||
if (authorization($ctx->getMessage()?->getFrom()?->getId() ?? $ctx->getCallbackQuery()->getFrom()->getId()) instanceof _document) {
|
||||
if (($account = authorization($ctx->getMessage()?->getFrom()?->getId() ?? $ctx->getCallbackQuery()->getFrom()->getId())) instanceof _document) {
|
||||
// Авторизован
|
||||
|
||||
if (!$account->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($account->banned) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if (!($worker = worker($account->getId()))->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($worker->fired) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else {
|
||||
// Активен аккаунт
|
||||
|
||||
// Инициализация буфера клавиатуры
|
||||
$keyboard = [];
|
||||
|
||||
|
@ -332,15 +442,23 @@ function day(Context $ctx): void
|
|||
|
||||
$ctx->nextStep("search");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function search(Context $ctx): void
|
||||
{
|
||||
global $arangodb;
|
||||
|
||||
if (authorization($ctx->getMessage()?->getFrom()?->getId() ?? $ctx->getCallbackQuery()->getFrom()->getId()) instanceof _document) {
|
||||
if (($account = authorization($ctx->getMessage()?->getFrom()?->getId() ?? $ctx->getCallbackQuery()->getFrom()->getId())) instanceof _document) {
|
||||
// Авторизован
|
||||
|
||||
if (!$account->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($account->banned) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if (!($worker = worker($account->getId()))->active) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else if ($worker->fired) $ctx->sendMessage('⚠️ Свяжитесь с оператором');
|
||||
else {
|
||||
// Активен аккаунт
|
||||
|
||||
$ctx->getChatDataItem('requests_page')->then(function ($page) use ($ctx, $arangodb) {
|
||||
// Найдена текущая страница
|
||||
|
||||
|
@ -478,6 +596,7 @@ function search(Context $ctx): void
|
|||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$config = new Config();
|
||||
|
@ -540,6 +659,8 @@ $bot->onCommand('start', function (Context $ctx) use ($stop): void {
|
|||
$bot->onCbQueryData(['requests_next'], fn ($ctx) => requests_next($ctx));
|
||||
$bot->onCbQueryData(['requests_previous'], fn ($ctx) => requests_previous($ctx));
|
||||
$bot->onCbQueryData(['request_choose'], fn ($ctx) => request_choose($ctx));
|
||||
$bot->onCbQueryData(['request_confirmed'], fn ($ctx) => request_confirmed($ctx));
|
||||
$bot->onCbQueryData(['request_rejected'], fn ($ctx) => request_rejected($ctx));
|
||||
$bot->onCommand('day', fn ($ctx) => day($ctx));
|
||||
$bot->onCbQueryData(['day'], fn ($ctx) => day($ctx));
|
||||
|
||||
|
|
Reference in New Issue