relOperation($param); break; case 'reply': // Reply operations $this->relOperation($param); break; case 'replied': // Replied operations $this->repdOperation($param); break; case 'delRelease': // Delete operations for Release $this->delRelOperation($param); break; case 'delReplied': // Delete operations for Replied $this->delRepOperation($param); break; case 'master': // Master operations change experience $this->masOperation($param); break; } } /** * Release & Reply operations * @param array $param */ private function relOperation($param){ $exp = 0; $today = date('Y-m-d'); $dexp = $param['type'] == 'release' ? intval(C('circle_exprelease')) : intval(C('circle_expreply')); if(intval(C('circle_expreleasemax')) != 0){ $exp_info = $this->table('circle_expmember')->find($param['member_id']); if(!empty($exp_info) && $exp_info['em_time'] == $today){ // there are data $exp = ( $dexp > (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) ) ? (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) : $dexp; }else{ // There is no data $exp = ( $dexp > intval(C('circle_expreleasemax')) ) ? intval(C('circle_expreleasemax')) : $dexp ; } $insert = array(); $insert['member_id'] = $param['member_id']; $insert['circle_id'] = $param['circle_id']; $insert['em_exp'] = empty($exp_info) || $today != $exp_info['em_time'] ? $exp : intval($exp_info['em_exp'])+$exp ; $insert['em_time'] = $today; $this->table('circle_expmember')->insert($insert, true); }else{ $exp = $dexp; } if( $exp != 0 ){ $param['exp'] = $exp; return $this->expOperation(1, $param); } } /** * Replied operations * @param array $param */ private function repdOperation($param){ $exp = 0; $today = date('Y-m-d'); if(intval(C('circle_exprepliedmax')) != 0){ $exp_info = $this->table('circle_exptheme')->find($param['theme_id']); if(!empty($exp_info) && $exp_info['et_time'] == $today){ // there are data $exp = ( intval(C('circle_expreplied')) > (intval(C('circle_exprepliedmax'))-intval($exp_info['et_exp'])) ) ? (intval(C('circle_exprepliedmax'))-intval($exp_info['et_exp'])) : intval(C('circle_expreplied')); }else{ // There is no data $exp = ( intval(C('circle_expreplied')) > (intval(C('circle_exprepliedmax'))) ) ? intval(C('circle_exprepliedmax')) : intval(C('circle_expreplied')); } $insert = array(); $insert['theme_id'] = $param['theme_id']; $insert['et_exp'] = empty($exp_info) || $today != $exp_info['et_time'] ? $exp : intval($exp_info['et_exp'])+$exp; $insert['et_time'] = $today; $this->table('circle_exptheme')->insert($insert, true); }else{ $exp = intval(C('circle_expelease')); } if($exp != 0){ $param['exp'] = $exp; return $this->expOperation(1, $param); } } /** * Delete operations for Release * @param array $param */ private function delRelOperation($param){ return $this->expOperation(0, $param); } /** * Delete operations for Replied * @param array $param */ private function delRepOperation($param){ return $this->expOperation(0, $param); } /** * Master operations change experience * @param array $param */ private function masOperation($param){ return $this->expOperation(0, $param); } /** * Experience operations * @param int $type 1 increase, 0 decrease * @param array $param */ private function expOperation($type, $param){ $where = array(); $where['member_id'] = $param['member_id']; $where['circle_id'] = $param['circle_id']; $cm_info = $this->table('circle_member')->where($where)->find(); $update = array(); if($type){ $update['cm_exp'] = intval($cm_info['cm_exp'])+$param['exp']; // upgrade if( intval($cm_info['cm_nextexp']) != 0 && (intval($cm_info['cm_exp'])+$param['exp']) >= intval($cm_info['cm_nextexp']) && intval($cm_info['cm_level']) != 16 ){ $data = rkcache('circle_level', true); $ml_info = $this->table('circle_ml')->find($param['circle_id']); $update['cm_level'] = intval($cm_info['cm_level'])+1; $update['cm_levelname'] = empty($ml_info) ? $data[$update['cm_level']]['mld_name'] : $ml_info['ml_'.$update['cm_level']]; $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$update['cm_level']+1]['mld_exp']; } }else{ $update['cm_exp'] = intval($cm_info['cm_exp'])-$param['exp']; $data = rkcache('circle_level', true); $level = 0; foreach ($data as $val){ $level = intval($val['mld_id'])-1; if(intval($val['mld_exp']) > $update['cm_exp']) break; } // upgrade if($level != intval($cm_info['cm_exp'])){ $ml_info = $this->table('circle_ml')->find($param['circle_id']); $update['cm_level'] = $level; $update['cm_levelname'] = empty($ml_info) ? $data[$level]['mld_name'] : $ml_info['ml_'.$level]; $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$level+1]['mld_exp']; } } $rs = $this->table('circle_member')->where($where)->update($update); if($rs){ $this->recordsLog($type, $param); }else{ return false; } } /** * Records experience log */ private function recordsLog($type, $param){ $insert = array(); $insert['circle_id'] = $param['circle_id']; $insert['member_id'] = $param['member_id']; $insert['member_name'] = $param['member_name']; $insert['el_exp'] = $type ? $param['exp'] : -$param['exp']; $insert['el_time'] = time(); $insert['el_itemid'] = $param['itemid']; switch ($param['type']){ case 'release': $update = array(); $update['theme_id'] = $param['itemid']; $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']); $this->table('circle_theme')->update($update); $insert['el_type'] = 2; $insert['el_desc'] = L('circle_exp_release_theme'); break; case 'reply': $update = array(); $update['reply_exp']= array('exp', 'reply_exp+'.$param['exp']); $where = array(); list($where['theme_id'],$where['reply_id']) = explode(',', $param['itemid']); $this->table('circle_threply')->where($where)->update($update); $insert['el_type'] = 3; $insert['el_desc'] = L('circle_exp_reply'); break; case 'replied': $update = array(); $update['theme_id'] = $param['theme_id']; $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']); $this->table('circle_theme')->update($update); $insert['el_type'] = 4; $insert['el_desc'] = L('circle_exp_theme_replied'); break; case 'delRelease': $insert['el_type'] = 5; $insert['el_desc'] = L('circle_exp_theme_delete'); break; case 'delReplied': $insert['el_type'] = 6; $insert['el_desc'] = L('circle_exp_reply_delete'); break; case 'master': $insert['el_type'] = 1; $insert['el_desc'] = $param['desc']; break; } $this->table('circle_explog')->insert($insert); } }