@ -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 ( ' smal l')
-> 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 ();