File: /var/www/ilya/data/www/povoleni.ru/modules/services/telegrambot.php
<?php
function prepare_keyboard($keyboard,$add_menu = true) {
$max_row_length = 35;
$new_keyboard = array();
$i = 0;
$row_length = 0;
$total_row_length = 0;
foreach($keyboard as $button) {
$total_row_length += mb_strlen($button);
}
$text_per_row = ceil($total_row_length/ceil($total_row_length/$max_row_length));
foreach($keyboard as $button) {
if(($row_length+mb_strlen($button))>$text_per_row) {
$i++;
$row_length = 0;
}
$new_keyboard[$i][] = $button;
$row_length += mb_strlen($button);
}
if($add_menu)
$new_keyboard[][0] = 'Главное меню';
return $new_keyboard;
}
///////////////////////////////////////////////////////////////////////
$body = file_get_contents('php://input');
$arr = json_decode($body, true);
$tg = new tg(TELEGRAM_KEY);
/*if(isset($arr['callback_query'])) {
$tg_id = $arr['callback_query']['from']['id'];
$message_text = $arr['callback_query']['data'];
}
else {*/
$tg_id = $arr['message']['chat']['id'];
$message_text = $arr['message']['text'];
//}
$rez_kb = array();
//$tg->sendChatAction($tg_id);
$start_text = 'Бот проекта <b>Поволéни.ру</b> поддерживает ряд функций:'.PHP_EOL.PHP_EOL.'1. Подписка на визовые новости посольств и консульств ЧР.'.PHP_EOL.'2. Отслеживание состояния заявления, поданного в МВД ЧР.'.PHP_EOL.'3. Отслеживание состояния заявления, поданного в посольстве или консульстве ЧР'.PHP_EOL.PHP_EOL.'С предложениями, вопросами и сообщениями об ошибках обращайтесь к @rudomilov.';
$help_text = 'Управление подписками осуществляется с помощью клавиатуры на экране или данных команд:'.PHP_EOL.PHP_EOL.'/news - подписка на визовые новости посольств и консульств ЧР.'.PHP_EOL.'/oam - отслеживание состояния заявления, поданного в МВД на территории ЧР.'.PHP_EOL.'/visa - отслеживание состояния заявления, поданного в посольстве или консульстве ЧР'.PHP_EOL.'/list - управление подписками.'.PHP_EOL.'/help - справка.'.PHP_EOL.PHP_EOL.'С предложениями, вопросами и сообщениями об ошибках обращайтесь к @rudomilov.';
$response = '';
$input_list = array();
///////////////////
$result = query("SELECT * FROM `news_sources`;");
if(mysqli_num_rows($result)>0)
while($data = mysqli_fetch_array($result)) {
$input_list[] = $data['name'];
}
$result = query("SELECT * FROM `entries` WHERE `telegram_id`='".$tg_id."';");
if(mysqli_num_rows($result)>0)
while($data = mysqli_fetch_array($result)) {
if($data['zov']!='') {
$input_list[] = $data['zov'];
}
else {
$input_list[] = "OAM-".$data['code']."/".$data['type']."-".$data['year'];
}
}
foreach ($input_list as $input_item) {
if($input_item==$message_text) {
$result = query("SELECT * FROM `telegrambot_log` WHERE `telegram_id`='".$tg_id."' ORDER BY `id` DESC LIMIT 1;");
if(mysqli_num_rows($result)>0)
while($data = mysqli_fetch_array($result)) {
$message_text = $data['message'].' '.$input_item;
}
}
}
//////////////////////////
if(($message_text=='/start') || ($message_text=='Главное меню')) {
$response = $start_text;
$rez_kb = ['Отслеживать заявление','Отслеживать новости посольства','Мои подписки','Помощь'];
$rez_kb = prepare_keyboard($rez_kb,false);
}
elseif($message_text=='Отслеживать заявление') {
$response = '<b>С 1.7.2023 в силу обновления сайта МВД автоматическое отслеживание не работает надежно, приоритетно проверяйте состояние вручную на https://frs.gov.cz/informace-o-stavu-rizeni/</b>'.PHP_EOL.PHP_EOL.'Но все же подписаться можно и мы будем отслеживать сообщение, как только сможем. Где вы подавали заявление?';
$rez_kb = ['В посольстве ЧР','В МВД на территории ЧР'];
$rez_kb = prepare_keyboard($rez_kb,true);
}
elseif(($message_text=='/help') || ($message_text=='Помощь')) {
$response = $help_text;
$rez_kb = ['Отслеживать заявление','Отслеживать новости посольства','Мои подписки','Помощь'];
$rez_kb = prepare_keyboard($rez_kb,false);
}
elseif((strpos($message_text,'/oam')===0) || ($message_text=='В МВД на территории ЧР')) {
$oam_text = '<b>С 1.7.2023 в силу обновления сайта МВД автоматическое отслеживание не работает надежно, приоритетно проверяйте состояние вручную на https://frs.gov.cz/informace-o-stavu-rizeni/</b>'.PHP_EOL.PHP_EOL.'Для подписки на автоматическое отслеживание заявления, поданного в МВД ЧР на ВНЖ или ПМЖ используйте номер дела из подтверждения, которое вы получили после подачи документов. Например, OAM-12345-3/DP-2020.'.PHP_EOL.PHP_EOL.'Для отслеживания отправьте сообщение вида:'.PHP_EOL.PHP_EOL.'<b>/oam 12345-6/CC-YYYY</b> или <b>/oam 12345/CC-YYYY</b>'.PHP_EOL.PHP_EOL.'<b>12345</b> - номер дела (до 7 цифр);'.PHP_EOL.'<b>6</b> - порядковый номер документа в деле (до 2 цифр, не обязателен);'.PHP_EOL.'<b>CC</b> - тип разрешения на пребывание (DP, PP, TP и др.);'.PHP_EOL.'<b>YYYY</b> - год подачи заявления.';
if(strpos($message_text,' ')) {
$data = str_replace('/oam ','',$message_text);
$data = str_replace(array("\r", "\n"), '', $data);
$data = explode('/',$data);
if(sizeof($data)==2) {
$code = $data[0];
$data = explode('-',$data[1]);
if(sizeof($data)==2) {
$type = $data[0];
$year = $data[1];
if((strlen($code)>1) && (strlen($type)==2) && (strlen($year)==4) && is_numeric($year) && (substr_count($code,'-')<=1) && is_numeric(str_replace('-','',$code))) {
if($year+1<date("Y"))
$response = 'Поддерживается отслеживание заявлений, поданных только последние 2 года.';
elseif(!in_array($type,$global_vars['visa_types']))
$response = 'К сожалению, отслеживание данного типа заявлений не поддерживается.';
else {
query("INSERT INTO `entries` (`telegram_id`,`code`,`type`,`year`,`status`,`added`,`language`) VALUES ('".$tg_id."','".$code."','".$type."','".$year."',2,NOW(),'ru');");
$response = 'Вы успешно подписаны на отслеживание состояния заявления <b>OAM-'.$code.'/'.$type.'-'.$year.'</b>. Как только по нему будет принято решение - мы вам сообщим.';
}
}
}
}
}
if($response=='') {
$response = $oam_text;
if(strpos($message_text,' ') && ($message_text!='В МВД на территории ЧР'))
$response = 'Команда не распознана. '.$oam_text;
}
$rez_kb = array('Мои подписки');
$rez_kb = prepare_keyboard($rez_kb);
}
elseif((strpos($message_text,'/visa')===0 ) || ($message_text=='В посольстве ЧР')) {
$visa_text = '<b>С 1.7.2023 в силу обновления сайта МВД автоматическое отслеживание не работает надежно, приоритетно проверяйте состояние вручную на https://frs.gov.cz/informace-o-stavu-rizeni/</b>'.PHP_EOL.PHP_EOL.'Для подписки на отслеживание заявления на долгосрочную визу, ВНЖ, ПМЖ или трудовую карту, поданного в посольстве или консульстве используйте номер из квитанции, которую вы получили после подачи документов. Например, MOSC202012100010.'.PHP_EOL.PHP_EOL.'Для отслеживания отправьте сообщение вида:'.PHP_EOL.PHP_EOL.'<b>/visa XXXXYYYYYYYYYYYY</b>'.PHP_EOL.PHP_EOL.'<b>XXXX</b> - буквенный код дип. представительства (например, MOSC для посольства в Москве);'.PHP_EOL.'<b>YYYYYYYY</b> - следующий за ним 12-значный цифровой номер заявления (например, 202012100010).';
if(strpos($message_text,' ')) {
$zov = str_replace('/visa ','',$message_text);
if((strlen($zov)==16) && is_numeric(substr($zov,4)) && !strpos($zov,' ')) {
query("INSERT INTO `entries` (`telegram_id`,`zov`,`status`,`added`,`language`) VALUES ('".$tg_id."','".$zov."',2,NOW(),'ru');");
$response = 'Вы успешно подписаны на отслеживание состояния заявления <b>'.$zov.'</b>. Как только по нему будет принято решение - мы вам сообщим.';
}
else
$response = 'Команда не распознана. '.$visa_text;
}
if(($response=='') || ($message_text=='В посольстве ЧР'))
$response = $visa_text;
$rez_kb = prepare_keyboard($rez_kb);
}
elseif((strpos($message_text,'/list')===0) || $message_text=='Мои подписки') {
$result = query("SELECT `s`.`id` AS `id`, `n`.`name` AS `name`, `n`.`name_where` AS `name_where`, `n`.`id` AS `news_id` FROM `news_subscriptions` `s` lEFT JOIN `news_sources` `n` ON `s`.`news_source_id`=`n`.`id` WHERE `telegram_id`='".$tg_id."' ORDER BY `n`.`id`;");
if(mysqli_num_rows($result)>0) {
while($data=mysqli_fetch_array($result)) {
$rez_kb[] = $data['name'];
}
}
$result = query("SELECT * FROM `entries` WHERE `telegram_id`='".$tg_id."' AND `status`=2 ORDER BY `id`;");
if(mysqli_num_rows($result)>0) {
while($data=mysqli_fetch_array($result)) {
if($data['zov']!='') {
$rez_kb[] = $data['zov'];
}
else {
$rez_kb[] = "OAM-".$data['code']."/".$data['type']."-".$data['year'];
}
}
}
if(sizeof($rez_kb)==0)
$response = 'У вас пока нет ни одной подписки на новости посольств или отслеживание статуса заявлений.';
else {
$response = 'Ниже приведены ваши текущие подписки. Какую из подписок вы хотели бы удалить?';
$rez_kb = prepare_keyboard($rez_kb);
query("INSERT INTO `telegrambot_log` (`telegram_id`, `datetime`, `message`) VALUES ('".$tg_id."', NOW(), '/remove');");
}
}
elseif((strpos($message_text,'/news')===0) || ($message_text=='Отслеживать новости посольства')) {
$news_text = 'Выберите, визовые новости какого посольства или консульства вы хотите отслеживать. В списке не указаны города, на которые вы уже подписаны.'.PHP_EOL.PHP_EOL.'Не нашли нужного вам города? Напишите нам на @rudomilov и мы его добавим.';
$subscriptions = array();
$result = query("SELECT * FROM `news_subscriptions` WHERE `telegram_id`='".$tg_id."';");
if(mysqli_num_rows($result)>0)
while($data = mysqli_fetch_array($result)) {
$subscriptions[] = $data['news_source_id'];
}
$result = query('SELECT * FROM `news_sources` ORDER BY `id`;');
if(mysqli_num_rows($result)>0) {
while($data=mysqli_fetch_array($result)) {
if(!in_array($data['id'],$subscriptions))
$rez_kb[] = $data['name'];
if($message_text=='/news '.$data['name']) {
$result2 = query('SELECT * FROM `news_subscriptions` WHERE `news_source_id`="'.$data['id'].'" AND `telegram_id`="'.$tg_id.'";');
if(mysqli_num_rows($result2)==0) {
query('INSERT INTO `news_subscriptions` (`news_source_id`,`telegram_id`,`added`) VALUES ("'.$data['id'].'","'.$tg_id.'",NOW())');
$response = 'Вы были успешно подписаны на визовые новости '.$data['name_where'].'.';
}
else
$response = 'Вы уже были подписаны на новости '.$data['name_where'].', поэтому команда была проигнорирована.';
$rez_kb = [];
}
}
if(($response=='') && ($message_text!='/news') && ($message_text!='Отслеживать новости посольства')) {
$response = 'Команда не была распознана. '.$news_text;
}
elseif($response=='') {
$response = $news_text;
query("INSERT INTO `telegrambot_log` (`telegram_id`, `datetime`, `message`) VALUES ('".$tg_id."', NOW(), '/news');");
}
}
else
$response = "Не найден ни один источник новостей, обратитесь к нам на @rudomilov.";
$rez_kb[] = 'Мои подписки';
$rez_kb = prepare_keyboard($rez_kb);
}
elseif(strpos($message_text,'/remove')===0) {
$result = query("SELECT `s`.`id` AS `id`, `n`.`name` AS `name`, `n`.`name_where` AS `name_where`, `n`.`id` AS `news_id` FROM `news_subscriptions` `s` lEFT JOIN `news_sources` `n` ON `s`.`news_source_id`=`n`.`id` WHERE `telegram_id`='".$tg_id."' ORDER BY `n`.`id`;");
$list = array();
if(mysqli_num_rows($result)>0) {
while($data=mysqli_fetch_array($result)) {
$list[] = $data['name'];
if($message_text=='/remove '.$data['name']) {
query("DELETE FROM `news_subscriptions` WHERE `id`='".$data['id']."';");
$response = 'Вы успешно отписаны от визовых новостей '.$data['name_where'].'.';
$rez_kb = ['Мои подписки'];
$rez_kb = prepare_keyboard($rez_kb);
}
}
}
$result = query("SELECT * FROM `entries` WHERE `telegram_id`='".$tg_id."' AND `status`=2 ORDER BY `id`;");
if(mysqli_num_rows($result)>0) {
while($data=mysqli_fetch_array($result)) {
if($data['zov']!='') {
$list[] = $data['zov'];
if($message_text=='/remove '.$data['zov']) {
query("DELETE FROM `entries` WHERE `id`='".$data['id']."';");
$response = 'Вы успешно отписаны от отслеживания статуса заявления <b>'.$data['zov'].'</b>.';
$rez_kb = ['Мои подписки'];
$rez_kb = prepare_keyboard($rez_kb);
}
}
else {
$list[] = "OAM-".$data['code']."/".$data['type']."-".$data['year'];
if($message_text=='/remove OAM-'.$data['code'].'/'.$data['type'].'-'.$data['year']) {
query("DELETE FROM `entries` WHERE `id`='".$data['id']."';");
$response = 'Вы успешно отписаны от отслеживания статуса заявления <b>OAM-'.$data['code'].'/'.$data['type'].'-'.$data['year'].'</b>.';
$rez_kb = ['Мои подписки'];
$rez_kb = prepare_keyboard($rez_kb);
}
}
}
}
if(sizeof($list)==0)
$response = 'У вас пока нет ни одной подписки на новости посольств или отслеживание статуса заявлений.';
if($response=='' && $message_text!='/remove') {
$response = 'Команда не распознана. Для удаления ваших подписок вы можете использовать данные команды:'.PHP_EOL;
foreach($list as $item) {
$response .= PHP_EOL.'/remove '.$item;
}
}
elseif($response=='') {
$response = 'Для удаления ваших подписок вы можете использовать данные команды:'.PHP_EOL;
foreach($list as $item) {
$response .= PHP_EOL.'/remove '.$item;
}
}
}
else
$response = 'Команда не распознана.'.PHP_EOL.PHP_EOL.$help_text;
$tg->send($tg_id, $response, $rez_kb);
exit('ok'); // говорим телеге, что все окей
?>