PkController.class.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. namespace Cron\Controller;
  3. use Common\Controller\CronController;
  4. class PkController extends CronController {
  5. public function __construct(){
  6. parent::__construct();
  7. }
  8. public function index(){
  9. $key = 'pk_choose_friend';
  10. $userRedis = $this->popQueue($key);
  11. if($userRedis){
  12. $num = $userRedis['num'];
  13. $userId = $userRedis['user_id'];
  14. $recordSource = $userRedis['pk_type'];
  15. $pkUserInfo = M('User')->where(array('user_id'=>$userId,))->field('user_id,user_status')->find();
  16. if (!in_array($pkUserInfo['user_status'], array(0,4,5))){
  17. return FALSE;
  18. }
  19. }
  20. $uid = $this->getSocketOnline($userId,$recordSource);
  21. if ($uid==-1){
  22. return false;
  23. }
  24. if (!$uid){
  25. if ($num<10){
  26. $this->pushQueue($key,array('user_id'=>$userId,'num'=>$num+1, 'pk_type'=>$recordSource));
  27. }
  28. }else {
  29. if ($uid<=0){
  30. return false;
  31. }
  32. //添加匹配记录
  33. $recordId = M('PkRecord')->add(array('user_id'=>$userId,'ref_user_id'=>$uid,'record_source'=>$recordSource,'record_status'=>2,'peer_source'=>2,'operate_dt'=>time()));
  34. M('User')->where(array('user_id'=>array('IN',array($userId,$uid))))->save(array('user_status'=>2));
  35. //如果是好友获取昵称
  36. $userNick = array($userId=>'',$uid=>'');
  37. if ($userId>$uid){
  38. $friendInfo =M('Friend')->where(array('user_id'=>$uid,'ref_user_id'=>$userId))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find();
  39. if ($friendInfo!=NULL){
  40. $userNick = array($userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']);
  41. }
  42. }else{
  43. $friendInfo =M('Friend')->where(array('user_id'=>$userId,'ref_user_id'=>$uid))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find();
  44. if ($friendInfo!=NULL){
  45. $userNick = array($userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']);
  46. }
  47. }
  48. $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id';
  49. $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name,1 as user_nickname';
  50. $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($userId,$uid))))->field($field)->select();
  51. foreach ($userInfoArr as $userInfo){
  52. if ($userInfo['user_id']==$userId){
  53. $userInfo['user_nickname'] = $userNick[$userId];
  54. $returnData = array('record_id'=>$recordId,'user_id'=>$userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo);
  55. $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData);
  56. $pushUid = $this->pushMsg(json_encode($dataSoc), $uid);
  57. //不在线
  58. if ($pushUid){
  59. $this->offline($pushUid, $returnData);
  60. }
  61. }else{
  62. $userInfo['user_nickname'] = $userNick[$uid];
  63. $returnData = array('record_id'=>$recordId,'user_id'=>$userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo);
  64. $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData);
  65. $pushUid = $this->pushMsg(json_encode($dataSoc), $userId);
  66. //不在线
  67. if ($pushUid){
  68. $this->offline($pushUid, $returnData);
  69. }
  70. }
  71. }
  72. }
  73. }
  74. public function aa(){
  75. //$this->flushQueue();
  76. $res = $this->online();
  77. $userIdArr = array_keys($res);
  78. $info = M('User')->where(array('user_id'=>array('IN',implode(',', $userIdArr))))->field('user_id,user_status')->select();
  79. $this->ajaxReturn($info);
  80. }
  81. /* public function bb(){
  82. M('User')->where(array('user_id'=>array('GT',0)))->save(array('user_status'=>0));
  83. M('PkRecord')->where(array('record_id'=>array('GT',0)))->delete();
  84. }
  85. public function cc(){
  86. $msg = I('msg');
  87. $uid = I('uid');
  88. if (empty($uid)){
  89. $this->pushMsg($msg);
  90. }else{
  91. $this->pushMsg($msg,$uid);
  92. }
  93. } */
  94. //获取在线好友
  95. private function getSocketOnline($userId,$recordSource){
  96. $res = $this->online();
  97. if(empty($res)){
  98. return FALSE;
  99. }
  100. if (!isset($res[$userId])){
  101. return -1;
  102. }
  103. unset($res[$userId]);
  104. $userIdArr = array_keys($res);
  105. if (empty($userIdArr)){
  106. return FALSE;
  107. }
  108. $redis = $this->getRedis();
  109. if ($recordSource==2){
  110. $userInfo = M('User')->where(array('user_id'=>$userId))->field('user_level')->find();
  111. }
  112. foreach ($userIdArr as $uid){
  113. $uidLock = $this->get($uid);
  114. if ($uidLock){
  115. continue;
  116. }else{
  117. $redis->set($uid,1,3);
  118. }
  119. if ($recordSource==2){
  120. $peerInfo = M('User')->where(array('user_id'=>$uid,'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find();
  121. }else{
  122. $peerInfo = M('User')->where(array('user_id'=>$uid,'user_status'=>array('IN','0,4,5')))->field('user_id')->find();
  123. }
  124. if ($peerInfo != NULL){
  125. M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2));
  126. break;
  127. }
  128. }
  129. if ($peerInfo == NULL){
  130. return FALSE;
  131. }else{
  132. return $peerInfo['user_id'];
  133. }
  134. }
  135. //获取在线好友
  136. private function getSocketOnlineOld($userId){
  137. $res = $this->online();
  138. if(empty($res)){
  139. return FALSE;
  140. }
  141. if (!isset($res[$userId])){
  142. return -1;
  143. }
  144. unset($res[$userId]);
  145. $userIdArr = array_keys($res);
  146. if (empty($userIdArr)){
  147. return FALSE;
  148. }
  149. $chunkUserId = array_chunk($userIdArr,200);
  150. $userInfo = M('User')->where(array('user_id'=>$userId))->field('user_level')->find();
  151. foreach ($chunkUserId as $userIdRow){
  152. $peerInfo = M('User')->where(array('user_id'=>array('IN',implode(',', $userIdRow)),'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find();
  153. if ($peerInfo != NULL){
  154. M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2));
  155. break;
  156. }
  157. }
  158. if ($peerInfo == NULL){
  159. return FALSE;
  160. }else{
  161. return $peerInfo['user_id'];
  162. }
  163. }
  164. }