OfflineController.class.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace Cron\Controller;
  3. use Common\Controller\CronController;
  4. class OfflineController extends CronController {
  5. public function __construct(){
  6. parent::__construct();
  7. }
  8. //处理下线
  9. public function index(){
  10. $uid = I('uid');
  11. $info = M('PkRecord')->where(array('user_id|ref_user_id'=>$uid,'record_status'=>array('IN','1,2,6'),))->order('record_id desc')->field('record_id,user_id,ref_user_id,record_status')->find();
  12. if ($info==NULL){
  13. return ;
  14. }
  15. $redis = $this->getRedis();
  16. //下线通知
  17. //$this->offline($uid, $info);
  18. $ms = $this->getMilliSecond();
  19. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms);
  20. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>4));
  21. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
  22. if ($info['record_status']==6){
  23. if ($uid == $returnData['user_id']){
  24. $pkUserid = $returnData['user_id'];
  25. $peerUserId = $returnData['ref_user_id'];
  26. $pkRes = $this->normal($info['record_id'], 2, $returnData['user_id']);
  27. }else{
  28. $pkUserid = $returnData['ref_user_id'];
  29. $peerUserId = $returnData['user_id'];
  30. $pkRes = $this->normal($info['record_id'], 2, $returnData['ref_user_id']);
  31. }
  32. $returnData['record_source'] = $pkRes['record_source'];
  33. $startTime = $redis->get('pk_start_time'.$info['record_id']);
  34. $time = time()-$startTime;
  35. $returnData['time']=$time;
  36. $returnData['winner'] = $peerUserId;
  37. if ($this->userId==$info['user_id']){
  38. $returnData['winner'] = $info['ref_user_id'];
  39. }
  40. //自己
  41. $returnData['user_score'] = $pkRes['user_score'];
  42. $returnData['peer_score'] = $pkRes['ref_user_score'];
  43. $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  44. $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  45. //对手
  46. $returnData['user_score'] = $pkRes['ref_user_score'];
  47. $returnData['peer_score'] = $pkRes['user_score'];
  48. $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  49. $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  50. //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  51. //$this->returnData($dataSoc1);exit;
  52. }else {
  53. $this->offline($uid, $info);
  54. }
  55. }
  56. //生成毫秒级时间
  57. private function getMilliSecond(){
  58. $time = explode (" ", microtime () );
  59. $time = $time [1] . ($time [0] * 1000);
  60. $time2 = explode ( ".", $time );
  61. $time = $time2 [0];
  62. return $time;
  63. }
  64. //掉线发送消息
  65. private function offline($pushUid,$info){
  66. if ($info['ref_user_id'] == $pushUid){
  67. $userId = $info['user_id'];
  68. }else{
  69. $userId = $info['ref_user_id'];
  70. }
  71. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>0));
  72. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
  73. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],);
  74. $dataSoc = array('code'=>0,'type'=>6,'msg'=>'对战对手掉线!','data'=>$returnData);
  75. $this->pushMsg(json_encode($dataSoc), $userId);
  76. }
  77. //对战分数上报
  78. private function normal($recordId, $recordType, $userId){
  79. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id,record_source')->find();
  80. $redis = $this->getRedis();
  81. $redis->del('pk_info'.$recordId);
  82. M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>5));
  83. M('User')->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id'],))))->save(array('user_status'=>5));
  84. if ($info['record_source']==1){
  85. //添加统计
  86. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  87. if ($staRes==NULL){
  88. M('Sta')->add(array('sta_normal'=>1));
  89. }else{
  90. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_normal');
  91. }
  92. return array('record_source'=>1,'user_score'=>0,'ref_user_score'=>0);
  93. }else{
  94. //添加统计
  95. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  96. if ($staRes==NULL){
  97. M('Sta')->add(array('sta_rank'=>1));
  98. }else{
  99. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
  100. }
  101. }
  102. if ($info['user_id']==$userId){
  103. $uid = $info['ref_user_id'];
  104. }else{
  105. $uid = $info['user_id'];
  106. }
  107. //把pk对象的信息查询出来
  108. $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();
  109. $userScore = $this->getScore($userId, $uid, $recordId, $recordType, $userRes);
  110. if ($recordType==1){
  111. $recordRefType = 2;
  112. }else{
  113. $recordRefType = 1;
  114. }
  115. $userRefScore = $this->getScore($uid, $userId, $recordId, $recordRefType, $userRes);
  116. return array('record_source'=>2,'user_score'=>$userScore,'ref_user_score'=>$userRefScore);
  117. }
  118. private function getScore($userId, $uid, $recordId, $recordType, $userRes){
  119. $userInfo = array();
  120. foreach ($userRes as $row){
  121. $userInfo[$row['user_id']] = $row;
  122. }
  123. /* 分数相同赢者加10分,败者减10分
  124. 分数不同且分低者胜时,赢者加10分+双方分数差/10 取整(比如700分赢了800分,这一局就加了20分),败者减10分+双方分数差/20取整(比如800分输给了700分,这一局就减了15分)
  125. 分数不同且分高者胜时,赢者加10分减去双方分数差/80 + 1 取整(比如800分赢了700分,这一局就加了8分),败者减赢者加分 */
  126. if ($userInfo[$userId]['user_score']>$userInfo[$uid]['user_score']){
  127. //自己的分数比对手高
  128. $score = 10 - floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/80) + 1;
  129. if ($recordType==1){
  130. $score = 0 + $score;
  131. }else{
  132. $score = 0 - $score;
  133. }
  134. }else{
  135. //自己的分数比对手低
  136. if ($recordType==1){
  137. $score = 10 + floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/10);
  138. }else{
  139. $score = floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/20) - 10;
  140. }
  141. }
  142. if ($recordType==1){
  143. //赢了比赛,并且比赛是前十场
  144. if ($userRes['pk_num']<=10){
  145. if ($userRes['win_num']<=2){
  146. $score = 2*$score;
  147. }else if($userRes['win_num']<6){
  148. $score = 3*$score;
  149. }else if($userRes['win_num']<=10){
  150. $score = 4*$score;
  151. }
  152. }
  153. }else{
  154. //输了比赛,并且比赛是前十场
  155. if ($userRes['pk_num']<=10){
  156. if ($userRes['fail_num']<=2){
  157. $score = 2*$score;
  158. }else if($userRes['fail_num']<6){
  159. $score = 3*$score;
  160. }else if($userRes['fail_num']<=10){
  161. $score = 4*$score;
  162. }
  163. }
  164. }
  165. //判断是否是前十场
  166. if($userRes['pk_num']>10){
  167. if ($recordType==1){
  168. 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'),));
  169. }else{
  170. 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'),));
  171. }
  172. }else{
  173. M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
  174. }
  175. M('UserScore')->add(array('user_id'=>$userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
  176. //修改用户等级
  177. $userResInfo = M('User')->where(array('user_id'=>$userId))->field('user_score')->find();
  178. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
  179. M('User')->where(array('user_id'=>$userId))->save(array('user_level'=>$levelInfo['level_id']));
  180. return $score;
  181. }
  182. }