@@ -25,96 +25,178 @@ use Google\Client,
require __DIR__ . '/../../../../../../../vendor/autoload.php' ;
/* ini_set( 'error_reporting', E_ALL);
ini_set( 'error_reporting', E_ALL );
ini_set ( 'display_errors' , 1 );
ini_set( 'display_startup_errors', 1); */
ini_set( 'display_startup_errors', 1 );
$config = new Config ();
$config -> setParseMode ( Config :: PARSE_MODE_MARKDOWN );
$bot = new Zanzara ( require ( __DIR__ . '/../settings/key.php' ), $config );
$timer ;
$member ;
$bot -> onMessage ( function ( Context $ctx ) {
if ( $members = $ctx -> getMessage () -> getNewChatMembers ()) {
// Новый аккаунт в чате
$ctx -> sendMessage ( ' ⚠️ Введите ваш табельный номер для авторизации' , [ 'reply_to_message_id' => $ctx -> getMessage () -> getMessageId ()])
-> then ( function () use ( $ctx , $members ) {
global $member ;
echo " Обнаружен новый участник в чате " . PHP_EOL ;
$ctx -> sendMessage ( " ⚠️ Введите ваш табельный номер" , [ 'reply_to_message_id' => $ctx -> getMessage () -> getMessageId ()])
-> then ( function ($message ) use ( $ctx , $members ) {
// Инициализация идентификатора сотрудника
$member = $ id = $members [ 0 ] -> getId ();
$id = $members [ 0 ] -> getId ();
global $timer ;
echo " Отправлено сообщение ( { $message -> getMessageId () } ) с запросом ID у сотрудника ( $id ) " . PHP_EOL ;
$timer = React\Promise\Timer\sleep ( 180 );
$ctx -> getGlobalDataItem ( " member_ { $id } _request " )
-> then (
function ( $old ) use ( $ctx , $id , $message ) {
// @todo Если сотрудник вышел из чата и снова зашёл, ответил правильно и е г о оставило, то всё равно забанит из-за прошлой сессии
$timer -> then (
function ($value ) use ( $ctx , $id ) {
// Изгнание из чата
$ctx -> kickChatMember ( $ctx -> getMessage () -> getChat () -> getId (), $id );
$timer = function ( $ctx , $id , $message ) {
$ctx -> setGlobalDataItem ( " member_ { $id } _request " , $message )
-> then ( function () use ( $ctx , $id , $message ) {
echo " Записано сообщение ( { $message -> getMessageId () } ) с запросом ID у сотрудника ( $id ) в сессионное хранилище " . PHP_EOL ;
$ctx -> wipeCache ();
// Инициализация таймера
React\Promise\Timer\sleep ( 180 ) -> then (
function () use ( $ctx , $id ) {
$ctx -> endConversation ();
},
function () {
}
);
$ctx -> getGlobalDataItem ( " member_ { $id } _request " )
-> then (
function ($message ) use ( $ctx , $id ) {
if ( $message ) {
// Изгнание из чата
$ctx -> kickChatMember ( $message -> getChat () -> getId (), $id )
-> then ( function () use ( $ctx , $id , $message ) {
echo " Сотрудник ( $id ) изгнан из чата ( { $message -> getChat () -> getId () } ) " . PHP_EOL ;
$ctx -> nextStep ( 'check' );
// Удаление сообщения из сессионного хранилища
$ctx -> deleteGlobalDataItem ( " member_ { $id } _request " );
echo " Удалено сообщение ( { $message -> getMessageId () } ?) (member_ { $id } _request) с запросом ID у сотрудника ( $id ) из сессионного хранилища " . PHP_EOL ;
// Удаление сообщения
$ctx -> deleteMessage ( $message -> getChat () -> getId (), $message -> getMessageId ());
echo " Удалено сообщение ( { $message -> getMessageId () } ) с запросом ID у сотрудника ( $id ) из чата ( { $message -> getChat () -> getId () } ) " . PHP_EOL ;
});
}
},
function () {
}
);
}
);
echo " Инициализирован таймер изгнания сотрудника ( $id ) " . PHP_EOL ;
});
};
if ( $old ) {
echo " Найдено сообщение ( { $old -> getMessageId () } ) с запросом ID у сотрудника ( $id ) в сессионном хранилище " . PHP_EOL ;
$ctx -> deleteGlobalDataItem ( " member_ { $id } _request " )
-> then ( function () use ( $ctx , $id , $message , $timer , $old ) {
echo " Удалено сообщение ( { $old -> getMessageId () } ?) (member_ { $id } _request) с запросом ID у сотрудника ( $id ) из сессионного хранилища " . PHP_EOL ;
$ctx -> deleteMessage ( $old -> getChat () -> getId (), $old -> getMessageId ())
-> then ( function () use ( $ctx , $id , $message , $timer , $old ) {
echo " Удалено сообщение ( { $old -> getMessageId () } ) с запросом ID у сотрудника ( $id ) из чата ( { $old -> getChat () -> getId () } ) " . PHP_EOL ;
$timer ( $ctx , $id , $message );
});
});
} else {
echo " Н е найдено сообщение с запросом ID у сотрудника ($id ) в сессионном хранилище " . PHP_EOL ;
$timer ( $ctx , $id , $message );
}
}
);
});
} else {
// Любое сообщение
// Инициализация сообщения
$message = $ctx -> getMessage ();
// Инициализация идентификатора отправителя сообщения
$id = $message -> getFrom () -> getId ();
$ctx -> getGlobalDataItem ( " member_ { $id } _request " )
-> then (
function ( $_message ) use ( $ctx , $id , $message ) {
if ( $_message ) {
// Инициализация переданного идентификатора (только цифры)
$worker = preg_replace ( '/[^\d]/' , '' , $message -> getText () ? ? '' );
$settings = json_decode ( require ( __DIR__ . '/../settings/workers/google.php' ), true );
$document = require ( __DIR__ . '/../settings/workers/document.php' );
$sheets = require ( __DIR__ . '/../settings/workers/sheets.php' );
$client = new Client ();
$client -> setScopes ( Sheets :: SPREADSHEETS );
$client -> setAuthConfig ( $settings );
$api = new Sheets ( $client );
foreach ( $sheets as $sheet ) {
$rows = ( new Flow ()) -> read ( new GoogleSheetExtractor ( $api , $document , new Columns ( $sheet , 'A' , 'A' ), true , 1000 ));
foreach ( $rows -> fetch ( 10000 ) as $row ) {
// Перебор строк
if ( $worker === $row -> toArray ()[ 'ID' ]) {
$ctx -> sendMessage ( " ✅ Авторизован сотрудник: $worker " , [ 'reply_to_message_id' => $message -> getMessageId ()])
-> then (
function ( $message ) use ( $ctx , $id ) {
// Инициализация таймера
React\Promise\Timer\sleep ( 10 ) -> then (
function () use ( $ctx , $id , $message ) {
// Удаление сообщения
$ctx -> deleteMessage ( $message -> getChat () -> getId (), $message -> getMessageId ());
echo " Удалено сообщение ( { $message -> getMessageId () } ) с подтверждением авторизации сотрудника ( $id ) в чате ( { $message -> getChat () -> getId () } ) " . PHP_EOL ;
},
function () {
}
);
}
);
echo " Авторизован сотрудник ( $id ) по идентификатору ( $worker ) " . PHP_EOL ;
// Удаление сообщения из сессионного хранилища
$ctx -> deleteGlobalDataItem ( " member_ { $id } _request " );
echo " Удалено сообщение ( { $_message -> getMessageId () } ) с запросом ID у сотрудника ( $id ) из сессионного хранилища после успешной авторизации " . PHP_EOL ;
// Удаление сообщения
$ctx -> deleteMessage ( $_message -> getChat () -> getId (), $_message -> getMessageId ());
echo " Удалено сообщение ( { $_message -> getMessageId () } ) с запросом ID у сотрудника ( $id ) из чата ( { $_message -> getChat () -> getId () } ) после успешной авторизации " . PHP_EOL ;
return ;
}
}
}
if ( ! empty ( $worker )) {
echo " Н е удалось авторизовать сотрудника ($id ) по номеру ( $worker ) " . PHP_EOL ;
$ctx -> sendMessage ( " ⛔ Н е найден сотрудник: $worker " , [ 'reply_to_message_id' => $message -> getMessageId ()])
-> then (
function ( $message ) use ( $ctx , $id ) {
// Инициализация таймера
React\Promise\Timer\sleep ( 10 ) -> then (
function () use ( $ctx , $id , $message ) {
// Удаление сообщения
$ctx -> deleteMessage ( $message -> getChat () -> getId (), $message -> getMessageId ());
echo " Удалено сообщение ( { $message -> getMessageId () } ) с провалом авторизации сотрудника ( $id ) в чате ( { $message -> getChat () -> getId () } ) " . PHP_EOL ;
},
function () {
}
);
}
);
}
}
}
);
}
});
function check ( Context $ctx )
{
global $member ;
if ( $member === $ctx -> getMessage () -> getFrom () -> getId ()) {
// Отправителем табельного номера является тот кто подключился к серверу
// Инициализация идентификатора (только цифры)
$id = preg_replace ( '/[^\d]/' , '' , $ctx -> getMessage () -> getText ());
$settings = json_decode ( require ( __DIR__ . '/../settings/workers/google.php' ), true );
$document = require ( __DIR__ . '/../settings/workers/document.php' );
$sheets = require ( __DIR__ . '/../settings/workers/sheets.php' );
$client = new Client ();
$client -> setScopes ( Sheets :: SPREADSHEETS );
$client -> setAuthConfig ( $settings );
$api = new Sheets ( $client );
foreach ( $sheets as $sheet ) {
$rows = ( new Flow ()) -> read ( new GoogleSheetExtractor ( $api , $document , new Columns ( $sheet , 'A' , 'A' ), true , 1000 ));
foreach ( $rows -> fetch ( 10000 ) as $row ) {
// Перебор строк
if ( $id === $row -> toArray ()[ 'ID' ]) {
$ctx -> sendMessage ( " ✅ Авторизован сотрудник: $id " );
global $timer ;
// Отмена блокировки
$timer -> cancel ();
$ctx -> endConversation ();
return ;
}
}
if ( ! empty ( $id )) $ctx -> sendMessage ( " ⛔ Н е найден сотрудник: $id " );
}
}
}
$bot -> run ();