@@ -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' => [
@@ -186,6 +228,7 @@ function generateMenu(Context $ctx): void
});
}
}
}
/**
* Прочитать заявки из ArangoDB
@@ -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 = [];
@@ -333,14 +443,22 @@ 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 ) {
// Найдена текущая страница
@@ -479,6 +597,7 @@ function search(Context $ctx): void
});
}
}
}
$config = new Config ();
$config -> setParseMode ( Config :: PARSE_MODE_MARKDOWN );
@@ -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 ));