View file engine/classes/engine.class.php

File size: 24.23Kb
<?php
 /**
  * Основной класс для работы с SHCMS Engine
  * Все обязательные параметры находятся тут
  * 
  * @package Classes
  * @author Shamsik
  * @link http://shcms.ru
  */
class engine {

     /**
      * Проверка версии PHP 
      * 
      */
    public static function php_version() {
        version_compare(PHP_VERSION, '5.2', '>=') or die('Для запуска движка испольуйте версию PHP 5.1 и выше');
    }

    /**
     * Фильтруем строки 
     * 
     * @param type $list
     * @return type
     */
    public static function inspect($list) {
	if (function_exists('iconv')) {
            $list = iconv("UTF-8", "UTF-8", $list);
        }
            $list= preg_replace('/[^\P{C}\n]+/u', '', $list);
        
        return trim($list);
    }
	
    /**
     * Получаем ICQ 
     * 
     * @param $icq
     */
    public static function icq($icq) {
	    if (preg_match('#[0-9]{5,9}#', $icq, $str)) {
            return $str[0];
        } else {
            return NULL;
        }
    }
	
    /**
     * Кодировка файлов
     * @param $fng
     * @return mb_convert_encoding()
     */
    public static function file_get_contents_utf8($fn) { 
     $content = file_get_contents($fn); 
	 
      return mb_convert_encoding($content, 'UTF-8', 
          mb_detect_encoding($content, 'UTF-8, Windows-1251', true)); 
    } 
	
	
    public static function admin($number) {
	
	if($number != 15) {
	    $admin = engine::error('У вас нет прав администратора!');
	    exit;
	}
		
	return $admin;
    }
    /**
     * Выделение найденной части
     * 
     * @param $search
     * @param $text
     */
    public static function search_text($search, $txt) {
        $r = preg_split( '((>)|(<))', $txt, - 1, PREG_SPLIT_DELIM_CAPTURE );
            for($i = 0; $i < count( $r ); $i ++) {
                if( $r[$i] == "<" ) {
                    $i ++;
                    continue;
                }
                    $r[$i] = preg_replace( "#($search)#i", "<span style='background-color:yellow;'><font color='red'>\\1</font></span>", $r[$i] );
            }
        return join( "", $r );
    }
	
    /**
     * Статусы для пользователей
     * 
     * @param $currentPoints
     */	
    public static function getStatus($currentPoints){
 
        $statuses = array(
                   70 => 'Чаттер',    
                   40 => 'Активный',
                   10 => 'Писанин',
                   1 => 'Обычный',);
 
 
            foreach($statuses as $value=>$status){
                if($currentPoints>=$value){
                    return $status;
                }
            }
 
        return array_pop($statuses);
    }
	
    /**
     * Удаляем ссылки при добавлении
     * 
     * @param $str
     */	
    public static function removing($str) {
            
        $remov = $str;
        $remov = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', '', $remov);
        
	return $remov;
    }
	
    /**
     * Умная обрезка строки
     * 
     * @param string $str - исходная строка
     * @param int $lenght - желаемая длина результирующей строки
     * @param string $end - завершение длинной строки
     * @param string $charset - кодировка
     * @param string $token - символ усечения
     * @return string - обрезанная строка
     * 
     */	
    public static function substr($str, $lenght = 100, $end = '...', $charset = 'UTF-8', $token = '~') {
   		
	$str = strip_tags($str);
    	if (mb_strlen($str, $charset) >= $lenght) {
            $wrap = wordwrap($str, $lenght, $token);
            $str_cut = mb_substr($wrap, 0, mb_strpos($wrap, $token, 0, $charset), $charset);    
        	return $str_cut .= $end;
    		
	} else {
        	return $str;
    	}
    } 
	
