PkController.class.php 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. <?php
  2. namespace Api\Controller;
  3. use Common\Controller\ApiController;
  4. class PkController extends ApiController {
  5. public function __construct(){
  6. parent::__construct();
  7. }
  8. //系统推荐pk对象
  9. public function chooseFriend(){
  10. //$this->userId = 1000001;
  11. $recordSource = I('pk_type',1);
  12. //查询是否有对战记录
  13. $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();
  14. if ($pkRecordInfo!=NULL){
  15. M('User')->where(array('user_id'=>array('IN',array($pkRecordInfo['user_id'],$pkRecordInfo['ref_user_id'],))))->save(array('user_status'=>0));
  16. M('PkRecord')->where(array('record_id'=>$pkRecordInfo['record_id']))->save(array('record_status'=>3));
  17. if ($this->userId==$pkRecordInfo['user_id']){
  18. $scockUserId = $pkRecordInfo['ref_user_id'];
  19. }else{
  20. $scockUserId = $pkRecordInfo['user_id'];
  21. }
  22. $dataSoc = array('code'=>0,'type'=>17,'msg'=>'10s中对战对象未准备!','data'=>$pkRecordInfo);
  23. $pushUid = $this->pushMsg(json_encode($dataSoc), $scockUserId);
  24. }
  25. //查询用户状态
  26. $pkUserInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_id,user_status')->find();
  27. if ($pkUserInfo==NULL || !in_array($pkUserInfo['user_status'], array(0,4,5))){
  28. $resData = array('code'=>1,'msg'=>'不能对战!');
  29. $this->returnData($resData);exit;
  30. }
  31. $peerUserId = I('peer','');
  32. $uid = $this->getSocketOnline($recordSource,$peerUserId);
  33. if (!$uid){
  34. $key = 'pk_choose_friend';
  35. $this->pushQueue($key,array('user_id'=>$this->userId,'num'=>1,'pk_type'=>$recordSource));
  36. $dataSoc = array('code'=>0,'msg'=>'系统正在匹配!','data'=>'');
  37. $this->returnData($dataSoc);exit;
  38. }
  39. if ($uid<=0){
  40. return false;
  41. }
  42. //添加匹配记录
  43. $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()));
  44. M('User')->where(array('user_id'=>array('IN',array($this->userId,$uid))))->save(array('user_status'=>2));
  45. //如果是好友获取昵称
  46. $userNick = array($this->userId=>'',$uid=>'');
  47. if ($this->userId>$uid){
  48. $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();
  49. if ($friendInfo!=NULL){
  50. $userNick = array($this->userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']);
  51. }
  52. }else{
  53. $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();
  54. if ($friendInfo!=NULL){
  55. $userNick = array($this->userId=>$friendInfo['user_nickname'],$uid=>$friendInfo['ref_user_nickname']);
  56. }
  57. }
  58. $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id';
  59. $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name';
  60. $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($this->userId,$uid))))->field($field)->select();
  61. foreach ($userInfoArr as $userInfo){
  62. if ($userInfo['user_id']==$this->userId){
  63. //$userInfo = $userInfoArr[0];
  64. $userInfo['user_nickname'] = $userNick[$this->userId];
  65. $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo,'red_score'=>C('RED_SCORE'));
  66. $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData);
  67. $pushUid = $this->pushMsg(json_encode($dataSoc), $uid);
  68. //不在线
  69. if ($pushUid){
  70. $this->offline($pushUid, $returnData);
  71. }
  72. }else{
  73. $userInfo['user_nickname'] = $userNick[$uid];
  74. $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo,'red_score'=>C('RED_SCORE'));
  75. $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData);
  76. $pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId);
  77. //不在线
  78. if ($pushUid){
  79. $this->offline($pushUid, $returnData);
  80. }
  81. }
  82. }
  83. //var_dump($returnData);exit;
  84. $resData = array('code'=>0,'msg'=>'已应战,请准备开始对战!');
  85. $this->returnData($resData);exit;
  86. }
  87. //人机对战
  88. public function pve(){
  89. //查询是否有对战记录
  90. //$pageSize = '';
  91. $levelId = I('level_id',0);
  92. $pageSize = I('init_score',0);
  93. $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();
  94. if ($pkRecordInfo!=NULL){
  95. M('User')->where(array('user_id'=>array('IN',array($pkRecordInfo['user_id'],$pkRecordInfo['ref_user_id'],))))->save(array('user_status'=>0));
  96. M('PkRecord')->where(array('record_id'=>$pkRecordInfo['record_id']))->save(array('record_status'=>3));
  97. if ($this->userId==$pkRecordInfo['user_id']){
  98. $scockUserId = $pkRecordInfo['ref_user_id'];
  99. }else{
  100. $scockUserId = $pkRecordInfo['user_id'];
  101. }
  102. $dataSoc = array('code'=>0,'type'=>17,'msg'=>'10s中对战对象未准备!','data'=>$pkRecordInfo);
  103. $pushUid = $this->pushMsg(json_encode($dataSoc), $scockUserId);
  104. }
  105. //查询用户状态
  106. $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id';
  107. $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name,user_status';
  108. $pkUserInfo = M('User')->join($join)->where(array('user_id'=>$this->userId,))->field($field)->find();
  109. if ($pkUserInfo==NULL || !in_array($pkUserInfo['user_status'], array(0,4,5))){
  110. $resData = array('code'=>1,'msg'=>'不能对战!');
  111. $this->returnData($resData);exit;
  112. }
  113. //添加匹配记录
  114. $uid = 1;
  115. $recordSource=3;
  116. $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()));
  117. M('User')->where(array('user_id'=>$this->userId,))->save(array('user_status'=>6));
  118. $userInfo = array(
  119. 'user_id'=>1,'user_name'=>'PelphaGo','user_level'=>$pkUserInfo['user_level'],
  120. 'user_sex'=>$pkUserInfo['user_sex'],'user_icon'=>C('DOMAIN').'/Public/img/admin_icon.png',
  121. 'level_name'=>$pkUserInfo['level_name']
  122. );
  123. /* $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo);
  124. $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData);
  125. $pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId);
  126. //不在线
  127. if ($pushUid){
  128. $this->offline($pushUid, $returnData);
  129. } */
  130. //生成对战题库
  131. $storeRes = $this->getStoreList($this->userId, $uid, $recordId, '');
  132. if (!$storeRes){
  133. $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid);
  134. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'生成题库失败','data'=>$returnData);
  135. $this->pushMsg(json_encode($dataSoc), array($this->userId));
  136. $this->returnData($dataSoc);exit;
  137. }
  138. //获取下一题
  139. $wordInfo = $this->getStore($recordId);
  140. $ms = $this->getMilliSecond();
  141. $scoreKey = 'score_'.$recordId.'_'.$this->userId;
  142. $refScoreKey = 'score_'.$recordId.'_'.$uid;
  143. $redis = $this->getRedis();
  144. if (empty($pageSize)){
  145. $redis->set($scoreKey,C('PK_SCORE'),500);
  146. $redis->set($refScoreKey,C('PK_SCORE'),500);
  147. }else{
  148. $redis->set($scoreKey,$pageSize,500);
  149. $redis->set($refScoreKey,$pageSize,500);
  150. }
  151. $redis->set('pk_start_time'.$recordId,time(),500);
  152. $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$uid,'second'=>3,'red_score'=>C('RED_SCORE'),'ms'=>$ms,'list'=>$wordInfo);
  153. if (empty($pageSize)){
  154. $returnData['user_score'] = C('PK_SCORE');
  155. $returnData['peer_score'] = C('PK_SCORE');
  156. }else{
  157. $returnData['user_score'] = $pageSize;
  158. $returnData['peer_score'] = $pageSize;
  159. }
  160. $returnData['peer_info'] = $userInfo;
  161. $dataSoc = array('code'=>0,'type'=>18,'msg'=>'3s后开始对战','data'=>$returnData);
  162. $pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId);
  163. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_status,user_id,ref_user_id,record_source')->find();
  164. //不在线
  165. if ($pushUid){
  166. $this->offline($pushUid, $info);
  167. }
  168. //把对战信息存到redis
  169. $this->setRedisPkRecordInfo($recordId,$info);
  170. unset($returnData['list']);
  171. $this->returnData($dataSoc);exit;
  172. }
  173. //获取在线好友
  174. private function getSocketOnline($recordSource, $peerUserId){
  175. $res = $this->online();
  176. if(empty($res)){
  177. return FALSE;
  178. }
  179. unset($res[$this->userId]);
  180. $userIdArr = array_keys($res);
  181. if (in_array($peerUserId, $userIdArr)){
  182. return $peerUserId;
  183. }
  184. //$chunkUserId = array_chunk($userIdArr,200);
  185. $redis = $this->getRedis();
  186. if ($recordSource==2){
  187. $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_level')->find();
  188. }
  189. foreach ($userIdArr as $uid){
  190. $uidLock = $this->get($uid);
  191. if ($uidLock){
  192. continue;
  193. }else{
  194. $redis->set($uid,1,3);
  195. }
  196. if ($recordSource==2){
  197. $peerInfo = M('User')->where(array('user_id'=>$uid,'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find();
  198. }else{
  199. $peerInfo = M('User')->where(array('user_id'=>$uid,'user_status'=>array('IN','0,4,5')))->field('user_id')->find();
  200. }
  201. if ($peerInfo != NULL){
  202. M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2));
  203. break;
  204. }
  205. }
  206. if ($peerInfo == NULL){
  207. return FALSE;
  208. }else{
  209. return $peerInfo['user_id'];
  210. }
  211. }
  212. //获取最近登录用户
  213. private function getLastTimeLogin($userLevel,$minute){
  214. $cons = array(
  215. 'is_delete' => 1,
  216. 'user_level'=>$userLevel,
  217. 'user_status' => array('IN','0,4,5'),
  218. //'u.user_id' => array('NEQ',$this->userId),
  219. 'user_id' => array('exp',"!=$this->userId"),
  220. 'last_dt' => array('GT',strtotime("{$minute} minute")),
  221. );
  222. $res = M('User')->where($cons)->order('last_dt desc')->field('user_id,user_phone,user_name,user_level,user_sex,user_icon')->find();
  223. return $res;
  224. }
  225. //邀请好友pk
  226. public function inviteFriend(){
  227. $uid = I('uid');
  228. $levelId = I('level_id',0);
  229. $condition = array(
  230. 'is_delete' => 1,
  231. 'user_id' => $uid,
  232. 'user_status' => array('IN','0,4,5'),
  233. );
  234. $info = M('User')->where($condition)->field('user_id,user_phone,user_name,user_level,user_sex,user_icon')->find();
  235. if ($info==NULL){
  236. $data = array('code'=>1,'msg'=>'对方正在PK对战,暂时无法邀请,请稍后再试');
  237. $this->returnData($data);exit;
  238. }
  239. //添加匹配记录
  240. $recordId = M('PkRecord')->add(array('user_id'=>$this->userId,'record_source'=>1,'ref_user_id'=>$uid,'level_id'=>$levelId,'operate_dt'=>time()));
  241. M('User')->where(array('user_id'=>array('IN',array($this->userId,$uid))))->save(array('user_status'=>1,'pk_dt'=>time()));
  242. //M('User')->where(array('user_id'=>$uid))->save(array('user_status'=>1,'friend_notice'=>array('exp','friend_notice+1')));
  243. //调用友盟给,好友发送消息
  244. $title = '我正在noraml对战模式邀请你来应战,就问你句:敢不敢应战!';
  245. //获取好友设置我的昵称
  246. if ($uid>$this->userId){
  247. $friendInfo = M('Friend')->where(array('user_id'=>$this->userId,'ref_user_id'=>$uid))->field('user_nickname')->find();
  248. }else{
  249. $friendInfo = M('Friend')->where(array('user_id'=>$uid,'ref_user_id'=>$this->userId))->field('ref_user_nickname as user_nickname')->find();
  250. }
  251. if ($friendInfo==NULL || empty($friendInfo['user_nickname'])){
  252. $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_name')->find();
  253. $userNickname = $userInfo['user_name'];
  254. }else{
  255. $userNickname = $friendInfo['user_nickname'];
  256. }
  257. $title1 = $userNickname.'正在noraml对战模式邀请你来应战,就问你句:敢不敢应战!';
  258. $returnData = array('record_id'=>$recordId,'user_id'=>$this->userId,'ref_user_id'=>$info['user_id']);
  259. $dataUm = json_encode(array('code'=>0,'type'=>0,'notice_type'=>2,'msg'=>$title1,'data'=>$returnData));
  260. $this->umengPush($info['user_id'], $dataUm);
  261. M('User')->where(array('user_id'=>$uid))->setInc('friend_notice');
  262. 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()));
  263. $data = array('code'=>0,'msg'=>'已邀请成功,请等待好友应战!','data'=>$returnData);
  264. $this->returnData($data);exit;
  265. }
  266. //对手响应
  267. public function answer(){
  268. $type=I('type');
  269. $recordId = I('record_id');
  270. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id,record_status')->find();
  271. if ($info['record_status']!=1){
  272. $returnData = array('record_id'=>$recordId,'user_id'=>'','ref_user_id'=>'');
  273. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'对战已结束','data'=>$returnData);
  274. $this->pushMsg(json_encode($dataSoc), array($this->userId));
  275. $this->returnData($dataSoc);exit;
  276. }
  277. if ($info['ref_user_id']!=$this->userId){
  278. $returnData = array('record_id'=>$recordId);
  279. $dataSoc = array('code'=>1,'msg'=>'您不允许应战','data'=>$returnData);
  280. $this->returnData($dataSoc);exit;
  281. }
  282. if ($type==2){
  283. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>0));
  284. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
  285. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']);
  286. $dataSoc = array('code'=>1,'type'=>2,'msg'=>'未应战','data'=>$returnData);
  287. $this->pushMsg(json_encode($dataSoc), array($info['user_id']));
  288. $this->returnData($dataSoc);exit;
  289. }
  290. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>2));
  291. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>2));
  292. /* $data = array('code'=>0,'msg'=>'已经准备','data'=>$info);
  293. $this->returnData($data);exit; */
  294. //如果是好友获取昵称
  295. $userNick = array($info['user_id']=>'',$info['ref_user_id']=>'');
  296. if ($info['user_id']>$info['ref_user_id']){
  297. $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();
  298. if ($friendInfo!=NULL){
  299. $userNick = array($info['user_id']=>$friendInfo['ref_user_nickname'],$info['ref_user_id']=>$friendInfo['user_nickname']);
  300. }
  301. }else{
  302. $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();
  303. if ($friendInfo!=NULL){
  304. $userNick = array($info['user_id']=>$friendInfo['user_nickname'],$info['ref_user_id']=>$friendInfo['ref_user_nickname']);
  305. }
  306. }
  307. $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id';
  308. $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name';
  309. $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id']))))->field($field)->select();
  310. foreach ($userInfoArr as $userInfo){
  311. if ($userInfo['user_id']==$info['user_id']){
  312. $userInfo['user_nickname'] = $userNick[$info['user_id']];
  313. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'peer_info'=>$userInfo);
  314. $dataSoc = array('code'=>0,'type'=>1,'msg'=>'已应战,请准备开始对战!','data'=>$returnData);
  315. $pushUid = $this->pushMsg(json_encode($dataSoc), $info['ref_user_id']);
  316. //不在线
  317. if ($pushUid){
  318. $this->offline($pushUid, $info);
  319. }
  320. }else{
  321. $userInfo['user_nickname'] = $userNick[$info['ref_user_id']];
  322. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'peer_info'=>$userInfo);
  323. $dataSoc = array('code'=>0,'type'=>1,'msg'=>'已应战,请准备开始对战!','data'=>$returnData);
  324. $pushUid = $this->pushMsg(json_encode($dataSoc), $info['user_id']);
  325. //不在线
  326. if ($pushUid){
  327. $this->offline($pushUid, $info);
  328. }
  329. }
  330. }
  331. //var_dump($returnData);exit;
  332. $resData = array('code'=>0,'msg'=>'已应战,请准备开始对战!');
  333. $this->returnData($resData);exit;
  334. }
  335. //掉线发送消息
  336. private function offline($pushUid,$info){
  337. if ($info['ref_user_id'] == $pushUid){
  338. $userId = $info['user_id'];
  339. }else{
  340. $userId = $info['ref_user_id'];
  341. }
  342. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>0));
  343. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>0));
  344. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],);
  345. $dataSoc = array('code'=>0,'type'=>6,'msg'=>'对战对手掉线!','data'=>$returnData);
  346. $this->pushMsg(json_encode($dataSoc), $userId);
  347. }
  348. //双方准备
  349. public function ready(){
  350. $recordId = I('record_id');
  351. //$pageSize = I('init_score',0);
  352. $pageSize = '';
  353. if (!empty($pageSize)){
  354. $testInfo = M('PkRecord')->where(array('record_id'=>$recordId))->find();
  355. if ($testInfo['user_status']!=1){
  356. M('PkRecord')->where(array('record_id'=>$recordId))->save(array('user_status'=>0,'record_status'=>2));
  357. //M('PkWords')->where(array('record_id'=>$recordId))->delete();
  358. }
  359. }
  360. $info = M('PkRecord')->where(array('record_id'=>$recordId,'record_status'=>2))->field('record_id,user_status,user_id,ref_user_id,record_source')->find();
  361. if ($info==NULL){
  362. $returnData = array('record_id'=>$recordId,'user_id'=>'','ref_user_id'=>'');
  363. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'没有查询到对战信息','data'=>$returnData);
  364. $this->pushMsg(json_encode($dataSoc), array($this->userId));
  365. $this->returnData($dataSoc);exit;
  366. }
  367. M('PkRecord')->where(array('record_id'=>$recordId))->setInc('user_status');
  368. $info = M('PkRecord')->where(array('record_id'=>$recordId,'record_status'=>2))->field('record_id,user_status,user_id,ref_user_id')->find();
  369. if ($info['user_status']==2){
  370. M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>6));
  371. M('User')->where(array('user_id'=>array('IN',array($info['ref_user_id'],$info['user_id']))))->save(array('user_status'=>6));
  372. //生成对战题库
  373. $storeRes = $this->getStoreList($info['user_id'], $info['ref_user_id'], $recordId, $pageSize);
  374. if (!$storeRes){
  375. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']);
  376. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'生成题库失败','data'=>$returnData);
  377. $this->pushMsg(json_encode($dataSoc), array($this->userId));
  378. $this->returnData($dataSoc);exit;
  379. }
  380. $wordInfo = $this->getStore($info['record_id']);
  381. $ms = $this->getMilliSecond();
  382. $scoreKey = 'score_'.$recordId.'_'.$info['user_id'];
  383. $refScoreKey = 'score_'.$recordId.'_'.$info['ref_user_id'];
  384. $redis = $this->getRedis();
  385. if (empty($pageSize)){
  386. $redis->set($scoreKey,C('PK_SCORE'),500);
  387. $redis->set($refScoreKey,C('PK_SCORE'),500);
  388. }else{
  389. $redis->set($scoreKey,$pageSize,500);
  390. $redis->set($refScoreKey,$pageSize,500);
  391. }
  392. $redis->set('pk_start_time'.$recordId,time(),500);
  393. $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'));
  394. if (empty($pageSize)){
  395. $returnData['user_score'] = C('PK_SCORE');
  396. $returnData['peer_score'] = C('PK_SCORE');
  397. }else{
  398. $returnData['user_score'] = $pageSize;
  399. $returnData['peer_score'] = $pageSize;
  400. }
  401. $dataSoc = array('code'=>0,'type'=>4,'msg'=>'已经准备,3s后开始对战','data'=>$returnData);
  402. $pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  403. //不在线
  404. if ($pushUid){
  405. $this->offline($pushUid, $info);
  406. }
  407. //把对战信息存到redis
  408. $this->setRedisPkRecordInfo($recordId,$info);
  409. unset($returnData['list']);
  410. $this->returnData($dataSoc);exit;
  411. }
  412. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']);
  413. $dataSoc = array('code'=>0,'type'=>8,'msg'=>'已准备,请等待对手准备','data'=>$returnData);
  414. if ($info['user_id']==$this->userId){
  415. $this->pushMsg(json_encode($dataSoc), $info['ref_user_id']);
  416. }else{
  417. $this->pushMsg(json_encode($dataSoc), $info['user_id']);
  418. }
  419. $this->returnData($dataSoc);exit;
  420. }
  421. //中途结束
  422. public function theEnd(){
  423. $recordId = I('record_id');
  424. $redis = $this->getRedis();
  425. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id')->find();
  426. $ms = $this->getMilliSecond();
  427. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms);
  428. if ($this->userId == $returnData['user_id']){
  429. $pkUserid = $returnData['user_id'];
  430. $peerUserId = $returnData['ref_user_id'];
  431. $pkRes = $this->normal($info['record_id'], 2, $returnData['user_id']);
  432. }else{
  433. $pkUserid = $returnData['ref_user_id'];
  434. $peerUserId = $returnData['user_id'];
  435. $pkRes = $this->normal($info['record_id'], 2, $returnData['ref_user_id']);
  436. }
  437. $returnData['record_source'] = $pkRes['record_source'];
  438. $startTime = $redis->get('pk_start_time'.$info['record_id']);
  439. $time = time()-$startTime;
  440. $returnData['time']=$time;
  441. $returnData['winner'] = $peerUserId;
  442. if ($this->userId==$info['user_id']){
  443. $returnData['winner'] = $info['ref_user_id'];
  444. }
  445. //自己
  446. $returnData['user_score'] = $pkRes['user_score'];
  447. $returnData['peer_score'] = $pkRes['ref_user_score'];
  448. $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  449. $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  450. //对手
  451. $returnData['user_score'] = $pkRes['ref_user_score'];
  452. $returnData['peer_score'] = $pkRes['user_score'];
  453. $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  454. $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  455. //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  456. //删除题库队列
  457. $pushKey = 'pk_words_'.$recordId;
  458. $this->flushQueue($pushKey);
  459. $this->returnData($dataSoc1);exit;
  460. }
  461. //10s未响应,取消pk
  462. public function cancel(){
  463. $recordId = I('record_id');
  464. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_status,record_id,user_id,ref_user_id')->find();
  465. if ($info==NULL){
  466. $returnData = array('record_id'=>$info['record_id'],'user_id'=>'','ref_user_id'=>'');
  467. $dataSoc =array('code'=>1,'msg'=>'对战信息获取失败','data'=>$returnData);
  468. $this->pushMsg( json_encode($dataSoc), array($this->userId));
  469. $this->returnData($dataSoc);
  470. }
  471. M('PkRecord')->where(array('record_id'=>$info['record_id']))->save(array('record_status'=>4));
  472. M('User')->where(array('user_id'=>array('IN',array($this->userId,$info['user_id']))))->save(array('user_status'=>5));
  473. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']);
  474. $dataSoc = array('code'=>0,'msg'=>'10s未响应,取消对战','data'=>$returnData);
  475. $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  476. $this->returnData($dataSoc);exit;
  477. }
  478. //把对战信息存到redis
  479. private function setRedisPkRecordInfo($recordId, $info){
  480. $redis = $this->getRedis();
  481. $redis->set('pk_info'.$recordId,serialize($info),3600);
  482. }
  483. //获取所有题库
  484. private function getStore($recordId){
  485. /* $condition = array('record_id'=>$recordId,'pw_status'=>1,'pw_id'=>array('GT',$pwId));
  486. $join = 'pw LEFT JOIN t_store_words sw ON pw.words_id=sw.words_id';
  487. $res = M('PkWords')->join($join)->where($condition)->order('pw_id desc')->field('sw.*,pw.pw_id')->find(); */
  488. $pushKey = 'pk_words_'.$recordId;
  489. $res = $this->popQueue($pushKey);
  490. $redis = $this->getRedis();
  491. $infoRedis = $redis->get('pk_info'.$recordId);
  492. $info = unserialize($infoRedis);
  493. if (!$res){
  494. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id']);
  495. $dataSoc = array('code'=>1,'type'=>13,'msg'=>'获取单词失败','data'=>$returnData);
  496. $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  497. $this->returnData($dataSoc);
  498. }
  499. $returnData = array();
  500. //获取错误3个项
  501. $wordsList = M('StoreWords')->where(array('store_id'=>$res['store_id'],'words_id'=>array('NEQ',$res['words_id'])))->order('rand()')->limit(3)->select();
  502. $rightText = $res['words_text'];
  503. $wordsKey = array('b','c','d');
  504. foreach ($wordsList as $k=>$r){
  505. $wordsTextArr[$wordsKey[$k]] = $this->getWordsText($r);
  506. }
  507. $wordsKey[]='a';
  508. shuffle($wordsKey);
  509. $wordsTextArr['a'] = $rightText;
  510. $wordsTextNewArr = array();
  511. foreach ($wordsKey as $char){
  512. $wordsTextNewArr[] = $wordsTextArr[$char];
  513. }
  514. $rightKey = array_search('a', $wordsKey);
  515. $redisKey = 'pk_right_'.$recordId.'_'.$res['pw_id'];
  516. $this->pushQueue($redisKey,$rightKey+1);
  517. $returnData = array(
  518. 'pw_id'=>$res['pw_id'],
  519. 'store_id'=>$res['store_id'],
  520. 'words_id'=>$res['words_id'],
  521. 'words_name'=>$res['words_name'],
  522. 'words_text' =>$wordsTextNewArr,
  523. );
  524. return $returnData;
  525. }
  526. //下一题
  527. public function getNextWords(){
  528. //从redis中获取答案,对比。
  529. $pwId = I('pw_id');
  530. $recordId = I('record_id');
  531. $chooseNum = I('choose_num',0);
  532. $redis = $this->getRedis();
  533. $redisKey = 'pk_right_'.$recordId.'_'.$pwId;
  534. //获取答案
  535. $rightKey = $this->popQueue($redisKey);
  536. //获取对战信息
  537. $infoRedis = $redis->get('pk_info'.$recordId);
  538. $info = unserialize($infoRedis);
  539. if ($info['record_source']==3 && $chooseNum==0){
  540. $chooseNum = 5;
  541. }
  542. $ms = $this->getMilliSecond();
  543. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'ms'=>$ms);
  544. //判断对战是否结束
  545. if ($info==NULL){
  546. $resData = array('code'=>1,'msg'=>'对战已结束!');
  547. $this->returnData($resData);exit;
  548. }
  549. //已被对手验证答案
  550. if (!$rightKey){
  551. $dataSoc = array('code'=>0,'type'=>9,'msg'=>'','data'=>$returnData);
  552. //$pushUid = $this->pushMsg(json_encode($dataSoc), $this->userId);
  553. $this->returnData($dataSoc);exit;
  554. }
  555. $scoreKey = 'score_'.$recordId.'_'.$info['user_id'];
  556. $refScoreKey = 'score_'.$recordId.'_'.$info['ref_user_id'];
  557. $score = $redis->get($scoreKey);
  558. $refScore = $redis->get($refScoreKey);
  559. if ($refScore<=0 || $score<=0){
  560. $dataSoc = array('code'=>0,'type'=>11,'msg'=>'','data'=>'');
  561. $pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  562. $this->returnData($dataSoc);exit;
  563. }
  564. //双方都未作答
  565. if ($chooseNum==0){
  566. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>3,'ref_status'=>3));
  567. $score = $redis->decr($scoreKey);
  568. $refScore = $redis->decr($refScoreKey);
  569. }else{
  570. //答题后,判断是否正确
  571. if ($chooseNum==$rightKey){
  572. //自己答对
  573. if ($info['user_id'] == $this->userId){
  574. $score = $redis->get($scoreKey);
  575. $refScore = $redis->decr($refScoreKey);
  576. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>1,'ref_status'=>3));
  577. }else{
  578. $score = $redis->decr($scoreKey);
  579. $refScore = $redis->get($refScoreKey);
  580. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>1,'user_status'=>3));
  581. }
  582. }else{
  583. //自己打错
  584. if ($info['user_id'] == $this->userId){
  585. $score = $redis->decr($scoreKey);
  586. $refScore = $redis->get($refScoreKey);
  587. if ($info['record_source']==3&&$chooseNum==5){
  588. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>3,'ref_status'=>1));
  589. }else{
  590. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'user_status'=>2,'ref_status'=>3));
  591. }
  592. }else{
  593. $score = $redis->get($scoreKey);
  594. $refScore = $redis->decr($refScoreKey);
  595. if ($info['record_source']==3&&$chooseNum==5){
  596. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>3,'user_status'=>1));
  597. }else{
  598. M('PkWords')->where(array('pw_id'=>$pwId))->save(array('pw_status'=>2,'ref_status'=>2,'user_status'=>3));
  599. }
  600. }
  601. }
  602. }
  603. $pushKey = 'pk_words_'.$recordId;
  604. $returnData['user_score'] = $score;
  605. $returnData['peer_score'] = $refScore;
  606. //都未作答
  607. if ($refScore==0 && $score==0){
  608. $this->flushQueue($pushKey);
  609. if ($this->userId == $returnData['user_id']){
  610. $pkUserid = $returnData['user_id'];
  611. $peerUserId = $returnData['ref_user_id'];
  612. $pkRes = $this->normal($recordId, 1, $returnData['user_id']);
  613. }else{
  614. $pkUserid = $returnData['ref_user_id'];
  615. $peerUserId = $returnData['user_id'];
  616. $pkRes = $this->normal($recordId, 1, $returnData['ref_user_id']);
  617. }
  618. $returnData['record_source'] = $pkRes['record_source'];
  619. $startTime = $redis->get('pk_start_time'.$recordId);
  620. $time = time()-$startTime;
  621. $returnData['time']=$time;
  622. $returnData['winner'] = $this->userId;
  623. //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  624. //自己
  625. $returnData['user_score'] = $pkRes['user_score'];
  626. $returnData['peer_score'] = $pkRes['ref_user_score'];
  627. $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  628. $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  629. //对手
  630. if ($info['record_source']!=3){
  631. $returnData['user_score'] = $pkRes['ref_user_score'];
  632. $returnData['peer_score'] = $pkRes['user_score'];
  633. $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  634. $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  635. $this->returnData($dataSoc1);exit;
  636. }
  637. }
  638. //对手分数先到0
  639. if ($refScore==0){
  640. $this->flushQueue($pushKey);
  641. if ($this->userId == $returnData['user_id']){
  642. $pkUserid = $returnData['user_id'];
  643. $peerUserId = $returnData['ref_user_id'];
  644. $pkRes = $this->normal($recordId, 1, $returnData['user_id']);
  645. }else{
  646. $pkUserid = $returnData['ref_user_id'];
  647. $peerUserId = $returnData['user_id'];
  648. $pkRes = $this->normal($recordId, 1, $returnData['ref_user_id']);
  649. }
  650. $returnData['record_source'] = $pkRes['record_source'];
  651. $startTime = $redis->get('pk_start_time'.$recordId);
  652. $time = time()-$startTime;
  653. $returnData['time']=$time;
  654. $returnData['winner'] = $this->userId;
  655. //自己
  656. $returnData['user_score'] = $pkRes['user_score'];
  657. $returnData['peer_score'] = $pkRes['ref_user_score'];
  658. $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  659. $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  660. //对手
  661. if ($info['record_source']!=3){
  662. $returnData['user_score'] = $pkRes['ref_user_score'];
  663. $returnData['peer_score'] = $pkRes['user_score'];
  664. $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  665. $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  666. $this->returnData($dataSoc1);exit;
  667. }else{
  668. $this->returnData($dataSoc1);exit;
  669. }
  670. }
  671. //自己分数先到0
  672. if ($score==0){
  673. $this->flushQueue($pushKey);
  674. //$pkRes = $this->normal($recordId, 2, $this->userId);
  675. if ($this->userId == $returnData['user_id']){
  676. $pkUserid = $returnData['user_id'];
  677. $peerUserId = $returnData['ref_user_id'];
  678. $pkRes = $this->normal($recordId, 2, $returnData['user_id']);
  679. }else{
  680. $pkUserid = $returnData['ref_user_id'];
  681. $peerUserId = $returnData['user_id'];
  682. $pkRes = $this->normal($recordId, 2, $returnData['ref_user_id']);
  683. }
  684. $returnData['record_source'] = $pkRes['record_source'];
  685. $startTime = $redis->get('pk_start_time'.$recordId);
  686. $time = time()-$startTime;
  687. $returnData['time']=$time;
  688. $returnData['winner'] = $peerUserId;
  689. if ($this->userId==$info['user_id']){
  690. $returnData['winner'] = $info['ref_user_id'];
  691. }
  692. //自己
  693. $returnData['user_score'] = $pkRes['user_score'];
  694. $returnData['peer_score'] = $pkRes['ref_user_score'];
  695. $dataSoc1 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  696. $pushUid = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  697. //对手
  698. if ($info['record_source']!=3){
  699. $returnData['user_score'] = $pkRes['ref_user_score'];
  700. $returnData['peer_score'] = $pkRes['user_score'];
  701. $dataSoc2 = array('code'=>0,'type'=>10,'msg'=>'','data'=>$returnData);
  702. $pushUid = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  703. //$pushUid = $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  704. $this->returnData($dataSoc1);exit;
  705. }else{
  706. $this->returnData($dataSoc1);exit;
  707. }
  708. }
  709. //获取下一题
  710. $wordInfo = $this->getStore($recordId);
  711. $returnData['list'] = $wordInfo;
  712. $pkUserid = $returnData['user_id'];
  713. $peerUserId = $returnData['ref_user_id'];
  714. $returnData1 = $returnData;
  715. $returnData2 = $returnData;
  716. $returnData1['user_score'] = $score;
  717. $returnData1['peer_score'] = $refScore;
  718. $returnData2['user_score'] = $refScore;
  719. $returnData2['peer_score'] = $score;
  720. $returnData2['user_id'] = $returnData['ref_user_id'];
  721. $returnData2['ref_user_id'] = $returnData['user_id'];
  722. $dataSoc1 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData1);
  723. $pushUid1 = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  724. //不在线
  725. if ($pushUid1){
  726. $this->offline($pushUid1, $info);
  727. }
  728. if ($info['record_source']!=3){
  729. $dataSoc2 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData2);
  730. $pushUid2 = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  731. //不在线
  732. if ($pushUid2){
  733. $this->offline($pushUid2, $info);
  734. }
  735. }
  736. $dataSoc = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData);
  737. $this->returnData($dataSoc);exit;
  738. }
  739. //对战分数上报
  740. private function normal($recordId, $recordType, $userId){
  741. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id,record_source')->find();
  742. $redis = $this->getRedis();
  743. $redis->del('pk_info'.$recordId);
  744. M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>5));
  745. M('User')->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id'],))))->save(array('user_status'=>5));
  746. if ($info['record_source']==1){
  747. //添加统计
  748. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  749. if ($staRes==NULL){
  750. M('Sta')->add(array('sta_normal'=>1,'operate_dt'=>strtotime(date('Y-m-d')),));
  751. }else{
  752. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_normal');
  753. }
  754. return array('record_source'=>1,'user_score'=>0,'ref_user_score'=>0);
  755. }else if($info['record_source']==3){
  756. //添加统计
  757. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  758. if ($staRes==NULL){
  759. M('Sta')->add(array('sta_pve'=>1,'operate_dt'=>strtotime(date('Y-m-d')),));
  760. }else{
  761. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_pve');
  762. }
  763. return array('record_source'=>1,'user_score'=>0,'ref_user_score'=>0);
  764. }else{
  765. //添加统计
  766. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  767. if ($staRes==NULL){
  768. M('Sta')->add(array('sta_rank'=>1,'operate_dt'=>strtotime(date('Y-m-d')),));
  769. }else{
  770. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
  771. }
  772. }
  773. if ($info['user_id']==$userId){
  774. $uid = $info['ref_user_id'];
  775. }else{
  776. $uid = $info['user_id'];
  777. }
  778. //把pk对象的信息查询出来
  779. $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();
  780. $userScore = $this->getScore($userId, $uid, $recordId, $recordType, $userRes);
  781. if ($recordType==1){
  782. $recordRefType = 2;
  783. }else{
  784. $recordRefType = 1;
  785. }
  786. $userRefScore = $this->getScore($uid, $userId, $recordId, $recordRefType, $userRes);
  787. return array('record_source'=>2,'user_score'=>$userScore,'ref_user_score'=>$userRefScore);
  788. }
  789. private function getScore($userId, $uid, $recordId, $recordType, $userRes){
  790. $userInfo = array();
  791. foreach ($userRes as $row){
  792. $userInfo[$row['user_id']] = $row;
  793. }
  794. /* 分数相同赢者加10分,败者减10分
  795. 分数不同且分低者胜时,赢者加10分+双方分数差/10 取整(比如700分赢了800分,这一局就加了20分),败者减10分+双方分数差/20取整(比如800分输给了700分,这一局就减了15分)
  796. 分数不同且分高者胜时,赢者加10分减去双方分数差/80 + 1 取整(比如800分赢了700分,这一局就加了8分),败者减赢者加分 */
  797. if ($userInfo[$userId]['user_score']>$userInfo[$uid]['user_score']){
  798. //自己的分数比对手高
  799. $score = 10 - floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/80) + 1;
  800. if ($recordType==1){
  801. $score = 0 + $score;
  802. }else{
  803. $score = 0 - $score;
  804. }
  805. }else{
  806. //自己的分数比对手低
  807. if ($recordType==1){
  808. $score = 10 + floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/10);
  809. }else{
  810. $score = floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/20) - 10;
  811. }
  812. }
  813. if ($recordType==1){
  814. //赢了比赛,并且比赛是前十场
  815. if ($userRes['pk_num']<=10){
  816. if ($userRes['win_num']<=2){
  817. $score = 2*$score;
  818. }else if($userRes['win_num']<6){
  819. $score = 3*$score;
  820. }else if($userRes['win_num']<=10){
  821. $score = 4*$score;
  822. }
  823. }
  824. }else{
  825. //输了比赛,并且比赛是前十场
  826. if ($userRes['pk_num']<=10){
  827. if ($userRes['fail_num']<=2){
  828. $score = 2*$score;
  829. }else if($userRes['fail_num']<6){
  830. $score = 3*$score;
  831. }else if($userRes['fail_num']<=10){
  832. $score = 4*$score;
  833. }
  834. }
  835. }
  836. //判断是否是前十场
  837. if($userRes['pk_num']>10){
  838. if ($recordType==1){
  839. 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'),));
  840. }else{
  841. 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'),));
  842. }
  843. }else{
  844. M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
  845. }
  846. M('UserScore')->add(array('user_id'=>$userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
  847. //修改用户等级
  848. $userResInfo = M('User')->where(array('user_id'=>$userId))->field('user_score')->find();
  849. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
  850. M('User')->where(array('user_id'=>$userId))->save(array('user_level'=>$levelInfo['level_id']));
  851. return $score;
  852. }
  853. //对战分数上报
  854. private function rank(){
  855. $score = I('user_score');
  856. $recordId = I('record_id');
  857. $recordType = I('record_type');
  858. if (empty($recordId)){
  859. $data = array('code'=>1,'msg'=>'对战ID不能为空');
  860. $this->returnData($data);exit;
  861. }
  862. //添加统计
  863. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  864. if ($staRes==NULL){
  865. M('Sta')->add(array('sta_rank'=>1,'operate_dt'=>strtotime(date('Y-m-d')),));
  866. }else{
  867. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
  868. }
  869. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find();
  870. if ($info['user_id']==$this->userId){
  871. $uid = $info['ref_user_id'];
  872. }else{
  873. $uid = $info['user_id'];
  874. }
  875. if (empty($recordType)||!in_array($recordType, array(1,2))){
  876. $data = array('code'=>1,'msg'=>'对战输赢错误');
  877. $this->returnData($data);exit;
  878. }
  879. //把pk对象的信息查询出来
  880. $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();
  881. if ($recordType==1){
  882. //赢了比赛,并且比赛是前十场
  883. if ($userRes['pk_num']<=10){
  884. if ($userRes['win_num']<=2){
  885. $score = 2*$score;
  886. }else if($userRes['win_num']<6){
  887. $score = 3*$score;
  888. }else if($userRes['win_num']<=10){
  889. $score = 4*$score;
  890. }
  891. }
  892. }else{
  893. //输了比赛,并且比赛是前十场
  894. if ($userRes['pk_num']<=10){
  895. if ($userRes['fail_num']<=2){
  896. $score = 2*$score;
  897. }else if($userRes['fail_num']<6){
  898. $score = 3*$score;
  899. }else if($userRes['fail_num']<=10){
  900. $score = 4*$score;
  901. }
  902. }
  903. }
  904. //判断是否是前十场
  905. if($userRes['pk_num']>10){
  906. if ($recordType==1){
  907. 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'),));
  908. }else{
  909. 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'),));
  910. }
  911. }else{
  912. M('User')->where(array('user_id'=>$this->userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
  913. }
  914. M('UserScore')->add(array('user_id'=>$this->userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
  915. //修改用户等级
  916. $userResInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_score')->find();
  917. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id desc')->field('level_id')->find();
  918. M('User')->where(array('user_id'=>$this->userId))->save(array('user_level'=>$levelInfo['level_id']));
  919. $data = array('code'=>0,'msg'=>'比赛分数上报成功','data'=>array('user_score'=>$score));
  920. $this->returnData($data);exit;
  921. }
  922. //生成3个错误选项
  923. private function getThreeWords($user_id, $ref_user_id, $num){
  924. if ($num%2==0){
  925. $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find();
  926. $userLevel = $userInfo['user_level'];
  927. }else{
  928. $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find();
  929. $userLevel = $info['user_level'];
  930. }
  931. $storeRes = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find();
  932. if ($storeRes == NULL){
  933. $storeRes['store_id'] = 1;
  934. }
  935. $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1);
  936. $wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit(3)->select();
  937. }
  938. //生成毫秒级时间
  939. private function getMilliSecond(){
  940. $time = explode (" ", microtime () );
  941. $time = $time [1] . ($time [0] * 1000);
  942. $time2 = explode ( ".", $time );
  943. $time = $time2 [0];
  944. return $time;
  945. }
  946. //生成对战题库
  947. private function getStoreList($user_id, $ref_user_id, $recordId, $pageSize=''){
  948. if (empty($pageSize)){
  949. $pageSize = I('page_size',C('PK_SCORE')*2);
  950. }else{
  951. $pageSize = $pageSize*2;
  952. }
  953. $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find();
  954. if (!empty($ref_user_id)){
  955. $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find();
  956. $info['user_level'] = $userInfo['user_level'];
  957. }
  958. if ($userInfo==NULL || $info==NULL){
  959. return false;
  960. }
  961. $recordInfo = M('PkRecord')->where(array('record_id'=>$recordId))->find();
  962. if ($recordInfo!=NULL && $recordInfo['level_id']>0){
  963. $storeRes = M('Store')->where(array('level_id'=>$userInfo['user_level'],'is_delete'=>1))->field('store_id')->find();
  964. if ($storeRes==NULL){
  965. return false;
  966. }
  967. $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1);
  968. //$wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit($pageSize)->select();
  969. $wordsRes = M('StoreWords')->where($condition)->order('rand()')->limit($pageSize)->select();
  970. }else if ($userInfo['user_level']==$info['user_level']){
  971. $storeRes = M('Store')->where(array('level_id'=>$userInfo['user_level'],'is_delete'=>1))->field('store_id')->find();
  972. if ($storeRes==NULL){
  973. return false;
  974. }
  975. $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1);
  976. //$wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit($pageSize)->select();
  977. $wordsRes = M('StoreWords')->where($condition)->order('rand()')->limit($pageSize)->select();
  978. }else{
  979. $userLevel = $userInfo['user_level']>$info['user_level']?$userInfo['user_level']:$info['user_level'];
  980. $storeRes1 = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find();
  981. $storeRes2 = M('Store')->where(array('level_id'=>$userLevel-1,'is_delete'=>1))->field('store_id')->find();
  982. if ($storeRes1==NULL||$storeRes2==NULL){
  983. return false;
  984. }
  985. $condition1 = array('store_id'=>$storeRes1['store_id'],'is_delete'=>1);
  986. $condition2 = array('store_id'=>$storeRes2['store_id'],'is_delete'=>1);
  987. $size = ceil($pageSize/2);
  988. //$wordsRes1 = M('StoreWords')->where($condition1)->order('words_id desc')->limit($size)->select();
  989. //$wordsRes2 = M('StoreWords')->where($condition2)->order('words_id desc')->limit($size)->select();
  990. $wordsRes1 = M('StoreWords')->where($condition1)->order('rand()')->limit($size)->select();
  991. $wordsRes2 = M('StoreWords')->where($condition2)->order('rand()')->limit($size)->select();
  992. $wordsRes = array_merge($wordsRes1, $wordsRes2);
  993. }
  994. //插入对战单词表中
  995. $dataList = array();
  996. foreach ($wordsRes as $key=>$words){
  997. $cacheData = array();
  998. $dataList = array('record_id'=>$recordId,'words_id'=>$words['words_id'],'operate_dt'=>time());
  999. $pwId = M('PkWords')->add($dataList);
  1000. $wordsRes[$key]['pw_id'] = $pwId;
  1001. $cacheData = array(
  1002. 'pw_id'=>$pwId,
  1003. 'store_id'=>$words['store_id'],
  1004. 'words_id'=>$words['words_id'],
  1005. 'words_name'=>$words['words_name'],
  1006. 'words_text' =>$this->getWordsText($words),
  1007. );
  1008. $pushKey = 'pk_words_'.$recordId;
  1009. $pushRes = $this->pushQueue($pushKey, $cacheData);
  1010. if (!$pushRes){
  1011. $pushRes = $this->pushQueue($pushKey, $cacheData);
  1012. }
  1013. if (!$pushRes){
  1014. return false;
  1015. }
  1016. }
  1017. return true;
  1018. }
  1019. //发弹幕
  1020. public function acFun(){
  1021. $recordId = I('record_id');
  1022. $acfunContent = I('acfun_content');
  1023. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id')->find();
  1024. if ($info==NULL){
  1025. $returnData = array('record_id'=>$info['record_id'],'user_id'=>'','ref_user_id'=>'');
  1026. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'对战信息获取失败','data'=>$returnData);
  1027. $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  1028. $this->returnData($dataSoc);
  1029. }
  1030. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'message'=>$acfunContent);
  1031. $dataSoc = array('code'=>0,'type'=>14,'msg'=>'','data'=>$returnData);
  1032. if ($info['user_id']==$this->userId){
  1033. $uid = $info['ref_user_id'];
  1034. }else{
  1035. $uid = $info['user_id'];
  1036. }
  1037. $this->pushMsg(json_encode($dataSoc), $uid);
  1038. $this->returnData($dataSoc);
  1039. }
  1040. //上报作答结果
  1041. public function words(){
  1042. $words = I('words');
  1043. $recordId = I('record_id');
  1044. if (empty($words)){
  1045. $data = array('code'=>1,'msg'=>'对战单词错误');
  1046. $this->returnData($data);exit;
  1047. }
  1048. if ($recordId){
  1049. $data = array('code'=>1,'msg'=>'对战ID错误');
  1050. $this->returnData($data);exit;
  1051. }
  1052. $words = json_decode($words,true);
  1053. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find();
  1054. $flag = FALSE;
  1055. if ($info['user_id'] == $this->userId){
  1056. $flag = TRUE;
  1057. }
  1058. foreach ($words as $row){
  1059. if ($flag){
  1060. M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('user_status'=>$row['user_status']));
  1061. }else{
  1062. M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('ref_status'=>$row['user_status']));
  1063. }
  1064. }
  1065. if ($flag){
  1066. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('user_status')->select();
  1067. }else{
  1068. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('ref_status as user_status')->select();
  1069. }
  1070. $data = array('code'=>0,'msg'=>'','data'=>$res);
  1071. }
  1072. //获取对战题单词所有单词情况
  1073. public function getStoreWords(){
  1074. $recordId = I('record_id');
  1075. if (empty($recordId)){
  1076. $data = array('code'=>1,'msg'=>'对战ID错误');
  1077. $this->returnData($data);exit;
  1078. }
  1079. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find();
  1080. $flag = FALSE;
  1081. if ($info['user_id'] == $this->userId){
  1082. $flag = TRUE;
  1083. }
  1084. if ($flag){
  1085. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,user_status')->select();
  1086. }else{
  1087. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,ref_status as user_status')->select();
  1088. }
  1089. if ($res==NULL){
  1090. $data = array('code'=>1,'msg'=>'暂无答题数据');
  1091. $this->returnData($data);exit;
  1092. }
  1093. $pkRes = array();
  1094. $wordsIdArr = array();
  1095. foreach ($res as $r){
  1096. $wordsIdArr[] = $r['words_id'];
  1097. $pkRes[$r['words_id']] = $r['user_status'];
  1098. }
  1099. $swRes = M('StoreWords')->where(array('words_id'=>array('IN',implode(',', $wordsIdArr))))->select();
  1100. if ($swRes==NULL){
  1101. $data = array('code'=>1,'msg'=>'获取数据失败');
  1102. $this->returnData($data);exit;
  1103. }
  1104. foreach ($swRes as $key=>$row){
  1105. $swRes[$key]['user_status'] = $pkRes[$row['words_id']]['user_status'];
  1106. }
  1107. $returnData = array('code'=>0,'msg'=>'','data'=>$swRes);
  1108. $this->returnData($returnData);
  1109. }
  1110. //获取对战难易级别
  1111. public function getLevel() {
  1112. $userInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_level')->find();
  1113. $byName = array(1=>'题库一','题库二','题库三','题库四','题库五','题库六','题库七','题库八');
  1114. $res = M('UserLevel')->order('level_id asc')->field('level_id,level_name')->select();
  1115. $arr = array();
  1116. foreach ($res as $row){
  1117. //$arr[] = array('level_id'=>$row['level_id'],'level_name'=>$row['level_name'],'by_name'=>$byName[$row['level_id']]);
  1118. $arr[] = array('level_id'=>$row['level_id'],'level_name'=>$row['level_name'],'by_name'=>$row['level_name']);
  1119. }
  1120. $returnData = array('code'=>0,'msg'=>'','renji_defaut'=>$userInfo['user_level'],'data'=>$arr);
  1121. $this->returnData($returnData);
  1122. }
  1123. }