Проблема с SE (39 лет назад)

Тема в разделе "Как сделать...", создана пользователем vave, 29 мар 2009.

Статус темы:
Закрыта.
  1. vave

    vave

    Регистр.:
    23 июн 2007
    Сообщения:
    364
    Симпатии:
    14
    Когда регистрируется первый пользователь то время последнего обновление правильное, а когда создаются следующие пользователи то у всех в профайле пишется (39 лет назад)
    Пример ниже:
    [​IMG]

    Как это решить?
     
  2. mixamixa

    mixamixa Постоялец

    Регистр.:
    9 янв 2007
    Сообщения:
    61
    Симпатии:
    13
    А ты можешь код написать, который это делает?
    А то по скриншоту думаю сложновато решить проблему))
     
  3. vave

    vave

    Регистр.:
    23 июн 2007
    Сообщения:
    364
    Симпатии:
    14
    PHP:
        // THIS METHOD VERIFIES LOGIN COOKIES, SETS APPROPRIATE OBJECT VARIABLES, AND UPDATES LAST ACTIVE TIME
        // INPUT: 
        // OUTPUT: 
        
    function user_checkCookies()
      {
          global 
    $database$setting$admin;
        
        
    $session_object SESession::getInstance();
        
        
    // Ignore bots
        
    if( strpos($_SERVER['HTTP_USER_AGENT'], 'Googlebot')!==FALSE ) return;
        if( 
    strpos($_SERVER['HTTP_USER_AGENT'], 'msnbot')!==FALSE ) return;
        
        
    // Check if user exists
        
    $user_id    $session_object->get('user_id');
        
    $user_email $session_object->get('user_email');
        
    $user_pass  $session_object->get('user_pass');
        
        if( isset(
    $user_id) && isset($user_email) && isset($user_pass) )
        {
          
    // Only create if not already exists to help with caching
          
    if( !$this->user_exists )
          {
            
    $this->SEUser(Array($user_id));
          }
    Кажеться этот
     
  4. mixamixa

    mixamixa Постоялец

    Регистр.:
    9 янв 2007
    Сообщения:
    61
    Симпатии:
    13
    уже лучше..возможно этот код.
    только ты не предоставил весь код этой функции.
    в начале кода понятно только , что если пользователя не существует вызываем функцию SEUser();

    Если хочешь, чтобы тут помог(ли) тебе разобраться выложи побольше кода, который ты считаешь относится к проблеме.
     
  5. vave

    vave

    Регистр.:
    23 июн 2007
    Сообщения:
    364
    Симпатии:
    14
    конечно:)

    вот весь код
    PHP:
    <?php

    /* $Id: class_user.php 72 2009-02-27 01:59:11Z john $ */


    //
    //  THIS CLASS CONTAINS USER-RELATED METHODS.
    //  IT IS USED DURING THE CREATION, MODIFICATION AND DELETION OF A USER.
    //
    //  METHODS IN THIS CLASS:
    //    SEUser()
    //
    //    getLevelSettings()
    //    getUserSettings()
    //    getProfileCategoryInfo()
    //    getProfileValues()
    //
    //    user_displayname()
    //    user_displayname_update()
    //    user_settings()
    //    user_checkCookies()
    //    user_login()
    //    user_setcookies()
    //    user_clear()
    //    user_logout()
    //    user_account()
    //    user_password()
    //    user_subnet_select()
    //    user_lastupdate()
    //    user_photo()
    //    user_photo_upload()
    //    user_photo_delete()
    //    user_friend_total()
    //    user_friend_list()
    //    user_friend_add()
    //    user_friend_remove()
    //    user_friend_of_friend()
    //    user_friended()
    //    user_blocked()
    //    user_privacy_max()
    //    user_create()
    //    user_delete()
    //    user_message_total()
    //    user_message_list()
    //    user_message_send()
    //    user_message_delete_selected()
    //    user_message_cleanup()
    //    user_message_validate()
    //    user_message_view()
    //


    class SEUser
    {
        
    // INITIALIZE VARIABLES
        
    var $is_error;            // DETERMINES WHETHER THERE IS AN ERROR OR NOT, CONTAINS RELEVANT ERROR CODE
        
    var $user_exists;        // DETERMINES WHETHER WE ARE EDITING AN EXISTING USER OR NOT

        
    var $user_info;            // CONTAINS USER'S INFORMATION FROM SE_USERS TABLE
        
    var $profile_info;        // CONTAINS USER'S INFORMATION FROM SE_PROFILEVALUES TABLE
        
    var $level_info;        // CONTAINS USER'S INFORMATION FROM SE_LEVELS TABLE
        
    var $subnet_info;        // CONTAINS USER'S INFORMATION FROM SE_SUBNETS TABLE
        
    var $usersetting_info;        // CONTAINS USER'S INFORMATION FROM SE_USERSETTINGS TABLE
        
        
    var $user_salt;            // CONTAINS THE SALT USED TO ENCRYPT USER'S PASSWORD

        
    var $moderation_privacy;    // CONTAINS THE PRIVACY LEVEL THAT IS ALLOWED TO MODERATE FOR THIS USER

        
    var $session_info;    // CONTAINS THE PRIVACY LEVEL THAT IS ALLOWED TO MODERATE FOR THIS USER









      //
        // THIS METHOD SETS INITIAL VARS SUCH AS USER INFO AND LEVEL INFO
      //
        // INPUT:
      //    $user_unique (OPTIONAL) REPRESENTING AN ARRAY:
        //        $user_unique[0] REPRESENTS THE USER'S ID (user_id)
        //        $user_unique[1] REPRESENTS THE USER'S USERNAME (user_username)
        //        $user_unique[2] REPRESENTS THE USER'S EMAIL (user_email)
        //      $select_fields (OPTIONAL) REPRESENTING AN ARRAY:
        //        $select_fields[0] REPRESENTS THE FIELDS TO SELECT FROM THE SE_USERS TABLE
        //        $select_fields[1] REPRESENTS THE FIELDS TO SELECT FROM THE SE_PROFILEVALUES TABLE (QUERY WILL NOT RUN AT ALL IF VALUE IS LEFT BLANK)
        //        $select_fields[2] REPRESENTS THE FIELDS TO SELECT FROM THE SE_LEVELS TABLE (QUERY WILL NOT RUN AT ALL IF VALUE IS LEFT BLANK)
        //        $select_fields[3] REPRESENTS THE FIELDS TO SELECT FROM THE SE_SUBNETS TABLE (QUERY WILL NOT RUN AT ALL IF VALUE IS LEFT BLANK)
        //      
        // OUTPUT: 
      //    void
      //
      
        
    function SEUser($user_unique = Array('0'''''), $select_fields = Array('*''*''*''*'))
      {
          global 
    $database;
        
          
    // SET VARS
          
    $this->is_error 0;
          
    $this->user_exists 0;
          
    $this->user_info['user_id'] = 0;
          
    $this->user_info['user_subnet_id'] = 0;
          
    $this->moderation_privacy 1;
        
        
    $user_unique_id = ( !empty($user_unique[0]) ? $user_unique[0] : NULL );
        
    $user_unique_username = ( !empty($user_unique[1]) ? $user_unique[1] : NULL );
        
    $user_unique_email = ( !empty($user_unique[2]) ? $user_unique[2] : NULL );
          
          
    // VERIFY USER_ID/USER_USERNAME/USER_EMAIL IS VALID AND SET APPROPRIATE OBJECT VARIABLES
          
    if( $user_unique_id || $user_unique_username || $user_unique_email )
        {
            
    // SET USERNAME AND EMAIL TO LOWERCASE
            
    $user_username strtolower($user_unique_username);
            
    $user_email strtolower($user_unique_email);
          
            
    // SELECT USER USING SPECIFIED SELECTION PARAMETER
            
    $sql_array = array();
            if( !empty(
    $user_unique[0]) )
              
    $sql_array[] = "SELECT {$select_fields[0]} FROM se_users WHERE user_id='{$user_unique_id}' LIMIT 1";
          
            if( !empty(
    $user_unique[1]) )
              
    $sql_array[] = "SELECT {$select_fields[0]} FROM se_users WHERE LOWER(user_username)='{$user_username}' LIMIT 1";
          
            if( !empty(
    $user_unique[2]) )
              
    $sql_array[] = "SELECT {$select_fields[0]} FROM se_users WHERE LOWER(user_email)='{$user_email}' LIMIT 1";
          
            if( 
    count($sql_array)>)
              
    $sql '('.join(') UNION ('$sql_array).')';
            else
              
    $sql $sql_array[0];
          
            
    $user $database->database_query($sql);
            if(
    $database->database_num_rows($user) == 1)
          {
              
    $this->user_exists 1;
              
    $this->user_info $database->database_fetch_assoc($user);
            
              
    // SET USER SALT
              
    $this->user_salt $this->user_info['user_code'];
            
              
    // SET DISPLAY NAME (BACKWARDS COMPAT)
            //$this->user_displayname = $this->user_info['user_displayname'];
              
    $this->user_displayname();
            
              
    // SELECT PROFILE CATEGORY INFO
              
    if( !empty($this->user_info['user_profilecat_id']) )
              
    $this->profilecat_info =& SEUser::getProfileCategoryInfo($this->user_info['user_profilecat_id']);
              
    //if(isset($this->user_info[user_profilecat_id])) { $this->profilecat_info = $database->database_fetch_assoc($database->database_query("SELECT profilecat_id, profilecat_title FROM se_profilecats WHERE profilecat_id=".$this->user_info[user_profilecat_id]." LIMIT 1")); }
            
              // SELECT PROFILE INFO
              
    if( !empty($select_fields[1]) )
              
    $this->profile_info =& SEUser::getProfileValues($this->user_info['user_id']);
              
    //if($select_fields[1] != "") { $this->profile_info = $database->database_fetch_assoc($database->database_query("SELECT $select_fields[1] FROM se_profilevalues WHERE profilevalue_user_id='".$this->user_info[user_id]."'")); }
            
              // SELECT LEVEL INFO
              
    if( !empty($select_fields[2]) )
              
    $this->level_info =& SEUser::getLevelSettings($this->user_info['user_level_id']);
              
    //if($select_fields[2] != "") { $this->level_info = $database->database_fetch_assoc($database->database_query("SELECT * FROM se_levels WHERE level_id='".$this->user_info[user_level_id]."'")); }
            
            // GET USER SETTINGS
            
    $this->usersetting_info =& SEUser::getUserSettings($this->user_info['user_id']);
            
            
              
    // SELECT SUBNET INFO
              
    if( $this->user_info['user_subnet_id'] )
            {
                if( !empty(
    $select_fields[3]) )
                
    $this->subnet_info =& SECore::getSubnetworkInfo($this->user_info['user_subnet_id']);
                
    //if($select_fields[3] != "") { $this->subnet_info = $database->database_fetch_assoc($database->database_query("SELECT subnet_id, subnet_name FROM se_subnets WHERE subnet_id='".$this->user_info[user_subnet_id]."'")); }
              
    }
            else
            {
                
    $this->subnet_info['subnet_id'] = 0;
              
    $this->subnet_info['subnet_name'] = 152;
              }
              
    SE_Language::_preload($this->subnet_info['subnet_name']);
            }
          }
        }
      
      
    // END SEUser() METHOD







      
    function &getLevelSettings($level_id)
      {
        static 
    $level_settings;
        
        if( !
    is_array($level_settings) ) $level_settings = array();
        
        if( !isset(
    $level_settings[$level_id]) )
        {
          
    $cache SECache::getInstance('serial', array('lifetime' => 3600));
          
          
    // Get from cache
          
    if( is_object($cache) )
          {
            
    $level_settings[$level_id] = $cache->get('site_level_settings_'.$level_id);
          }
          
          
    // Get from database
          
    if( !is_array($level_settings[$level_id]) )
          {
            
    $database SEDatabase::getInstance();
            
    $resource $database->database_query("SELECT * FROM se_levels WHERE level_id='{$level_id}' LIMIT 1");
            
    $level_settings[$level_id] = $database->database_fetch_assoc($resource);
            
            
    // Store in cache
            
    if( is_object($cache) )
            {
              
    $cache->store($level_settings[$level_id], 'site_level_settings_'.$level_id);
            }
          }
        }
        
        return 
    $level_settings[$level_id];
      }







      function &
    getUserSettings($user_id)
      {
        static 
    $user_settings;
        
        if( !
    is_array($user_settings) ) $user_settings = array();
        
        if( !isset(
    $user_settings[$user_id]) )
        {
          
    $cache SECache::getInstance('serial', array('lifetime' => 3600));
          
          
    // Get from cache
          
    if( is_object($cache) )
          {
            
    $user_settings[$user_id] = $cache->get('site_user_settings_'.$user_id);
          }
          
          
    // Get from database
          
    if( !is_array($user_settings[$user_id]) )
          {
            
    $database SEDatabase::getInstance();
            
    $resource $database->database_query("SELECT * FROM se_usersettings WHERE usersetting_user_id='{$user_id}' LIMIT 1");
            
    $user_settings[$user_id] = $database->database_fetch_assoc($resource);
            
            
    // Store in cache
            
    if( is_object($cache) )
            {
              
    $cache->store($user_settings[$user_id], 'site_user_settings_'.$user_id);
            }
          }
        }
        
        return 
    $user_settings[$user_id];
      }







      function &
    getProfileCategoryInfo($profilecat_id)
      {
        static 
    $profile_cats;
        
        if( !
    is_array($profile_cats) ) $profile_cats = array();
        
        if( !isset(
    $profile_cats[$profilecat_id]) )
        {
          
    $cache SECache::getInstance('serial', array('lifetime' => 3600));
          
          
    // Get from cache
          
    if( is_object($cache) )
          {
            
    $profile_cats[$profilecat_id] = $cache->get('site_profile_categories_'.$profilecat_id);
          }
          
          
    // Get from database
          
    if( !is_array($profile_cats[$profilecat_id]) )
          {
            
    $database SEDatabase::getInstance();
            
    $resource $database->database_query("SELECT profilecat_id, profilecat_title FROM se_profilecats WHERE profilecat_id='{$profilecat_id}' LIMIT 1");
            
    $profile_cats[$profilecat_id] = $database->database_fetch_assoc($resource);
            
            
    // Store in cache
            
    if( is_object($cache) )
            {
              
    $cache->store($profile_cats[$profilecat_id], 'site_profile_categories_'.$profilecat_id);
            }
          }
        }
        
        return 
    $profile_cats[$profilecat_id];
      }







      function &
    getProfileValues($user_id)
      {
        static 
    $user_profiles;
        
        if( !
    is_array($user_profiles) ) $user_profiles = array();
        
        if( !isset(
    $user_profiles[$user_id]) )
        {
          
    $cache SECache::getInstance('serial', array('lifetime' => 3600));
          
          
    // Get from cache
          
    if( is_object($cache) )
          {
            
    $user_profiles[$user_id] = $cache->get('site_user_profiles_'.$user_id);
          }
          
          
    // Get from database
          
    if( !is_array($user_profiles[$user_id]) )
          {
            
    $database SEDatabase::getInstance();
            
    $resource $database->database_query("SELECT * FROM se_profilevalues WHERE profilevalue_user_id='{$user_id}' LIMIT 1");
            
    $user_profiles[$user_id] = $database->database_fetch_assoc($resource);
            
            
    // Store in cache
            
    if( is_object($cache) )
            {
              
    $cache->store($user_profiles[$user_id], 'site_user_profiles_'.$user_id);
            }
          }
        }
        
        return 
    $user_profiles[$user_id];
      }







      
      
    //
        // THIS METHOD SETS A USER'S DISPLAY NAME
      //
        // INPUT:
      //    void
      //
        // OUTPUT: 
      //    void
      //
      
        
    function user_displayname()
      {
          
    // SET DISPLAY NAME
        
    if( !empty($this->user_info['user_displayname']) && trim($this->user_info['user_displayname']) )
          
    $this->user_displayname $this->user_info['user_displayname'];
        elseif( !empty(
    $this->user_info['user_fname']) && !empty($this->user_info['user_lname']) && trim($this->user_info['user_fname']) && trim($this->user_info['user_lname']) )
          
    $this->user_info['user_displayname'] = $this->user_displayname $this->user_info['user_fname'].' '.$this->user_info['user_lname'];
        elseif( !empty(
    $this->user_info['user_fname']) && trim($this->user_info['user_fname']) )
          
    $this->user_info['user_displayname'] = $this->user_displayname $this->user_info['user_fname'];
        elseif( !empty(
    $this->user_info['user_lname']) && trim($this->user_info['user_lname']) )
          
    $this->user_info['user_displayname'] = $this->user_displayname $this->user_info['user_lname'];
        elseif( !empty(
    $this->user_info['user_username']) && trim($this->user_info['user_username']) )
          
    $this->user_info['user_displayname'] = $this->user_displayname $this->user_info['user_username'];
        else
          
    $this->user_info['user_displayname'] = $this->user_displayname $this->user_info['user_id'];
        
        
    $this->user_displayname_short = ( !empty($this->user_info['user_fname']) && trim($this->user_info['user_fname']) ? $this->user_info['user_fname'] : $this->user_info['user_username'] );
        }
      
      
    // END user_displayname() METHOD








      //
        // THIS METHOD UPDATES A USER'S DISPLAY NAME IN THE DATABASE
      //
        // INPUT:
      //    $mode   - Denotes the method used to generate the displayname
      //
        // OUTPUT: 
      //    void
      //
      
        
    function user_displayname_update($user_fname=NULL$user_lname=NULL)
      {
        global 
    $setting$database;
        
        
    // Check user exists and allowed method
        
    if( !$this->user_exists || (!$user_fname && !$user_lname) ) return;
        
        if( empty(
    $this->usersetting_info) ) $this->user_settings();
        
        
    $delimiter '';
        
    $user_displayname '';
        
    $user_fname trim((string)$user_fname);
        
    $user_lname trim((string)$user_lname);
        
        switch( (int)
    $this->usersetting_info['usersetting_displayname_method'] )
        {
          
    // {First name} {Last name}
          
    case 1:
          default:
            if( 
    $user_fname && $user_lname $delimiter ' ';
            
    $user_displayname $user_fname.$delimiter.$user_lname;
          break;
          
          
    // {Last name} {First name}
          
    case 2:
            if( 
    $user_fname && $user_lname $delimiter ' ';
            
    $user_displayname $user_lname.$delimiter.$user_fname;
          break;
          
          
    // {Last name}, {First name}
          
    case 3:
            if( 
    $user_fname && $user_lname $delimiter ', ';
            
    $user_displayname $user_lname.$delimiter.$user_fname;
          break;
          
          
    // {Last name}
          
    case 4:
            
    $user_displayname $user_lname;
          break;
          
          
    // {First name}
          
    case 5:
            
    $user_displayname $user_fname;
          break;
          
          
    // Custom (TODO)
          
    case 6:
            
    $user_displayname sprintf($setting['setting_displayname_method_custom'], $user_fname$user_lname);
          break;
        }
        
        
    // Fallback to username or user id
        
    if( !$user_displayname && $user_username )
          
    $user_displayname $this->user_info['user_username'];
        elseif( !
    $user_displayname )
          
    $user_displayname $this->user_info['user_id'];
        
        
    // Update the current user object?
        
    $this->user_info['user_displayname'] = $this->user_displayname $user_displayname;
        
        
    // Update database
        
    $sql "UPDATE se_users SET user_displayname='".addslashes($user_displayname)."' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1";
        
    $database->database_query($sql);
        }
      
      
    // END user_displayname_update() METHOD








      //
        // THIS METHOD POPULATES THE USERSETTING VARIABLE
      //
        // INPUT:
      //    $select_fields (OPTIONAL) REPRESENTING THE FIELDS TO SELECT FROM THE USERSETTINGS TABLE
      //
        // OUTPUT: 
      //    void
      //
      
        
    function user_settings($select_fields "*")
      {
          global 
    $database;
        
          
    $this->usersetting_info =& SEUser::getUserSettings($this->user_info['user_id']);
          
    //$this->usersetting_info = $database->database_fetch_assoc($database->database_query("SELECT $select_fields FROM se_usersettings WHERE usersetting_user_id='".$this->user_info[user_id]."'"));
        
    }
      
      
    // END user_settings() METHOD








        // THIS METHOD VERIFIES LOGIN COOKIES, SETS APPROPRIATE OBJECT VARIABLES, AND UPDATES LAST ACTIVE TIME
        // INPUT: 
        // OUTPUT: 
        
    function user_checkCookies()
      {
          global 
    $database$setting$admin;
        
        
    $session_object SESession::getInstance();
        
        
    // Ignore bots
        
    if( strpos($_SERVER['HTTP_USER_AGENT'], 'Googlebot')!==FALSE ) return;
        if( 
    strpos($_SERVER['HTTP_USER_AGENT'], 'msnbot')!==FALSE ) return;
        
        
    // Check if user exists
        
    $user_id    $session_object->get('user_id');
        
    $user_email $session_object->get('user_email');
        
    $user_pass  $session_object->get('user_pass');
        
        if( isset(
    $user_id) && isset($user_email) && isset($user_pass) )
        {
          
    // Only create if not already exists to help with caching
          
    if( !$this->user_exists )
          {
            
    $this->SEUser(Array($user_id));
          }
          
            
    // VERIFY USER EXISTS, LOGIN COOKIE VALUES ARE CORRECT, AND EMAIL HAS BEEN VERIFIED - ELSE RESET USER CLASS
            
    switch( TRUE )
          {
            case ( !
    $this->user_exists ):
            case ( 
    $user_email != $this->user_password_crypt($this->user_info['user_email']) ):
            case ( 
    $user_pass != $this->user_info['user_password'] ):
            case ( !
    $this->user_info['user_verified'] && $setting['setting_signup_verify'] ):
            case ( !
    $this->user_info['user_enabled'] && (!is_object($admin) || !$admin->admin_exists) ):
              
    $this->user_clear();
            break;
            }
          
          
    // MIGHT REMOVE THIS IN FAVOR OF SESSIONS?
          
    if( $this->user_exists && time()>$this->user_info['user_lastactive']+600 )
          {
            
    $time_current time();
            
    $database->database_query("UPDATE se_users SET user_lastactive='{$time_current}', user_ip_lastactive='{$_SERVER['REMOTE_ADDR']}' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
          }
          }
        
        
        
        
    // VISITOR HANDLING (ONLY UPDATE ONCE EVERY TWO MINUTES
        
    $user_lastactive $session_object->get('user_lastactive');
        
        
    //if( empty($_COOKIE['se_user_lastactive']) || ($_COOKIE['se_user_lastactive'] < time() - 120) )
        //{
        
    if( empty($user_lastactive) || ($user_lastactive time() - 120) )
        {
          
    $visitor_ip ip2long($_SERVER['REMOTE_ADDR']);
          
    $visitor_browser addslashes(substr($_SERVER['HTTP_USER_AGENT'], 0255));
          
    $visitor_lastactive time();
          
    $visitor_invisible = (bool) ( $this->user_exists && $this->user_info['user_invisible'] );
          
          
    $visitor_user_id = ( $this->user_exists $this->user_info['user_id'] : '0' );
          
    $visitor_user_username = ( $this->user_exists "'".addslashes($this->user_info['user_username'])."'" 'NULL' );
          
    $visitor_user_displayname = ( $this->user_exists "'".addslashes($this->user_displayname)."'" 'NULL' );
          
          
          
    $sql "
            INSERT INTO se_visitors (
              visitor_ip,
              visitor_browser,
              visitor_lastactive,
              visitor_invisible,
              visitor_user_id,
              visitor_user_username,
              visitor_user_displayname
            ) VALUES (
              '
    {$visitor_ip}',
              '
    {$visitor_browser}',
              '
    {$visitor_lastactive}',
              '
    {$visitor_invisible}',
              '
    {$visitor_user_id}',
              
    {$visitor_user_username}, /* PRE-QUOTED */
              
    {$visitor_user_displayname} /* PRE-QUOTED */
            ) ON DUPLICATE KEY UPDATE
              visitor_lastactive='
    {$visitor_lastactive}' /* ,
              visitor_user_id='
    {$visitor_user_id}',
              visitor_user_username='
    {$visitor_user_username}',
              visitor_user_displayname='
    {$visitor_user_displayname}'
              */
          "
    ;
          
          
    $database->database_query($sql);
          
          
    // UPDATE USER LAST ACTIVE IF LOGGED IN
          
    if( $this->user_exists )
          {
            
    $sql "UPDATE se_users SET user_lastactive='{$visitor_lastactive}', user_ip_lastactive='{$_SERVER['REMOTE_ADDR']}' WHERE user_id='{$visitor_user_id}' LIMIT 1";
            
    $database->database_query($sql);
          }
          
          
    $session_object->set('user_lastactive'$visitor_lastactive);
          
    //setcookie("se_user_lastactive", , 0, "/");
        
    }
        
        
        
    // REMOVE OLD VISITORS (20% chance)
        
    if( rand(1,100)<20 )
        {
          
    $removal_limit time() - 600;
          
    $sql "DELETE FROM se_visitors WHERE visitor_lastactive<'{$removal_limit}'";
          
    $database->database_query($sql);
        }
        }
      
      
    // END user_checkCookies() METHOD








        // THIS METHOD TRIES TO LOG A USER IN IF THERE IS NO ERROR
        // INPUT: $email REPRESENTING THE LOGIN EMAIL
        //      $password REPRESENTING THE LOGIN PASSWORD
        //      $javascript_disabled (OPTIONAL) A BOOLEAN REPRESENTING WHETHER JAVASCRIPT IS DISABLED OR NOT
        //      $persistent (OPTIONAL) A BOOLEAN SPECIFYING WHETHER COOKIES SHOULD BE PERSISTENT OR NOT
        // OUTPUT: 
        
    function user_login($email$password$javascript_disabled 0$persistent 0)
      {
          global 
    $database$setting;
        
          
    $this->SEUser(Array(0""$email));
        
          
    $current_time time();
          
    $login_result 0;
        
          
    // SHOW ERROR IF JAVASCRIPT IS DIABLED
          
    if( $javascript_disabled )
        {
            
    $this->is_error 31;
        }
        
          
    // SHOW ERROR IF NO USER ROW FOUND
          
    elseif($this->user_exists == 0)
        {
            
    $this->is_error 676;
        }
        
          
    // VALIDATE PASSWORD
          
    elseif( !trim($password) || $this->user_password_crypt($password) != $this->user_info['user_password'] )
        {
            
    $this->is_error 676;
          }
        
          
    // CHECK IF USER IS ENABLED
          
    elseif( !$this->user_info['user_enabled'] )
        {
            
    $this->is_error 677;
        }
        
          
    // CHECK IF EMAIL IS VERIFIED
          
    elseif( !$this->user_info['user_verified'] && $setting['setting_signup_verify'] )
        {
            
    $this->is_error 678;
          }
        
          
    // INITIATE LOGIN AND ENCRYPT COOKIES
          
    else
        {
            
    // SET LOGIN RESULT VAR
            
    $login_result TRUE;
          
            
    // UPDATE USER LOGIN INFO
            
    $database->database_query("UPDATE se_users SET user_lastlogindate='{$current_time}', user_logins=user_logins+1, user_lastactive='{$current_time}', user_ip_lastactive='{$_SERVER['REMOTE_ADDR']}' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
          
            
    // LOG USER IN
            
    $this->user_setcookies($persistent);
          
          
    // FIX VISITOR TABLE
          
    $visitor_ip ip2long($_SERVER['REMOTE_ADDR']);
          
    $visitor_browser addslashes(substr($_SERVER['HTTP_USER_AGENT'], 0255));
          
    $sql "DELETE FROM se_visitors WHERE visitor_ip='{$visitor_ip}' && visitor_browser='{$visitor_browser}' && visitor_user_id='0'";
          
    $database->database_query($sql);
          
    setcookie("se_user_lastactive"time() - 36000"/");
          
            
    // UPDATE LOGIN STATS
            
    update_stats("logins");
          }
        
          
    // BUMP LOG
          
    $database->database_query("INSERT INTO se_logins (login_email, login_date, login_ip, login_result) VALUES ('{$email}', '{$current_time}', '{$_SERVER['REMOTE_ADDR']}', '{$login_result}')");
          
    bumplog();
        }
      
      
    // END user_login() METHOD







      
      //
        // THIS METHOD SETS USER LOGIN COOKIES
      //
        // INPUT:
      //    $persistent (OPTIONAL) REPRESENTING WHETHER THE COOKIES SHOULD BE PERSISTENT OR NOT
      //
        // OUTPUT: 
      //    void
      //
      
        
    function user_setcookies($persistent 0)
      {
        
    // TODO: PERSISTENT
        
    $session_object SESession::getInstance();
        
        
    $user_id = ( !empty($this->user_info['user_id']) ? $this->user_info['user_id'] : '' );
        
    $user_email = ( !empty($this->user_info['user_email']) ? $this->user_password_crypt($this->user_info['user_email']) : '' );
        
    $user_password = ( !empty($this->user_info['user_password']) ? $this->user_info['user_password'] : '' );
        
        
    $cookie_lifetime = ( $persistent 99999999 );
        
    $cookie    =    session_get_cookie_params();
        
    session_set_cookie_params($cookie_lifetime$cookie['path'], $cookie['domain'], $cookie['secure']);
        
        
    //$session_object->restart();
        
        
    $session_object->set('user_id'$user_id);
        
    $session_object->set('user_email'$user_email);
        
    $session_object->set('user_pass'$user_password);
        }
      
      
    // END user_setcookies() METHOD








        // THIS METHOD CLEARS ALL THE CURRENT OBJECT VARIABLES
        // INPUT:
        // OUTPUT:
      
        
    function user_clear()
      {
          
    $this->is_error FALSE;
          
    $this->user_exists FALSE;
        
          
    $this->user_info = array();
          
    $this->profile_info = array();
          
    $this->level_info = array();
          
    $this->subnet_info = array();
        
          
    $this->new_pms_total 0;
          
    $this->friend_requests_total 0;
        }
      
      
    // END user_clear() METHOD








        // THIS METHOD LOGS A USER OUT
        // INPUT:
        // OUTPUT:
      
        
    function user_logout()
      {
          global 
    $database;
        
        
    $session_object SESession::getInstance();
        
          
    // CLEAR LAST ACTIVITY DATE
          
    $database->database_query("DELETE FROM se_visitors WHERE visitor_user_id='{$this->user_info['user_id']}'");
        
    $session_object->clear('se_user_lastactive');
        
          
    // CREATE PLAINTEXT USER EMAIL COOKIE WHILE LOGGED OUT
          
    setcookie("prev_email"$this->user_info['user_email'], time()+99999999"/");
        
          
    $this->user_clear();
          
    $this->user_setcookies();
        }
      
      
    // END user_logout() METHOD









        // THIS METHOD VALIDATES USER ACCOUNT INPUT
        // INPUT: $email REPRESENTING THE DESIRED EMAIL
        //      $username REPRESENTING THE DESIRED USERNAME
        // OUTPUT: 
      
        
    function user_account($email$username)
      {
          global 
    $database$setting;

          
    // MAKE SURE FIELDS ARE FILLED OUT
          
    if( !trim($email) || (!trim($username) && $setting['setting_username']))
          
    $this->is_error 51;
        
          
    // MAKE SURE USERNAME IS ALPHANUMERIC
          
    if( ereg('[^A-Za-z0-9]'$username) && $setting['setting_username'] )
          
    $this->is_error 694;
        
          
    // MAKE SURE USERNAME IS NOT BANNED
          
    $banned_usernames explode(","strtolower($setting['setting_banned_usernames']));
          if( 
    in_array(strtolower($username), $banned_usernames) && trim($username) && $setting['setting_username'] )
          
    $this->is_error 695;
        
          
    // MAKE SURE USERNAME IS NOT RESERVED
          
    if( is_dir($username) && $setting['setting_username'] )
          
    $this->is_error 696;
        
          
    // MAKE SURE EMAIL IS NOT BANNED
          
    $banned_emails explode(","strtolower($setting['setting_banned_emails']));
          
    $wildcard_ban "*".strstr(strtolower($email), "@");
        
        if( 
    trim($email) && in_array(strtolower($email), $banned_emails) )
          
    $this->is_error 697;
        
        if( 
    trim($email) && in_array(strtolower($wildcard_ban), $banned_emails) )
          
    $this->is_error 697;
        
          
    // MAKE SURE EMAIL IS VALID
          
    if( !is_email_address($email) )
          
    $this->is_error 698;
        
          
    // MAKE SURE USERNAME IS UNIQUE
          
    $lowercase_username strtolower($username);
        if( 
    $setting['setting_username'] && strtolower($this->user_info['user_username']) != $lowercase_username )
        {
          
    $username_query $database->database_query("SELECT user_username FROM se_users WHERE LOWER(user_username)='{$lowercase_username}' LIMIT 1");
          if( 
    $database->database_num_rows($username_query) )
            
    $this->is_error 699;
        }
        
          
    // MAKE SURE EMAIL IS UNIQUE
          
    $lowercase_email strtolower($email);
        if( 
    strtolower($this->user_info['user_email']) != $lowercase_email )
        {
          
    $email_query $database->database_query("SELECT user_email FROM se_users WHERE LOWER(user_email)='{$lowercase_email}' LIMIT 1");  
          if( 
    $database->database_num_rows($email_query) )
            
    $this->is_error 700;
        }
        }
      
      
    // END user_account() METHOD









        // THIS METHOD VALIDATES USER PASSWORD INPUT
        // INPUT: $password_old REPRESENTING THE EXISTING PASSWORD
        //      $password REPRESENTING THE DESIRED PASSWORD
        //      $password_confirm REPRESENTING THE PASSWORD CONFIRMATION FIELD
        //      $check_old (OPTIONAL) REPRESENTING WHETHER THE OLD PASSWORD SHOULD BE VERIFIED OR NOT
        // OUTPUT: 
      
        
    function user_password($password_old$password$password_confirm$check_old 1)
      {
          
    // CHECK FOR EMPTY PASSWORDS
          
    if( !trim($password) || !trim($password_confirm) || ($check_old && !trim($password_old)) )
          
    $this->is_error 51;
        
          
    // CHECK FOR OLD PASSWORD MATCH
          
    if( $check_old && $this->user_password_crypt($password_old) != $this->user_info['user_password'] )
          
    $this->is_error 701;
        
          
    // MAKE SURE BOTH PASSWORDS ARE IDENTICAL
          
    if( $password != $password_confirm )
          
    $this->is_error 702;
        
          
    // MAKE SURE PASSWORD IS LONGER THAN 5 CHARS
          
    if( trim($password) && strlen($password) < )
          
    $this->is_error 703;
        
          
    // MAKE SURE PASSWORD IS ALPHANUMERIC
          
    if( ereg('[^A-Za-z0-9]'$password) )
          
    $this->is_error 704;
        }
      
      
    // END user_password() METHOD









        // THIS METHOD ENCRYPTS A USERS PASsWORD
        // INPUT: UNENCRYPTED PASSWORD
        // OUTPUT: ENCRYPTED PASSWORD
      
        
    function user_password_crypt($user_password)
      {
        global 
    $setting;
        
        if( !
    $this->user_exists )
        {
          
    $method $setting['setting_password_method'];
          
    $this->user_salt randomcode($setting['setting_password_code_length']);
        }
        
        else
        {
          
    $method $this->user_info['user_password_method'];
        }
        
        
    // For new methods
        
    if( $method>)
        {
          if( !empty(
    $this->user_salt) )
          {
            list(
    $salt1$salt2) = str_split($this->user_saltceil(strlen($this->user_salt) / 2));
            
    $salty_password $salt1.$user_password.$salt2;
          }
          else
          {
            
    $salty_password $user_password;
          }
        }
        
        switch( 
    $method )
        {
          
    // crypt()
          
    default:
          case 
    0:
            
    $user_password_crypt crypt($user_password'$1$'.str_pad(substr($this->user_salt08), 8'0'STR_PAD_LEFT).'$');
          break;
          
          
    // md5()
          
    case 1:
            
    $user_password_crypt md5($salty_password);
          break;
          
          
    // sha1()
          
    case 2:
            
    $user_password_crypt sha1($salty_password);
          break;
          
          
    // crc32()
          
    case 3:
            
    $user_password_crypt sprintf("%u"crc32($salty_password));
          break;
        }
        
        return 
    $user_password_crypt;
      }
      
      
    // END user_password_crypt() METHOD








        // THIS METHOD RETURNS A SUBNETWORK ID DEPENDENT ON GIVEN INPUTS
        // INPUT: $email (OPTIONAL) REPRESENTING THE USER'S EMAIL 
        //      $category (OPTIONAL) REPRESENTING THE USER'S PROFILE CATEGORY
        //      $profile_info (OPTIONAL) REPRESENTING THE USER'S PROFILE INFO
        // OUTPUT: RETURNS AN ARRAY CONTAINING THE SUBNETWORK ID AND RESULT STRINGS
        
    function user_subnet_select($email ""$category ""$profile_info "")
      {
          global 
    $database$datetime$setting;
        
          
    // SET DEFAULTS
          
    if( !$email $email $this->user_info['user_email'];
          if( !
    $category $category $this->user_info['user_profilecat_id'];
          if( !
    $profile_info $profile_info $this->profile_info;
        
        
    $subnet_id = ( $this->user_info['user_subnet_id'] ? $this->user_info['user_subnet_id'] : );
        
          
    // DETERMINE USER'S PRIMARY SUBNETWORK FIELD VALUE
          
    $field1_val "";
          switch(
    $setting['setting_subnet_field1_id'])
        {
            case -
    2: break;
            case -
    1$field1_val $category; break;
            case 
    0$field1_val $email; break;
            default:
              
    $field1 $database->database_query("SELECT profilefield_id AS field_id, profilefield_special AS field_special FROM se_profilefields WHERE profilefield_id='{$setting['setting_subnet_field1_id']}'");
              if( 
    $database->database_num_rows($field1) )
            {
                
    $field1_info $database->database_fetch_assoc($field1);
                if( 
    $field1_info['field_special'] == )
              {
                  
    $field1_val $datetime->age($profile_info["profilevalue_".$field1_info['field_id']]);
                }
              else
              {
                  
    $field1_val $profile_info["profilevalue_".$field1_info['field_id']];
                }
              }
          }
        
          
    // DETERMINE USER'S SECONDARY SUBNETWORK FIELD VALUE
          
    $field2_val "";
          switch(
    $setting['setting_subnet_field2_id'])
        {
            case -
    2: break;
            case -
    1$field2_val $category; break;
            case 
    0$field2_val $email; break;
            default:
              
    $field2 $database->database_query("SELECT profilefield_id AS field_id, profilefield_special AS field_special FROM se_profilefields WHERE profilefield_id='{$setting['setting_subnet_field2_id']}'");
              if( 
    $database->database_num_rows($field2) )
            {
                
    $field2_info $database->database_fetch_assoc($field2);
                if(
    $field2_info['field_special'] == 1)
              {
                  
    $field2_val $datetime->age($profile_info["profilevalue_".$field2_info['field_id']]);
                }
              else
              {
                  
    $field2_val $profile_info["profilevalue_".$field2_info['field_id']];
                }
              }
          }
        
          
    // IF FIELD VALUES NOT EMPTY, RUN QUERY
          
    if( $field1_val )
        {
            
    // SET NUMERICAL VALUES
            
    $field1_val_num "'{$field1_val}'";
            
    $field2_val_num "'{$field2_val}'";
            if(
    is_numeric($field1_val)) { $field1_val_num str_replace(" """$field1_val); }
            if(
    is_numeric($field2_val)) { $field2_val_num str_replace(" """$field2_val); }
          
            
    // SET SUBNETWORK QUERY
            
    $subnet_query "SELECT subnet_id, subnet_name FROM se_subnets WHERE
            ( 
              (subnet_field1_qual='==' AND '
    {$field1_val}' LIKE REPLACE(subnet_field1_value, '*', '%')) OR
              (subnet_field1_qual='!=' AND '
    {$field1_val}' NOT LIKE REPLACE(subnet_field1_value, '*', '%')) OR
              (subnet_field1_qual='>' AND subnet_field1_value<'
    {$field1_val_num}') OR
              (subnet_field1_qual='<' AND subnet_field1_value>'
    {$field1_val_num}') OR
              (subnet_field1_qual='>=' AND subnet_field1_value<='
    {$field1_val_num}') OR
              (subnet_field1_qual='<=' AND subnet_field1_value>='
    {$field1_val_num}') OR
              (subnet_field1_qual='' AND subnet_field1_value='')
            ) AND (
              (subnet_field2_qual='==' AND '
    {$field2_val}' LIKE REPLACE(subnet_field2_value, '*', '%')) OR
              (subnet_field2_qual='!=' AND '
    {$field2_val}' NOT LIKE REPLACE(subnet_field2_value, '*', '%')) OR
              (subnet_field2_qual='>' AND subnet_field2_value<'
    {$field2_val_num}') OR
              (subnet_field2_qual='<' AND subnet_field2_value>'
    {$field2_val_num}') OR
              (subnet_field2_qual='>=' AND subnet_field2_value<='
    {$field2_val_num}') OR
              (subnet_field2_qual='<=' AND subnet_field2_value>='
    {$field2_val_num}') OR
              (subnet_field2_qual='' AND subnet_field2_value='')
            ) LIMIT 1"
    ;
          
            
    // RUN SUBNETWORK QUERY AND FIND USER'S SUBNETWORK ID
            
    $subnet $database->database_query($subnet_query);
            if( 
    $database->database_num_rows($subnet) )
          { 
              
    $subnet_info $database->database_fetch_assoc($subnet);
              
    $subnet_id $subnet_info['subnet_id']; 
            }
          else
          {
              
    $subnet_id 0;
            }
          }
        
          
    // IF SUBNETWORK CHANGED, ADD NOTE
          
    if( $subnet_id != $this->user_info['user_subnet_id'] )
        {
          
    $new_subnet = ( $subnet_id $subnet_info['subnet_name'] : 152 );
          }
        
          return Array(
    $subnet_id$new_subnet$this->subnet_info['subnet_name']);
        }
      
      
    // END user_subnet_select() METHOD








        // THIS METHOD UPDATES THE USER'S LAST UPDATE DATE
        // INPUT: 
        // OUTPUT: 
      
        
    function user_lastupdate()
      {
          global 
    $database;
        
          
    $database->database_query("UPDATE se_users SET user_dateupdated='".time()."' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
        }
      
      
    // END user_lastupdate() METHOD








        // THIS METHOD OUTPUTS THE PATH TO THE USER'S PHOTO OR THE GIVEN NOPHOTO IMAGE
        // INPUT: $nophoto_image (OPTIONAL) REPRESENTING THE PATH TO AN IMAGE TO OUTPUT IF NO PHOTO EXISTS
        //      $thumb (OPTIONAL) REPRESENTING WHETHER TO RETRIEVE THE SQUARE THUMBNAIL OR NOT
        // OUTPUT: A STRING CONTAINING THE PATH TO THE USER'S PHOTO
      
        
    function user_photo($nophoto_image ""$thumb FALSE)
      {
          global 
    $url;
        
        
    //if( !$user->user_exists || !$this->user_info['user_photo'] )
        
    if( !$this->user_info['user_photo'] )
          return 
    $nophoto_image;
        
          
    $user_photo $url->url_userdir($this->user_info['user_id']).$this->user_info['user_photo'];
          if( 
    $thumb )
        { 
            
    $user_thumb substr($user_photo0strrpos($user_photo"."))."_thumb".substr($user_photostrrpos($user_photo".")); 
            if( 
    file_exists($user_thumb) )
            return 
    $user_thumb;
          }
        
          if( 
    file_exists($user_photo) )
          return 
    $user_photo;
        
          return 
    $nophoto_image;
        }
      
      
    // END user_photo() METHOD








        // THIS METHOD UPLOADS A USER PHOTO ACCORDING TO SPECIFICATIONS AND RETURNS USER PHOTO
        // INPUT: $photo_name REPRESENTING THE NAME OF THE FILE INPUT
        // OUTPUT: 
      
        
    function user_photo_upload($photo_name)
      {
          global 
    $database$url;
        
          
    // ENSURE USER DIRECTORY IS ADDED
          
    $user_directory $url->url_userdir($this->user_info['user_id']);
          
    $user_path_array explode("/"$user_directory);
          
    array_pop($user_path_array);
          
    array_pop($user_path_array);
          
    $subdir implode("/"$user_path_array)."/";
          if( !
    is_dir($subdir) )
        { 
            
    mkdir($subdir0777); 
            
    chmod($subdir0777); 
            
    $handle fopen($subdir."index.php"'x+');
            
    fclose($handle);
          }
        if( !
    is_dir($user_directory) )
        {
          
    mkdir($user_directory0777);
          
    chmod($user_directory0777);
          
    $handle fopen($user_directory."/index.php"'x+');
          
    fclose($handle);
        }
        
          
    // SET KEY VARIABLES
          
    $file_maxsize "4194304";
          
    $file_exts explode(","str_replace(" """strtolower($this->level_info['level_photo_exts'])));
          
    $file_types explode(","str_replace(" """strtolower("image/jpeg, image/jpg, image/jpe, image/pjpeg, image/pjpg, image/x-jpeg, x-jpg, image/gif, image/x-gif, image/png, image/x-png")));
          
    $file_maxwidth $this->level_info['level_photo_width'];
          
    $file_maxheight $this->level_info['level_photo_height'];
          
    $photo_newname "0_".rand(10009999).".jpg";
          
    $file_dest $url->url_userdir($this->user_info['user_id']).$photo_newname;
          
    $thumb_dest substr($file_dest0strrpos($file_dest"."))."_thumb".substr($file_deststrrpos($file_dest"."));
        
          
    $new_photo = new se_upload();
          
    $new_photo->new_upload($photo_name$file_maxsize$file_exts$file_types$file_maxwidth$file_maxheight);
        
          
    // UPLOAD AND RESIZE PHOTO IF NO ERROR
          
    if( !$new_photo->is_error )
        {
            
    // DELETE OLD AVATAR IF EXISTS
            
    $this->user_photo_delete();
          
            
    // UPLOAD THUMB
            
    $new_photo->upload_thumb($thumb_dest);
          
            
    // CHECK IF IMAGE RESIZING IS AVAILABLE, OTHERWISE MOVE UPLOADED IMAGE
            
    if( $new_photo->is_image )
          {
              
    $new_photo->upload_photo($file_dest);
            }
          else
          {
              
    $new_photo->upload_file($file_dest);
            }
          
            
    // UPDATE USER INFO WITH IMAGE IF STILL NO ERROR
            
    if( !$new_photo->is_error )
          {
              
    $database->database_query("UPDATE se_users SET user_photo='{$photo_newname}' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
              
    $this->user_info['user_photo'] = $photo_newname;
            }
          }
        
          
    $this->is_error $new_photo->is_error;
        }
      
      
    // END user_photo_upload() METHOD








        // THIS METHOD DELETES A USER PHOTO
        // INPUT: 
        // OUTPUT: 
      
        
    function user_photo_delete()
      {
          global 
    $database;
          
    $user_photo $this->user_photo();
          if( 
    $user_photo )
        {
            @
    unlink($user_photo);
            @
    unlink(substr($user_photo0strrpos($user_photo"."))."_thumb".substr($user_photostrrpos($user_photo".")));
            
    $database->database_query("UPDATE se_users SET user_photo='' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
            
    $this->user_info['user_photo'] = NULL;
          }
        }
      
      
    // END user_photo_delete() METHOD








        // THIS METHOD RETURNS THE TOTAL NUMBER OF FRIENDS
        // INPUT: $direction (OPTIONAL) REPRESENTING A "0" FOR OUTGOING CONNECTIONS AND A "1" FOR INCOMING CONNECTIONS
        //      $friend_status (OPTIONAL) REPRESENTING THE FRIEND STATUS (1 FOR CONFIRMED, 0 FOR PENDING REQUESTS)
        //      $user_details (OPTIONAL) REPRESENTING WHETHER THE QUERY SHOULD JOIN TO THE USER TABLE OR NOT
        //      $where (OPTIONAL) REPRESENTING ADDITIONAL THINGS TO INCLUDE IN THE WHERE CLAUSE
        // OUTPUT: AN INTEGER REPRESENTING THE NUMBER OF FRIENDS
      
        
    function user_friend_total($direction 0$friend_status 1$user_details 0$where "")
      {
          global 
    $database$setting;
        
        if( !
    $setting['setting_connection_allow'] )
          return 
    0;
        
        
    // BEGIN FRIEND QUERY
        
    $friend_query "
          SELECT
            NULL
          FROM
            se_friends
        "
    ;
        
        
    // JOIN TO FRIEND TABLE IF NECESSARY
        
    if( $user_details $friend_query .= "
          LEFT JOIN
            se_users
            ON "
    ;
        
        if( 
    $user_details && $direction==)
          
    $friend_query .= "se_friends.friend_user_id1=se_users.user_id ";
        elseif( 
    $user_details )
          
    $friend_query .= "se_friends.friend_user_id2=se_users.user_id ";
        
        
    // CONTINUE QUERY
        
    $friend_query .= "
          WHERE
            friend_status='
    {$friend_status}'
        "
    ;
        
        
    // EITHER "LIST OF WHO USER IS A FRIEND OF" OR "LIST OF USER'S FRIENDS"
        
    if( $direction == $friend_query .= " &&
            friend_user_id2='
    {$this->user_info['user_id']}'
        "
    ;
        
        if( 
    $direction != $friend_query .= " &&
            friend_user_id1='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    // ADD ADDITIONAL WHERE CLAUSE IF EXISTS
        
    if( $where $friend_query .= " &&
            
    {$where}
        "
    ;
        
          return (int) 
    $database->database_num_rows($database->database_query($friend_query));
        }
      
      
    // END user_friend_total() METHOD








        // THIS METHOD RETURNS AN ARRAY OF USER'S FRIENDS
        // INPUT: $start REPRESENTING THE FRIEND TO START WITH
        //      $limit REPRESENTING THE NUMBER OF FRIENDS TO RETURN
        //      $direction (OPTIONAL) REPRESENTING A "0" FOR OUTGOING CONNECTIONS AND A "1" FOR INCOMING CONNECTIONS
        //      $friend_status (OPTIONAL) REPRESENTING THE FRIEND STATUS (1 FOR CONFIRMED, 0 FOR PENDING REQUESTS)
        //      $sort_by (OPTIONAL) REPRESENTING THE ORDER BY CLAUSE
        //      $where (OPTIONAL) REPRESENTING ADDITIONAL THINGS TO INCLUDE IN THE WHERE CLAUSE
        //      $friend_details (OPTIONAL) REPRESENTING A BOOLEAN THAT DETERMINES WHETHER OR NOT TO RETRIEVE THE "FRIEND TYPE" AND "FRIEND EXPLANATION"
        // OUTPUT: AN ARRAY OF THE USER'S FRIENDS
      
        
    function user_friend_list($start$limit$direction 0$friend_status 1$sort_by "se_users.user_dateupdated DESC"$where ""$friend_details 0)
      {
          global 
    $database$setting;
        
          
    // SET VARIABLE
          
    $friend_array = Array();
        
          
    // MAKE SURE CONNECTIONS ARE ALLOWED
          
    if( $setting['setting_connection_allow'] )
        {
            
    // BEGIN FRIEND QUERY
            
    $friend_query "
            SELECT 
              se_friends.friend_id, 
              se_users.user_id, 
              se_users.user_username, 
              se_users.user_fname,
              se_users.user_lname,
              se_users.user_photo, 
              se_users.user_lastlogindate, 
              se_users.user_dateupdated,
              CASE
                WHEN (SELECT TRUE FROM se_friends WHERE friend_user_id1='
    {$this->user_info['user_id']}' AND friend_user_id2=se_users.user_id AND friend_status='1' LIMIT 1)
                  THEN 2
                WHEN (SELECT TRUE FROM se_friends WHERE friend_user_id1='
    {$this->user_info['user_id']}' AND friend_user_id2=se_users.user_id AND friend_status='0' LIMIT 1)
                  THEN 1
                ELSE 0
              END
              AS is_viewers_friend,
              CASE
                WHEN (SELECT TRUE FROM se_users AS se_users2 WHERE se_users2.user_id=se_users.user_id AND (user_blocklist LIKE '
    {$this->user_info['user_id']},%' OR user_blocklist LIKE '%,{$this->user_info['user_id']}' OR user_blocklist LIKE '%,{$this->user_info['user_id']},%') LIMIT 1)
                  THEN TRUE
                ELSE FALSE
              END
              AS is_viewers_blocklisted
          "
    ;
          
            
    // GET FRIEND EXPLAIN, IF NECESSARY
            
    if( $friend_details $friend_query .= ",
              se_friends.friend_type,
              se_friendexplains.friendexplain_body
          "
    ;
          
            
    // CONTINUE QUERY
            
    $friend_query .= "
            FROM
              se_friends
            LEFT JOIN
              se_users ON
          "
    ;
          
            
    // MAKE SURE TO JOIN ON THE CORRECT FIELD (DEPENDENT ON DIRECTION)
            
    if( $direction == $friend_query .= "
            se_friends.friend_user_id1=se_users.user_id
          "
    ;
          
            if( 
    $direction != $friend_query .= "
            se_friends.friend_user_id2=se_users.user_id
          "
    ;
          
            
    // JOIN ON FRIEND EXPLAIN TABLE, IF NECESSARY
            
    if( $friend_details $friend_query .= "
            LEFT JOIN
              se_friendexplains
              ON se_friends.friend_id=se_friendexplains.friendexplain_friend_id
          "
    ;
          
            
    // CONTINUE QUERY
            
    $friend_query .= "
            WHERE
              friend_status='
    {$friend_status}'
          "
    ;
          
            
    // EITHER "LIST OF WHO USER IS A FRIEND OF" OR "LIST OF USER'S FRIENDS"
            
    if( $direction == $friend_query .= " &&
            friend_user_id2='
    {$this->user_info['user_id']}'
          "
    ;
          
            if( 
    $direction != $friend_query .= " &&
            friend_user_id1='
    {$this->user_info['user_id']}'
          "
    ;
          
            
    // ADD ADDITIONAL WHERE CLAUSE IF EXISTS
            
    if( $where $friend_query .= " &&
              
    {$where}
          "
    ;
          
            
    // SET SORT    AND LIMIT
            
    $friend_query .= "
            ORDER BY
              
    {$sort_by}
            LIMIT
              
    {$start}{$limit}
          "
    ;
          
            
    // LOOP OVER FRIENDS
            
    $friends $database->database_query($friend_query);
            while(
    $friend_info $database->database_fetch_assoc($friends))
          {
              
    // CREATE AN OBJECT FOR FRIEND
              
    $friend = new SEUser();
              
    $friend->user_info['user_id'] = $friend_info['user_id'];
              
    $friend->user_info['user_username'] = $friend_info['user_username'];
              
    $friend->user_info['user_fname'] = $friend_info['user_fname'];
              
    $friend->user_info['user_lname'] = $friend_info['user_lname'];
              
    $friend->user_info['user_photo'] = $friend_info['user_photo'];
              
    $friend->user_info['user_lastlogindate'] = $friend_info['user_lastlogindate'];
              
    $friend->user_info['user_dateupdated'] = $friend_info['user_dateupdated'];
              
    $friend->is_viewers_friend $friend_info['is_viewers_friend'];
              
    $friend->is_viewers_blocklist $friend_info['is_viewers_blocklist'];
              
    $friend->user_displayname();
            
              
    // SET FRIEND TYPE/EXPLANATION VARS
              
    if( $friend_details )
            {
                
    $friend->friend_type $friend_info['friend_type'];
                
    $friend->friend_explain $friend_info['friendexplain_body'];
              }
            
              
    // SET FRIEND ARRAY
              
    $friend_array[] = $friend;
            }
          }
        
          
    // RETURN FRIEND ARRAY
          
    return $friend_array;
        }
      
      
    // END user_friend_list() METHOD








        // THIS METHOD ADDS A USER AS A FRIEND OF THE CURRENT USER
        // INPUT: $other_user_id REPRESENTING THE USER ID OF THE FRIEND TO BE ADDED
        //      $friend_status REPRESENTING WHETHER THE FRIENDSHIP IS CONFIRMED OR NOT
        //      $friend_type REPRESENTING A STRING WITH THE TYPE OF FRIEND
        //      $friend_explain REPRESENTING A TEXTUAL EXPLANATION OF THE FRIENDSHIP
        // OUTPUT:
      
        
    function user_friend_add($other_user_id$friend_status$friend_type$friend_explain)
      {
          global 
    $database;
        
          
    // CHECK EXISTANCE OF FRIENDSHIP
          
    if( $database->database_num_rows($database->database_query("SELECT TRUE FROM se_friends WHERE friend_user_id1='{$this->user_info['user_id']}' AND friend_user_id2='{$other_user_id}' LIMIT 1")) )
          return;

          
    // ADD USER TO FRIENDS
          
    $database->database_query("
          INSERT INTO se_friends
            (friend_user_id1, friend_user_id2, friend_status, friend_type)
          VALUES
            ('
    {$this->user_info['user_id']}', '{$other_user_id}', '{$friend_status}', '{$friend_type}'
          )
        "
    );
          
    $friend_id $database->database_insert_id();
        
          
    $database->database_query("
          INSERT INTO se_friendexplains
            (friendexplain_friend_id, friendexplain_body)
          VALUES
            ('
    {$friend_id}', '{$friend_explain}')
        "
    );
        
          
    // REMOVE FRIEND FROM BLOCKLIST
          
    if( $this->user_blocked($other_user_id) )
        {
            
    $blocklist explode(","$this->user_info['user_blocklist']);
            
    $user_key array_search($other_user_id$blocklist);
          
    $blocklist[$user_key] = "";
            
    $this->user_info['user_blocklist'] = implode(","$blocklist);
            
    $database->database_query("UPDATE se_users SET user_blocklist='{$this->user_info['user_blocklist']}' WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
          }
        }
      
      
    // END user_friend_add() METHOD








        // THIS METHOD REMOVES A USER AS A FRIEND OF THE CURRENT USER
        // INPUT: $other_user_id REPRESENTING THE FRIEND'S USER ID
        // OUTPUT: 
      
        
    function user_friend_remove($other_user_id)
      {
          global 
    $database$setting;
        
        
    // REMOVE IF FRIEND
        
    $friend1 $database->database_query("SELECT friend_id FROM se_friends WHERE friend_user_id1='{$this->user_info['user_id']}' AND friend_user_id2='{$other_user_id}'");
        if( 
    $database->database_num_rows($friend1) )
        {
          
    $friendship $database->database_fetch_assoc($friend1);
          
    $database->database_query("DELETE FROM se_friends WHERE friend_id='{$friendship['friend_id']}' LIMIT 1");
          
    $database->database_query("DELETE FROM se_friendexplains WHERE friendexplain_friend_id='{$friendship['friend_id']}' LIMIT 1");
        }
        
        
    // REMOVE ADDITIONAL ROW IF TWO-DIRECTIONAL
        
    $friend2 $database->database_query("SELECT friend_id FROM se_friends WHERE friend_user_id2='{$this->user_info['user_id']}' AND friend_user_id1='{$other_user_id}'");
        if( 
    $database->database_num_rows($friend2) && ($setting['setting_connection_framework'] == || $setting['setting_connection_framework'] == 2) )
        {
          
    $friendship $database->database_fetch_assoc($friend2);
          
    $database->database_query("DELETE FROM se_friends WHERE friend_id='{$friendship['friend_id']}' LIMIT 1");
          
    $database->database_query("DELETE FROM se_friendexplains WHERE friendexplain_friend_id='{$friendship['friend_id']}' LIMIT 1");    
        }
        }
      
      
    // END user_friend_remove() METHOD








        // THIS METHOD RETURNS TRUE IF THE SPECIFIED USER IS A FRIEND OF A FRIEND OF THE EXISTING USER IN THIS CLASS
        // INPUT: $other_user_id REPRESENTING A USER'S USER ID
        // OUTPUT: RETURNS A BOOLEAN REPRESENTING WHETHER THE SPECIFIED USER IS A FRIEND OF A FRIEND OR NOT
      
        
    function user_friend_of_friend($other_user_id)
      {
          global 
    $database;
        
        
    $resource $database->database_query("
          SELECT
            t2.friend_user_id2
          FROM
            se_friends AS t1
          LEFT JOIN
            se_friends AS t2
            ON t1.friend_user_id2=t2.friend_user_id1
          WHERE
            t1.friend_user_id1='
    {$this->user_info['user_id']}' &&
            t2.friend_user_id2='
    {$other_user_id}' &&
            t1.friend_status<>'0' &&
            t2.friend_status<>'0'
        "
    );
        
        return (bool) 
    $database->database_num_rows($resource);
        }
      
      
    // END user_friend_of_friend() METHOD








        // THIS METHOD RETURNS TRUE IF THE SPECIFIED USER HAS BEEN FRIENDED BY THE EXISTING USER IN THIS CLASS
        // INPUT: $other_user_id REPRESENTING A USER'S USER ID
        //      $friend_status (OPTIONAL) REPRESENTING WHETHER THE FRIENDSHIP IS CONFIRMED OR NOT
        // OUTPUT: RETURNS A BOOLEAN REPRESENTING WHETHER THE SPECIFIED USER IS FRIENDED OR NOT
      
        
    function user_friended($other_user_id$friend_status 1)
      {
          global 
    $database;
        
        
    $resource $database->database_query("
          SELECT
            friend_id
          FROM
            se_friends
          WHERE
            friend_user_id1='
    {$this->user_info['user_id']}' &&
            friend_user_id2='
    {$other_user_id}' &&
            friend_status='
    {$friend_status}'
        "
    );
        
        return (bool) 
    $database->database_num_rows($resource);
        }
      
      
    // END user_friended() METHOD








        // THIS METHOD RETURNS TRUE IF THE SPECIFIED USER HAS BEEN BLOCKED BY THE EXISTING USER IN THIS CLASS
        // INPUT: $other_user_id REPRESENTING A USER'S USER ID
        // OUTPUT: RETURNS A BOOLEAN REPRESENTING WHETHER THE SPECIFIED USER IS BLOCKED OR NOT
      
        
    function user_blocked($other_user_id)
      {
        if( !
    $this->level_info['level_profile_block'] || !$this->user_info['user_blocklist'] )
          return 
    FALSE;
        
          
    $blocklist explode(","$this->user_info['user_blocklist']);
        return 
    in_array($other_user_id$blocklist);
        }
      
      
    // END user_blocked() METHOD








        // THIS METHOD RETURNS MAXIMUM PRIVACY LEVEL VIEWABLE BY A USER WITH REGARD TO THE CURRENT USER
        // INPUT: $other_user REPRESENTING A ANOTHER USER OBJECT
        // OUTPUT: RETURNS PRIVACY LEVEL OF GIVEN USER WITH RESPECT TO CURRENT USER
      
        
    function user_privacy_max($other_user)
      {
          global 
    $database;
        
          
    // UNREGISTERED USER
          
    if( !$other_user->user_exists )
          return 
    32;
        
          switch(
    TRUE)
        {
            
    // OWNER
            
    case( $this->user_info['user_id'] == $other_user->user_info['user_id'] ):
              return 
    1;
              break;
          
            
    // FRIEND
            
    case( $this->user_friended($other_user->user_info['user_id']) ):
              return 
    2;
              break;
          
            
    // FRIEND OF FRIEND WITHIN SAME SUBNETWORK
            
    case( $this->user_info['user_subnet_id'] == $other_user->user_info['user_subnet_id'] && $this->user_friend_of_friend($other_user->user_info['user_id']) ):
              return 
    4;
              break;
          
            
    // SAME SUBNETWORK
            
    case( $this->user_info['user_subnet_id'] == $other_user->user_info['user_subnet_id'] ):
              return 
    8;
              break;
          
            
    // REGISTERED USER
            
    case( $other_user->user_exists ):
              return 
    16;
              break;
          
            
    // DEFAULT EVERYONE
            
    default:
              return 
    32;
          }
        }
      
      
    // END user_privacy_max() METHOD








        // THIS METHOD CREATES A USER ACCOUNT USING THE GIVEN INFORMATION
        // INPUT: $signup_email REPRESENTING THE DESIRED EMAIL
        //      $signup_username REPRESENTING THE DESIRED USERNAME
        //      $signup_password REPRESENTING THE DESIRED PASSWORD
        //      $signup_timezone REPRESENTING THE USER'S TIMEZONE
        //      $signup_language REPRESENTING THE USER'S SELECTED LANGUAGE
        //      $signup_cat REPRESENTING THE USER'S SELECTED PROFILE CATEGORY
        //      $profile_field_query REPRESENTING THE PARTIAL QUERY TO SAVE IN THE USER'S PROFILE VALUE TABLE
        // OUTPUT: 
      
        
    function user_create($signup_email$signup_username$signup_password$signup_timezone$signup_language$signup_cat$profile_field_query)
      {
          global 
    $database$setting$url$actions$field;
        
          
    // PRESET VARS
          
    $signup_subnet_id 0;
          
    $signup_level_info $database->database_fetch_assoc($database->database_query("SELECT level_id, level_profile_privacy, level_profile_comments FROM se_levels WHERE level_default='1' LIMIT 1"));
          
    $signup_date time();
          
    $signup_dateupdated $signup_date;
          
    $signup_invitesleft $setting['setting_signup_invite_numgiven'];
          
    $signup_notify_friendrequest 1;
          
    $signup_notify_message 1;
          
    $signup_notify_profilecomment 1;
          
    $signup_profile_search 1;
          
    $signup_ip $_SERVER['REMOTE_ADDR'];
        
          
    // SET SIGNUP_USERNAME TO A PLACEHOLDER IF USERNAMES ARE NOT BEING USED
          
    if( !$setting['setting_username'] ) $signup_username randomcode(15);
        
          
    // SET WHETHER USER IS ENABLED OR NOT
        
    $signup_enabled = (bool) $setting['setting_signup_enable'];
        
          
    // SET EMAIL VERIFICATION VARIABLE
        
    $signup_verified = !$setting['setting_signup_verify'];
        
          
    // CREATE RANDOM PASSWORD IF NECESSARY
          
    if( $setting['setting_signup_randpass'] ) $signup_password randomcode(10);
        
          
    // ENCODE PASSWORD WITH MD5
          
    $crypt_password $this->user_password_crypt($signup_password);
        
    $signup_code $user_salt $this->user_salt;
        
          
    // SET PRIVACY DEFAULT
          
    $allowable_privacy unserialize($signup_level_info['level_profile_privacy']);
          
    rsort($allowable_privacy);
          
    $profile_privacy $allowable_privacy[0];
        
          
    // SET COMMENT DEFAULT
          
    $allowable_comments unserialize($signup_level_info['level_profile_comments']);
          
    rsort($allowable_comments);
          
    $profile_comments $allowable_comments[0];
        
          
    // ADD USER TO USER TABLE
          
    $database->database_query("
          INSERT INTO se_users (
            user_level_id,
            user_profilecat_id,
            user_email,
            user_newemail,
            user_username,
            user_password,
            user_password_method,
            user_code,
            user_enabled,
            user_verified,
            user_signupdate,
            user_invitesleft,
            user_timezone,
            user_language_id,
            user_dateupdated,
            user_search,
            user_privacy,
            user_comments,
            user_ip_signup,
            user_ip_lastactive
          ) VALUES (
            '
    {$signup_level_info['level_id']}',
            '
    {$signup_cat}',
            '
    {$signup_email}',
            '
    {$signup_email}',
            '
    {$signup_username}',
            '
    {$crypt_password}',
            '
    {$setting['setting_password_method']}',
            '
    {$signup_code}',
            '
    {$signup_enabled}',
            '
    {$signup_verified}',
            '
    {$signup_date}',
            '
    {$signup_invitesleft}',
            '
    {$signup_timezone}',
            '
    {$signup_language}',
            '
    {$signup_dateupdated}',
            '
    {$signup_profile_search}',
            '
    {$profile_privacy}',
            '
    {$profile_comments}',
            '
    {$signup_ip}',
            '
    {$signup_ip}'
          )
        "
    );
        
          
    // RETRIEVE USER ID
          
    $user_id $database->database_insert_id();
        
        if( 
    $user_id $this->user_exists TRUE;
        
          
    // UPDATE USERNAME IF NECESSARY
          
    if( !$setting['setting_username'] )
          
    $database->database_query("UPDATE se_users SET user_username=user_id WHERE user_id='{$user_id}' LIMIT 1");
        
          
    // GET USER INFO
          
    $this->user_info $database->database_fetch_assoc($database->database_query("SELECT * FROM se_users WHERE user_id='{$user_id}' LIMIT 1"));
          
    $this->level_info $database->database_fetch_assoc($database->database_query("SELECT * FROM se_levels WHERE level_id='{$this->user_info['user_level_id']}' LIMIT 1"));
          
    $this->subnet_info $database->database_fetch_assoc($database->database_query("SELECT subnet_id, subnet_name FROM se_subnets WHERE subnet_id='{$this->user_info['user_subnet_id']}' LIMIT 1"));
        
          
    // ADD USER PROFILE
          
    $database->database_query("INSERT INTO se_profilevalues (profilevalue_user_id) VALUES ('{$this->user_info['user_id']}')");
          if( 
    $profile_field_query )
            
    $database->database_query("UPDATE se_profilevalues SET $profile_field_query WHERE profilevalue_user_id='{$this->user_info['user_id']}' LIMIT 1");
          
          
    // GET PROFILE INFO
          
    $this->profile_info $database->database_fetch_assoc($database->database_query("SELECT * FROM se_profilevalues WHERE profilevalue_user_id='{$this->user_info['user_id']}' LIMIT 1"));
        
          
    // GET SUBNET ID
          
    $signup_subnet $this->user_subnet_select($signup_email$signup_cat$this->profile_info); 
          
    $signup_subnet_id $signup_subnet[0];
          
    $database->database_query("UPDATE se_users SET user_subnet_id='{$signup_subnet_id}' WHERE user_id='{$user_id}' LIMIT 1");
          
    $this->user_info['user_subnet_id'] = $signup_subnet_id;
        
          
    // ADD ROW IN STYLES TABLE
          
    $database->database_query("INSERT INTO se_profilestyles (profilestyle_user_id, profilestyle_css) VALUES ('{$this->user_info['user_id']}', '')");
        
          
    // ADD ROW IN SETTINGS TABLE
          
    $actiontypes $database->database_query("SELECT actiontype_id FROM se_actiontypes");
          
    $action_ids = Array();
          while( 
    $actiontype $database->database_fetch_assoc($actiontypes) )
          
    $action_ids[] = $actiontype['actiontype_id'];
        
          
    $database->database_query("
          INSERT INTO se_usersettings (
            usersetting_user_id,
            usersetting_notify_friendrequest,
            usersetting_notify_message,
            usersetting_notify_profilecomment,
            usersetting_actions_display
          ) VALUES (
            '
    {$this->user_info['user_id']}',
            '
    {$signup_notify_friendrequest}',
            '
    {$signup_notify_message}',
            '
    {$signup_notify_profilecomment}',
            '"
    .implode(","$action_ids)."'
          )
        "
    ) or die($database->database_error());
        
          
    // ADD USER DIRECTORY
          
    $user_directory $url->url_userdir($this->user_info['user_id']);
          
    $user_path_array explode("/"$user_directory);
          
    array_pop($user_path_array);
          
    array_pop($user_path_array);
          
    $subdir implode("/"$user_path_array)."/";
          if( !
    is_dir($subdir) )
        { 
            
    mkdir($subdir0777); 
            
    chmod($subdir0777); 
            
    $handle fopen($subdir."index.php"'x+');
            
    fclose($handle);
          }
        if( !
    is_dir($user_directory) )
        {
          
    mkdir($user_directory0777);
          
    chmod($user_directory0777);
          
    $handle fopen($user_directory."/index.php"'x+');
          
    fclose($handle);
        }
        
          
    // SAVE FIRST/LAST NAME, IF RELEVANT
          
    if( trim($field->field_special[2]) )
        {
          
    $flquery[] = "user_fname='".$field->field_special[2]."'";
          
    $this->user_info['user_fname'] = $field->field_special[2];
        }
          if( 
    trim($field->field_special[3]) )
        {
          
    $flquery[] = "user_lname='".$field->field_special[3]."'";
          
    $this->user_info['user_lname'] = $field->field_special[3];
        }
          if( !empty(
    $flquery) )
        {
          
    $database->database_query("UPDATE se_users SET ".implode(", "$flquery)." WHERE user_id='{$this->user_info['user_id']}'");
          
    $this->user_displayname_update($field->field_special[2], $field->field_special[3]);
        }
        
          
    // SET DISPLAY NAME
          
    $this->user_displayname();
        
          
    // CALL SIGNUP HOOK
          
    ($hook SE_Hook::exists('se_signup_success')) ? SE_Hook::call($hook, array()) : NULL;
        
          
    // SEND RANDOM PASSWORD IF NECESSARY
          
    if( $setting['setting_signup_randpass'] )
        {
          
    send_systememail('newpassword'$this->user_info['user_email'], Array($this->user_displayname$this->user_info['user_email'], $signup_password"<a href=\"".$url->url_base."login.php\">".$url->url_base."login.php</a>"));
        }
        
          
    // SEND VERIFICATION EMAIL IF REQUIRED
          
    if( $setting['setting_signup_verify'] )
        {
            
    $verify_code md5($this->user_info['user_code']);
            
    $time time();
            
    $verify_link $url->url_base."signup_verify.php?u={$this->user_info['user_id']}&verify={$verify_code}&d={$time}";
            
    send_systememail('verification'$this->user_info['user_email'], Array($this->user_displayname$this->user_info['user_email'], "<a href=\"$verify_link\">$verify_link</a>")); 
        }
        
        
    // INSERT ACTION IF VERIFICATION NOT NECESSARY
        
    else
        {
          
    $actions->actions_add($this"signup", Array($this->user_info['user_username'], $this->user_displayname), Array(), 0false"user"$this->user_info['user_id'], $this->user_info['user_privacy']);
        }
        
          
    // SEND WELCOME EMAIL IF REQUIRED (AND IF VERIFICATION EMAIL IS NOT BEING SENT)
          
    if( $setting['setting_signup_welcome'] && !$setting['setting_signup_verify'] )
        {
          
    send_systememail('welcome'$this->user_info['user_email'], Array($this->user_displayname$this->user_info['user_email'], $signup_password"<a href=\"".$url->url_base."login.php\">".$url->url_base."login.php</a>"));
        }
        }
      
      
    // END user_create() METHOD









        // THIS METHOD DELETES THE USER CURRENTLY ASSOCIATED WITH THIS OBJECT
        // INPUT: 
        // OUTPUT:
        
    function user_delete()
      {
          global 
    $database$url$global_plugins;
        
          
    // CALL USER DELETE HOOK
          
    ($hook SE_Hook::exists('se_user_delete')) ? SE_Hook::call($hook$this->user_info['user_id']) : NULL;
        
          
    // DELETE USER TABLE ROW
          
    $database->database_query("DELETE FROM se_users WHERE user_id='{$this->user_info['user_id']}' LIMIT 1");
        
          
    // DELETE USER PROFILE
          
    $database->database_query("DELETE FROM se_profilevalues WHERE profilevalue_user_id='{$this->user_info['user_id']}'");
        
          
    // DELETE USER STYLES
          
    $database->database_query("DELETE FROM se_profilestyles WHERE profilestyle_user_id='{$this->user_info['user_id']}'");
        
          
    // DELETE USER-OWNED AND PROFILE COMMENTS
          
    $database->database_query("DELETE FROM se_profilecomments WHERE profilecomment_user_id='{$this->user_info['user_id']}'");
        
        
    // DELETE NOTIFICATIONS SENT TO OTHER USERS FOR A PM THEY SENT
        
    $database->database_query("DELETE se_notifys.* FROM se_pmconvoops LEFT JOIN se_notifys ON se_notifys.notify_object_id=se_pmconvoops.pmconvoop_pmconvo_id WHERE se_notifys.notify_notifytype_id=2 && se_pmconvoops.pmconvoop_user_id='{$this->user_info['user_id']}'");
        
          
    // DELETE PMCONVOS AND PMS WHERE THE DELETED USER AND THE OTHER USER ARE THE ONLY TWO INSIDE, OR WHERE THE DELETED USER WAS THE INITIAL SENDER
        
    $database->database_query("UPDATE se_pmconvos LEFT JOIN se_pmconvoops ON pmconvoop_pmconvo_id=pmconvo_id SET pmconvo_recipients=pmconvo_recipients-1 WHERE pmconvoop_user_id='{$this->user_info['user_id']}'");
        
    $database->database_query("UPDATE se_pmconvos LEFT JOIN se_pmconvoops ON pmconvoop_pmconvo_id=pmconvo_id SET pmconvo_recipients=0 WHERE pmconvoop_user_id='{$this->user_info['user_id']}' && pmconvoop_user_id=(SELECT pm_authoruser_id FROM se_pms WHERE pm_pmconvo_id=pmconvo_id ORDER BY pm_id ASC)");
        
    $database->database_query("DELETE FROM se_pmconvoops WHERE pmconvoop_user_id='{$this->user_info['user_id']}'");
        
        
    // THIS MAY ALSO DELETE OTHER CONVOS THAT WERE PARTIALLY REMOVED
        
    $database->database_query("DELETE se_pms.*, se_pmconvos.*, se_pmconvoops.* FROM se_pmconvos LEFT JOIN se_pms ON pm_pmconvo_id=pmconvo_id LEFT JOIN se_pmconvoops ON pmconvoop_pmconvo_id=pmconvo_id WHERE pmconvo_recipients<2");
        
        
    // DELETE CONNECTIONS TO AND FROM USER
          
    $database->database_query("DELETE FROM se_friends, se_friendexplains USING se_friends LEFT JOIN se_friendexplains ON se_friends.friend_id=se_friendexplains.friendexplain_friend_id WHERE se_friends.friend_user_id1='{$this->user_info['user_id']}' OR se_friends.friend_user_id2='{$this->user_info['user_id']}'");
          
        
    // DELETE ALL OF THIS USER'S REPORTS
          
    $database->database_query("DELETE FROM se_reports WHERE report_user_id='{$this->user_info['user_id']}'");
          
        
    // DELETE USER ACTIONS
          
    $database->database_query("DELETE FROM se_actions, se_actionmedia USING se_actions LEFT JOIN se_actionmedia ON se_actions.action_id=se_actionmedia.actionmedia_action_id WHERE action_user_id='{$this->user_info['user_id']}'");
          
        
    // DELETE USER NOTIFICATIONS
          
    $database->database_query("DELETE FROM se_notifys WHERE notify_user_id='{$this->user_info['user_id']}'");
        
          
    // DELETE NOTIFICATIONS BY USER
          
    $database->database_query("DELETE FROM se_notifys WHERE notify_notifytype_id=1 AND notify_object_id='{$this->user_info['user_id']}'");

          
    // DELETE USER'S FILES
          
    if( is_dir($url->url_userdir($this->user_info['user_id'])) )
            
    $dir $url->url_userdir($this->user_info['user_id']);
          else
            
    $dir ".".$url->url_userdir($this->user_info['user_id']);
        
          if( 
    $dh = @opendir($dir) )
        {
            while( (
    $file = @readdir($dh)) !== false )
          {
              if( 
    $file != "." && $file != ".." )
            {
                @
    unlink($dir.$file);
              }
            }
            @
    closedir($dh);
          }
          @
    rmdir($dir);
        
          
    $this->user_clear();
        }
      
      
    // END user_delete() METHOD







      
      //
        // THIS METHOD RETURNS THE TOTAL NUMBER OF MESSAGES
      //
        // INPUT:
      //    $direction    (OPTIONAL) REPRESENTING A "0" FOR MESSAGES SENT TO USER AND "1" FOR MESSAGES SENT BY USER
        //      $unread_only  (OPTIONAL) REPRESENTING A "0" FOR ALL MESSAGES AND A "1" FOR UNREAD MESSAGES ONLY
      //
        // OUTPUT:
      //    AN INTEGER REPRESENTING THE NUMBER OF MESSAGES
      //
      
      
    function user_message_total($direction=0$unread_only=FALSE$where=NULL$do_joins=FALSE)
      {
        global 
    $database;
        
        
    $message_total 0;
        
          
    // MAKE SURE MESSAGES ARE ALLOWED
          
    if( empty($this->level_info['level_message_allow']) )
          return 
    FALSE;
        
        
    // BEGIN MESSAGE QUERY
        
    $sql "
          SELECT
            COUNT(pmconvoop_id) as pm_total
          FROM
            se_pmconvoops
        "
    ;
        
        
    // JOIN TO PM AND PMCONVO TABLES
        
    if( $do_joins $sql .= "
          LEFT JOIN
            se_pmconvos
            ON se_pmconvos.pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id
          LEFT JOIN
            se_pms
            ON se_pms.pm_pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id
        "
    ;
        
        
    $sql .= "
          WHERE
            se_pmconvoops.pmconvoop_user_id='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    // INCOMING MESSAGES
        
    if( !$direction $sql .= " &&
            se_pmconvoops.pmconvoop_deleted_inbox=0
        "
    ;
        
        
    // OUTGOING MESSAGES
        
    if(  $direction $sql .= " &&
            /*
            THIS IS REMOVED BECAUSE I AM HOPING THE deleted_outbox WILL HANDLE IT
            se_pms.pm_authoruser_id='
    {$this->user_info['user_id']}' &&
            */
            se_pmconvoops.pmconvoop_deleted_outbox=0
        "
    ;
        
        
    // READ ONLY
        
    if( $unread_only $sql .= " &&
            se_pmconvoops.pmconvoop_read=0
        "
    ;
        
        
    // ADD WHERE
        
    if( $where $sql .= " &&
            
    {$where}
        "
    ;
        
        
    // ADD GROUP BY IF JOINING
        
    if( $do_joins $sql .= "
          GROUP BY
            se_pmconvoops.pmconvoop_pmconvo_id
        "
    ;
        
        
    // RUN QUERY AND RETURN
        
    $resource $database->database_query($sql);
        
    $result $database->database_fetch_assoc($resource);
        
        
    //return (int) $database->database_num_rows($resource);
        
    return (int) $result['pm_total'];
      }
      
      
    // END user_message_total() METHOD







      
      //
        // THIS METHOD RETURNS AN ARRAY OF USER'S MESSAGES
      //
        // INPUT:
      //    $start      REPRESENTING THE MESSAGE TO START WITH
        //      $limit      REPRESENTING THE NUMBER OF MESSAGES TO RETURN
        //      $direction  (OPTIONAL) REPRESENTING A "0" FOR MESSAGES SENT TO USER AND "1" FOR MESSAGES SENT BY USER
        //      $where      (OPTIONAL)
      //
        // OUTPUT:
      //    AN ARRAY OF THE USER'S MESSAGES
      //
      
      
    function &user_message_list($start=NULL$limit=NULL$direction=0$where=NULL)
      {
        global 
    $database;
        
          
    $message_array = array();
        
          
    // MAKE SURE MESSAGES ARE ALLOWED
          
    if( empty($this->level_info['level_message_allow']) )
          return 
    FALSE;
        
        
    // BEGIN MESSAGE QUERY
        
    $sql "
          SELECT
            se_pmconvos.*,
            se_pms.*,
            se_pmconvoops_user.pmconvoop_read, 
                    se_users.user_id,
                    se_users.user_username,
                    se_users.user_fname,
                    se_users.user_lname,
                    se_users.user_photo
        "
    ;
        
        
    // GET MESSAGE AUTHOR, REPLIED STATUS
        
    if( !$direction $sql .= ",
                    (SELECT TRUE FROM se_pms WHERE pm_pmconvo_id=se_pmconvos.pmconvo_id && pm_authoruser_id='
    {$this->user_info['user_id']}' ORDER BY pm_id DESC LIMIT 1)
                    AS pm_replied
        "
    ;
        
        
    // CONTINUE QUERY
        
    $sql .= "
          FROM
            se_pmconvoops AS se_pmconvoops_user
          LEFT JOIN
            se_pmconvos
            ON se_pmconvoops_user.pmconvoop_pmconvo_id=se_pmconvos.pmconvo_id
          LEFT JOIN
            se_pms
            ON se_pms.pm_pmconvo_id=se_pmconvos.pmconvo_id
        "
    ;
        
        
    // INCOMING MESSAGES - JOIN TO USER TABLE TO GET AUTHOR
        
    if( !$direction $sql .= "
          LEFT JOIN
            se_users
            ON se_users.user_id=se_pms.pm_authoruser_id"
    ;
        
        
    // OUTGOING MESSAGES - JOIN TO PMCONVOOPS AND USER TABLE TO GET RECIPIENT
        
    if(  $direction $sql .= "
          LEFT JOIN
            se_pmconvoops AS se_pmconvoops_other
            ON (se_pmconvoops_other.pmconvoop_pmconvo_id=se_pmconvos.pmconvo_id && se_pmconvoops_other.pmconvoop_user_id!='
    {$this->user_info['user_id']}')
          LEFT JOIN
            se_users
            ON se_users.user_id=se_pmconvoops_other.pmconvoop_user_id
        "
    ;
        
        
        
    // CONTINUE QUERY
        
    $sql .= "
          WHERE
            se_pmconvoops_user.pmconvoop_user_id='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    // INCOMING MESSAGES
        
    if( !$direction $sql .= " &&
            se_pmconvoops_user.pmconvoop_deleted_inbox=0
        "
    ;
        
        
    // OUTGOING MESSAGES
        
    if(  $direction $sql .= " &&
            se_pmconvoops_user.pmconvoop_deleted_outbox=0
        "
    ;
        
        
    // CONTINUE QUERY
        
    $sql .= " &&
            se_pms.pm_id=(
              SELECT
                MAX(pm_id)
              FROM
                se_pms
              WHERE
                pm_pmconvo_id=se_pmconvos.pmconvo_id
        "
    ;
        
        
    // INCOMING MESSAGES
        
    if( !$direction $sql .= " &&
                se_pms.pm_authoruser_id!='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    // OUTGOING MESSAGES
        
    if(  $direction $sql .= " &&
                se_pms.pm_authoruser_id='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    // CONTINUE QUERY
        
    $sql .= "
            )
        "
    ;
        
        
    // ADD WHERE
        
    if( $where $sql .= " && {$where}";
        
        
    /*
          GROUP BY
            se_pmconvoops_user.pmconvoop_pmconvo_id
        */
        
        
    $sql .= "
          ORDER BY
            se_pmconvoops_user.pmconvoop_pmdate DESC
            /* se_pms.pm_date DESC */
          LIMIT
            
    $start$limit
        "
    ;
        
        
    // EXECUTE QUERY
        
    $resource $database->database_query($sql);
        
        
    // GET MESSAGES
          
    while( $message_info=$database->database_fetch_assoc($resource) )
        {
          
    // CREATE AN OBJECT FOR MESSAGE AUTHOR/RECIPIENT
          
    $pm_user = new SEUser();
          
    $pm_user->user_info['user_id']        = $message_info['user_id'];
          
    $pm_user->user_info['user_username']  = $message_info['user_username'];
          
    $pm_user->user_info['user_photo']     = $message_info['user_photo'];
          
    $pm_user->user_info['user_fname']     = $message_info['user_fname'];
          
    $pm_user->user_info['user_lname']     = $message_info['user_lname'];
          
    $pm_user->user_displayname();
          
          
    // Remove breaks for preview
          
    $message_info['pm_body'] = str_replace("<br>"""$message_info['pm_body']);
          
          
    // SET MESSAGE ARRAY
          
    $message_array[] = array(
            
    'pmconvo_id'      => $message_info['pmconvo_id'],
            
    'pmconvo_subject' => $message_info['pmconvo_subject'],
            
    'pm_date'         => $message_info['pm_date'],
            
    'pm_read'         => (bool) $message_info['pmconvoop_read'],
            
    'pm_replied'      => $message_info['pm_replied'],
            
    'pm_body'         => $message_info['pm_body'],
            
    'pm_user'         => &$pm_user,
            
    'pm_recipients'   => $message_info['pmconvo_recipients'] - 1
          
    );
          
          unset(
    $pm_user);
        }
        
        return 
    $message_array;
      }
      
      
    // END user_message_list() METHOD








      //
        // THIS METHOD SENDS A MESSAGE TO ANOTHER USER
      //
        // INPUT:
      //    $to REPRESENTING A SEMI-COLON DELIMITED STRING OF USERNAMES OF THE RECIPIENTS
        //      $subject REPRESENTING THE SUBJECT OF THE MESSAGE
        //      $message REPRESENTING THE MESSAGE BODY
        //      $convo_id (OPTIONAL) REPRESENTING THE CONVERSATION ID
      //
        // OUTPUT: 
      //    void
      //
      
      
    function user_message_send($to$subject$message$convo_id=NULL)
      {
        global 
    $database$notify$url;
        
        
    $recipients = array();
        
    $recipients_full = array();
        
          
    // VALIDATE CONVERSATION ID
          
    if( !$convo_id || !is_numeric($convo_id) )
          
    $convo_id 0;
        
          
    // CHECK TO SEE IF MESSAGE IS EMPTY
          
    if( !trim($message) )
          
    $this->is_error 796;
        
          
    // NEW MESSAGE
          
    if( !$convo_id )
        {
            
    // ORGANIZE RECIPIENTS
            
    $tos array_filter(preg_split('/[\s,;]+?/'$to));
            
    array_splice($tos$this->level_info['level_message_recipients']);
          
            
    // LOOP OVER RECIPIENTS
          
    foreach( $tos as $to_username )
          {
            
    // CANT SEND TO SELF
            
    if( strtolower($to_username)==strtolower($this->user_info['user_username']) ) continue;
            
            
    // GET TO USER OBJECT
              
    $to_user = new SEUser(array(NULL$to_username));
            
            
    // CANT SEND TO NON EXISTENT USER. BLOCKED USER, OR USERS NOT ALLOWED TO USE MESSAGES
            
    if( !$to_user->user_exists ) continue;
            if( 
    $to_user->user_blocked($this->user_info['user_id']) ) continue;
            if( !
    $this->level_info['level_message_allow'] ) continue;
            
            
    // CHECK MESSAGE TYPES AND ADD RECIPIENT
            
    if( $this->level_info['level_message_allow']==|| ($this->level_info['level_message_allow']==&& $this->user_friended($to_user->user_info['user_id'])) )
            {
              
    $recipients_full[$to_user->user_info['user_id']] =& $to_user;
              
    $recipients[] = $to_user->user_info['user_id'];
            }
            }
          
          
            
    // ENSURE THERE ARE RECIPIENTS
            
    if( empty($recipients) )
            
    $this->is_error 795;
          
          
            
    // IF NO ERROR, CREATE CONVERSATION
            
    if( !$this->is_error )
          {
            
    // CREATE CONVO
            
    $sql "INSERT INTO se_pmconvos (pmconvo_subject, pmconvo_recipients) VALUES ('".addslashes($subject)."', '".(count($recipients)+1)."')";
            
    $resource $database->database_query($sql);
              
    $convo_id $database->database_insert_id();
            
            
    // CREATE CONVOOPS
            
    $sql "
              INSERT INTO se_pmconvoops
                (pmconvoop_pmconvo_id, pmconvoop_user_id, pmconvoop_deleted_outbox, pmconvoop_deleted_inbox)
              VALUES
                ('
    {$convo_id}', '{$this->user_info['user_id']}', 0, 1)";
            
            
    //$is_first = TRUE;
            
    foreach( $recipients as $to_user_id )
              
    $sql .= ", ('{$convo_id}', '{$to_user_id}', 1, 0)";
            
            
    // EXECUTE QUERY
            
    $resource $database->database_query($sql);
            }
        }
        
        
    // GET RECIPIENTS AND VERIFY USER IS PART OF CONVERSATION
        
    else
        {
          
    $sql "SELECT pmconvoop_user_id FROM se_pmconvoops WHERE pmconvoop_pmconvo_id='{$convo_id}'";
          
    $resource $database->database_query($sql);
          
          
    $unauthorized TRUE;
          while( 
    $pmconvoop_info=$database->database_fetch_assoc($resource) )
          {
            if( 
    $pmconvoop_info['pmconvoop_user_id']!=$this->user_info['user_id'] )
              
    $recipients[] = $pmconvoop_info['pmconvoop_user_id'];
            else
              
    $unauthorized FALSE;
          }
          
          
    // USER WAS NOT IN CONVERSATION
          
    if( $unauthorized )
            
    $this->is_error 39// FIX THIS CODE RANDOM NUMBER TEMP
        
    }
        
          
    // IF NO ERROR, ADD MESSAGE TO CONVERSATION
          
    if( !$this->is_error )
        {
            
    // LINK ALL LINKS
            
    $message ereg_replace("http://([.]?[a-zA-Z0-9_/-])*""<a href=\"\\0\">\\0</a>"$message);
            
    $message ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)""\\1<a href=\"http://\\2\">\\2</a>"$message);
          
            
    // RUN SECURITY ON THE MESSAGE TO ENSURE NO XSS ATTACKS WITH LINKS
            
    $message cleanHTML($message"a");
          
            
    // REPLACE NEWLINES IN BODY WITH BREAKS
            
    $message str_replace("\n""<br>"$message);
            
    $message str_replace("'""\'"$message);
          
            
    // INSERT MESSAGE
            
    $pm_date time();
          
          
    $sql "
            INSERT INTO se_pms
              (pm_authoruser_id, pm_pmconvo_id, pm_date, pm_body)
            VALUES
              ('
    {$this->user_info['user_id']}', '{$convo_id}', '{$pm_date}', '{$message}')
          "
    ;
          
          
    $resource $database->database_query($sql);
          
          
          
    // UPDATE PMCONVOOPS
          
    $sql "UPDATE se_pmconvoops SET pmconvoop_deleted_outbox=0, pmconvoop_pmdate='{$pm_date}' WHERE pmconvoop_pmconvo_id='{$convo_id}' && pmconvoop_user_id='{$this->user_info['user_id']}'";
          
    $resource $database->database_query($sql);
          
          
    $sql "UPDATE se_pmconvoops SET pmconvoop_deleted_inbox=0, pmconvoop_read=0, pmconvoop_pmdate='{$pm_date}' WHERE pmconvoop_pmconvo_id='{$convo_id}' && pmconvoop_user_id!='{$this->user_info['user_id']}'";
          
    $resource $database->database_query($sql);
          
          
            
    // INSERT/SEND NOTIFICATIONS FOR RECIPIENTS
          // GET RECIPIENTS IF NOT INITIAL MESSAGE
          
    foreach( $recipients as $recipient_user_id )
          {
            if( empty(
    $recipients_full[$recipient_user_id]) )
            {
              
    $recipients_full[$recipient_user_id] = new SEUser(array($recipient_user_id));
            }
            
            
    $current_recipient =& $recipients_full[$recipient_user_id];
            
            
    // NOT A USER
            
    if( !is_object($current_recipient) || !$current_recipient->user_exists )
              continue;
            
            
    // ADD NOTIFICATION
            
    $notify->notify_add($current_recipient->user_info['user_id'], 'message'$convo_id, array(), array(), TRUE);
            
            
    // SEND EMAIL
            
    $current_recipient->user_settings('usersetting_notify_message');
            if( 
    $current_recipient->usersetting_info['usersetting_notify_message'] )
            {
              
    send_systememail('message'$current_recipient->user_info[user_email], array(
                
    $current_recipient->user_displayname,
                
    $this->user_displayname,
                
    "<a href=\"{$url->url_base}login.php\">{$url->url_base}login.php</a>"
              
    ));
            }
            
            
    // CLEAN OUT THEM OLD MESSAGES
            
    $num_inbox $current_recipient->user_message_total(00);
            
    $num_outbox $current_recipient->user_message_total(10);
            
    $num_inbox_delete $num_inbox $current_recipient->level_info['level_message_inbox'];
            
    $num_outbox_delete $num_outbox $current_recipient->level_info['level_message_outbox'];
            
            
    // CLEAN OUT INBOX
              
    if( $num_inbox_delete>)
            {
              
    $sql "
                SELECT
                  se_pmconvoops.pmconvoop_pmconvo_id AS pmconvo_id
                FROM
                  se_pmconvoops
                LEFT JOIN
                  se_pmconvos
                  ON se_pmconvos.pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id
                LEFT JOIN
                  se_pms
                  ON se_pms.pm_pmconvo_id=se_pmconvos.pmconvo_id
                WHERE
                  se_pmconvoops.pmconvoop_user_id='
    {$current_recipient->user_info['user_id']}' &&
                  se_pmconvoops.pmconvoop_deleted_inbox=0 &&
                  se_pms.pm_id=(SELECT MAX(pm_id) FROM se_pms WHERE pm_pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id)
                ORDER BY
                  se_pms.pm_date ASC
                LIMIT
                  
    {$num_inbox_delete}
              "
    ;
              
              
    $resource $database->database_query($sql);
              
              while( 
    $result=$database->database_fetch_assoc($resource) )
                
    $delete_array[] = $result['pmconvo_id'];
              
              
    // DELETE
                
    $current_recipient->user_message_delete_selected($delete_array0);
            }
            
            
    // CLEAN OUT OUTBOX
            
    if( $num_outbox_delete>)
            {
              
    $sql "
                SELECT
                  se_pmconvoops.pmconvoop_pmconvo_id AS pmconvo_id
                FROM
                  se_pmconvoops
                LEFT JOIN
                  se_pmconvos
                  ON se_pmconvos.pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id
                LEFT JOIN
                  se_pms
                  ON se_pms.pm_pmconvo_id=se_pmconvos.pmconvo_id
                WHERE
                  se_pmconvoops.pmconvoop_user_id='
    {$current_recipient->user_info['user_id']}' &&
                  se_pmconvoops.pmconvoop_deleted_outbox=0 &&
                  se_pms.pm_id=(SELECT MAX(pm_id) FROM se_pms WHERE pm_pmconvo_id=se_pmconvoops.pmconvoop_pmconvo_id)
                ORDER BY
                  se_pms.pm_date ASC
                LIMIT
                  
    {$num_outbox_delete}
              "
    ;
              
              
    $resource $database->database_query($sql);
              
              while( 
    $result=$database->database_fetch_assoc($resource) )
                
    $delete_array[] = $result['pmconvo_id'];
              
              
    // DELETE
                
    $current_recipient->user_message_delete_selected($delete_array1);
            }
            
            
    // CLEAR INACTIVE CONVERSATIONS
            
    $this->user_message_cleanup();
          }
        }
        
        return 
    $convo_id;
      }
      
      
    // END user_message_send() METHOD







      
      //
        // THIS METHOD DELETES MANY MESSAGES BASED ON WHAT HAS BEEN POSTED
      //
        // INPUT:
      //    $delete_array CONTAINING THE ARRAY OF CONVERSATION IDs TO DELETE
        //      $direction (OPTIONAL) REPRESENTING A "0" FOR MESSAGES SENT TO USER AND "1" FOR MESSAGES SENT BY USER
      //
        // OUTPUT: 
      //    void
      //
      
      
    function user_message_delete_selected($delete_array$direction=0)
      {
        global 
    $database;
        
          
    // START CONSTRUCTING QUERY
        
    $sql "
          UPDATE
            se_pmconvoops
          SET
        "
    ;
        
        
    // INCOMING MESSAGES
        
    if( !$direction $sql .= "
            se_pmconvoops.pmconvoop_deleted_inbox=1
        "
    ;
        
        
    // OUTGOING MESSAGES
        
    if(  $direction $sql .= "
            se_pmconvoops.pmconvoop_deleted_outbox=1
        "
    ;
        
          
    // CONTINUE QUERY
          
    $sql .= "
          WHERE
            se_pmconvoops.pmconvoop_user_id='
    {$this->user_info['user_id']}' &&
            se_pmconvoops.pmconvoop_pmconvo_id IN('"
    .implode("', '"$delete_array)."')
        "
    ;
        
        
    $database->database_query($sql);
        
          
    // DELETE ANY NOTIFICATIONS ASSOCIATED WITH THESE PMs
        
    $sql "
          DELETE FROM
            se_notifys
          WHERE
            notify_user_id='
    {$this->user_info[user_id]}' &&
            notify_notifytype_id='2' &&
            notify_object_id IN('"
    .implode("', '"$delete_array)."')
        "
    ;
        
        
    $database->database_query($sql);
      }
      
      
    // END user_message_delete_selected() METHOD







      
      //
        // THIS METHOD CLEANS UP THE PM TABLES
      //
        // INPUT:
      //    void
      //
        // OUTPUT: 
      //    void
      //
      
      
    function user_message_cleanup()
      {
        global 
    $database;
        
        
    // CONSTRUCT QUERY
        
    $sql "
          SELECT
            SUM(se_pmconvoops.pmconvoop_deleted_inbox) AS total_deleted_inbox,
            SUM(se_pmconvoops.pmconvoop_deleted_inbox) AS total_deleted_outbox,
            se_pmconvos.pmconvo_recipients,
            se_pmconvos.pmconvo_id
          FROM
            se_pmconvos
          LEFT JOIN
            se_pmconvoops
            ON se_pmconvoops.pmconvoop_pmconvo_id=se_pmconvos.pmconvo_id
          GROUP BY
            se_pmconvos.pmconvo_id
          LIMIT
            50
        "
    ;
        
        
    $resource $database->database_query($sql);
        
        
    $to_delete = array();
        while( 
    $result=$database->database_fetch_assoc($resource) && count($to_delete)<50 )
        {
          if( 
    $result['total_deleted_inbox']!=$result['pmconvo_recipients'] ) continue;
          if( 
    $result['total_deleted_outbox']!=$result['pmconvo_recipients'] ) continue;
          
    $to_delete[] = $result['pmconvo_id'];
        }
        
        
    $to_delete array_filter($to_delete);
        
        if( empty(
    $to_delete) )
          return;
        
        
    $sql "
          DELETE FROM
            se_pmconvos,
            se_pms,
            se_pmconvoops
          USING
            se_pmconvos
          LEFT JOIN
            se_pms
            ON se_pms.pm_pmconvo_id=se_pmconvos.pmconvo_id
          LEFT JOIN
            se_pmconvoops
            ON se_pmconvoops.pmconvoop_pmconvo_id=se_pmconvos.pmconvo_id
          WHERE
            se_pmconvos.pmconvo_id IN('"
    .join("','"$to_delete)."')
        "
    ;
        
        
    $resource $database->database_query($sql);
      }
      
      
    // END user_message_cleanup() METHOD







      
      //
        // THIS METHOD GETS CONVO INFO IF USER IS PART OF CONVO
      //
        // INPUT:
      //    $convo_id
      //    $validate_only
      //
        // OUTPUT: 
      //    void
      //
      
      
    function user_message_validate($convo_id$validate_only=FALSE)
      {
        global 
    $database;
        
        
    // GET PMCONVO INFO
        
    $sql "
          SELECT
            se_pmconvos.*,
            se_pmconvoops.*
          FROM
            se_pmconvos
          LEFT JOIN
            se_pmconvoops
            ON se_pmconvoops.pmconvoop_pmconvo_id=se_pmconvos.pmconvo_id
          WHERE
            se_pmconvos.pmconvo_id='
    {$convo_id}' &&
            se_pmconvoops.pmconvoop_user_id='
    {$this->user_info['user_id']}'
          LIMIT
            1
        "
    ;
        
        
    $resource $database->database_query($sql);
        
        if( !
    $database->database_num_rows($resource) )
          return 
    FALSE;
        
        if( 
    $validate_only )
          return 
    TRUE;
        
        return 
    $database->database_fetch_assoc($resource);
      }
      
      
    // END user_message_validate() METHOD







      
      //
        // THIS METHOD GETS CONVO INFO
      //
        // INPUT:
      //    $convo_id
      //
        // OUTPUT: 
      //    void
      //
      
      
    function &user_message_view($convo_id)
      {
        global 
    $database;
        
        if( !
    $this->user_message_validate($convo_idTRUE) )
          return 
    FALSE;
        
        
    // SET MESSAGE TO READ
        
    $sql "UPDATE se_pmconvoops SET pmconvoop_read=1 WHERE pmconvoop_pmconvo_id='{$convo_id}' && pmconvoop_user_id='{$this->user_info['user_id']}' LIMIT 1";
        
    $resource $database->database_query($sql);
        
        
    // DELETE NOTIFICATIONS
        
    $sql "DELETE FROM se_notifys WHERE notify_user_id='{$this->user_info['user_id']}' AND notify_notifytype_id='2' AND notify_object_id='{$convo_id}'";
        
    $resource $database->database_query($sql);
        
        
    // GET COLLABORATORS
        
    $sql "
          SELECT
            user_id,
            user_username,
            user_fname,
            user_lname,
            user_photo
          FROM
            se_pmconvoops
          LEFT JOIN
            se_users
            ON se_users.user_id=se_pmconvoops.pmconvoop_user_id
          WHERE
            se_pmconvoops.pmconvoop_pmconvo_id='
    {$convo_id}' &&
            se_pmconvoops.pmconvoop_user_id!='
    {$this->user_info['user_id']}'
        "
    ;
        
        
    $resource $database->database_query($sql);
        
        
    $collaborators = array();
        
    $collaborators_by_id = array();
        while( 
    $result=$database->database_fetch_assoc($resource) )
        {
          
    $coll = new SEUser();
          
    $coll->user_info['user_id']       = $result['user_id'];
          
    $coll->user_info['user_username'] = $result['user_username'];
          
    $coll->user_info['user_photo']    = $result['user_photo'];
          
    $coll->user_info['user_fname']    = $result['user_fname'];
          
    $coll->user_info['user_lname']    = $result['user_lname'];
          
    $coll->user_displayname();
          
          
    $collaborators[] =& $coll;
          
    $collaborators_by_id[$result['user_id']] =& $coll;
          unset(
    $coll);
        }
        
        
    // GET CONVERSATION
        
    $sql "
          SELECT
            se_pms.*
          FROM
            se_pms
          WHERE
            pm_pmconvo_id='
    {$convo_id}'
          ORDER BY
            pm_date
        "
    ;
        
        
    $resource $database->database_query($sql);
        
        
    $pms = array();
        while( 
    $result=$database->database_fetch_assoc($resource) )
        {
          
    $pm_info $result;
          
          if( 
    $pm_info['pm_authoruser_id']==$this->user_info['user_id'] )
            
    $pm_info['author'] =& $this;
          else
            
    $pm_info['author'] =& $collaborators_by_id[$pm_info['pm_authoruser_id']];
          
          
    $pms[] =& $pm_info;
          unset(
    $pm_info);
        }
        
        return array
        (
          
    'collaborators' => &$collaborators,
          
    'pms'           => &$pms
        
    );
      }
      
      
    // END user_message_view() METHOD

    }




    // Backwards compat
    class se_user extends SEUser
    {
      function 
    se_user($user_unique = Array('0'''''), $select_fields = Array('*''*''*''*'))
      {
        
    $this->SEUser($user_unique$select_fields);
      }
    }



    ?>
     
  6. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    253
    Симпатии:
    58
    Судя по цифорке 39 значение поля в базе данных с юниксовым временем равно 0 (1970 год). Покрайней мере в методе user_create этому есть подтверждение. Очевидно что или поле с датой заполняется поумолчанию нулём, что проверяется просмотром базы данных. Или какая-то проблема при выводе значения. Вобще это гадание. Нужно дебажить код на серваке.
     
  7. vave

    vave

    Регистр.:
    23 июн 2007
    Сообщения:
    364
    Симпатии:
    14
    Кстати после любого обновления этот баг пропадает
     
  8. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Открой таблицу se_users и посмотри что вставляется в поля user_signupdate, user_dateupdated при добавлении нового юзера..
     
  9. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Т.е. обновления страницы? Скорее всего при создании юзера в user_dateupdated идет ноль, после обновления страницы значение изменяется.

    Дебажить функцию создания юзера надо.
    Хотя в коде все относительно верно :
    PHP:
          $signup_date time(); 
          
    $signup_dateupdated $signup_date
     
  10. CjGuSSa

    CjGuSSa

    Регистр.:
    9 фев 2009
    Сообщения:
    196
    Симпатии:
    45
    Там должно выводится сообщение об обновлении статуса, а так как у тебя статус ниразу не менялся, то и шляпа такая вылазит.
    Поставь в шаблоне проверку на наличие статуса и все ;)
     
Статус темы:
Закрыта.