<?php
namespace imcat;

// usrBase
class usrBase{    

    public 
$userType ''//member/adminer
    
public $userFlag 'Guest'//Login/Guest,Error
    
public $usTable ''//online/admin
    
public $utmOut ''//1200/2400
    
public $udbUpd 300//db更新周期,5分钟
    //public $uckUpd = 20; //cookie更新周期,20秒
    
public $errno 0;
    public 
$sessid '';
    
    public 
$sinit = array(); //初始sid,sip,sua数据
    
public $usess = array(); //active会话数据
    
public $uperm = array(); //用户权限
    
public $uinfo = array(); //用户模型数据
    
    
static $uobjs = array(); //用户对象
    
public $db NULL;
    
    function 
__construct($userType=''){
        
$this->db glbDBObj::dbObj(); 
        
$this->sess_tout($userType);
        
$this->sess_init();
        
$this->check_cuser();
    }
    
    
// re : Null, isLogin, Forbid, Info, array()
    
function check_logout(){
        
$_groups glbConfig::read('groups');
        if(
$this->userFlag=='Error') return 'Forbid';
        if(
$this->userFlag!='Login') return 'notLogin'
        
$this->userFlag 'Guest';
        
$this->uperm = array();
        
$this->uinfo = array();
        
$data $this->sinit$sid $data['sid']; unset($data['sid'],$data['scode']);
        foreach(array(
'show','cfgs','grade') as $k){
            
$data[$k] = $this->usess[$k] = '0';
        }
        
$this->usess['errno'] = '0';
        
$this->db->table($this->usTable)->data(basReq::in($data))->where("sid='$sid'")->update();
        return 
'OK'
    }
    