    /**
     * Я хотел построить на том, что капут и колючий способствовали таким образом,
     * что я думаю, что это немного более понятным 
     * (например, пусть Sprintf делать всю двоичный преобразования и отступы,
     *  и пусть substr_compare сделать обрезку и сравнения):
     * 
     * @param $ip = Адрес
     * @param $net_addr = Действующий адрес
     * @param $net_mask = Маска
     */	
    public static function ip_in_network($ip, $net_addr, $net_mask){ 
        if($net_mask <= 0){ return false; } 
            $ip_binary_string = sprintf("%032b",ip2long($ip)); 
            $net_binary_string = sprintf("%032b",ip2long($net_addr)); 
        return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0); 
    } 
	
    /**
     * Включаем антиреклму
     * 
     * @param $str = Ссылка
     */
    public static function antilink($str){
        $str = preg_replace('~\\[url=(https?://.+?)\\](.+?)\\[/url\\]|(https?://(www.)?[0-9a-z\.-]+\.[0-9a-z]{2,6}[0-9a-zA-Z/\?\.\~&amp;_=/%-:#]*)~', '[b]Ссылки запрещены[/b]', $str);
        $replace = array(
            '.ru' => '**',
            '.com' => '***',
            '.biz' => '***',
            '.cn' => '***',
            '.in' => '**',
            '.net' => '***',
            '.org' => '***',
            '.info' => '***',
            '.mobi' => '***',
            '.wen' => '***'
        );
        return strtr($str, $replace);
    }	
	
    /**
     * Функция проверки существования и доступности другой функции PHP
     * 
     * @param $function - строка имени функции
     * 
     */
    public static function function_enabled($function) {
        $function = strtolower(trim($function));
            if ($function == '') return false;
                // Получить список функций, отключенных в php.ini
                $disabled = explode(",",@ini_get("disable_functions"));
                    if (empty($disabled)) {
                        $disabled = array();
                }
            else {
                // Убрать пробелы и привести названия к нижнему регистру
                    $disabled = array_map('trim',array_map('strtolower',$disabled));
            }
        // Проверить доступность функции разными способами
        return (function_exists($function) && is_callable($function) &&
                !in_array($function,$disabled));
    }	
	
    /**
     * Используйте регулярные выражения для извлечения URL-адреса от произвольного содержания
     * 
     * @param string $content
     * @return array URL-адреса находятся в переданной строке
     */
    public static function xtract_urls( $content ) {
	preg_match_all("#((?:[\w-]+://?|[\w\d]+[.])[^\s()<>]+[.](?:\([\w\d]+\)|(?:[^`!()\[\]{};:'\".,<>?«»“”‘’\s]|(?:[:]\d+)?/?)+))#",
		$content,
		$post_links
	);
	$post_links = array_unique( array_map( 'html_entity_decode', $post_links[0] ) );

	return array_values( $post_links );
    }
	
    /**
     * Проверяем на существенность параметра $id
     * 
     * @param $id = Проверка на true
     */
    public static function nullid( $id ) {
	    if( empty( $id ) ) 
		{
		    $param  = engine::error(Lang::__('У вас отсутствуют важный параметр'),'<a href="">'.Lang::__('Назад').'</a>');	
			exit;
		} 
		
		return $param;
	
    }
	
	
    /**
     * Сгенерированный пароли для пользователей
     * 
     * @param $string
     * @param $options = array()
     */	
    public static function shgen($string,$options=array(
	    array('size' => 5, 'position' => 8 ),
	    array('size' => 6, 'position' => 0 ),
	    array('size' => 5, 'position' => 30 ),
	    array('size' => -1, 'position' => 20 ),
        ))
	{
	    $sha1 = sha1($string);
	    $md5 = md5($string);
	    $chunks = array();
	        foreach($options as $item){
		        if($item['size']==-1) $chunk=$md5;
		            else {
			            $chunk = substr($md5,0,$item['size']);
			            $md5 = substr_replace($md5,'',0,$item['size']);
		            }
		        $chunks[$item['position']]=$chunk;
	        }
	    $keys = array_keys($chunks);
	    sort($keys);
	    $delta = 0;
	        foreach($keys as $key){
		        $sha1 = substr($sha1,0,$key+$delta).$chunks[$key].substr($sha1,$key+$delta);
		         $delta+=strlen($chunks[$key]);
	        }
	    return sha1($sha1);
    }
    /**
     * Функция для удаление пробелов
     * 
     * @param $str = Источник 
     * @param $charlist = Список символов, которые будут обрезаны от источника
     * Стандартный метод trim() не работал пришлось написать самому
     */	
    public static function trim($str, $charlist = '') {
        $result = '';
        /* список запрещенных символов для подрезки */
        $forbidden_list = array(" ", "\t", "\r", "\n", "\0", "\x0B");
        
        if (empty($charlist)) {
            for ($i = 0; $i < strlen($str); $i++) {
                if (($str[$i] != $forbidden_list[0]) &&
                    ($str[$i] != $forbidden_list[1]) &&
                    ($str[$i] != $forbidden_list[2]) &&
                    ($str[$i] != $forbidden_list[3]) &&
                    ($str[$i] != $forbidden_list[4]) &&
                    ($str[$i] != $forbidden_list[5])) {
                    $result .= $str[$i];
                }
            }
        }
        else if (!empty($charlist)) {
            $is_not_same = true;
            
            for ($i = 0; $i < strlen($str); $i++) {
                for ($j = 0; $j < strlen($charlist); $j++) {
                    if ($str[$i] != $charlist[$j]) {
                        $is_not_same = true;
                    }
                    else if ($str[$i] == $charlist[$j]) {
                        $is_not_same = false;
                        break;
                    }
                }
                
                if ($is_not_same == true) {
                    $result .= $str[$i];
                }
            }
        }
        
        return ($result);
    }
    /**
     * Определение расположения по IP
     * 
     * @param $id в качестве параметра, и возвращает данные о расположении.
     * Если локация не будет обнаружена, то в ответ будет получен параметр unknown. 
     */
    public static function detect_city($ip) {

        $default = 'UNKNOWN';

        if (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost')
            $ip = '8.8.8.8';

        $curlopt_useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)';

        $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
        $ch = curl_init();

        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION  => 1,
            CURLOPT_HEADER      => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_USERAGENT   => $curlopt_useragent,
            CURLOPT_URL       => $url,
            CURLOPT_TIMEOUT         => 1,
            CURLOPT_REFERER         => 'http://' . $_SERVER['HTTP_HOST'],
        );

        curl_setopt_array($ch, $curl_opt);

        $content = curl_exec($ch);

        if (!is_null($curl_info)) {
            $curl_info = curl_getinfo($ch);
        }

        curl_close($ch);

        if ( preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs) )  {
            $city = $regs[1];
        }
        if ( preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs) )  {
            $state = $regs[1];
        }

        if( $city!='' && $state!='' ){
          $location = $city . ', ' . $state;
          return $location;
        }else{
          return $default;
        }

    }  

    /**
     * Функция для скрытия некоторых символов в email
     * 
     * @param $text = Адрес почты
     */	
    public static function email_block($text) {
	$mail = $text;

	preg_match("/^(.*)(@.*)+/", $mail, $res);
		$mail = $res[1][0];
		for ($i = 1; $i < strlen($res[1]); $i++) {
        		$mail .= "*";
		}
		$mail .= $res[2];
	
        return $mail;
    }

    /**
     * Возвращает длину строки
     * 
     * @param $values = Текст
     * @param $charset = Кодировка
     */
    public static function strlen_shcms($values, $charset = 'utf-8' ) {

        if ( strtolower($charset) == "utf-8") return iconv_strlen($values, "utf-8");
	        else return strlen($values);

    }
 
    /**
     *  Возвращает подстроку
     * 
     * @param $list = Текст
     * @param $start = Начало
     * @param $length = Номер
     * @param $charset = Кодировка
     */
    public static function substr_shcms($list, $start, $length, $charset = 'utf-8') {

	    if ( strtolower($charset) == "utf-8") return iconv_substr($list, $start, $length, "utf-8");
	        else return substr($list, $start, $length);

    }
	
	
    /**
     * Проверка на точное использование ника
     * 
     * @param $nick = Ник пользователя
     */	
    public static function nick($nick) {
        // проверка на длину логина и возможные символы
        if (!preg_match("#^[a-zа-яё][a-zа-яё0-9\-\_\ ]{2,31}$#ui", $nick)) {
            return false;
        }
        // запрещаем одновременное использование русского и английского алфавилов
        if (preg_match("#[a-z]+#ui", $nick) && preg_match("#[а-яё]+#ui", $nick)) {
            return false;
        }
        // пробелы вначале или конце ника недопустимы
        if (preg_match("#(^\ )|(\ $)#ui", $nick)) {
            return false;
        }
        return true;
    }
 	
    /**
     * Проверяем на правильность логина в скайпе
     * 
     * @param $skype = Логин скайпа
     */	
    public static function skype($skype) {
        if (preg_match("#^[a-z][a-z0-9_\-\.]{5,31}$#ui", $skype))
            return true;
    }
	

    /**
     * Для удачных случаев
     * 
     * @param $msg = Основная описание
     * @param @mess = Дополнительный текст
     */
    public static function success($msg,$mess = false) {
        if(!empty($msg)) {
	    $message  = '<div class="success alert alert-success"><img src="/engine/template/icons/success.png">&nbsp;';
            $message .= '<button type="button" class="close" data-dismiss="alert">&times;</button>'.$msg.'</div>';
		if($mess == true) {
	            $message .= '<div class="success">'.$mess.'</div>';
		}
	    echo $message;
	}else {
            echo '<div class="error">Неизвестная ошибка</div>';		
	}
    }

    /**
     * Для неудачных случаев
     * 
     * @param = $error = Основной текст
     * @param = $err = Дополнительный текст
     */
    public static function error($error,$err = false) {
	if(!empty($error)) {
	    $errno = '<div class="error alert alert-error"><img src="/engine/template/icons/error.png">&nbsp;';
            $errno .= '<button type="button" class="close" data-dismiss="alert">&times;</button>'.$error.'</div>';
		if($err == true) {
		    $errno .= '<div class="error">'.$err.'</div>';
		}
	    echo $errno;
	}else {
	    echo '<div class="error">Неизвестная ошибка</div>';		
	}
    }
	
    /**
     * ucfirst UTF-8 известная функция
     * 
     * @param string $string 
     * @return string 
    */ 
    public static function ucfirst($string, $e ='utf-8') { 
        if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) { 
            $string = mb_strtolower($string, $e); 
            $upper = mb_strtoupper($string, $e); 
            preg_match('#(.)#us', $upper, $matches); 
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e); 
        } else { 
            $string = ucfirst($string); 
        } 
        return $string; 
    } 

    /**
     * Переадресации на другие страницы
     * 
     * @param $link = Cсылки
     */
    public static function home($link){
        foreach ($link as $v1) {
            
            return '<ul class="pager"><li class="previous">
                    <a href="'.$link[1].'">&larr; '.$link[0].'</a></li></ul>';
        }
        
    }
	
	
    /**
     * Определение размера файлов
     * 
     * @param $bt = Номеровый
     */
    public static function filesize($bt) {
            $s = array('B', 'Kb', 'MB', 'GB', 'TB', 'PB');
            $e = floor(log($bt)/log(1024));
			
        return sprintf('%.2f '.$s[$e], ($bt/pow(1024, floor($e))));
    }
	
    /**
     * Функция Оброботка текста  (0 - 999)
     * 
     * @param $name
     */		
    public static function format($name) {
        $f1 = strrpos($name, ".");
        $f2 = substr($name, $f1 + 1, 999);
        $fname = strtolower($f2);
        return $fname;
    }
	
    /**
     * Функция Оброботка текста  (999 - -4)
     * 
     * @param $name
     */	
    public static function format_r($name) {
        $f1 = strrpos($name, ".");
        $f2 = substr($name, $f1 - 999, -4);
        $fname = strtolower($f2);
    return $fname;
    }
	
    /**
     * Выводит данные по пользователю
     * 
     * @param $user1 = $id_user
     */
    public static function user($user1) {
	global $user;
		$nick = $user->users($user1,array('nick'));
		$id = $user->users($user1,array('id'));
				
	return '<a href="'.MODULE.'profile.php?act=view&id='.$id.'">'.$nick.'</a>';
    }
	
    /**
     * Функция для обработки текстов и смайликов
     * 
     * @param $str = Текст
     */
    public static function input_text($str) {
        // обработка входящего текста
        $str = (string) $str;
		
		$pak = file(H.'engine/template/smilies/smiles.pak');
        $smiles = array();
            foreach ( $pak as $val ) {
                $val = trim($val);
                    if (! $val || '#' == $val{0}) { continue; }
                        list($gif,$alt,$symbol) = explode('=+:',$val);
                        $smiles[$symbol] = '<img src="/engine/template/smilies/'.htmlspecialchars($gif).'" alt="'.htmlspecialchars($alt).'" />';
            }
        $inputbbcode = new bbcode($str);
		// Задаем набор смайликов
        $str = $inputbbcode -> mnemonics = $smiles;
        $str = $inputbbcode->get_html();
		
		$str = preg_replace('#\[user=([^\]]+)\]#ies', 'engine::user("\\1")', $str);
        return $str;
    }
	

    /**
     * Функция для генерации случайной строки
     * 
     * @param $length = Число 
     */
    public static function generate($length=6) {

        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789";
        $code = "";
        $clen = strlen($chars) - 1;  
            while (strlen($code) < $length) {
                $code .= $chars[mt_rand(0,$clen)];  
            }
        return $code;
    }

    /**
     * Функция обрабатывает числовые данные
     * 
     * @param $num = Счетчик обработки
     */
    public static function number($num) {
		$number = $num;
	    return number_format($number, 0, '', ' '); // 1 500 000
    }
	
    /**
     * Транслит данных
     * 
     * @param = $var
     * @param = $lower
     * @param = $punkt
     */
    public static function totranslit($var, $lower = true, $punkt = true) {
	global $langtranslit;
	
	if ( is_array($var) ) return "";

	$var = str_replace(chr(0), '', $var);

	if (!is_array ( $langtranslit ) OR !count( $langtranslit ) ) {
		$var = trim( strip_tags( $var ) );

		if ( $punkt ) $var = preg_replace( "/[^a-z0-9\_\-.]+/mi", "", $var );
		else $var = preg_replace( "/[^a-z0-9\_\-]+/mi", "", $var );

		$var = preg_replace( '#[.]+#i', '.', $var );
		$var = str_ireplace( ".php", ".ppp", $var );

		if ( $lower ) $var = strtolower( $var );

		return $var;

	}
	
	$var = trim( strip_tags( $var ) );
	$var = preg_replace( "/\s+/ms", "-", $var );
	$var = str_replace( "/", "-", $var );

	$var = strtr($var, $langtranslit);
	
	if ( $punkt ) $var = preg_replace( "/[^a-z0-9\_\-.]+/mi", "", $var );
	else $var = preg_replace( "/[^a-z0-9\_\-]+/mi", "", $var );

	$var = preg_replace( '#[\-]+#i', '-', $var );
	$var = preg_replace( '#[.]+#i', '.', $var );

	if ( $lower ) $var = strtolower( $var );

	$var = str_ireplace( ".php", "", $var );
	$var = str_ireplace( ".php", ".ppp", $var );
	
	if( strlen( $var ) > 200 ) {
		
		$var = substr( $var, 0, 200 );
		
		if( ($temp_max = strrpos( $var, '-' )) ) $var = substr( $var, 0, $temp_max );
	
	}
	
	return $var;
}

    /**
     * Обработка названии 
     * 
     * @param = $name
     * @string = Функция устарела
     */
    public static function proc_name($name) {
            return trim(preg_replace('#[^\pL0-9\=\?\!\@\\\%/\#\$^\*\(\)\-_\+ ,\.:;]+#ui', '', $name));
    }

    /**
     * Возвращает реальный ip пользователя
     * 
     * @return string
     */
    public static function get_ip(){

        if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            return $_SERVER["HTTP_CLIENT_IP"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            return $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED"])) {
            return $_SERVER["HTTP_X_FORWARDED"];
        } elseif (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
            return $_SERVER["HTTP_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_FORWARDED"])) {
            return $_SERVER["HTTP_FORWARDED"];
        } elseif (isset($_SERVER["HTTP_X_REAL_IP"])) {
            return $_SERVER["HTTP_X_REAL_IP"];
        } else {
            return $_SERVER["REMOTE_ADDR"];
        }
    }
	

    /**
     * Обратный отсчет времени 
     * 
     * @param $timediff = time()
     */	
    public static function timeq($timediff){
        $oneMinute=60;
        $oneHour=60*60;
        $oneDay=60*60*24;
            $dayfield = floor($timediff/$oneDay);
            $hourfield = floor(($timediff-$dayfield*$oneDay)/$oneHour);
            $minutefield = floor(($timediff-$dayfield*$oneDay-$hourfield*$oneHour)/$oneMinute);
            $secondfield = floor(($timediff-$dayfield*$oneDay-$hourfield*$oneHour-$minutefield*$oneMinute));
            $time_1="$hourfield ч. $minutefield м. $secondfield c";
        return $time_1;
    }	
	

    /**
     * Проверяет авторизован ли пользователь
     * 
     * @return string
     */	
    public static function auth() {
        global $id_user;
	        
	    if($id_user == true) {
		header('Location: /');
	    }else {
		return false;
	    }
    }

}