View file sys/inc/functions/ds-user.php

File size: 23.95Kb
<?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', 
    )); 
}