PkController.class.php20180226 52 KB

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