Просмотр файла engine/classes/engine.class.php

Размер файла: 21.19Kb
<?

class engine {

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

    //Фильтрация строк
    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 уина
	public static function icq($icq) {
	    if (preg_match('#[0-9]{5,9}#', $icq, $str)) {
            return $str[0];
        } else {
            return NULL;
        }
	}
	


	//Работа с файлами и кодирокой выбранного файла
	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;
	
	}
    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 );
    }
	
	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);
    }
    //Удаление ссылок из текстов	
	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 сделать обрезку и сравнения):
	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); 
    } 
	//Включение антирекламы
    public 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
	 * Параметры: $function - строка имени функции
     * На выходе: true - функция есть и доступна для вызова,
     * false - функция недоступна по какой-либо причине
	*/
    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 );
    }
	
	
	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);
    }
	
	/*
	 * Функция для удаление пробелов
	 * $str = Источник 
     * $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
	 *
	 * IP в качестве параметра, и возвращает данные о расположении. 
	 * Если локация не будет обнаружена, то в ответ будет получен параметр 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
	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;

	
	}
	
    public static function strlen_shcms($values, $charset = 'utf-8' ) {

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

    }

    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);

        }
	
	//Проверяет на возможность использования строки в качестве ника
	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;
    }
 	
	//Проверяем на правильность логина в скайпе
	public static function skype($skype) {
        if (preg_match("#^[a-z][a-z0-9_\-\.]{5,31}$#ui", $skype))
            return true;
    }
	
	//Если все правильно
    public static function success($msg,$mess = false) {
        if(!empty($msg)) {
		    $message = '<div class="success">'.$msg.'</div>';
			    if($mess == true) {
			        $message .= '<div class="success">'.$mess.'</div>';
			    }
		    echo $message;
		}else {
		    echo '<div class="error">Неизвестная ошибка</div>';		
		}
    }
	//Сообщение об ошибке
    public static function error($error,$err = false) {
	    if(!empty($error)) {
		    $errno = '<div class="error"><img src="/engine/template/icons/error.png">&nbsp;'.$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; 
    } 

	
    //Переадресация на предыдущие страницы	
	public static function home($link){
        foreach ($link as $v1) {
            return '<div class="subpost"><img src="/engine/template/icons/undo.png">&nbsp;<b><a href="'.$link[1].'">'.$link[0].'</a></b></div>';
        }
	}
	
	/**
    * Умная обрезка строки
    * @param string $str - исходная строка
    * @param int $lenght - желаемая длина результирующей строки
    * @param string $end - завершение длинной строки
    * @param string $charset - кодировка
    * @param string $token - символ усечения
    * @return string - обрезанная строка
    */
	public static function string($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;
    }
} 
	
	//Определения размера файла
    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)
	 * string format()
	*/	
	public static function format($name) {
        $f1 = strrpos($name, ".");
        $f2 = substr($name, $f1 + 1, 999);
        $fname = strtolower($f2);
    return $fname;
    }
	
	/*
	 * Функция Оброботка текста  (999 - -4)
	 * string format()
	*/	
	public static function format_r($name) {
        $f1 = strrpos($name, ".");
        $f2 = substr($name, $f1 - 999, -4);
        $fname = strtolower($f2);
    return $fname;
    }
	
    //Выводит в URL данные по пользователю
	public 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>';
	}
	
	/*
	 * Функция для обработки текстов и смайликов
	 * @string $str
	*/
	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;
    }
	
	//Функция для генерации случайной строки
    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;
    }
	
	//Функция обрабатывает числовые данные
	public function number($num) {
		$number = $num;
			return number_format($number, 0, '', ' '); // 1 500 000
	}
	
	//Транслирует switch $act
	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;
}
        //Обработка названий и выводим разрещенное название
        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"];
        }
    }
	
	// Проверяет авторизован ли пользователь
	public static function auth() {
        global $id_user;
	        
			if($id_user == true) {
			    header('Location: /');
			}else {
			    return false;
			}
	}

}

?>