2, 'day' => 10, 'night' => 30, 'dayfrom' => 10, 'dayto' => 22 ); $af = isset(self::$system_set['antiflood']) ? unserialize(self::$system_set['antiflood']) : $default; switch ($af['mode']) { case 1: // Адаптивный режим $adm = mysql_result(mysql_query("SELECT COUNT(*) FROM `users` WHERE `rights` > 0 AND `lastdate` > " . (time() - 300)), 0); $limit = $adm > 0 ? $af['day'] : $af['night']; break; case 3: // День $limit = $af['day']; break; case 4: // Ночь $limit = $af['night']; break; default: // По умолчанию день / ночь $c_time = date('G', time()); $limit = $c_time > $af['day'] && $c_time < $af['night'] ? $af['day'] : $af['night']; } if (self::$user_rights > 0) $limit = 4; // Для Администрации задаем лимит в 4 секунды $flood = self::$user_data['lastpost'] + $limit - time(); if ($flood > 0) return $flood; else return FALSE; } /** * Маскировка ссылок в тексте * * @param $var * * @return string */ public static function antilink($var) { $var = preg_replace('~\\[url=(https?://.+?)\\](.+?)\\[/url\\]|(https?://(www.)?[0-9a-z\.-]+\.[0-9a-z]{2,6}[0-9a-zA-Z/\?\.\~&_=/%-:#]*)~', '###', $var); $replace = array( '.ru' => '***', '.com' => '***', '.biz' => '***', '.cn' => '***', '.in' => '***', '.net' => '***', '.org' => '***', '.info' => '***', '.mobi' => '***', '.wen' => '***', '.kmx' => '***', '.h2m' => '***' ); return strtr($var, $replace); } /** * Фильтрация строк * * @param string $str * * @return string */ public static function checkin($str) { if (function_exists('iconv')) { $str = iconv("UTF-8", "UTF-8", $str); } // Фильтруем невидимые символы $str = preg_replace('/[^\P{C}\n]+/u', '', $str); return trim($str); } /** * Обработка текстов перед выводом на экран * * @param string $str * @param int $br Параметр обработки переносов строк * 0 - не обрабатывать (по умолчанию) * 1 - обрабатывать * 2 - вместо переносов строки вставляются пробелы * @param int $tags Параметр обработки тэгов * 0 - не обрабатывать (по умолчанию) * 1 - обрабатывать * 2 - вырезать тэги * * @return string */ public static function checkout($str, $br = 0, $tags = 0) { $str = htmlentities(trim($str), ENT_QUOTES, 'UTF-8'); if ($br == 1) { // Вставляем переносы строк $str = nl2br($str); } elseif ($br == 2) { $str = str_replace("\r\n", ' ', $str); } if ($tags == 1) { $str = bbcode::tags($str); } elseif ($tags == 2) { $str = bbcode::notags($str); } return trim($str); } /** * Показ различных счетчиков внизу страницы */ public static function display_counters() { global $headmod; $req = mysql_query("SELECT * FROM `cms_counters` WHERE `switch` = '1' ORDER BY `sort` ASC"); if (mysql_num_rows($req) > 0) { while (($res = mysql_fetch_array($req)) !== FALSE) { $link1 = ($res['mode'] == 1 || $res['mode'] == 2) ? $res['link1'] : $res['link2']; $link2 = $res['mode'] == 2 ? $res['link1'] : $res['link2']; $count = ($headmod == 'mainpage') ? $link1 : $link2; if (!empty($count)) echo $count; } } } /** * Показываем дату с учетом сдвига времени * * @param int $var Время в Unix формате * * @return string Отформатированное время */ public static function display_date($var) { $shift = (self::$system_set['timeshift'] + self::$user_set['timeshift']) * 3600; if (date('Y', $var) == date('Y', time())) { if (date('z', $var + $shift) == date('z', time() + $shift)) return self::$lng['today'] . ', ' . date("H:i", $var + $shift); if (date('z', $var + $shift) == date('z', time() + $shift) - 1) return self::$lng['yesterday'] . ', ' . date("H:i", $var + $shift); } return date("d.m.Y / H:i", $var + $shift); } /** * Сообщения об ошибках * * @param string|array $error Сообщение об ошибке (или массив с сообщениями) * @param string $link Необязательная ссылка перехода * * @return bool|string */ public static function display_error($error = '', $link = '') { if (!empty($error)) { return '

' . self::$lng['error'] . '!
' . (is_array($error) ? implode('
', $error) : $error) . '

' . (!empty($link) ? '

' . $link . '

' : '') . '
'; } else { return FALSE; } } /** * Отображение различных меню * * @param array $val * @param string $delimiter Разделитель между пунктами * @param string $end_space Выводится в конце * * @return string */ public static function display_menu($val = array(), $delimiter = ' | ', $end_space = '') { return implode($delimiter, array_diff($val, array(''))) . $end_space; } /** * Постраничная навигация * За основу взята доработанная функция от форума SMF 2.x.x * * @param string $url * @param int $start * @param int $total * @param int $kmess * * @return string */ public static function display_pagination($url, $start, $total, $kmess) { $neighbors = 2; if ($start >= $total) $start = max(0, $total - (($total % $kmess) == 0 ? $kmess : ($total % $kmess))); else $start = max(0, (int)$start - ((int)$start % (int)$kmess)); $base_link = '%s'; $out[] = $start == 0 ? '' : sprintf($base_link, $start / $kmess, '<<'); if ($start > $kmess * $neighbors) $out[] = sprintf($base_link, 1, '1'); if ($start > $kmess * ($neighbors + 1)) $out[] = '...'; for ($nCont = $neighbors; $nCont >= 1; $nCont--) if ($start >= $kmess * $nCont) { $tmpStart = $start - $kmess * $nCont; $out[] = sprintf($base_link, $tmpStart / $kmess + 1, $tmpStart / $kmess + 1); } $out[] = '' . ($start / $kmess + 1) . ''; $tmpMaxPages = (int)(($total - 1) / $kmess) * $kmess; for ($nCont = 1; $nCont <= $neighbors; $nCont++) if ($start + $kmess * $nCont <= $tmpMaxPages) { $tmpStart = $start + $kmess * $nCont; $out[] = sprintf($base_link, $tmpStart / $kmess + 1, $tmpStart / $kmess + 1); } if ($start + $kmess * ($neighbors + 1) < $tmpMaxPages) $out[] = '...'; if ($start + $kmess * $neighbors < $tmpMaxPages) $out[] = sprintf($base_link, $tmpMaxPages / $kmess + 1, $tmpMaxPages / $kmess + 1); if ($start + $kmess < $total) { $display_page = ($start + $kmess) > $total ? $total : ($start / $kmess + 2); $out[] = sprintf($base_link, $display_page, '>>'); } return implode(' ', $out); } /** * Показываем местоположение пользователя * * @param int $user_id * @param string $place * * @return mixed|string */ public static function display_place($user_id = 0, $place = '') { global $headmod; $place = explode(",", $place); $placelist = parent::load_lng('places'); if (array_key_exists($place[0], $placelist)) { if ($place[0] == 'profile') { if ($place[1] == $user_id) { return '' . $placelist['profile_personal'] . ''; } else { $user = self::get_user($place[1]); return $placelist['profile'] . ': ' . $user['name'] . ''; } } elseif ($place[0] == 'online' && isset($headmod) && $headmod == 'online') { return $placelist['here']; } else { return str_replace('#home#', self::$system_set['homeurl'], $placelist[$place[0]]); } } return '' . $placelist['homepage'] . ''; } /** * Отображения личных данных пользователя * * @param int $user Массив запроса в таблицу `users` * @param array $arg Массив параметров отображения * [lastvisit] (boolean) Дата и время последнего визита * [stshide] (boolean) Скрыть статус (если есть) * [iphide] (boolean) Скрыть (не показывать) IP и UserAgent * [iphist] (boolean) Показывать ссылку на историю IP * * [header] (string) Текст в строке после Ника пользователя * [body] (string) Основной текст, под ником пользователя * [sub] (string) Строка выводится вверху области "sub" * [footer] (string) Строка выводится внизу области "sub" * * @return string */ public static function display_user($user = 0, $arg = array()) { $lng_arank = core::load_lng('arank'); global $mod; $out = FALSE; if (!$user['id']) { $out = '' . self::$lng['guest'] . ''; if (!empty($user['name'])) $out .= ': ' . $user['name']; if (!empty($arg['header'])) $out .= ' ' . $arg['header']; } else { if (self::$user_set['avatar']) { $out .= '
'; if (file_exists((ROOTPATH . 'files/users/avatar/' . $user['id'] . '.png'))) $out .= ' '; else $out .= ' '; $out .= ''; } if ($user['sex']) $out .= functions::image(($user['sex'] == 'm' ? 'm' : 'w') . ($user['datereg'] > time() - 86400 ? '_new' : '') . '.png', array('class' => 'icon-inline')); else $out .= functions::image('del.png'); $out .= !self::$user_id || self::$user_id == $user['id'] ? '' . $user['name'] . '' : '' . $user['name'] . ''; $rank = array( 0 => '', 1 => '(GMod)', 2 => '(CMod)', 3 => '(FMod)', 4 => '(DMod)', 5 => '(LMod)', 6 => '(Smd)', 7 => '(Adm)', 9 => '(SV!)' ); $rights = isset($user['rights']) ? $user['rights'] : 0; $out .= ' ' . $rank[$rights]; $out .= (time() > $user['lastdate'] + 300 ? ' [Off]' : ' [ON]'); if ($user['postforum'] != 0) { $arank = $user['postforum']; if ($arank <= 10) $arank = 'Новичок'; elseif ($arank <= 50) $arank = 'Пользователь'; elseif ($arank <= 300) $arank = 'Друзья For-People'; elseif ($arank <= 500) $arank = '' . $lng_arank['super_poster'] . ''; elseif ($arank <= 750) $arank = '' . $lng_arank['resident'] . ''; elseif ($arank <= 1000) $arank = '' . $lng_arank['vip'] . ''; elseif ($arank <= 2000) $arank = '' . $lng_arank['guru'] . ''; elseif ($arank <= 3000) $arank = '' . $lng_arank['gold'] . ''; elseif ($arank >= 3001) $arank = '' . $lng_arank['platinum'] . ''; } if ($user['rights'] >= 6) { $out .='
' . $lng_arank['admins_team'] . '
'; if (self::$user_set['avatar']) $out .= '
'; } else { $out .='
' . $arank . '
'; if (self::$user_set['avatar']) $out .= ''; } if (!empty($arg['header'])) $out .= ' ' . $arg['header']; if (!isset($arg['stshide']) && !empty($user['status'])) $out .= '
' . functions::image('label.png', array('class' => 'icon-inline')) . $user['status'] . '
'; if (self::$user_set['avatar']) $out .= ''; } if (isset($arg['body'])) $out .= '
' . $arg['body'] . '
'; $ipinf = !isset($arg['iphide']) && self::$user_rights ? 1 : 0; $lastvisit = time() > $user['lastdate'] + 300 && isset($arg['lastvisit']) ? self::display_date($user['lastdate']) : FALSE; if ($ipinf || $lastvisit || isset($arg['sub']) && !empty($arg['sub']) || isset($arg['footer'])) { $out .= '
'; if (isset($arg['sub'])) { $out .= '
' . $arg['sub'] . '
'; } if ($lastvisit) { $out .= '
' . self::$lng['last_visit'] . ': ' . $lastvisit . '
'; } $iphist = ''; if ($ipinf) { $out .= '
' . self::$lng['browser'] . ': ' . htmlspecialchars($user['browser']) . '
' . '
' . self::$lng['ip_address'] . ': '; $hist = $mod == 'history' ? '&mod=history' : ''; $ip = long2ip($user['ip']); if (self::$user_rights && isset($user['ip_via_proxy']) && $user['ip_via_proxy']) { $out .= '' . $ip . ''; $out .= ' [?]'; $out .= ' / '; $out .= '' . long2ip($user['ip_via_proxy']) . ''; $out .= ' [?]'; } elseif (self::$user_rights) { $out .= '' . $ip . ''; $out .= ' [?]'; } else { $out .= $ip . $iphist; } if (isset($arg['iphist'])) { $iptotal = mysql_result(mysql_query("SELECT COUNT(*) FROM `cms_users_iphistory` WHERE `user_id` = '" . $user['id'] . "'"), 0); $out .= '
' . self::$lng['ip_history'] . ': [' . $iptotal . ']
'; } $out .= '
'; } if (isset($arg['footer'])) $out .= $arg['footer']; $out .= '
'; } return $out; } /** * Форматирование имени файла * * @param string $name * * @return string */ public static function format($name) { $f1 = strrpos($name, "."); $f2 = substr($name, $f1 + 1, 999); $fname = strtolower($f2); return $fname; } /** * Получаем данные пользователя * * @param int $id Идентификатор пользователя * * @return array|bool */ public static function get_user($id = 0) { if ($id && $id != self::$user_id) { $req = mysql_query("SELECT * FROM `users` WHERE `id` = '$id'"); if (mysql_num_rows($req)) { return mysql_fetch_assoc($req); } else { return FALSE; } } else { return self::$user_data; } } public static function image($name, $args = array()) { if (is_file(ROOTPATH . 'theme/' . core::$user_set['skin'] . '/images/' . $name)) { $src = core::$system_set['homeurl'] . '/theme/' . core::$user_set['skin'] . '/images/' . $name; } elseif (is_file(ROOTPATH . 'images/' . $name)) { $src = core::$system_set['homeurl'] . '/images/' . $name; } else { return false; } return '' . (isset($args['alt']) ? $args['alt'] : '') . ''; } /** * Является ли выбранный юзер другом? * * @param int $id Идентификатор пользователя, которого проверяем * * @return bool */ public static function is_friend($id = 0) { static $user_id = NULL; static $return = FALSE; if (!self::$user_id && !$id) { return FALSE; } if (is_null($user_id) || $id != $user_id) { $query = mysql_result(mysql_query("SELECT COUNT(*) FROM `cms_contact` WHERE `type` = '2' AND ((`from_id` = '$id' AND `user_id` = '" . self::$user_id . "') OR (`from_id` = '" . self::$user_id . "' AND `user_id` = '$id'))"), 0); $return = $query == 2 ? TRUE : FALSE; } return $return; } /** * Находится ли выбранный пользователь в контактах и игноре? * * @param int $id Идентификатор пользователя, которого проверяем * * @return int Результат запроса: * 0 - не в контактах * 1 - в контактах * 2 - в игноре у меня */ public static function is_contact($id = 0) { static $user_id = NULL; static $return = 0; if (!self::$user_id && !$id) { return 0; } if (is_null($user_id) || $id != $user_id) { $user_id = $id; $req_1 = mysql_query("SELECT * FROM `cms_contact` WHERE `user_id` = '" . self::$user_id . "' AND `from_id` = '$id'"); if (mysql_num_rows($req_1)) { $res_1 = mysql_fetch_assoc($req_1); if ($res_1['ban'] == 1) { $return = 2; } else { $return = 1; } } else { $return = 0; } } return $return; } /** * Проверка на игнор у получателя * * @param $id * * @return bool */ public static function is_ignor($id) { static $user_id = NULL; static $return = FALSE; if (!self::$user_id && !$id) { return FALSE; } if (is_null($user_id) || $id != $user_id) { $user_id = $id; $req_2 = mysql_query("SELECT * FROM `cms_contact` WHERE `user_id` = '$id' AND `from_id` = '" . self::$user_id . "'"); if (mysql_num_rows($req_2)) { $res_2 = mysql_fetch_assoc($req_2); if ($res_2['ban'] == 1) { $return = TRUE; } } } return $return; } /* ----------------------------------------------------------------- Транслитерация с Русского в латиницу ----------------------------------------------------------------- */ public static function rus_lat($str) { $replace = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'j', 'з' => 'z', 'и' => 'i', 'й' => 'i', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ъ' => "", 'ы' => 'y', 'ь' => "", 'э' => 'ye', 'ю' => 'yu', 'я' => 'ya' ); return strtr($str, $replace); } /* ----------------------------------------------------------------- Обработка смайлов ----------------------------------------------------------------- */ public static function smileys($str, $adm = FALSE) { static $smileys_cache = array(); if (empty($smileys_cache)) { $file = ROOTPATH . 'files/cache/smileys.dat'; if (file_exists($file) && ($smileys = file_get_contents($file)) !== FALSE) { $smileys_cache = unserialize($smileys); return strtr($str, ($adm ? array_merge($smileys_cache['usr'], $smileys_cache['adm']) : $smileys_cache['usr'])); } else { return $str; } } else { return strtr($str, ($adm ? array_merge($smileys_cache['usr'], $smileys_cache['adm']) : $smileys_cache['usr'])); } } /* ----------------------------------------------------------------- Функция пересчета на дни, или часы ----------------------------------------------------------------- */ public static function timecount($var) { global $lng; if ($var < 0) $var = 0; $day = ceil($var / 86400); if ($var > 345600) return $day . ' ' . $lng['timecount_days']; if ($var >= 172800) return $day . ' ' . $lng['timecount_days_r']; if ($var >= 86400) return '1 ' . $lng['timecount_day']; return date("G:i:s", mktime(0, 0, $var)); } /* ----------------------------------------------------------------- Транслитерация текста ----------------------------------------------------------------- */ public static function trans($str) { $replace = array( 'a' => 'а', 'b' => 'б', 'v' => 'в', 'g' => 'г', 'd' => 'д', 'e' => 'е', 'yo' => 'ё', 'zh' => 'ж', 'z' => 'з', 'i' => 'и', 'j' => 'й', 'k' => 'к', 'l' => 'л', 'm' => 'м', 'n' => 'н', 'o' => 'о', 'p' => 'п', 'r' => 'р', 's' => 'с', 't' => 'т', 'u' => 'у', 'f' => 'ф', 'h' => 'х', 'c' => 'ц', 'ch' => 'ч', 'w' => 'ш', 'sh' => 'щ', 'q' => 'ъ', 'y' => 'ы', 'x' => 'э', 'yu' => 'ю', 'ya' => 'я', 'A' => 'А', 'B' => 'Б', 'V' => 'В', 'G' => 'Г', 'D' => 'Д', 'E' => 'Е', 'YO' => 'Ё', 'ZH' => 'Ж', 'Z' => 'З', 'I' => 'И', 'J' => 'Й', 'K' => 'К', 'L' => 'Л', 'M' => 'М', 'N' => 'Н', 'O' => 'О', 'P' => 'П', 'R' => 'Р', 'S' => 'С', 'T' => 'Т', 'U' => 'У', 'F' => 'Ф', 'H' => 'Х', 'C' => 'Ц', 'CH' => 'Ч', 'W' => 'Ш', 'SH' => 'Щ', 'Q' => 'Ъ', 'Y' => 'Ы', 'X' => 'Э', 'YU' => 'Ю', 'YA' => 'Я' ); return strtr($str, $replace); } /* ----------------------------------------------------------------- Старая функция проверки переменных. В новых разработках не применять! Вместо данной функции использовать checkin() ----------------------------------------------------------------- */ public static function check($str) { $str = htmlentities(trim($str), ENT_QUOTES, 'UTF-8'); $str = self::checkin($str); $str = nl2br($str); $str = mysql_real_escape_string($str); return $str; } }