HEX
Server: Apache/2.4.59 (Debian)
System: Linux skycube.cz 4.19.0-25-amd64 #1 SMP Debian 4.19.289-2 (2023-08-08) x86_64
User: ilya (534)
PHP: 7.3.31-1~deb10u7
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
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'); // говорим телеге, что все окей

?>