userId = 1000001; $recordSource = I('pk_type',1); //查询是否有对战记录 $pkRecordInfo = M('PkRecord')->where(array('user_id|ref_user_id'=>$this->userId,'record_status'=>2,'operate_dt'=>array('LT',strtotime('-10 second'))))->field('record_id,user_id,ref_user_id')->find(); if ($pkRecordInfo!=NULL){ M('User')->where(array('user_id'=>array('IN',array($pkRecordInfo['user_id'],$pkRecordInfo['ref_user_id'],))))->save(array('user_status'=>0)); M('PkRecord')->where(array('record_id'=>$pkRecordInfo['record_id']))->save(array('record_status'=>3)); if ($this->userId==$pkRecordInfo['user_id']){ $scockUserId = $pkRecordInfo['ref_user_id']; }else{ $scockUserId = $pkRecordInfo['user_id']; } $dataSoc = array('code'=>0,'type'=>17,'msg'=>'10s中对战对象为准备!','data'=>$pkRecordInfo); $pushUid = $this->pushMsg(json_encode($dataSoc), $scockUserId); } //查询用户状态 $pkUserInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_id,user_status')->find(); if ($pkUserInfo==NULL || !in_array($pkUserInfo['user_status'], array(0,4,5))){ $resData = array('code'=>1,'msg'=>'不能对战!'); $this->returnData($resData);exit; } $peerUserId = I('peer',''); $uid = $this->getSocketOnline($recordSource,$peerUserId); if (!$uid){ $key = 'pk_choose_friend'; $this->pushQueue($key,array('user_id'=>$this->userId,'num'=>1,'pk_type'=>$recordSource)); $dataSoc = array('code'=>0,'msg'=>'系统正在匹配!','data'=>''); $this->returnData($dataSoc);exit; } if ($uid<=0){ return false; } //添加匹配记录 $recordId = M('PkRecord')->add(array('user_id'=>$this->userId,'ref_user_id'=>$uid,'record_source'=>$recordSource,'record_status'=>2,'peer_source'=>2,'operate_dt'=>time())); M('User')->where(array('user_id'=>array('IN',array($this->userId,$uid))))->save(array('user_status'=>2)); //如果是好友获取昵称 $userNick = array($this->userId=>'',$uid=>''); if ($this->userId>$uid){ $friendInfo =M('Friend')->where(array('user_id'=>$uid,'ref_user_id'=>$this->userId))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($this->userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']); } }else{ $friendInfo =M('Friend')->where(array('user_id'=>$this->userId,'ref_user_id'=>$uid))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($this->userId=>$friendInfo['user_nickname'],$uid=>$friendInfo['ref_user_nickname']); } } $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id'; $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name'; $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($this->userId,$uid))))->field($field)->select(); foreach ($userInfoArr as $userInfo){ if ($userInfo['user_id']==$this->userId){ //$userInfo = $userInfoArr[0]; $userInfo['user_nickname'] = $userNick[$this->userId]; $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $uid); //不在线 if ($pushUid){ $this->offline($pushUid, $returnData); } }else{ $userInfo['user_nickname'] = $userNick[$uid]; $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId); //不在线 if ($pushUid){ $this->offline($pushUid, $returnData); } } } //var_dump($returnData);exit; $resData = array('code'=>0,'msg'=>'已应战,请准备开始对战!'); $this->returnData($resData);exit; } //获取在线好友 private function getSocketOnline($recordSource, $peerUserId){ $res = $this->online(); if(empty($res)){ return FALSE; } unset($res[$this->userId]); $userIdArr = array_keys($res); if (in_array($peerUserId, $userIdArr)){ return $peerUserId; } //$chunkUserId = array_chunk($userIdArr,200); $redis = $this->getRedis(); if ($recordSource==2){ $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_level')->find(); } foreach ($userIdArr as $uid){ $uidLock = $this->get($uid); if ($uidLock){ continue; }else{ $redis->set($uid,1,3); } if ($recordSource==2){ $peerInfo = M('User')->where(array('user_id'=>$uid,'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find(); }else{ $peerInfo = M('User')->where(array('user_id'=>$uid,'user_status'=>array('IN','0,4,5')))->field('user_id')->find(); } if ($peerInfo != NULL){ M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2)); break; } } if ($peerInfo == NULL){ return FALSE; }else{ return $peerInfo['user_id']; } } //获取最近登录用户 private function getLastTimeLogin($userLevel,$minute){ $cons = array( 'is_delete' => 1, 'user_level'=>$userLevel, 'user_status' => array('IN','0,4,5'), //'u.user_id' => array('NEQ',$this->userId), 'user_id' => array('exp',"!=$this->userId"), 'last_dt' => array('GT',strtotime("{$minute} minute")), ); $res = M('User')->where($cons)->order('last_dt desc')->field('user_id,user_phone,user_name,user_level,user_sex,user_icon')->find(); return $res; } //邀请好友pk public function inviteFriend(){ $uid = I('uid'); $condition = array( 'is_delete' => 1, 'user_id' => $uid, 'user_status' => array('IN','0,4,5'), ); $info = M('User')->where($condition)->field('user_id,user_phone,user_name,user_level,user_sex,user_icon')->find(); if ($info==NULL){ $data = array('code'=>1,'msg'=>'对方正在PK对战,暂时无法邀请,请稍后再试'); $this->returnData($data);exit; } //添加匹配记录 $recordId = M('PkRecord')->add(array('user_id'=>$this->userId,'record_source'=>1,'ref_user_id'=>$uid,'operate_dt'=>time())); M('User')->where(array('user_id'=>array('IN',array($this->userId,$uid))))->save(array('user_status'=>1,'pk_dt'=>time())); //M('User')->where(array('user_id'=>$uid))->save(array('user_status'=>1,'friend_notice'=>array('exp','friend_notice+1'))); //调用友盟给,好友发送消息 $title = '我正在noraml对战模式邀请你来应战,就问你句:敢不敢应战!'; //获取好友设置我的昵称 if ($uid>$this->userId){ $friendInfo = M('Friend')->where(array('user_id'=>$this->userId,'ref_user_id'=>$uid))->field('user_nickname')->find(); }else{ $friendInfo = M('Friend')->where(array('user_id'=>$uid,'ref_user_id'=>$this->userId))->field('ref_user_nickname as user_nickname')->find(); } if ($friendInfo==NULL || empty($friendInfo['user_nickname'])){ $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_name')->find(); $userNickname = $userInfo['user_name']; }else{ $userNickname = $friendInfo['user_nickname']; } $title1 = $userNickname.'正在noraml对战模式邀请你来应战,就问你句:敢不敢应战!'; $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$info['user_id']); $dataUm = json_encode(array('code'=>0,'type'=>0,'notice_type'=>2,'msg'=>$title1,'data'=>$returnData)); $this->umengPush($info['user_id'], $dataUm); M('User')->where(array('user_id'=>$uid))->setInc('friend_notice'); M('Notice')->add(array('ref_user_id'=>$uid,'user_id'=>$this->userId,'record_id'=>$recordId,'notice_type'=>2,'notice_title'=>'对战邀请','notice_content'=>$title,'operate_dt'=>time())); $data = array('code'=>0,'msg'=>'已邀请成功,请等待好友应战!','data'=>$returnData); $this->returnData($data);exit; } public function test(){ $dataSoc = array('code'=>0,'msg'=>'已应战,请准备开始对战!','data'=>array(111,222)); $res = $this->pushMsg(json_encode($dataSoc), array(1000010,1000005)); var_dump($res);exit; } //对手响应 public function answer(){ $type=I('type'); $recordId = I('record_id'); $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id,record_status')->find(); if ($info['record_status']!=1){ $returnData = array('record_id'=>$recordId,'user_id'=>'','ref_user_id'=>''); $dataSoc = array('code'=>1,'type'=>0,'msg'=>'对战已结束','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($this->userId)); $this->returnData($dataSoc);exit; } if ($info['ref_user_id']!=$this->userId){ $returnData = array('record_id'=>$recordId); $dataSoc = array('code'=>1,'msg'=>'您不允许应战','data'=>$returnData); $this->returnData($dataSoc);exit; } if ($type==2){ 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'=>1,'type'=>2,'msg'=>'未应战','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($info['user_id'])); $this->returnData($dataSoc);exit; } M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>2)); M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>2)); /* $data = array('code'=>0,'msg'=>'已经准备','data'=>$info); $this->returnData($data);exit; */ //如果是好友获取昵称 $userNick = array($info['user_id']=>'',$info['ref_user_id']=>''); if ($info['user_id']>$info['ref_user_id']){ $friendInfo =M('Friend')->where(array('user_id'=>$info['ref_user_id'],'ref_user_id'=>$this->userId))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($info['user_id']=>$friendInfo['ref_user_nickname'],$info['ref_user_id']=>$friendInfo['user_nickname']); } }else{ $friendInfo =M('Friend')->where(array('user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($info['user_id']=>$friendInfo['user_nickname'],$info['ref_user_id']=>$friendInfo['ref_user_nickname']); } } $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id'; $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name'; $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id']))))->field($field)->select(); foreach ($userInfoArr as $userInfo){ if ($userInfo['user_id']==$info['user_id']){ $userInfo['user_nickname'] = $userNick[$info['user_id']]; $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>1,'msg'=>'已应战,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $info['ref_user_id']); //不在线 if ($pushUid){ $this->offline($pushUid, $info); } }else{ $userInfo['user_nickname'] = $userNick[$info['ref_user_id']]; $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>1,'msg'=>'已应战,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $info['user_id']); //不在线 if ($pushUid){ $this->offline($pushUid, $info); } } } //var_dump($returnData);exit; $resData = array('code'=>0,'msg'=>'已应战,请准备开始对战!'); $this->returnData($resData);exit; } //掉线发送消息 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); } //双方准备 public function ready(){ $recordId = I('record_id'); $pageSize = I('init_score',0); if (!empty($pageSize)){ $testInfo = M('PkRecord')->where(array('record_id'=>$recordId))->find(); if ($testInfo['user_status']!=1){ M('PkRecord')->where(array('record_id'=>$recordId))->save(array('user_status'=>0,'record_status'=>2)); M('PkWords')->where(array('record_id'=>$recordId))->delete(); } } $info = M('PkRecord')->where(array('record_id'=>$recordId,'record_status'=>2))->field('record_id,user_status,user_id,ref_user_id')->find(); if ($info==NULL){ $returnData = array('record_id'=>$recordId,'user_id'=>'','ref_user_id'=>''); $dataSoc = array('code'=>1,'type'=>0,'msg'=>'没有查询到对战信息','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($this->userId)); $this->returnData($dataSoc);exit; } M('PkRecord')->where(array('record_id'=>$recordId))->setInc('user_status'); $info = M('PkRecord')->where(array('record_id'=>$recordId,'record_status'=>2))->field('record_id,user_status,user_id,ref_user_id')->find(); if ($info['user_status']==2){ M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>6)); M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>6)); //生成对战题库 $storeRes = $this->getStoreList($info['user_id'], $info['ref_user_id'], $recordId, $pageSize); if (!$storeRes){ $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']); $dataSoc = array('code'=>1,'type'=>0,'msg'=>'生成题库失败','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($this->userId)); $this->returnData($dataSoc);exit; } $wordInfo = $this->getStore($info['record_id']); $ms = $this->getMilliSecond(); $scoreKey = 'score_'.$recordId.'_'.$info['user_id']; $refScoreKey = 'score_'.$recordId.'_'.$info['ref_user_id']; $redis = $this->getRedis(); if (empty($pageSize)){ $redis->set($scoreKey,C('PK_SCORE'),500); $redis->set($refScoreKey,C('PK_SCORE'),500); }else{ $redis->set($scoreKey,$pageSize,500); $redis->set($refScoreKey,$pageSize,500); } $redis->set('pk_start_time'.$recordId,time(),500); $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'second'=>3,'ms'=>$ms,'list'=>$wordInfo); if (empty($pageSize)){ $returnData['user_score'] = C('PK_SCORE'); $returnData['peer_score'] = C('PK_SCORE'); }else{ $returnData['user_score'] = $pageSize; $returnData['peer_score'] = $pageSize; } $dataSoc = array('code'=>0,'type'=>4,'msg'=>'已经准备,3s后开始对战','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); //不在线 if ($pushUid){ $this->offline($pushUid, $info); } //把对战信息存到redis $this->setRedisPkRecordInfo($recordId,$info); unset($returnData['list']); $this->returnData($dataSoc);exit; } $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']); $dataSoc = array('code'=>0,'type'=>8,'msg'=>'已准备,请等待对手准备','data'=>$returnData); if ($info['user_id']==$this->userId){ $this->pushMsg(json_encode($dataSoc), $info['ref_user_id']); }else{ $this->pushMsg(json_encode($dataSoc), $info['user_id']); } $this->returnData($dataSoc);exit; } //中途结束 public function theEnd(){ $recordId = I('record_id'); $redis = $this->getRedis(); $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id')->find(); $ms = $this->getMilliSecond(); $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms); if ($this->userId == $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'])); //删除题库队列 $pushKey = 'pk_words_'.$recordId; $this->flushQueue($pushKey); $this->returnData($dataSoc1);exit; } //10s未响应,取消pk public function cancel(){ $recordId = I('record_id'); $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_status,record_id,user_id,ref_user_id')->find(); if ($info==NULL){ $returnData = array('record_id'=>$info['record_id'],'user_id'=>'','ref_user_id'=>''); $dataSoc =array('code'=>1,'msg'=>'对战信息获取失败','data'=>$returnData); $this->pushMsg( json_encode($dataSoc), array($this->userId)); $this->returnData($dataSoc); } M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>4)); M('User')->where(array('user_id'=>array('IN',array($this->userId,$info['user_id']))))->save(array('user_status'=>5)); $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']); $dataSoc = array('code'=>0,'msg'=>'10s未响应,取消对战','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); $this->returnData($dataSoc);exit; } //把对战信息存到redis private function setRedisPkRecordInfo($recordId, $info){ $redis = $this->getRedis(); $redis->set('pk_info'.$recordId,serialize($info),3600); } //获取所有题库 private function getStore($recordId){ /* $condition = array('record_id'=>$recordId,'pw_status'=>1,'pw_id'=>array('GT',$pwId)); $join = 'pw LEFT JOIN t_store_words sw ON pw.words_id=sw.words_id'; $res = M('PkWords')->join($join)->where($condition)->order('pw_id desc')->field('sw.*,pw.pw_id')->find(); */ $pushKey = 'pk_words_'.$recordId; $res = $this->popQueue($pushKey); $redis = $this->getRedis(); $infoRedis = $redis->get('pk_info'.$recordId); $info = unserialize($infoRedis); if (!$res){ $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']); $dataSoc = array('code'=>1,'type'=>13,'msg'=>'获取单词失败','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); $this->returnData($dataSoc); } $returnData = array(); //获取错误3个项 $wordsList = M('StoreWords')->where(array('store_id'=>$res['store_id'],'words_id'=>array('NEQ',$res['words_id'])))->order('rand()')->limit(3)->select(); $rightText = $res['words_text']; $wordsKey = array('b','c','d'); foreach ($wordsList as $k=>$r){ $wordsTextArr[$wordsKey[$k]] = $this->getWordsText($r); } $wordsKey[]='a'; shuffle($wordsKey); $wordsTextArr['a'] = $rightText; $wordsTextNewArr = array(); foreach ($wordsKey as $char){ $wordsTextNewArr[] = $wordsTextArr[$char]; } $rightKey = array_search('a', $wordsKey); $redisKey = 'pk_right_'.$recordId.'_'.$res['pw_id']; $this->pushQueue($redisKey,$rightKey+1); $returnData = array( 'pw_id'=>$res['pw_id'], 'store_id'=>$res['store_id'], 'words_id'=>$res['words_id'], 'words_name'=>$res['words_name'], 'words_text' =>$wordsTextNewArr, ); return $returnData; } //下一题 public function getNextWords(){ //从redis中获取答案,对比。 $pwId = I('pw_id'); $recordId = I('record_id'); $chooseNum = I('choose_num',0); $redis = $this->getRedis(); $redisKey = 'pk_right_'.$recordId.'_'.$pwId; //获取答案 $rightKey = $this->popQueue($redisKey); //获取对战信息 $infoRedis = $redis->get('pk_info'.$recordId); $info = unserialize($infoRedis); $ms = $this->getMilliSecond(); $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms); //判断对战是否结束 if ($info==NULL){ $resData = array('code'=>1,'msg'=>'对战已结束!'); $this->returnData($resData);exit; } //已被对手验证答案 if (!$rightKey){ $dataSoc = array('code'=>0,'type'=>9,'msg'=>'','data'=>$returnData); //$pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId); $this->returnData($dataSoc);exit; } $scoreKey = 'score_'.$recordId.'_'.$info['user_id']; $refScoreKey = 'score_'.$recordId.'_'.$info['ref_user_id']; $score = $redis->get($scoreKey); $refScore = $redis->get($refScoreKey); if ($refScore<=0 || $score<=0){ $dataSoc = array('code'=>0,'type'=>11,'msg'=>'','data'=>''); $pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); $this->returnData($dataSoc);exit; } //双方都未作答 if ($chooseNum==0){ M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>3,'ref_status'=>3)); $score = $redis->decr($scoreKey); $refScore = $redis->decr($refScoreKey); }else{ //答题后,判断是否正确 if ($chooseNum==$rightKey){ //自己答对 if ($info['user_id'] == $this->userId){ M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>1,'ref_status'=>3)); }else{ M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>1,'user_status'=>3)); } $score = $redis->get($scoreKey); $refScore = $redis->decr($refScoreKey); }else{ //自己打错 if ($info['user_id'] == $this->userId){ M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>2,'ref_status'=>3)); }else{ M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>2,'user_status'=>3)); } $score = $redis->decr($scoreKey); $refScore = $redis->get($refScoreKey); } } $pushKey = 'pk_words_'.$recordId; $returnData['user_score'] = $score; $returnData['peer_score'] = $refScore; //都未作答 if ($refScore==0 && $score==0){ $this->flushQueue($pushKey); if ($this->userId == $returnData['user_id']){ $pkUserid = $returnData['user_id']; $peerUserId = $returnData['ref_user_id']; $pkRes = $this->normal($recordId, 1, $returnData['user_id']); }else{ $pkUserid = $returnData['ref_user_id']; $peerUserId = $returnData['user_id']; $pkRes = $this->normal($recordId, 1, $returnData['ref_user_id']); } $returnData['record_source'] = $pkRes['record_source']; $startTime = $redis->get('pk_start_time'.$recordId); $time = time()-$startTime; $returnData['time']=$time; $returnData['winner'] = $this->userId; //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['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); $this->returnData($dataSoc1);exit; } //对手分数先到0 if ($refScore==0){ $this->flushQueue($pushKey); if ($this->userId == $returnData['user_id']){ $pkUserid = $returnData['user_id']; $peerUserId = $returnData['ref_user_id']; $pkRes = $this->normal($recordId, 1, $returnData['user_id']); }else{ $pkUserid = $returnData['ref_user_id']; $peerUserId = $returnData['user_id']; $pkRes = $this->normal($recordId, 1, $returnData['ref_user_id']); } $returnData['record_source'] = $pkRes['record_source']; $startTime = $redis->get('pk_start_time'.$recordId); $time = time()-$startTime; $returnData['time']=$time; $returnData['winner'] = $this->userId; //自己 $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); $this->returnData($dataSoc1);exit; } //自己分数先到0 if ($score==0){ $this->flushQueue($pushKey); //$pkRes = $this->normal($recordId, 2, $this->userId); if ($this->userId == $returnData['user_id']){ $pkUserid = $returnData['user_id']; $peerUserId = $returnData['ref_user_id']; $pkRes = $this->normal($recordId, 2, $returnData['user_id']); }else{ $pkUserid = $returnData['ref_user_id']; $peerUserId = $returnData['user_id']; $pkRes = $this->normal($recordId, 2, $returnData['ref_user_id']); } $returnData['record_source'] = $pkRes['record_source']; $startTime = $redis->get('pk_start_time'.$recordId); $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; } //获取下一题 $wordInfo = $this->getStore($recordId); $returnData['list'] = $wordInfo; $dataSoc = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); //不在线 if ($pushUid){ $this->offline($pushUid, $info); } $this->returnData($dataSoc);exit; } public function aa(){ $userResInfo = M('User')->where(array('user_id'=>1000010))->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'=>1000010))->save(array('user_level'=>$levelInfo['level_id'])); $userResInfo = M('User')->where(array('user_id'=>1000005))->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'=>1000005))->save(array('user_level'=>$levelInfo['level_id'],'user_status'=>5)); //$this->getStoreList(1000010,1000005,34);exit; //$this->getNextWord(34); //$aa = $this->pushQueue(34,1); //var_dump($aa);exit; //$bb = $this->popQueue(34); //var_dump($bb);exit; //$info = M('PkRecord')->where(array('record_id'=>34))->field('record_id,user_id,ref_user_id')->find(); //$this->setRedisPkRecordInfo(34,$info); //$aa = $this->getRedisPkRecordInfo(34); //var_dump($aa);exit; /* $wordsTextArr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4); $wordsKey = array('b','c','d','a'); shuffle($wordsKey); $wordsTextNewArr = array(); foreach ($wordsKey as $char){ $wordsTextNewArr[] = $wordsTextArr[$char]; } echo array_search('a',$wordsKey); var_dump($wordsKey,$wordsTextNewArr);exit; */ //$this->normal(55, 1, 1000010); } //对战分数上报 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; } //对战分数上报 private function rank(){ $score = I('user_score'); $recordId = I('record_id'); $recordType = I('record_type'); if (empty($recordId)){ $data = array('code'=>1,'msg'=>'对战ID不能为空'); $this->returnData($data);exit; } //添加统计 $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'); } $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find(); if ($info['user_id']==$this->userId){ $uid = $info['ref_user_id']; }else{ $uid = $info['user_id']; } if (empty($recordType)||!in_array($recordType, array(1,2))){ $data = array('code'=>1,'msg'=>'对战输赢错误'); $this->returnData($data);exit; } //把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(); 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'=>$this->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'=>$this->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'=>$this->userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),)); } M('UserScore')->add(array('user_id'=>$this->userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time())); //修改用户等级 $userResInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_score')->find(); $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id desc')->field('level_id')->find(); M('User')->where(array('user_id'=>$this->userId))->save(array('user_level'=>$levelInfo['level_id'])); $data = array('code'=>0,'msg'=>'比赛分数上报成功','data'=>array('user_score'=>$score)); $this->returnData($data);exit; } //生成3个错误选项 private function getThreeWords($user_id, $ref_user_id, $num){ if ($num%2==0){ $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find(); $userLevel = $userInfo['user_level']; }else{ $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find(); $userLevel = $info['user_level']; } $storeRes = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find(); if ($storeRes == NULL){ $storeRes['store_id'] = 1; } $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1); $wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit(3)->select(); } //生成毫秒级时间 private function getMilliSecond(){ $time = explode (" ", microtime () ); $time = $time [1] . ($time [0] * 1000); $time2 = explode ( ".", $time ); $time = $time2 [0]; return $time; } //生成对战题库 private function getStoreList($user_id, $ref_user_id, $recordId, $pageSize=''){ if (empty($pageSize)){ $pageSize = I('page_size',C('PK_SCORE')*2); }else{ $pageSize = $pageSize*2; } $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find(); $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find(); if ($userInfo==NULL || $info==NULL){ return false; } if ($userInfo['user_level']==$info['user_level']){ $storeRes = M('Store')->where(array('level_id'=>$userInfo['user_level'],'is_delete'=>1))->field('store_id')->find(); if ($storeRes==NULL){ return false; } $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1); //$wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit($pageSize)->select(); $wordsRes = M('StoreWords')->where($condition)->order('rand()')->limit($pageSize)->select(); }else{ $userLevel = $userInfo['user_level']>$info['user_level']?$userInfo['user_level']:$info['user_level']; $storeRes1 = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find(); $storeRes2 = M('Store')->where(array('level_id'=>$userLevel-1,'is_delete'=>1))->field('store_id')->find(); if ($storeRes1==NULL||$storeRes2==NULL){ return false; } $condition1 = array('store_id'=>$storeRes1['store_id'],'is_delete'=>1); $condition2 = array('store_id'=>$storeRes2['store_id'],'is_delete'=>1); $size = ceil($pageSize/2); //$wordsRes1 = M('StoreWords')->where($condition1)->order('words_id desc')->limit($size)->select(); //$wordsRes2 = M('StoreWords')->where($condition2)->order('words_id desc')->limit($size)->select(); $wordsRes1 = M('StoreWords')->where($condition1)->order('rand()')->limit($size)->select(); $wordsRes2 = M('StoreWords')->where($condition2)->order('rand()')->limit($size)->select(); $wordsRes = array_merge($wordsRes1, $wordsRes2); } //插入对战单词表中 $dataList = array(); foreach ($wordsRes as $key=>$words){ $cacheData = array(); $dataList = array('record_id'=>$recordId,'words_id'=>$words['words_id'],'operate_dt'=>time()); $pwId = M('PkWords')->add($dataList); $wordsRes[$key]['pw_id'] = $pwId; $cacheData = array( 'pw_id'=>$pwId, 'store_id'=>$words['store_id'], 'words_id'=>$words['words_id'], 'words_name'=>$words['words_name'], 'words_text' =>$this->getWordsText($words), ); $pushKey = 'pk_words_'.$recordId; $pushRes = $this->pushQueue($pushKey, $cacheData); if (!$pushRes){ $pushRes = $this->pushQueue($pushKey, $cacheData); } if (!$pushRes){ return false; } } return true; } //发弹幕 public function acFun(){ $recordId = I('record_id'); $acfunContent = I('acfun_content'); $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id')->find(); if ($info==NULL){ $returnData = array('record_id'=>$info['record_id'],'user_id'=>'','ref_user_id'=>''); $dataSoc = array('code'=>1,'type'=>0,'msg'=>'对战信息获取失败','data'=>$returnData); $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id'])); $this->returnData($dataSoc); } $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'message'=>$acfunContent); $dataSoc = array('code'=>0,'type'=>14,'msg'=>'','data'=>$returnData); if ($info['user_id']==$this->userId){ $uid = $info['ref_user_id']; }else{ $uid = $info['user_id']; } $this->pushMsg(json_encode($dataSoc), $uid); $this->returnData($dataSoc); } //上报作答结果 public function words(){ $words = I('words'); $recordId = I('record_id'); if (empty($words)){ $data = array('code'=>1,'msg'=>'对战单词错误'); $this->returnData($data);exit; } if ($recordId){ $data = array('code'=>1,'msg'=>'对战ID错误'); $this->returnData($data);exit; } $words = json_decode($words,true); $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find(); $flag = FALSE; if ($info['user_id'] == $this->userId){ $flag = TRUE; } foreach ($words as $row){ if ($flag){ M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('user_status'=>$row['user_status'])); }else{ M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('ref_status'=>$row['user_status'])); } } if ($flag){ $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('user_status')->select(); }else{ $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('ref_status as user_status')->select(); } $data = array('code'=>0,'msg'=>'','data'=>$res); } //获取对战题单词所有单词情况 public function getStoreWords(){ $recordId = I('record_id'); if (empty($recordId)){ $data = array('code'=>1,'msg'=>'对战ID错误'); $this->returnData($data);exit; } $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find(); $flag = FALSE; if ($info['user_id'] == $this->userId){ $flag = TRUE; } if ($flag){ $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,user_status')->select(); }else{ $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,ref_status as user_status')->select(); } if ($res==NULL){ $data = array('code'=>1,'msg'=>'暂无答题数据'); $this->returnData($data);exit; } $pkRes = array(); $wordsIdArr = array(); foreach ($res as $r){ $wordsIdArr[] = $r['words_id']; $pkRes[$r['words_id']] = $r['user_status']; } $swRes = M('StoreWords')->where(array('words_id'=>array('IN',implode(',', $wordsIdArr))))->select(); if ($swRes==NULL){ $data = array('code'=>1,'msg'=>'获取数据失败'); $this->returnData($data);exit; } foreach ($swRes as $key=>$row){ $swRes[$key]['user_status'] = $pkRes[$row['words_id']]['user_status']; } $returnData = array('code'=>0,'msg'=>'','data'=>$swRes); $this->returnData($returnData); } }