<?php
function is_user_access( $access, $user_id = '')
{
if ($user_id == '')
global $user;
else
$user = get_user( $user_id );
if ( !isset( $user['group_access'] ) || $user['group_access'] == null) {
return false;
}
$is_group_access = db::count("SELECT COUNT(*) FROM `user_group_access`
WHERE `id_group` = '$user[group_access]' AND `id_access` = '" . my_esc( $access ) . "'");
return ($is_group_access ? true : false);
}
/**
* Проверяет наличие пользователя по логину и паролю
* Кеширует данные для дальнейшего их использования
* @return bolean
*/
function is_auth_user($value, $password, $key = 'id')
{
global $ds_users_cache;
if (!$value || !$password) {
return false;
}
$password = shif($password);
$user = db::fetch("SELECT * FROM `user` WHERE `$key` = '$value' AND `pass` = '$password' LIMIT 1", ARRAY_A);
if (isset($user['id'])) {
if (!isset($ds_users_cache[$user['group_access']])) {
$group_access = get_group_access($user['group_access']);
$user['level'] = $group_access['level'];
$user['group_name'] = $group_access['group_name'];
$ds_users_cache[$user['id']] = use_filters('ds_users_cache_add', $user);
}
return true;
}
return false;
}
function is_user() {
global $user;
if (isset($user['id'])) {
return true;
}
return false;
}
/**
* Проверяет в сети ли указанный пользователь
*/
function is_online($user_id = false)
{
if (!$user_id) {
$user_id = get_user_id();
}
$user = get_user($user_id);
$time = use_filters('is_user_online', 60 * 10);
if (isset($user['id']) && $user['date_last'] + $time > TIME) {
return true;
}
return false;
}
/**
* Возвращает ссылку на страницу пользователя
* $user - ID или массив пользователя
* @return string
*/
function get_user_url($user)
{
if (is_numeric($user)) {
$user = get_user($user);
}
if (isset($user['id'])) {
return use_filters('get_user_url', ds_site_url() . '/info.php?id=' . $user['id'], $user);
}
}
function get_user_id()
{
if (isset($_SESSION['id_user'])) {
return (int) $_SESSION['id_user'];
}
return ;
}
/**
* Возвращаяет ник пользователя
*/
function get_user_nick($user_id = false)
{
if (!$user_id) {
$user_id = get_user_id();
}
$user = get_user($user_id);
if (isset($user['id']))
return use_filters('get_user_nick', $user['nick']);
}
/**
* Получает данные пользователя
* $user_id ID пользователя
* @return array
*/
function get_user($user_id = 0)
{
global $ds_users_cache;
if ( $user_id == 0 ) {
$user = use_filters('ds_system_user', array(
'id' => 0,
'pol' => 1,
'level' => 999,
'nick' => __('Система'),
'group_name' => __('Системный робот'),
'ank_o_sebe' => __('Создан для уведомлений'),
));
return $user;
} else {
$user_id = (int) $user_id;
if (!isset($ds_users_cache[$user_id])) {
$ds_users_cache[$user_id] = db::fetch("SELECT * FROM `user` WHERE `id` = '$user_id' LIMIT 1", ARRAY_A);
if (isset($ds_users_cache[$user_id]['id'])) {
$group_access = get_group_access($ds_users_cache[$user_id]['group_access']);
if ( $group_access['group_name'] == null ) {
$ds_users_cache[$user_id]['level'] = 0;
$ds_users_cache[$user_id]['group_name'] = 'Пользователь';
} else {
$ds_users_cache[$user_id]['level'] = $group_access['level'];
$ds_users_cache[$user_id]['group_name'] = $group_access['group_name'];
}
} else {
$ds_users_cache[$user_id] = false;
}
}
return $ds_users_cache[$user_id];
}
}
/**
* Получает и кеширует груггу пользователя
* $group_id ID группы
* @return array
*/
function get_group_access($group_id)
{
global $ds_group_accesses;
if (!isset($ds_group_accesses[$group_id])) {
$group_access = db::fetch("SELECT `level`, `name` AS `group_name`
FROM `user_group`
WHERE `id` = '" . (int) $group_id . "' LIMIT 1", ARRAY_A);
$ds_group_accesses[$group_id] = $group_access;
}
return $ds_group_accesses[$group_id];
}
/**
* Генератор пароля
* $k_simb колличество символов
* @return string
*/
function passgen($k_simb = 8, $types = 3)
{
$password = '';
$small = 'abcdefghijkmnpqrstuvwxyz';
$large = 'ABCDEFGHIJKLMNPQRSTUVWXYZ';
$numbers = '1234567890';
mt_srand((double)microtime()*1000000);
for ($i = 0; $i < $k_simb; $i++)
{
$type = mt_rand(1,min($types,3));
switch ($type)
{
case 3:
$password .= $large[mt_rand(0, strlen($large) - 1)];
break;
case 2:
$password .= $small[mt_rand(0, strlen($small) - 1)];
break;
case 1:
$password .= $numbers[mt_rand(0,9)];
break;
}
}
return $password;
}
/**
* Обновляет информацию о пользователе
* Хук фильтр: {update_user_information}
*/
function update_user_information()
{
global $user, $ds_user_update;
$ds_user_update['date_last'] = time();
$ds_user_update = use_filters('update_user_information', $ds_user_update);
if (isset($user['id'])) {
db::update('user', $ds_user_update, array(array(
'field' => 'id',
'value' => $user['id'],
)));
}
}
/**
* Добавляет данные о пользователе
*/
function add_user_update($key, $value)
{
global $ds_user_update;
$ds_user_update[$key] = $value;
}
/**
* Счетчики пользователя
* Хук фильтр: {ds_user_counters}
*/
function get_user_counters($user_id = false)
{
if ($user_id === false) {
$user_id = get_user_id();
}
$user = get_user($user_id);
if (!isset($user['id'])) {
return ;
}
$counter = ds_get('ds_user_counters', array());
if (!empty($counter[$user_id])) {
return use_filters('ds_user_counters', $counter[$user_id]);
}
$counter[$user_id]['mail'] = array(
'title' => __('Сообщения'),
'count' => db::count("SELECT COUNT(`mail`.`id`) FROM `mail`
LEFT JOIN `users_konts` ON `mail`.`id_user` = `users_konts`.`id_kont` AND `users_konts`.`id_user` = '$user[id]'
WHERE `mail`.`id_kont` = '$user[id]' AND (`users_konts`.`type` IS NULL OR `users_konts`.`type` = 'common' OR `users_konts`.`type` = 'favorite') AND `mail`.`read` = '0'"),
);
$counter[$user_id]['tape'] = array(
'title' => __('Лента'),
'count' => db::count("SELECT COUNT(`read`) FROM `tape` WHERE `id_user` = '$user[id]' AND `read` = '0'"),
);
$counter[$user_id]['discussions'] = array(
'title' => __('Обсуждения'),
'count' => db::count("SELECT COUNT(`count`) FROM `discussions` WHERE `id_user` = '$user[id]' AND `count` > '0'"),
);
$counter[$user_id]['notification'] = array(
'title' => __('Уведомления'),
'count' => db::count("SELECT COUNT(`read`) FROM `notification` WHERE `id_user` = '$user[id]' AND `read` = '0'"),
);
$counter[$user_id]['friends'] = array(
'title' => __('Друзья'),
'count' => db::count("SELECT COUNT(id) FROM `frends_new` WHERE `to` = '$user[id]'"),
);
ds_set('ds_user_counters', $counter);
return use_filters('ds_user_counters', $counter[$user_id]);
}
function ds_user_panel()
{
do_event('user_panel_after');
if (is_user()) {
do_event('user_panel');
} else {
do_event('guest_panel');
}
do_event('user_panel_before');
}
function get_user_panel()
{
global $user;
$counter = get_user_counters();
$template = array();
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/info.php?id=' . $user['id'] . '"><img src="/style/icons/nav_stranica.gif" alt="DS" /></a></div>';
if ($counter['mail']['count'] > 0) {
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/new_mess.php"><img src="/style/icons/icon_pochta22.gif" alt="DS" /><span class="counter">(' . $counter['mail']['count'] . ')</span></a></div>';
} else {
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/konts.php"><img src="/style/icons/nav_pochta.gif" alt="DS" /></a></div>';
}
$type = 'tape';
if ($counter['tape']['count'] > 0) {
$type = 'tape';
} elseif ($counter['discussions']['count'] > 0) {
$type = 'discussions';
} elseif ($counter['notification']['count'] > 0) {
$type = 'notification';
}
$counter_all = ($counter['tape']['count'] + $counter['discussions']['count'] + $counter['notification']['count']);
if ($counter_all) {
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/user/' . $type . '/"><img src="/style/icons/nav_lenta.gif" alt="DS" /><span class="counter">(' . $counter_all . ')</span></a></div>';
} else {
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/user/' . $type . '/"><img src="/style/icons/nav_lenta.gif" alt="DS" /></a></div>';
}
if ($counter['friends']['count'] > 0) {
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . '/user/frends/new.php"><img src="/style/icons/icon_druzya.gif" alt="DS" /><span class="counter">(' . $counter['friends']['count'] . ')</span></a></div>';
}
$template[] = '<div class="panel-item"><a href="' . ds_site_url() . text($_SERVER['REQUEST_URI']) . '"><img src="/style/icons/nav_obnovit.gif" alt="DS" /></a></div>';
echo '<div class="header-user-panel">' . implode('', $template) . '</div>';
}
/**
* Выход с сайта
*/
function ds_user_logout()
{
setcookie('id_user');
setcookie('pass');
session_destroy();
do_event('ds_user_logout');
header('Location: ' . ds_site_url());
exit;
}
/**
* Добавляет область блока в профиле
*/
function add_profile_box($name, $args = array())
{
$profile_boxes = ds_get('ds_profile_boxes', array());
if (!isset($profile_boxes[$name])) {
$profile_boxes[$name] = $args;
}
ds_set('ds_profile_boxes', use_filters('add_profile_boxes', $profile_boxes));
}
/**
* Добавляет область блока в профиле
*/
function get_profile_boxes()
{
$profile_boxes = ds_get('ds_profile_boxes', array());
return $profile_boxes;
}
/**
* Добавляет в область блока содержимое
*/
function add_profile_item($boxId, $args)
{
$profile_items = ds_get('ds_profile_items', array());
$profile_items[$boxId][] = $args;
ds_set('ds_profile_items', use_filters('add_profile_items', $profile_items));
}
/**
* Функция получает обработанный контент области блока профиля
*/
function get_profile_items($user_id, $box_id, $args)
{
$profile_items = ds_get('ds_profile_items', array());
$pre_items = array();
foreach($profile_items[$box_id] AS $item)
{
// Шаблон
if (!isset($item['template'])) {
$item['template'] = use_filters('ds_template_profile_item', '<div class="profile-box-item %class">%content</div>');
}
// Хук фильтр (динамический)
$filter = 'filters_' . md5(microtime());
// Callback функция содержимого
if (isset($item['function'])) {
add_filter($filter, $item['function']);
}
// Получаем контент в блок области профиля
$content = use_filters($filter, $user_id);
if ($content) {
$pre_items[] = str_replace(array('%class', '%content'), array($item['class'], $content), $item['template']);
}
}
return join('', $pre_items);
}
/**
* Вывод ника пользователя
*/
function get_profile_title($user_id) {
$ank = get_user($user_id);
$content = sprintf('%s %s %s %s', group($ank['id']), use_filters('ds_user_nick', $ank['nick']), medal($ank['id']), online($ank['id']));
if ((user_access('user_ban_set') || user_access('user_ban_set_h') || user_access('user_ban_unset')) && $ank['id'] != get_user_id()) {
$content .= ' <a class="ds-link-ban" href="' . ds_site_url() . '/adm_panel/ban.php?id=' . $ank['id'] . '">Бан</a> ';
}
$title = str_replace('%content', $content, use_filters('ds_template_profile_title', '%content'));
return $title;
}
/**
* Вывод аватара пользователя в профиле
*/
function get_profile_avatar($user_id)
{
$content = avatar($user_id, 1, 128);
$avatar = str_replace('%content', $content, use_filters('ds_template_profile_avatar', '%content'));
return $avatar;
}
function get_profile_menu($menu)
{
$counter = use_filters('ds_template_profile_menu_counter', '<span class="counter">(%count)</span>');
$template = '<a href="%link" class="%class">%icon %title %count</span></a>';
$pre_html = array();
foreach($menu AS $key => $value)
{
if (!isset($value['template'])) {
$value['template'] = use_filters('ds_template_profile_menu_link', $template);
}
if (!isset($value['template'])) {
$value['template'] = use_filters('ds_template_profile_menu_link', $template);
}
$count = '';
if (isset($value['count'])) {
$count = str_replace('%count', $value['count'], $counter);
}
$keys = array('%title', '%link', '%count', '%class', '%icon');
$values = array($value['title'], $value['link'], $count, '', $value['icon']);
$pre_html[] = str_replace($keys, $values, $value['template']);
}
return join('', $pre_html);
}
/**
* Вывод меню пользователя в профиле
*/
function get_profile_media($user_id)
{
$menu['photos'] = array(
'link' => ds_site_url() . '/foto/' . $user_id . '/',
'title' => __('Фотографии'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/foto.png" alt="Photo" />',
'count' => db::count("SELECT COUNT(*) FROM `gallery_foto` WHERE `id_user` = '$user_id'"),
);
$menu['files'] = array(
'link' => ds_site_url() . '/user/personalfiles/' . $user_id . '/',
'title' => __('Файлы'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/files.gif" alt="Files" />',
'count' => db::count("SELECT COUNT(*) FROM `obmennik_files` WHERE `id_user` = '$user_id'"),
);
$menu['music'] = array(
'link' => ds_site_url() . '/music/' . $user_id . '/',
'title' => __('Музыка'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/foto.png" alt="Music" />',
'count' => db::count("SELECT COUNT(*) FROM `user_music` WHERE `id_user` = '$user_id'"),
);
return get_profile_menu(use_filters('get_profile_menu_media', $menu));
}
function get_profile_anketa($user_id)
{
$menu['anketa'] = array(
'link' => ds_site_url() . '/user/info/anketa.php?id=' . $user_id,
'title' => __('Анкета'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/anketa.gif" alt="Anketa" />',
);
return get_profile_menu(use_filters('get_profile_menu_anketa', $menu));
}
function get_profile_friends($user_id)
{
$menu['friends'] = array(
'link' => ds_site_url() . '/user/frends/?id=' . $user_id,
'title' => __('Друзья'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/druzya.png" alt="Friends" />',
'count' => db::count("SELECT COUNT(*) FROM `frends` WHERE `user` = '$user_id' AND `i` = '1'"),
);
return get_profile_menu(use_filters('get_profile_menu_friends', $menu));
}
function get_profile_action($user_id)
{
$ank = get_user($user_id);
$menu = array();
if (get_user_id() && $ank['id'] != get_user_id())
{
$menu['message'] = array(
'link' => ds_site_url() . '/mail.php?id=' . $user_id,
'title' => __('Написать сообщение'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/pochta.gif" alt="Message" />',
);
$frend = db::count("SELECT COUNT(*) FROM `frends` WHERE (`user` = '".get_user_id()."' AND `frend` = '$user_id') OR (`user` = '$user_id' AND `frend` = '".get_user_id()."') LIMIT 1");
$frend_new = db::count("SELECT COUNT(*) FROM `frends_new` WHERE (`user` = '".get_user_id()."' AND `to` = '$user_id') OR (`user` = '$user_id' AND `to` = '".get_user_id()."') LIMIT 1");
if ( $frend_new == 0 && $frend == 0 ) {
$menu['friends'] = array(
'link' => ds_site_url() . '/user/frends/create.php?add=' . $user_id,
'title' => __('Добавить в друзья'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/druzya.png" alt="Add Friend" />',
);
} elseif ( $frend_new == 1 ) {
$menu['friends'] = array(
'link' => ds_site_url() . '/user/frends/create.php?otm=' . $user_id,
'title' => __('Отменить заявку'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/druzya.png" alt="Add Friend" />',
);
} else {
$menu['friends'] = array(
'link' => ds_site_url() . '/user/frends/create.php?del=' . $user_id,
'title' => __('Удалить из друзей'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/druzya.png" alt="Add Friend" />',
);
}
}
elseif (is_user()) {
$menu['service'] = array(
'link' => ds_site_url() . '/user/money/',
'title' => __('Дополнительные услуги'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/uslugi.gif" alt="Service" />',
);
$menu['settings'] = array(
'link' => ds_site_url() . '/user/info/settings.php',
'title' => __('Мои настройки'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/settings.png" alt="Settings" />',
'template' => '<div class="ds-profile-group"><a href="%link" class="%class">%icon %title</span></a> | <a class="%class" href="' . ds_site_url() . '/umenu.php">' . __('Меню') . '</a></div>',
);
}
return get_profile_menu(use_filters('get_profile_menu_friends', $menu));
}
function get_profile_notify($user_id)
{
$counter = get_user_counters($user_id);
$menu['notification'] = array(
'link' => ds_site_url() . '/user/discussions/',
'title' => __('Обсуждения'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/chat.gif" alt="*" />',
);
$menu['discussions'] = array(
'link' => ds_site_url() . '/user/tape/',
'title' => __('Лента'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/lenta.gif" alt="*" />',
);
return get_profile_menu(use_filters('get_profile_menu_notify', $menu));
}
function get_profile_blog($user_id)
{
$menu['diary'] = array(
'link' => ds_site_url() . '/plugins/notes/user.php?id=' . $user_id,
'title' => __('Дневники'),
'icon' => '<img src="' . ds_site_url() . '/style/icons/zametki.gif" alt="Diary" />',
'count' => db::count("SELECT COUNT(*) FROM `notes` WHERE `id_user` = '$user_id'"),
);
return get_profile_menu(use_filters('get_profile_menu_blog', $menu));
}
/**
* Функция отвечает за вывод странички пользователя
*/
function ds_profile_view($user_id)
{
$ank = get_user($user_id);
// Зарегистрированные области
$boxes = get_profile_boxes();
/*
usort($boxes, "sort_position");
die();
*/
$pre_html = array();
foreach($boxes AS $box_id => $args)
{
// Шаблон блока области
$template = use_filters('ds_template_profile_box', '<div class="%class">%content</div>');
// Содержимое блока области
$box_content = get_profile_items($user_id, $box_id, $args);
if (!isset($args['class'])) {
$args['class'] = 'profile-box';
}
// Помещаем сформированный html в шаблон
if ($box_content) {
$pre_html[] = str_replace(array('%class', '%content'), array($args['class'], $box_content), $template);
}
}
echo join('', $pre_html);
}
/**
* Регистрируем стандартный профиля пользователя
*/
function ds_profile_load()
{
// Область заголовка и аватара
add_profile_box('ds_profile_head');
// Вывод ника и времени последнего посещения
add_profile_item('ds_profile_head', array(
'function' => 'get_profile_title',
'class' => 'ds-profile-title',
));
// Аватар пользователя
add_profile_item('ds_profile_head', array(
'function' => 'get_profile_avatar',
'class' => 'ds-profile-avatar',
));
// Область меню пользователя
add_profile_box('ds_profile_body');
// Анкета пользователя
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_anketa',
'class' => 'ds-profile-menu',
));
// Обсуждения и лента
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_notify',
'class' => 'ds-profile-menu',
));
// Друзья пользователя
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_friends',
'class' => 'ds-profile-menu',
));
// Вывод фото, файлы и музыки
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_media',
'class' => 'ds-profile-menu',
));
// Вывод дневников
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_blog',
'class' => 'ds-profile-menu',
));
// Вывод дневников, файлы и музыки
add_profile_item('ds_profile_body', array(
'function' => 'get_profile_action',
'class' => 'ds-profile-menu',
));
}