PkController.class.php20180228 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  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. if ($this->userId == $returnData['user_id']){
  605. $pkUserid = $returnData['user_id'];
  606. $peerUserId = $returnData['ref_user_id'];
  607. $returnData1 = $returnData;
  608. $returnData2 = $returnData;
  609. $returnData1['user_score'] = $score;
  610. $returnData1['peer_score'] = $refScore;
  611. $returnData2['user_score'] = $refScore;
  612. $returnData2['peer_score'] = $score;
  613. }else{
  614. $pkUserid = $returnData['user_id'];
  615. $peerUserId = $returnData['ref_user_id'];
  616. $returnData1 = $returnData;
  617. $returnData2 = $returnData;
  618. $returnData1['user_score'] = $refScore;
  619. $returnData1['peer_score'] = $score;
  620. $returnData2['user_score'] = $score;
  621. $returnData2['peer_score'] = $refScore;
  622. }
  623. $dataSoc1 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData1);
  624. $pushUid1 = $this->pushMsg(json_encode($dataSoc1), $pkUserid);
  625. //不在线
  626. if ($pushUid1){
  627. $this->offline($pushUid1, $info);
  628. }
  629. $dataSoc2 = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData2);
  630. $pushUid2 = $this->pushMsg(json_encode($dataSoc2), $peerUserId);
  631. //不在线
  632. if ($pushUid2){
  633. $this->offline($pushUid2, $info);
  634. }
  635. $dataSoc = array('code'=>0,'type'=>7,'msg'=>'','data'=>$returnData);
  636. $this->returnData($dataSoc);exit;
  637. }
  638. public function aa(){
  639. $userResInfo = M('User')->where(array('user_id'=>1000010))->field('user_score')->find();
  640. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
  641. M('User')->where(array('user_id'=>1000010))->save(array('user_level'=>$levelInfo['level_id']));
  642. $userResInfo = M('User')->where(array('user_id'=>1000005))->field('user_score')->find();
  643. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
  644. M('User')->where(array('user_id'=>1000005))->save(array('user_level'=>$levelInfo['level_id'],'user_status'=>5));
  645. //$this->getStoreList(1000010,1000005,34);exit;
  646. //$this->getNextWord(34);
  647. //$aa = $this->pushQueue(34,1);
  648. //var_dump($aa);exit;
  649. //$bb = $this->popQueue(34);
  650. //var_dump($bb);exit;
  651. //$info = M('PkRecord')->where(array('record_id'=>34))->field('record_id,user_id,ref_user_id')->find();
  652. //$this->setRedisPkRecordInfo(34,$info);
  653. //$aa = $this->getRedisPkRecordInfo(34);
  654. //var_dump($aa);exit;
  655. /* $wordsTextArr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4);
  656. $wordsKey = array('b','c','d','a');
  657. shuffle($wordsKey);
  658. $wordsTextNewArr = array();
  659. foreach ($wordsKey as $char){
  660. $wordsTextNewArr[] = $wordsTextArr[$char];
  661. }
  662. echo array_search('a',$wordsKey);
  663. var_dump($wordsKey,$wordsTextNewArr);exit; */
  664. //$this->normal(55, 1, 1000010);
  665. }
  666. //对战分数上报
  667. private function normal($recordId, $recordType, $userId){
  668. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id,record_source')->find();
  669. $redis = $this->getRedis();
  670. $redis->del('pk_info'.$recordId);
  671. M('PkRecord')->where(array('record_id'=>$recordId))->save(array('record_status'=>5));
  672. M('User')->where(array('user_id'=>array('IN',array($info['user_id'],$info['ref_user_id'],))))->save(array('user_status'=>5));
  673. if ($info['record_source']==1){
  674. //添加统计
  675. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  676. if ($staRes==NULL){
  677. M('Sta')->add(array('sta_normal'=>1));
  678. }else{
  679. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_normal');
  680. }
  681. return array('record_source'=>1,'user_score'=>0,'ref_user_score'=>0);
  682. }else{
  683. //添加统计
  684. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  685. if ($staRes==NULL){
  686. M('Sta')->add(array('sta_rank'=>1));
  687. }else{
  688. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
  689. }
  690. }
  691. if ($info['user_id']==$userId){
  692. $uid = $info['ref_user_id'];
  693. }else{
  694. $uid = $info['user_id'];
  695. }
  696. //把pk对象的信息查询出来
  697. $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();
  698. $userScore = $this->getScore($userId, $uid, $recordId, $recordType, $userRes);
  699. if ($recordType==1){
  700. $recordRefType = 2;
  701. }else{
  702. $recordRefType = 1;
  703. }
  704. $userRefScore = $this->getScore($uid, $userId, $recordId, $recordRefType, $userRes);
  705. return array('record_source'=>2,'user_score'=>$userScore,'ref_user_score'=>$userRefScore);
  706. }
  707. private function getScore($userId, $uid, $recordId, $recordType, $userRes){
  708. $userInfo = array();
  709. foreach ($userRes as $row){
  710. $userInfo[$row['user_id']] = $row;
  711. }
  712. /* 分数相同赢者加10分,败者减10分
  713. 分数不同且分低者胜时,赢者加10分+双方分数差/10 取整(比如700分赢了800分,这一局就加了20分),败者减10分+双方分数差/20取整(比如800分输给了700分,这一局就减了15分)
  714. 分数不同且分高者胜时,赢者加10分减去双方分数差/80 + 1 取整(比如800分赢了700分,这一局就加了8分),败者减赢者加分 */
  715. if ($userInfo[$userId]['user_score']>$userInfo[$uid]['user_score']){
  716. //自己的分数比对手高
  717. $score = 10 - floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/80) + 1;
  718. if ($recordType==1){
  719. $score = 0 + $score;
  720. }else{
  721. $score = 0 - $score;
  722. }
  723. }else{
  724. //自己的分数比对手低
  725. if ($recordType==1){
  726. $score = 10 + floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/10);
  727. }else{
  728. $score = floor(abs($userInfo[$userId]['user_score'] - $userInfo[$uid]['user_score'])/20) - 10;
  729. }
  730. }
  731. if ($recordType==1){
  732. //赢了比赛,并且比赛是前十场
  733. if ($userRes['pk_num']<=10){
  734. if ($userRes['win_num']<=2){
  735. $score = 2*$score;
  736. }else if($userRes['win_num']<6){
  737. $score = 3*$score;
  738. }else if($userRes['win_num']<=10){
  739. $score = 4*$score;
  740. }
  741. }
  742. }else{
  743. //输了比赛,并且比赛是前十场
  744. if ($userRes['pk_num']<=10){
  745. if ($userRes['fail_num']<=2){
  746. $score = 2*$score;
  747. }else if($userRes['fail_num']<6){
  748. $score = 3*$score;
  749. }else if($userRes['fail_num']<=10){
  750. $score = 4*$score;
  751. }
  752. }
  753. }
  754. //判断是否是前十场
  755. if($userRes['pk_num']>10){
  756. if ($recordType==1){
  757. 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'),));
  758. }else{
  759. 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'),));
  760. }
  761. }else{
  762. M('User')->where(array('user_id'=>$userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
  763. }
  764. M('UserScore')->add(array('user_id'=>$userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
  765. //修改用户等级
  766. $userResInfo = M('User')->where(array('user_id'=>$userId))->field('user_score')->find();
  767. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id asc')->field('level_id')->find();
  768. M('User')->where(array('user_id'=>$userId))->save(array('user_level'=>$levelInfo['level_id']));
  769. return $score;
  770. }
  771. //对战分数上报
  772. private function rank(){
  773. $score = I('user_score');
  774. $recordId = I('record_id');
  775. $recordType = I('record_type');
  776. if (empty($recordId)){
  777. $data = array('code'=>1,'msg'=>'对战ID不能为空');
  778. $this->returnData($data);exit;
  779. }
  780. //添加统计
  781. $staRes = M('Sta')->where(array('operate_dt'=>strtotime(date('Y-m-d'))))->field('sta_id')->find();
  782. if ($staRes==NULL){
  783. M('Sta')->add(array('sta_rank'=>1));
  784. }else{
  785. M('Sta')->where(array('sta_id'=>$staRes['sta_id']))->setInc('sta_rank');
  786. }
  787. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find();
  788. if ($info['user_id']==$this->userId){
  789. $uid = $info['ref_user_id'];
  790. }else{
  791. $uid = $info['user_id'];
  792. }
  793. if (empty($recordType)||!in_array($recordType, array(1,2))){
  794. $data = array('code'=>1,'msg'=>'对战输赢错误');
  795. $this->returnData($data);exit;
  796. }
  797. //把pk对象的信息查询出来
  798. $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();
  799. if ($recordType==1){
  800. //赢了比赛,并且比赛是前十场
  801. if ($userRes['pk_num']<=10){
  802. if ($userRes['win_num']<=2){
  803. $score = 2*$score;
  804. }else if($userRes['win_num']<6){
  805. $score = 3*$score;
  806. }else if($userRes['win_num']<=10){
  807. $score = 4*$score;
  808. }
  809. }
  810. }else{
  811. //输了比赛,并且比赛是前十场
  812. if ($userRes['pk_num']<=10){
  813. if ($userRes['fail_num']<=2){
  814. $score = 2*$score;
  815. }else if($userRes['fail_num']<6){
  816. $score = 3*$score;
  817. }else if($userRes['fail_num']<=10){
  818. $score = 4*$score;
  819. }
  820. }
  821. }
  822. //判断是否是前十场
  823. if($userRes['pk_num']>10){
  824. if ($recordType==1){
  825. 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'),));
  826. }else{
  827. 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'),));
  828. }
  829. }else{
  830. M('User')->where(array('user_id'=>$this->userId))->save(array('user_score'=>array('exp',"user_score+{$score}"),'pk_num'=>array('exp','pk_num+1'),));
  831. }
  832. M('UserScore')->add(array('user_id'=>$this->userId,'record_id'=>$recordId,'score_num'=>$score,'operate_dt'=>time()));
  833. //修改用户等级
  834. $userResInfo = M('User')->where(array('user_id'=>$this->userId))->field('user_score')->find();
  835. $levelInfo = M('UserLevel')->where(array('max_score'=>array('EGT',$userResInfo['user_score']),))->order('level_id desc')->field('level_id')->find();
  836. M('User')->where(array('user_id'=>$this->userId))->save(array('user_level'=>$levelInfo['level_id']));
  837. $data = array('code'=>0,'msg'=>'比赛分数上报成功','data'=>array('user_score'=>$score));
  838. $this->returnData($data);exit;
  839. }
  840. //生成3个错误选项
  841. private function getThreeWords($user_id, $ref_user_id, $num){
  842. if ($num%2==0){
  843. $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find();
  844. $userLevel = $userInfo['user_level'];
  845. }else{
  846. $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find();
  847. $userLevel = $info['user_level'];
  848. }
  849. $storeRes = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find();
  850. if ($storeRes == NULL){
  851. $storeRes['store_id'] = 1;
  852. }
  853. $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1);
  854. $wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit(3)->select();
  855. }
  856. //生成毫秒级时间
  857. private function getMilliSecond(){
  858. $time = explode (" ", microtime () );
  859. $time = $time [1] . ($time [0] * 1000);
  860. $time2 = explode ( ".", $time );
  861. $time = $time2 [0];
  862. return $time;
  863. }
  864. //生成对战题库
  865. private function getStoreList($user_id, $ref_user_id, $recordId, $pageSize=''){
  866. if (empty($pageSize)){
  867. $pageSize = I('page_size',C('PK_SCORE')*2);
  868. }else{
  869. $pageSize = $pageSize*2;
  870. }
  871. $userInfo = M('User')->where(array('is_delete' => 1,'user_id'=>$user_id))->field('user_level')->find();
  872. $info = M('User')->where(array('is_delete' => 1,'user_id'=>$ref_user_id))->field('user_level')->find();
  873. if ($userInfo==NULL || $info==NULL){
  874. return false;
  875. }
  876. if ($userInfo['user_level']==$info['user_level']){
  877. $storeRes = M('Store')->where(array('level_id'=>$userInfo['user_level'],'is_delete'=>1))->field('store_id')->find();
  878. if ($storeRes==NULL){
  879. return false;
  880. }
  881. $condition = array('store_id'=>$storeRes['store_id'],'is_delete'=>1);
  882. //$wordsRes = M('StoreWords')->where($condition)->order('words_id desc')->limit($pageSize)->select();
  883. $wordsRes = M('StoreWords')->where($condition)->order('rand()')->limit($pageSize)->select();
  884. }else{
  885. $userLevel = $userInfo['user_level']>$info['user_level']?$userInfo['user_level']:$info['user_level'];
  886. $storeRes1 = M('Store')->where(array('level_id'=>$userLevel,'is_delete'=>1))->field('store_id')->find();
  887. $storeRes2 = M('Store')->where(array('level_id'=>$userLevel-1,'is_delete'=>1))->field('store_id')->find();
  888. if ($storeRes1==NULL||$storeRes2==NULL){
  889. return false;
  890. }
  891. $condition1 = array('store_id'=>$storeRes1['store_id'],'is_delete'=>1);
  892. $condition2 = array('store_id'=>$storeRes2['store_id'],'is_delete'=>1);
  893. $size = ceil($pageSize/2);
  894. //$wordsRes1 = M('StoreWords')->where($condition1)->order('words_id desc')->limit($size)->select();
  895. //$wordsRes2 = M('StoreWords')->where($condition2)->order('words_id desc')->limit($size)->select();
  896. $wordsRes1 = M('StoreWords')->where($condition1)->order('rand()')->limit($size)->select();
  897. $wordsRes2 = M('StoreWords')->where($condition2)->order('rand()')->limit($size)->select();
  898. $wordsRes = array_merge($wordsRes1, $wordsRes2);
  899. }
  900. //插入对战单词表中
  901. $dataList = array();
  902. foreach ($wordsRes as $key=>$words){
  903. $cacheData = array();
  904. $dataList = array('record_id'=>$recordId,'words_id'=>$words['words_id'],'operate_dt'=>time());
  905. $pwId = M('PkWords')->add($dataList);
  906. $wordsRes[$key]['pw_id'] = $pwId;
  907. $cacheData = array(
  908. 'pw_id'=>$pwId,
  909. 'store_id'=>$words['store_id'],
  910. 'words_id'=>$words['words_id'],
  911. 'words_name'=>$words['words_name'],
  912. 'words_text' =>$this->getWordsText($words),
  913. );
  914. $pushKey = 'pk_words_'.$recordId;
  915. $pushRes = $this->pushQueue($pushKey, $cacheData);
  916. if (!$pushRes){
  917. $pushRes = $this->pushQueue($pushKey, $cacheData);
  918. }
  919. if (!$pushRes){
  920. return false;
  921. }
  922. }
  923. return true;
  924. }
  925. //发弹幕
  926. public function acFun(){
  927. $recordId = I('record_id');
  928. $acfunContent = I('acfun_content');
  929. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('record_id,user_id,ref_user_id')->find();
  930. if ($info==NULL){
  931. $returnData = array('record_id'=>$info['record_id'],'user_id'=>'','ref_user_id'=>'');
  932. $dataSoc = array('code'=>1,'type'=>0,'msg'=>'对战信息获取失败','data'=>$returnData);
  933. $this->pushMsg(json_encode($dataSoc), array($info['ref_user_id'],$info['user_id']));
  934. $this->returnData($dataSoc);
  935. }
  936. $returnData = array('record_id'=>$info['record_id'],'user_id'=>$info['user_id'],'ref_user_id'=>$info['ref_user_id'],'message'=>$acfunContent);
  937. $dataSoc = array('code'=>0,'type'=>14,'msg'=>'','data'=>$returnData);
  938. if ($info['user_id']==$this->userId){
  939. $uid = $info['ref_user_id'];
  940. }else{
  941. $uid = $info['user_id'];
  942. }
  943. $this->pushMsg(json_encode($dataSoc), $uid);
  944. $this->returnData($dataSoc);
  945. }
  946. //上报作答结果
  947. public function words(){
  948. $words = I('words');
  949. $recordId = I('record_id');
  950. if (empty($words)){
  951. $data = array('code'=>1,'msg'=>'对战单词错误');
  952. $this->returnData($data);exit;
  953. }
  954. if ($recordId){
  955. $data = array('code'=>1,'msg'=>'对战ID错误');
  956. $this->returnData($data);exit;
  957. }
  958. $words = json_decode($words,true);
  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. foreach ($words as $row){
  965. if ($flag){
  966. M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('user_status'=>$row['user_status']));
  967. }else{
  968. M('PkWords')->where(array('record_id'=>$recordId,'words_id'=>$row['words_id']))->save(array('ref_status'=>$row['user_status']));
  969. }
  970. }
  971. if ($flag){
  972. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('user_status')->select();
  973. }else{
  974. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('ref_status as user_status')->select();
  975. }
  976. $data = array('code'=>0,'msg'=>'','data'=>$res);
  977. }
  978. //获取对战题单词所有单词情况
  979. public function getStoreWords(){
  980. $recordId = I('record_id');
  981. if (empty($recordId)){
  982. $data = array('code'=>1,'msg'=>'对战ID错误');
  983. $this->returnData($data);exit;
  984. }
  985. $info = M('PkRecord')->where(array('record_id'=>$recordId))->field('user_id,ref_user_id')->find();
  986. $flag = FALSE;
  987. if ($info['user_id'] == $this->userId){
  988. $flag = TRUE;
  989. }
  990. if ($flag){
  991. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,user_status')->select();
  992. }else{
  993. $res = M('PkWords')->where(array('record_id'=>$recordId,'pw_status'=>2)) ->field('words_id,ref_status as user_status')->select();
  994. }
  995. if ($res==NULL){
  996. $data = array('code'=>1,'msg'=>'暂无答题数据');
  997. $this->returnData($data);exit;
  998. }
  999. $pkRes = array();
  1000. $wordsIdArr = array();
  1001. foreach ($res as $r){
  1002. $wordsIdArr[] = $r['words_id'];
  1003. $pkRes[$r['words_id']] = $r['user_status'];
  1004. }
  1005. $swRes = M('StoreWords')->where(array('words_id'=>array('IN',implode(',', $wordsIdArr))))->select();
  1006. if ($swRes==NULL){
  1007. $data = array('code'=>1,'msg'=>'获取数据失败');
  1008. $this->returnData($data);exit;
  1009. }
  1010. foreach ($swRes as $key=>$row){
  1011. $swRes[$key]['user_status'] = $pkRes[$row['words_id']]['user_status'];
  1012. }
  1013. $returnData = array('code'=>0,'msg'=>'','data'=>$swRes);
  1014. $this->returnData($returnData);
  1015. }
  1016. }