<?php
class system {
// Фильтрация.
public static function check($msg) {
if (is_array($msg)) {
foreach($msg as $key => $val) {
$msg[$key] = self::check($val);
}
} else {
$msg = htmlspecialchars($msg);
$search = array(' ','|', '\'', '$', '\\', '^', '%', '`', "\0", "\x00", "\x1A", chr(226) . chr(128) . chr(174));
$replace = array(' ','|', ''', '$', '\', '^', '%', '`', '', '', '', '');
$msg = str_replace($search, $replace, $msg);
$msg = stripslashes(trim($msg));
}
return $msg;
}
// Вывод ошибок, текста.
public static function show($message=NULL,$err=0) {
global $user;
if($message != NULL) {
?>
<div class="note-<?=($err == 0 ? "error" : "success" )?>"><?=$message?></div>
<?php
}
}
// Перенаправление.
public static function redirect($message, $redirect, $status = 0) {
if($message != NULL) {
$stat = ($status == 0 ? "note" : "error" );
$_SESSION[$stat] = $message;
}
//echo '<meta http-equiv="refresh" content="0; URL=\''.$redirect.'\'" />';
header("Location: {$redirect}");
die();
return;
}
// Форматирование текста.
public static function textOut($msg, $br = ' <br/> ') {
$msg = emoji::smile($msg);
return str_replace("\r\n", $br, str_replace("\n", $br, $msg));
}
public static function BBcode($msg) {
$listDomain = "place|camera|info|name|academy|aero|arpa|coop|media|museum|mobi|travel|xxx|asia|biz|com|net|org|gov|mil|edu|int|tel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pr|ps|pt|pw|py|qa|re|ro|ru|rs|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|cat|pro|local|рф";
$bbcode = array(
'/#((?!_)\d*[A-z_а-я]+\d*)/ui' => '<a href="/?q=$1">#$1</a>',
'/(https?:\/\/)?([\w\.\-]+)\.('.$listDomain.'\.?)([\w\-\_#%&?+\/\.=;:~]*)*\/?/i' => '<a href="$0">$0</a>'
//'~(?:(?:http(s?)|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.;,_@%&?+=\~/-]*)?(?:#[^ \'\"&]*)?~im' => '<a href="$0">$0</a>'
);
$msg = preg_replace(array_keys($bbcode), array_values($bbcode), $msg);
return $msg;
}
///(https?\:\/\/((\w+\-*.)+)?(\w+\-*)+\.{1}(?:рф|com|aero|biz|com|coop|edu|eu|gov|info|int|mil|museum|name|net|org|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)(?::\d+)?(\/\S*)?)/
// Вывод времени.
public static function times($time = NULL) {
global $user;
$timep="".date("j M".(date("Y", $time) != date("Y") ? " Y" : "" )." в H:i", $time)."";
$time_p[0]=date("j n Y", $time);
$time_p[1]=date("H:i", $time);
if ($time_p[0]==date("j n Y"))$timep=date("H:i", $time);
if ($time_p[0]==date("j n Y"))$timep=date("H:i", $time);
if ($time_p[0]==date("j n Y", time()-60*60*24)) $timep="вчера в ".$time_p[1];
$rep = array(
"Jan" => "янв",
"Feb" => "фев",
"Mar" => "мар",
"May" => "мая",
"Apr" => "апр",
"Jun" => "июн",
"Jul" => "июл",
"Aug" => "авг",
"Sep" => "сен",
"Oct" => "окт",
"Nov" => "ноя",
"Dec" => "дек"
);
$timep = @str_replace(array_keys($rep), array_values($rep), $timep);
return $timep;
}
// Кол-во символов UTF-8.
public static function utf_strlen($msg) {
$msg = str_replace(" ","",$msg);
if (function_exists('mb_strlen')) return mb_strlen($msg, 'utf-8');
if (function_exists('iconv_strlen')) return iconv_strlen($msg, 'utf-8');
if (function_exists('utf8_decode')) return strlen(utf8_decode($msg));
return strlen(utf_to_win($msg));
}
public static function error()
{
return self::show('Страница не найдена.');
}
public static function count($num){
if(is_array($num))
{
foreach($num as $k => $v)
{
$num[$k] = self :: count($v);
}
} else {
if($num == 0) { $num = 0; } else{ $num = intval($num); }
}
return $num;
}
// Проверка на путоту. Зафиксированый баг.
public static function noempty($v)
{
if(empty($v) && $v != "0"){ $r = false; } else { $r = true; }
return $r;
}
// Измеряем память в байтах
public static function FBytes($bytes, $precision = 2) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
$bytes = max($bytes, 0);
$pow = floor(($bytes?log($bytes):0)/log(1024));
$pow = min($pow, count($units)-1);
$bytes /= pow(1024, $pow);
return round($bytes, $precision).' '.$units[$pow];
}
// Обрезание текста.
public static function cutText($str, $len = 100)
{
// Обрезаем текст до нужного кол-ва символов.
$str = @substr($str, 0, $len);
// Если символов больше, чем нужно, то добавляем "...".
if(@strlen($str) >= $len){ $str .= "..."; }
return $str;
}
public static function vail($int, $expressions, $retNum = true)
{
if (count($expressions) < 3)$expressions[2] = $expressions[1];
$count = $int%100;
if ($count >= 5 && $count <= 20)$result = 2;
else $count = $count%10;
if ($count == 1)$result = 0;
elseif($count >= 2 && $count <= 4)$result = 1;
else $result = 2;
return ($retNum == true ? $int.' ' : '' ).$expressions[$result];
}
public static function coins($c) {
return $c." ".profile :: getPhrase($c,['монета','монеты','монет']);
}
public static function notes() {
if(isset($_SESSION['note'])){ ?><div class="note-success"><?=($_SESSION['note'])?></div><?php }
if(isset($_SESSION['error'])){ ?><div class="note-error"><?=self::check($_SESSION['error'])?></div><?php }
return;
}
// Удаление не читаемых символов. Ничего не менять!
public static function text($s)
{
$array_edit = array(
' ' => "", // nbsp
' ' => "", // en space
' ' => "", // em space
' ' => "" // thin space
);
$s = @str_replace(array_keys($array_edit), array_values($array_edit), $s);
return trim($s);
}
// Тoлько цифры.
public static function num($n) {
return abs(intval($n));
}
// Генерация хэша.
public static function genHash($t, $int) {
return (md5(md5($t).'loli'.md5($t).'loli').$int.md5('uoi!hrenVamSuchki!:* текст чтобы точно не хакнули.hentai').$int);
}
// Вывод иконок.
public static function icon($i, $s = NULL) {
$s .= "vertical-align: top;";
return " <img src=\"/template/icons/{$i}.png\" ".($s != NULL ? "style=\"".$s."\"" : '')." /> ";
}
public static function ico($i) {
return "<span class=\"ico ico-{$i}\"></span>";
}
public static function touch($l = NULL, $t = NULL) {
return '<div class="touch"><a href="'.$l.'" class="touch-cont _oh">'.$t.'</a></div>';
}
public static function back($l = NULL, $t = NULL, $x = false) {
return '<div '.($x == true ? "id='app-ajax-back' " : '' ).'class="touch-back"><a href="'.$l.'" class="touch-cont">'.self :: icon('arr-l').$t.'</a></div>';
}
public static function activateMail($id,$mail,$act) {
$vseti = 'vineti.ru';
$email_a = 'activate@vineti.ru';
$message = '
Поздравляем с регистрацией на '.$vseti.'.
Чтобы подтвердить регистрацию, пожалуйста, откройте ссылку:
http://vineti.ru/activate?user='.$id.'&key='.$act.'
После подтверждения можно полностью пользоваться сайтом.
Пожалуйста, никому не доверяйте данные от Вашего аккаунта.
---
Вы получили это сообщение, потому что Ваш email-адрес был зарегистрирован на сайте '.$vseti.'.
Если данное письмо попало к Вам по ошибке, пожалуйста, проигнорируйте его и примите наши извинения.
С наилучшими пожеланиями,
Администрация сайта vineti.ru';
$r = mail($mail, '=?utf-8?B?'.base64_encode('Регистрация на '.$vseti).'?=', $message, "From: $email_a\r\nContent-type: text/plain; charset=utf-8;\r\nX-Mailer: PHP;");
return $r;
}
public static function restoreMail($email, $key)
{
if (empty($email) || empty($key))
{
return exit('Empty data.');
}
else
{
$vseti = 'vineti.ru';
$email_a = 'restore@vineti.ru';
$message = '
Мы получили запрос на восстановление пароля к Вашему аккаунту.
Чтобы продолжить восстановление, пожалуйста, откройте ссылку:
http://vineti.ru/restore?key='.$key.'
Пожалуйста, никому не доверяйте данные от Вашего аккаунта.
---
Вы получили это сообщение, потому что Ваш email-адрес был зарегистрирован на сайте '.$vseti.'.
Если данное письмо попало к Вам по ошибке, пожалуйста, проигнорируйте его и примите наши извинения.
С наилучшими пожеланиями,
Администрация сайта vineti.ru';
$r = mail($email, '=?utf-8?B?'.base64_encode('Восстановление пароля').'?=', $message, "From: $email_a\r\nContent-type: text/plain; charset=utf-8;\r\nX-Mailer: PHP;");
return $r;
}
}
public static function dsCrypt($input,$decrypt=false) {
$o = $s1 = $s2 = array(); // Arrays for: Output, Square1, Square2
// формируем базовый массив с набором символов
$basea = array('?','(','@',';','$','#',"]","&",'*'); // base symbol set
$basea = array_merge($basea, range('a','z'), range('A','Z'), range(0,9) );
$basea = array_merge($basea, array('!',')','_','+','|','%','/','[','.',' ') );
$dimension=9; // of squares
for($i=0;$i<$dimension;$i++) { // create Squares
for($j=0;$j<$dimension;$j++) {
$s1[$i][$j] = $basea[$i*$dimension+$j];
$s2[$i][$j] = str_rot13($basea[($dimension*$dimension-1) - ($i*$dimension+$j)]);
}
}
unset($basea);
$m = floor(strlen($input)/2)*2; // !strlen%2
$symbl = $m==strlen($input) ? '':$input[strlen($input)-1]; // last symbol (unpaired)
$al = array();
// crypt/uncrypt pairs of symbols
for ($ii=0; $ii<$m; $ii+=2) {
$symb1 = $symbn1 = strval($input[$ii]);
$symb2 = $symbn2 = strval($input[$ii+1]);
$a1 = $a2 = array();
for($i=0;$i<$dimension;$i++) { // search symbols in Squares
for($j=0;$j<$dimension;$j++) {
if ($decrypt) {
if ($symb1===strval($s2[$i][$j]) ) $a1=array($i,$j);
if ($symb2===strval($s1[$i][$j]) ) $a2=array($i,$j);
if (!empty($symbl) && $symbl===strval($s2[$i][$j])) $al=array($i,$j);
}
else {
if ($symb1===strval($s1[$i][$j]) ) $a1=array($i,$j);
if ($symb2===strval($s2[$i][$j]) ) $a2=array($i,$j);
if (!empty($symbl) && $symbl===strval($s1[$i][$j])) $al=array($i,$j);
}
}
}
if (sizeof($a1) && sizeof($a2)) {
$symbn1 = $decrypt ? $s1[$a1[0]][$a2[1]] : $s2[$a1[0]][$a2[1]];
$symbn2 = $decrypt ? $s2[$a2[0]][$a1[1]] : $s1[$a2[0]][$a1[1]];
}
$o[] = $symbn1.$symbn2;
}
if (!empty($symbl) && sizeof($al)) // last symbol
$o[] = $decrypt ? $s1[$al[1]][$al[0]] : $s2[$al[1]][$al[0]];
return implode('',$o);
}
// Создание дерева директорий
public static function createDir($p = NULL) {
if(!file_exists(FILES_PATH.$p)) {
$arr = explode('/', $p);
$curr=array();
foreach($arr as $key => $val){ if(isset($val) && $val != ""){
$curr[]=$val;
$p = FILES_PATH.implode('/',$curr)."/";
if(!is_dir($p)){ mkdir($p, 0777); }
}}
}
}
// Получение текущей директории для загрузки фоток
public static $photosDir = "photos/";
public static function photosGetLink($std = false, $id = 0, $hash = 0) {
return ($std ? self :: $photosDir : '').($id > 0 ? intval($id/1000)."/{$id}/" : '').($hash === 0 ? (idate("Y") * pow(idate("y"), 2))."/".(idate("z")*(365+idate("L")))."/" : $hash );
}
public static function photosGetView($hash,$size = 0) {
$sizes = ['','_64x','_128x','_150x','_256x','_512x','_1080x'];
return self :: photosGetLink(true,0,$hash).(isset($sizes[$size]) ? $sizes[$size] : '' ).".jpg";
}
public static function photosGetCover($id) {
$r = DB :: $pdo -> queryFetch("SELECT `hash` FROM `photos` WHERE `id_album` = ? ORDER BY `id` DESC LIMIT 1;", array($id));
return isset($r['hash']) ? system :: photosGetView($r['hash'],3) : self :: $photosDir . '0.jpg';
}
//Хеш пароли
public static function bhash($a)
{
return md5('~' . md5('~' . $a . '~') . '~');
}
}