123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173 |
- <?php
- namespace Api\Controller;
- use Common\Controller\ApiController;
- class PkController extends ApiController {
- public function __construct(){
- parent::__construct();
- }
-
- //系统推荐pk对象
- public function chooseFriend(){
- //$this->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,'red_score'=>C('RED_SCORE'));
- $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,'red_score'=>C('RED_SCORE'));
- $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;
- }
-
- //人机对战
- public function pve(){
- //查询是否有对战记录
- //$pageSize = '';
- $levelId = I('level_id',0);
- $pageSize = I('init_score',0);
- $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);
- }
-
- //查询用户状态
- $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,user_status';
- $pkUserInfo = M('User')->join($join)->where(array('user_id'=>$this->userId,))->field($field)->find();
- if ($pkUserInfo==NULL || !in_array($pkUserInfo['user_status'], array(0,4,5))){
- $resData = array('code'=>1,'msg'=>'不能对战!');
- $this->returnData($resData);exit;
- }
- //添加匹配记录
- $uid = 1;
- $recordSource=3;
- $recordId = M('PkRecord')->add(array('user_id'=>$this->userId,'ref_user_id'=>$uid,'level_id'=>$levelId,'record_source'=>$recordSource,'record_status'=>6,'peer_source'=>3,'operate_dt'=>time()));
- M('User')->where(array('user_id'=>$this->userId,))->save(array('user_status'=>6));
-
- $userInfo = array(
- 'user_id'=>1,'user_name'=>'PelphaGo','user_level'=>$pkUserInfo['user_level'],
- 'user_sex'=>$pkUserInfo['user_sex'],'user_icon'=>C('DOMAIN').'/Public/img/admin_icon.png',
- 'level_name'=>$pkUserInfo['level_name']
- );
- /* $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);
- } */
-
- //生成对战题库
- $storeRes = $this->getStoreList($this->userId, $uid, $recordId, '');
- if (!$storeRes){
- $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid);
- $dataSoc = array('code'=>1,'type'=>0,'msg'=>'生成题库失败','data'=>$returnData);
- $this->pushMsg(json_encode($dataSoc), array($this->userId));
- $this->returnData($dataSoc);exit;
- }
- //获取下一题
- $wordInfo = $this->getStore($recordId);
- $ms = $this->getMilliSecond();
- $scoreKey = 'score_'.$recordId.'_'.$this->userId;
- $refScoreKey = 'score_'.$recordId.'_'.$uid;
- $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'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'second'=>3,'red_score'=>C('RED_SCORE'),'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;
- }
- $returnData['peer_info'] = $userInfo;
- $dataSoc = array('code'=>0,'type'=>18,'msg'=>'3s后开始对战','data'=>$returnData);
- $pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId);
- $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_status,user_id,ref_user_id,record_source')->find();
- //不在线
- if ($pushUid){
- $this->offline($pushUid, $info);
- }
- //把对战信息存到redis
- $this->setRedisPkRecordInfo($recordId,$info);
- unset($returnData['list']);
- $this->returnData($dataSoc);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');
- $levelId = I('level_id',0);
- $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,'level_id'=>$levelId,'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 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);
- $pageSize = '';
- 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,record_source')->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,'red_score'=>C('RED_SCORE'));
- 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);
- if ($info['record_source']==3 && $chooseNum==0){
- $chooseNum = 5;
- }
- $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){
- $score = $redis->get($scoreKey);
- $refScore = $redis->decr($refScoreKey);
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>1,'ref_status'=>3));
- }else{
- $score = $redis->decr($scoreKey);
- $refScore = $redis->get($refScoreKey);
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>1,'user_status'=>3));
- }
- }else{
- //自己打错
- if ($info['user_id'] == $this->userId){
- $score = $redis->decr($scoreKey);
- $refScore = $redis->get($refScoreKey);
- if ($info['record_source']==3&&$chooseNum==5){
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>3,'ref_status'=>1));
- }else{
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>2,'ref_status'=>3));
- }
- }else{
- $score = $redis->get($scoreKey);
- $refScore = $redis->decr($refScoreKey);
- if ($info['record_source']==3&&$chooseNum==5){
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>3,'user_status'=>1));
- }else{
- M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>2,'user_status'=>3));
- }
- }
-
- }
- }
-
- $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);
- //对手
- if ($info['record_source']!=3){
- $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);
- //对手
- if ($info['record_source']!=3){
- $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;
- }else{
- $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);
- //对手
- if ($info['record_source']!=3){
- $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->returnData($dataSoc1);exit;
- }
- }
- //获取下一题
- $wordInfo = $this->getStore($recordId);
- $returnData['list'] = $wordInfo;
-
- $pkUserid = $returnData['user_id'];
- $peerUserId = $returnData['ref_user_id'];
- $returnData1 = $returnData;
- $returnData2 = $returnData;
- $returnData1['user_score'] = $score;
- $returnData1['peer_score'] = $refScore;
- $returnData2['user_score'] = $refScore;
- $returnData2['peer_score'] = $score;
- $returnData2['user_id'] = $returnData['ref_user_id'];
- $returnData2['ref_user_id'] = $returnData['user_id'];
-
- $dataSoc1 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData1);
- $pushUid1 = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
- //不在线
- if ($pushUid1){
- $this->offline($pushUid1, $info);
- }
- if ($info['record_source']!=3){
- $dataSoc2 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData2);
- $pushUid2 = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
- //不在线
- if ($pushUid2){
- $this->offline($pushUid2, $info);
- }
- }
- $dataSoc = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData);
- $this->returnData($dataSoc);exit;
- }
-
- //对战分数上报
- 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,'operate_dt'=>strtotime(date('Y-m-d')),));
- }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 if($info['record_source']==3){
- //添加统计
- $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
- if ($staRes==NULL){
- M('Sta')->add(array('sta_pve'=>1,'operate_dt'=>strtotime(date('Y-m-d')),));
- }else{
- M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_pve');
- }
- 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,'operate_dt'=>strtotime(date('Y-m-d')),));
- }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,'operate_dt'=>strtotime(date('Y-m-d')),));
- }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();
- if (!empty($ref_user_id)){
- $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find();
- $info['user_level'] = $userInfo['user_level'];
- }
- if ($userInfo==NULL || $info==NULL){
- return false;
- }
- $recordInfo = M('PkRecord')->where(array('record_id'=>$recordId))->find();
- if ($recordInfo!=NULL && $recordInfo['level_id']>0){
- $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 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);
- }
-
- //获取对战难易级别
- public function getLevel() {
- $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_level')->find();
- $byName = array(1=>'题库一','题库二','题库三','题库四','题库五','题库六','题库七','题库八');
- $res = M('UserLevel')->order('level_id asc')->field('level_id,level_name')->select();
- $arr = array();
- foreach ($res as $row){
- //$arr[] = array('level_id'=>$row['level_id'],'level_name'=>$row['level_name'],'by_name'=>$byName[$row['level_id']]);
- $arr[] = array('level_id'=>$row['level_id'],'level_name'=>$row['level_name'],'by_name'=>$row['level_name']);
- }
- $returnData = array('code'=>0,'msg'=>'','renji_defaut'=>$userInfo['user_level'],'data'=>$arr);
- $this->returnData($returnData);
- }
-
-
- }
|