    function 
login_msg($key){
        if(
is_numeric($key)){
            
$re basLang::show('usrb_ertimes',$key);
        }else{
            
$ucfg basLang::ucfg('cfglibs.usrbase');
            
$re = isset($ucfg[$key]) ? $ucfg[$key] : "($key)".basLang::show('usrb_erunknow');
        }
        return 
$re;
    }
    
    
//
    
static function setLogin($type='m'$uname=''){
        
$db glbDBObj::dbObj();
        if(empty(
$uname)) return;
        
$user self::userObj($type=='m' 'Member' 'Admin');
        
$user->uinfo $user->uget_minfo($uname); 
        
$data $user->sinit; unset($data['scode']); 
        
$data['uname'] = $user->uinfo['uname']; 
        
$data['cfgs'] = '0';
        
$data['grade'] = $user->uinfo['grade']; //grade=xstop处理???
        
$data['errno'] = 0;
        
$data['show'] = empty($user->uinfo['show']) ? '0' $user->uinfo['show'];
        
$usTable $type=='m' 'active_online' 'active_admin';
        if(!empty(
$user->usess)){
            
$sid $data['sid']; unset($data['sid']);
            
$db->table($usTable)->data(basReq::in($data))->where("sid='$sid'")->update();
        }else{ 
            
$db->table($usTable)->data(basReq::in($data))->insert();
        } 
    }
    
    
// re : Null, isLogin, Forbid, Info, array()
    
function check_login($uname='',$upass=''){
        
$_groups glbConfig::read('groups');
        if(empty(
$uname) || empty($upass)) return 'Null';
        
$sre usrPerm::simIdpw($uname$upass);
        if(!empty(
$sre)) return $sre;
        if(
$this->userFlag=='Error') return 'Forbid';
        if(
$this->userFlag=='Login') return 'isLogin'
        
$uname basStr::filKey($uname,'_.-@'); // email
        
$this->uinfo $this->uget_minfo($uname,$upass); 
        if(empty(
$this->uinfo['show'])) return 'noChecked'
        if(
$this->uinfo['grade']=='isStopped') return 'isStopped'//grade=xstop处理???
        
if($this->uinfo['grade']=='unActivated') return 'unActivated'
        
$data $this->sinit; unset($data['scode']);
        
$data['uname'] = $uname$data['show'] = '0'$data['cfgs'] = '0';
        if(
$this->uinfo){ 
            
$this->userFlag 'Login';
            
$data['grade'] = $this->uinfo['grade']; 
            
$data['errno'] = 0;
            
$data['show'] = empty($this->uinfo['show']) ? '0' $this->uinfo['show'];
            
$this->uperm $this->uget_perms($this->uinfo['grade']); 
            
$this->uset_mlogs($uname,$this->uperm['model']);
            
$re 'OK';
        }else{ 
            
$data['grade'] = '0';
            
$data['errno'] = empty($this->usess) ? $this->usess['errno'] + 1;
            
$re $data['errno'];
        } 
        if(!empty(
$this->usess)){
            
$sid $data['sid']; unset($data['sid']);
            
$this->db->table($this->usTable)->data(basReq::in($data))->where("sid='$sid'")->update();
        }else{ 
            
$this->db->table($this->usTable)->data(basReq::in($data))->insert();
        }
        
$this->usess $data
        return 
$re;
    }
    
    
//$re //Login/Guest,Error
    
function check_cuser(){
        global 
$_cbase;
        
$stamp $_cbase['run']['stamp'];
        
$_groups glbConfig::read('groups');
        
$sid $this->sinit['sid'];
        
$this->usess $this->uget_online($sid,'*');
        
$_cbase['run']['uname'] = empty($this->usess['uname']) ? '(unKnow)' $this->usess['uname'];
        if(!empty(
$this->usess)){ // 判断: stime,errno,uid,grade,
            
if($stamp-$this->usess['stime']>$this->utmOut){ //超时
                
$this->userFlag 'Guest';
            }elseif(
$this->usess['errno']>=$this->errno){ //错误
                
$this->userFlag 'Error';
            }else{ 
//登录正常
                
$this->uperm $this->uget_perms($this->usess['grade']);
                if(
$this->uperm){
                    
$this->userFlag 'Login';
                    if(
$stamp-$this->usess['stime']>$this->udbUpd){ //更新会话表
                        
$data = array('stime'=>$stamp);
                        
$this->db->table($this->usTable)->data(basReq::in($data))->where("sid='$sid'")->update();
                    }
                }
                
$this->uinfo $this->uget_minfo($this->usess['uname']); //if(empty($this->uinfo['show']))  
            
}        
        }
    }

    
//...???
    
function uget_online($sid,$field=''){
        
$_groups glbConfig::read('groups');
        
$field || $field '*';
        
$res $this->db->table($this->usTable)->field($field)->where("sid='$sid'")->find();
        return 
$res;    
    }

    
//...
    
static function uget_perms($grade){
        
$grades glbConfig::read('grade','dset');
        if(isset(
$grades[$grade])){
            
$res $grades[$grade];
        }else{
            
$res = array();    
        }
        return 
$res;    
    }

    
//...
    
function uset_mlogs($uname,$umod,$user=''){
        global 
$_cbase;
        
$_cbase['run']['skipDemo'] = 1;
        
$user || $user $uname;
        
$data = array('eip'=>$this->sinit['sip'],'etime'=>$this->sinit['stime'],'euser'=>$user);
        
$re1 $this->db->table("users_$umod")->data(basReq::in($data))->where("uname='$uname'")->update();
        
//$re2 = $this->db->table("users_uacc")->data(array('etime'=>$this->sinit['stime']))->where("uname='$uname'")->update();
        
$_cbase['run']['skipDemo'] = 0;
    }

    
//..., model,grade,checked
    
static function uget_minfo($uname,$upass='',$unset=array('upass')){
        
$db glbDBObj::dbObj(); 
        
$_groups glbConfig::read('groups');
        
$ubase $db->table('users_uacc')->where("uname='$uname'")->find(); 
        if(empty(
$ubase)) return array(); 
        
$umod $ubase['umods']; $dbpass $ubase['upass'];
        if(!isset(
$_groups[$umod])) return array(); 
        if(
$upass && $dbpass!==comConvert::sysPass($uname,$upass,$umod)) return array();
        
$uminf $db->table("users_$umod")->where("uname='$uname'")->find(); // AND `show`='1'
        
if(empty($uminf)) return array();
        if(!empty(
$ubase)){
            if(!empty(
$unset)){ foreach($unset as $k){
                unset(
$ubase[$k]);
            } }
            
$uminf $uminf $ubase;
        } 
        return 
$uminf;    
    }
    
    
//超时时间设置
    
function sess_tout($userType=''){
        global 
$_cbase
        
$madmin intval(@$_cbase['tout_admin']);
        
$member intval(@$_cbase['tout_member']);
        
//小时
        
if($madmin<0.15$madmin 1; if($madmin>100$madmin 96
        if(
$member<0.15$member 4; if($member>100$member 96
        
$this->userType $userType;
        
$this->usTable $this->userType=='adminer' 'active_admin' 'active_online'
        
$this->errno $this->userType=='adminer' 8
        
$this->utmOut 3600*($this->userType=='adminer' $madmin $member);

        
    }
    
//初始化seesion
    
function sess_init(){
        global 
$_cbase
        
$this->sessid usrPerm::getSessid();
        
$stime $_cbase['run']['stamp'];
        
$scode comConvert::sysEncode($stime,$_cbase['safe']['safil']);
        
$re comSession::guid('safil','sessid');
        foreach(array(
'stime','scode') as $k$re[$k] = $$k;
        
$this->sinit $re
    }
        
    
// $uclass : 按uclass建立user对象, <Null>-Admin/Member-建立
    
static function userObj($uclass=''){
        if(empty(
$uclass)){ 
            
$uclass defined('RUN_ADMIN') ? 'Admin' : array('Member','Admin');    
        }
        if(
is_array($uclass)){
            
$utmp NULL;
            foreach(
$uclass as $flag){
                
$iuser self::userObj($flag);
                if(
$flag=='Member'$utmp $iuser;
                if(!empty(
$iuser->uperm)){ 
                    return 
$iuser;
                }
            }
            return 
$utmp;
        }
        
$uclass $uclass=='Admin' '\\imcat\\usrAdmin' '\\imcat\\usrMember';
        if(empty(
self::$uobjs[$uclass])){ 
            
self::$uobjs[$uclass] = new $uclass();
        }
        return 
self::$uobjs[$uclass];
    }
    
}