123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- namespace Cron\Controller;
- use Common\Controller\CronController;
- class OfflineController extends CronController {
- public function __construct(){
- parent::__construct();
- }
- //处理下线
- public function index(){
- $uid = I('uid');
- $info = M('PkRecord')->where(array('user_id|ref_user_id'=>$uid,'record_status'=>array('IN','1,2,6'),))->order('record_id desc')->field('record_id,user_id,ref_user_id,record_status')->find();
- if ($info==NULL){
- return ;
- }
- $redis = $this->getRedis();
- //下线通知
- //$this->offline($uid, $info);
- $ms = $this->getMilliSecond();
- $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms);
-
- M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>4));
- M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
-
- if ($info['record_status']==6){
- if ($uid == $returnData['user_id']){
- $pkUserid = $returnData['user_id'];
- $peerUserId = $returnData['ref_user_id'];
- $pkRes = $this->normal($info['record_id'], 2, $returnData['user_id']);
- }else{
- $pkUserid = $returnData['ref_user_id'];
- $peerUserId = $returnData['user_id'];
- $pkRes = $this->normal($info['record_id'], 2, $returnData['ref_user_id']);
- }
- $returnData['record_source'] = $pkRes['record_source'];
-
- $startTime = $redis->get('pk_start_time'.$info['record_id']);
- $time = time()-$startTime;
- $returnData['time']=$time;
- $returnData['winner'] = $peerUserId;
- if ($this->userId==$info['user_id']){
- $returnData['winner'] = $info['ref_user_id'];
- }
- //自己
- $returnData['user_score'] = $pkRes['user_score'];
- $returnData['peer_score'] = $pkRes['ref_user_score'];
- $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
- $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
- //对手
- $returnData['user_score'] = $pkRes['ref_user_score'];
- $returnData['peer_score'] = $pkRes['user_score'];
- $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
- $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
- //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
- //$this->returnData($dataSoc1);exit;
- }else {
- $this->offline($uid, $info);
-
- }
- }
-
- //生成毫秒级时间
- private function getMilliSecond(){
- $time = explode (" ", microtime () );
- $time = $time [1] . ($time [0] * 1000);
- $time2 = explode ( ".", $time );
- $time = $time2 [0];
- return $time;
- }
-
- //掉线发送消息
- private function offline($pushUid,$info){
- if ($info['ref_user_id'] == $pushUid){
- $userId = $info['user_id'];
- }else{
- $userId = $info['ref_user_id'];
- }
- M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>0));
- M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
- $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],);
- $dataSoc = array('code'=>0,'type'=>6,'msg'=>'对战对手掉线!','data'=>$returnData);
- $this->pushMsg(json_encode($dataSoc), $userId);
- }
-
- //对战分数上报
- private function normal($recordId, $recordType, $userId){
- $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id,record_source')->find();
- $redis = $this->getRedis();
- $redis->del('pk_info'.$recordId);
- M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>5));
- M('User')->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id'],))))->save(array('user_status'=>5));
- if ($info['record_source']==1){
- //添加统计
- $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
- if ($staRes==NULL){
- M('Sta')->add(array('sta_normal'=>1));
- }else{
- M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_normal');
- }
- return array('record_source'=>1,'user_score'=>0,'ref_user_score'=>0);
- }else{
- //添加统计
- $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
- if ($staRes==NULL){
- M('Sta')->add(array('sta_rank'=>1));
- }else{
- M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
- }
- }
- if ($info['user_id']==$userId){
- $uid = $info['ref_user_id'];
- }else{
- $uid = $info['user_id'];
- }
- //把pk对象的信息查询出来
- $userRes = M('User')->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id']))))->field('user_id,user_score,pk_num,win_num,fail_num')->select();
- $userScore = $this->getScore($userId, $uid, $recordId, $recordType, $userRes);
- if ($recordType==1){
- $recordRefType = 2;
- }else{
- $recordRefType = 1;
- }
-
- $userRefScore = $this->getScore($uid, $userId, $recordId, $recordRefType, $userRes);
- return array('record_source'=>2,'user_score'=>$userScore,'ref_user_score'=>$userRefScore);
- }
-
- private function getScore($userId, $uid, $recordId, $recordType, $userRes){
- $userInfo = array();
- foreach ($userRes as $row){
- $userInfo[$row['user_id']] = $row;
- }
- /* 分数相同赢者加10分,败者减10分
- 分数不同且分低者胜时,赢者加10分+双方分数差/10 取整(比如700分赢了800分,这一局就加了20分),败者减10分+双方分数差/20取整(比如800分输给了700分,这一局就减了15分)
- 分数不同且分高者胜时,赢者加10分减去双方分数差/80 + 1 取整(比如800分赢了700分,这一局就加了8分),败者减赢者加分 */
- if ($userInfo[$userId]['user_score']>$userInfo[$uid]['user_score']){
- //自己的分数比对手高
- $score = 10 - floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/80) + 1;
- if ($recordType==1){
- $score = 0 + $score;
- }else{
- $score = 0 - $score;
- }
- }else{
- //自己的分数比对手低
- if ($recordType==1){
- $score = 10 + floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/10);
- }else{
- $score = floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/20) - 10;
- }
- }
- if ($recordType==1){
- //赢了比赛,并且比赛是前十场
- if ($userRes['pk_num']<=10){
- if ($userRes['win_num']<=2){
- $score = 2*$score;
- }else if($userRes['win_num']<6){
- $score = 3*$score;
- }else if($userRes['win_num']<=10){
- $score = 4*$score;
- }
- }
- }else{
- //输了比赛,并且比赛是前十场
- if ($userRes['pk_num']<=10){
- if ($userRes['fail_num']<=2){
- $score = 2*$score;
- }else if($userRes['fail_num']<6){
- $score = 3*$score;
- }else if($userRes['fail_num']<=10){
- $score = 4*$score;
- }
- }
- }
- //判断是否是前十场
- if($userRes['pk_num']>10){
- if ($recordType==1){
- M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'fail_num'=>0,'pk_num'=>array('exp','pk_num+1'),));
- }else{
- M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'win_num'=>0,'pk_num'=>array('exp','pk_num+1'),));
- }
- }else{
- M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
- }
- M('UserScore')->add(array('user_id'=>$userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
- //修改用户等级
- $userResInfo = M('User')->where(array('user_id'=>$userId))->field('user_score')->find();
- $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
- M('User')->where(array('user_id'=>$userId))->save(array('user_level'=>$levelInfo['level_id']));
- return $score;
- }
- }
|