Livepk.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. <?php
  2. namespace App\Api;
  3. use PhalApi\Api;
  4. use App\Domain\Livepk as Domain_Livepk;
  5. /**
  6. * Livepk-主播PK
  7. */
  8. class Livepk extends Api {
  9. public function getRules() {
  10. return array(
  11. 'getLiveList' => array(
  12. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  13. 'p' => array('name' => 'p', 'type' => 'int', 'default' => 1, 'desc' => '页码'),
  14. ),
  15. 'search' => array(
  16. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  17. 'key' => array('name' => 'key', 'type' => 'string', 'require' => true, 'desc' => '关键词'),
  18. 'p' => array('name' => 'p', 'type' => 'int', 'default' => 1, 'desc' => '页码'),
  19. ),
  20. 'checkLive' => array(
  21. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '连麦主播流名'),
  22. 'uid_stream' => array('name' => 'uid_stream', 'type' => 'string', 'require' => true, 'desc' => '当前主播流名'),
  23. ),
  24. 'changeLive' => array(
  25. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  26. 'pkuid' => array('name' => 'pkuid', 'type' => 'int', 'require' => true, 'desc' => '连麦主播ID'),
  27. 'type' => array('name' => 'type', 'type' => 'int', 'require' => true, 'desc' => '标识'),
  28. 'sign' => array('name' => 'sign', 'type' => 'string', 'require' => true, 'desc' => '签名'),
  29. ),
  30. 'setPK' => array(
  31. 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'),
  32. 'pkuid' => array('name' => 'pkuid', 'type' => 'int', 'desc' => '连麦主播ID'),
  33. 'sign' => array('name' => 'sign', 'type' => 'string', 'desc' => '签名'),
  34. ),
  35. 'endPK' => array(
  36. 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'),
  37. 'addtime' => array('name' => 'addtime', 'type' => 'int', 'desc' => '时间戳'),
  38. 'type' => array('name' => 'type', 'type' => 'int', 'desc' => '标识'),
  39. 'sign' => array('name' => 'sign', 'type' => 'string','desc' => '签名'),
  40. ),
  41. 'setThreePK' => array(
  42. 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'),
  43. 'pkuid2' => array('name' => 'pkuid2', 'type' => 'int', 'desc' => '连麦主播ID2'),
  44. 'pkuid3' => array('name' => 'pkuid3', 'type' => 'int', 'desc' => '连麦主播ID3'),
  45. 'sign' => array('name' => 'sign', 'type' => 'string', 'desc' => '签名'),
  46. ),
  47. 'endThreePK' => array(
  48. 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'),
  49. 'addtime' => array('name' => 'addtime', 'type' => 'int', 'desc' => '时间戳'),
  50. 'type' => array('name' => 'type', 'type' => 'int', 'desc' => '标识'),
  51. 'sign' => array('name' => 'sign', 'type' => 'string','desc' => '签名'),
  52. ),
  53. );
  54. }
  55. /**
  56. * 获取直播中的用户列表
  57. * @desc 用于获取直播中的用户列表
  58. * @return int code 操作码,0表示成功
  59. * @return array info
  60. * @return string info[].uid 主播ID
  61. * @return string info[].pkuid PK对象ID,0表示未连麦
  62. * @return string msg 提示信息
  63. */
  64. public function getLiveList() {
  65. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  66. $uid=\App\checkNull($this->uid);
  67. $p=\App\checkNull($this->p);
  68. if(!$p){
  69. $p=1;
  70. }
  71. $where="uid!={$uid}";
  72. $domain = new Domain_Livepk();
  73. $list = $domain->getLiveList($uid,$where,$p);
  74. foreach($list as $k=>$v){
  75. $userinfo=\App\getUserInfo($v['uid']);
  76. $v['sex']=$userinfo['sex'];
  77. $list[$k]=$v;
  78. }
  79. $rs['info']=$list;
  80. return $rs;
  81. }
  82. /**
  83. * 搜索直播用户
  84. * @desc 用于搜索直播中用户
  85. * @return int code 操作码,0表示成功
  86. * @return array info
  87. * @return string info[].uid 主播ID
  88. * @return string info[].pkuid PK对象ID,0表示未连麦
  89. * @return string msg 提示信息
  90. */
  91. public function search() {
  92. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  93. $uid=\App\checkNull($this->uid);
  94. $key=\App\checkNull($this->key);
  95. $p=\App\checkNull($this->p);
  96. if(!$p){
  97. $p=1;
  98. }
  99. if($key==''){
  100. $rs['code']=1001;
  101. $rs['msg']=\PhalApi\T('请输入您要搜索的主播昵称或ID');
  102. return $rs;
  103. }
  104. $list=\PhalApi\DI()->notorm->user
  105. ->select('id')
  106. ->where("id!={$uid} and (id='{$key}' or user_nickname like '%{$key}%')")
  107. ->fetchAll();
  108. if(!$list){
  109. return $rs;
  110. }
  111. $uids=array_column($list,'id');
  112. $uids_s=implode(',',$uids);
  113. $where="uid!={$uid} and uid in ({$uids_s})";
  114. $domain = new Domain_Livepk();
  115. $list = $domain->getLiveList($uid,$where,$p);
  116. foreach($list as $k=>$v){
  117. $userinfo=\App\getUserInfo($v['uid']);
  118. $v['sex']=$userinfo['sex'];
  119. $list[$k]=$v;
  120. }
  121. $rs['info']=$list;
  122. return $rs;
  123. }
  124. /**
  125. * 检测要连麦主播是否直播中
  126. * @desc 用于检测要连麦主播是否直播中
  127. * @return int code 操作码,0表示成功
  128. * @return array info
  129. * @return string msg 提示信息
  130. */
  131. public function checkLive() {
  132. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  133. $stream=\App\checkNull($this->stream);
  134. $uid_stream=\App\checkNull($this->uid_stream);
  135. $domain = new Domain_Livepk();
  136. $info = $domain->checkLive($stream);
  137. if(!$info){
  138. $rs['code']=1001;
  139. $rs['msg']=\PhalApi\T('对方已关播');
  140. return $rs;
  141. }
  142. //rtmp播流
  143. /*$configpri = getConfigPri();
  144. $nowtime=time();
  145. $bizid = $configpri['tx_bizid'];
  146. $push_url_key = $configpri['tx_push_key'];
  147. $tx_acc_key = $configpri['tx_acc_key'];
  148. $push = $configpri['tx_push'];
  149. $pull = $configpri['tx_pull'];
  150. $now_time2 = $nowtime + 3*60*60;
  151. $txTime = dechex($now_time2);
  152. $live_code = $uid_stream ;
  153. $txSecret2 = md5($tx_acc_key . $live_code . $txTime);
  154. $safe_url2 = "?txSecret=" . $txSecret2."&txTime=" .$txTime;
  155. $play_url = "rtmp://" . $pull . "/live/" .$live_code .$safe_url2. "&bizid=" . $bizid;*/
  156. //trtc播流
  157. $stream_arr=explode('_', $stream);
  158. $liveuid=$stream_arr[0];
  159. $play_url = \App\getTxTrtcUrl($liveuid,$uid_stream);
  160. $info=array(
  161. "pull" => $play_url
  162. );
  163. $rs['info'][0]=$info;
  164. return $rs;
  165. }
  166. /**
  167. * 连麦成功后更新直播信息
  168. * @desc 用于连麦成功后更新数据库信息
  169. * @return int code 操作码,0表示成功
  170. * @return array info
  171. * @return string msg 提示信息
  172. */
  173. public function changeLive() {
  174. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  175. $uid = \App\checkNull($this->uid);
  176. $pkuid=\App\checkNull($this->pkuid);
  177. $type=\App\checkNull($this->type);
  178. $sign=\App\checkNull($this->sign);
  179. $checkdata=array(
  180. 'uid'=>$uid,
  181. 'pkuid'=>$pkuid,
  182. 'type'=>$type,
  183. );
  184. $issign=\App\checkSign($checkdata,$sign);
  185. if(!$issign){
  186. $rs['code']=1001;
  187. $rs['msg']=\PhalApi\T('签名错误');
  188. return $rs;
  189. }
  190. $domain = new Domain_Livepk();
  191. $info = $domain->changeLive($uid,$pkuid,$type);
  192. if($type == 0) {
  193. // 断开连麦 - 处理多人房间
  194. $this->handleLeaveRoom($uid, $pkuid);
  195. } else {
  196. // 建立连麦 - 处理多人房间
  197. $this->handleJoinRoom($uid, $pkuid);
  198. }
  199. // if($type==0){
  200. //
  201. // $key1='LivePK';
  202. // $key2='LivePK_gift';
  203. // $key3='LivePK_timer';
  204. // $key4='LiveConnect';
  205. // $key5='LiveConnect_pull';
  206. //
  207. // \Phalapi\DI()->redis -> hDel($key1,$uid);
  208. // \Phalapi\DI()->redis -> hDel($key1,$pkuid);
  209. //
  210. // \Phalapi\DI()->redis -> hDel($key2,$uid);
  211. // \Phalapi\DI()->redis -> hDel($key2,$pkuid);
  212. //
  213. // \Phalapi\DI()->redis -> hDel($key3,$uid);
  214. // \Phalapi\DI()->redis -> hDel($key3,$pkuid);
  215. //
  216. // \Phalapi\DI()->redis -> hDel($key4,$uid);
  217. // \Phalapi\DI()->redis -> hDel($key4,$pkuid);
  218. //
  219. // \Phalapi\DI()->redis -> hDel($key5,$uid);
  220. // \Phalapi\DI()->redis -> hDel($key5,$pkuid);
  221. //
  222. // }else{
  223. // $key4='LiveConnect';
  224. // \Phalapi\DI()->redis -> hSet($key4,$uid,$pkuid);
  225. // \Phalapi\DI()->redis -> hSet($key4,$pkuid,$uid);
  226. //
  227. // }
  228. return $rs;
  229. }
  230. /**
  231. * 处理加入房间逻辑
  232. */
  233. private function handleJoinRoom($uid, $pkuid) {
  234. // 检查pkuid是否已在房间中
  235. $pkuid_room = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $pkuid);
  236. if($pkuid_room) {
  237. // pkuid已在房间中,uid加入该房间
  238. $room_id = $pkuid_room;
  239. $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id);
  240. $members_array = explode(',', $room_members);
  241. if(!in_array($uid, $members_array)) {
  242. $members_array[] = $uid;
  243. $new_members = implode(',', $members_array);
  244. \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members);
  245. \PhalApi\DI()->redis->hSet('LiveRoomMaster', $uid, $room_id);
  246. }
  247. } else {
  248. // 检查uid是否已在房间中
  249. $uid_room = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid);
  250. if($uid_room) {
  251. // uid已在房间中,pkuid加入该房间
  252. $room_id = $uid_room;
  253. $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id);
  254. $members_array = explode(',', $room_members);
  255. if(!in_array($pkuid, $members_array)) {
  256. $members_array[] = $pkuid;
  257. $new_members = implode(',', $members_array);
  258. \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members);
  259. \PhalApi\DI()->redis->hSet('LiveRoomMaster', $pkuid, $room_id);
  260. }
  261. } else {
  262. // 都不在房间中,创建新房间
  263. $room_id = $uid . '_' . time();
  264. $members = $uid . ',' . $pkuid;
  265. \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $members);
  266. \PhalApi\DI()->redis->hSet('LiveRoomMaster', $uid, $room_id);
  267. \PhalApi\DI()->redis->hSet('LiveRoomMaster', $pkuid, $room_id);
  268. }
  269. }
  270. // 保持现有的LiveConnect逻辑
  271. \PhalApi\DI()->redis->hSet('LiveConnect', $uid, $pkuid);
  272. \PhalApi\DI()->redis->hSet('LiveConnect', $pkuid, $uid);
  273. }
  274. /**
  275. * 处理离开房间逻辑
  276. */
  277. private function handleLeaveRoom($uid, $pkuid) {
  278. $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid);
  279. if($room_id) {
  280. $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id);
  281. $members_array = explode(',', $room_members);
  282. // 移除离开的用户
  283. $members_array = array_filter($members_array, function($member) use ($uid) {
  284. return $member != $uid;
  285. });
  286. if(count($members_array) < 2) {
  287. // 房间人数少于2人,解散房间
  288. $this->dissolveRoom($room_id, $members_array);
  289. } else {
  290. // 更新房间成员
  291. $new_members = implode(',', $members_array);
  292. \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members);
  293. \PhalApi\DI()->redis->hDel('LiveRoomMaster', $uid);
  294. }
  295. }
  296. // 清除现有的连麦相关Redis键
  297. $this->clearConnectKeys($uid, $pkuid);
  298. }
  299. /**
  300. * 解散房间
  301. */
  302. private function dissolveRoom($room_id, $remaining_members) {
  303. // 清除房间相关Redis键
  304. \PhalApi\DI()->redis->hDel('LiveRoom', $room_id);
  305. foreach($remaining_members as $member) {
  306. \PhalApi\DI()->redis->hDel('LiveRoomMaster', $member);
  307. // 清除该成员的所有连麦关系
  308. $all_connects = \PhalApi\DI()->redis->hGetAll('LiveConnect');
  309. foreach($all_connects as $connect_uid => $connect_pkuid) {
  310. if($connect_uid == $member || $connect_pkuid == $member) {
  311. \PhalApi\DI()->redis->hDel('LiveConnect', $connect_uid);
  312. \PhalApi\DI()->redis->hDel('LiveConnect_pull', $connect_uid);
  313. }
  314. }
  315. }
  316. }
  317. /**
  318. * 清除连麦相关键
  319. */
  320. private function clearConnectKeys($uid, $pkuid) {
  321. $keys = ['LivePK', 'LivePK_gift', 'LivePK_timer', 'LiveConnect', 'LiveConnect_pull'];
  322. foreach($keys as $key) {
  323. \PhalApi\DI()->redis->hDel($key, $uid);
  324. \PhalApi\DI()->redis->hDel($key, $pkuid);
  325. }
  326. }
  327. /**
  328. * PK开始
  329. * @desc 用于PK开始处理业务
  330. * @return int code 操作码,0表示成功
  331. * @return array info
  332. * @return string msg 提示信息
  333. */
  334. public function setPK() {
  335. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  336. $uid = \App\checkNull($this->uid);
  337. $pkuid=\App\checkNull($this->pkuid);
  338. $sign=\App\checkNull($this->sign);
  339. $checkdata=array(
  340. 'uid'=>$uid,
  341. 'pkuid'=>$pkuid,
  342. );
  343. $issign=\App\checkSign($checkdata,$sign);
  344. if(!$issign){
  345. $rs['code']=1001;
  346. $rs['msg']=\PhalApi\T('签名错误');
  347. return $rs;
  348. }
  349. $key1='LivePK';
  350. $key2='LivePK_gift';
  351. \Phalapi\DI()->redis -> hSet($key1,$uid,$pkuid);
  352. \Phalapi\DI()->redis -> hSet($key1,$pkuid,$uid);
  353. \Phalapi\DI()->redis -> hSet($key2,$uid,0);
  354. \Phalapi\DI()->redis -> hSet($key2,$pkuid,0);
  355. $nowtime=time();
  356. $key3='LivePK_timer';
  357. \Phalapi\DI()->redis -> hSet($key3,$uid,$nowtime);
  358. $rs['info'][0]['addtime']=$nowtime;
  359. return $rs;
  360. }
  361. /**
  362. * PK结束
  363. * @desc 用于PK结束处理业务
  364. * @return int code 操作码,0表示成功
  365. * @return array info
  366. * @return string msg 提示信息
  367. */
  368. public function endPK() {
  369. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  370. $uid = \App\checkNull($this->uid);
  371. $addtime=\App\checkNull($this->addtime);
  372. //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 endPK:'."\r\n",FILE_APPEND);
  373. //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 uid:'.json_encode($uid)."\r\n",FILE_APPEND);
  374. //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 addtime:'.json_encode($addtime)."\r\n",FILE_APPEND);
  375. $type=\App\checkNull($this->type);
  376. $sign=\App\checkNull($this->sign);
  377. $checkdata=array(
  378. 'uid'=>$uid,
  379. 'addtime'=>$addtime,
  380. 'type'=>$type,
  381. );
  382. $issign=\App\checkSign($checkdata,$sign);
  383. if(!$issign){
  384. $rs['code']=1001;
  385. $rs['msg']=\PhalApi\T('签名错误');
  386. return $rs;
  387. }
  388. $key1='LivePK';
  389. $key2='LivePK_gift';
  390. $key3='LivePK_timer';
  391. $pkuid = \Phalapi\DI()->redis -> hGet($key1,$uid);
  392. if(!$pkuid){
  393. $pkuid=0;
  394. }
  395. if($type==0){
  396. $pktime=\Phalapi\DI()->redis -> hGet($key3,$uid);
  397. //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 pktime:'.json_encode($pktime)."\r\n",FILE_APPEND);
  398. if(!$pktime){
  399. $pktime=\Phalapi\DI()->redis -> hGet($key3,$pkuid);
  400. }
  401. //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 pktime:'.json_encode($pktime)."\r\n",FILE_APPEND);
  402. if($pktime!=$addtime){
  403. $rs['code']=1002;
  404. $rs['msg']=\PhalApi\T('时间不匹配');
  405. return $rs;
  406. }
  407. }
  408. $gift_uid=\Phalapi\DI()->redis -> hGet($key2,$uid);
  409. if(!$gift_uid){
  410. $gift_uid=0;
  411. }
  412. $gift_pkuid=\Phalapi\DI()->redis -> hGet($key2,$pkuid);
  413. if(!$gift_pkuid){
  414. $gift_pkuid=0;
  415. }
  416. $win_uid=0;
  417. if($type==1){
  418. $win_uid=$pkuid;
  419. }else if($gift_uid > $gift_pkuid){
  420. $win_uid=$uid;
  421. }else if($gift_uid < $gift_pkuid){
  422. $win_uid=$pkuid;
  423. }
  424. \Phalapi\DI()->redis -> hDel($key1,$uid);
  425. \Phalapi\DI()->redis -> hDel($key1,$pkuid);
  426. \Phalapi\DI()->redis -> hDel($key2,$uid);
  427. \Phalapi\DI()->redis -> hDel($key2,$pkuid);
  428. \Phalapi\DI()->redis -> hDel($key3,$uid);
  429. \Phalapi\DI()->redis -> hDel($key3,$pkuid);
  430. $info=[
  431. 'win_uid'=>$win_uid,
  432. 'pkuid'=>$pkuid,
  433. ];
  434. $rs['info'][0]=$info;
  435. return $rs;
  436. }
  437. /**
  438. * 三人PK开始
  439. * @desc 用于三人PK开始处理业务
  440. * @return int code 操作码,0表示成功
  441. * @return array info
  442. * @return string msg 提示信息
  443. */
  444. public function setThreePK() {
  445. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  446. $uid = \App\checkNull($this->uid);
  447. $pkuid2 = \App\checkNull($this->pkuid2);
  448. $pkuid3 = \App\checkNull($this->pkuid3);
  449. $sign = \App\checkNull($this->sign);
  450. $checkdata = array(
  451. 'uid' => $uid,
  452. 'pkuid2' => $pkuid2,
  453. 'pkuid3' => $pkuid3,
  454. );
  455. $issign = \App\checkSign($checkdata, $sign);
  456. if(!$issign){
  457. $rs['code'] = 1001;
  458. $rs['msg'] = \PhalApi\T('签名错误');
  459. return $rs;
  460. }
  461. // 检查三人是否都在连麦房间中
  462. $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid);
  463. if(!$room_id) {
  464. $rs['code'] = 1002;
  465. $rs['msg'] = \PhalApi\T('未在连麦房间中');
  466. return $rs;
  467. }
  468. $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id);
  469. $members_array = explode(',', $room_members);
  470. if(count($members_array) < 3 || !in_array($pkuid2, $members_array) || !in_array($pkuid3, $members_array)) {
  471. $rs['code'] = 1003;
  472. $rs['msg'] = \PhalApi\T('房间成员不足三人或成员不匹配');
  473. return $rs;
  474. }
  475. $key1 = 'LivePK_Three';
  476. $key2 = 'LivePK_Three_gift';
  477. $nowtime = time();
  478. // 设置三人PK状态
  479. $pk_data = json_encode(array(
  480. 'uid1' => $uid,
  481. 'uid2' => $pkuid2,
  482. 'uid3' => $pkuid3,
  483. 'room_id' => $room_id
  484. ));
  485. \PhalApi\DI()->redis->hSet($key1, $room_id, $pk_data);
  486. // 初始化礼物统计
  487. \PhalApi\DI()->redis->hSet($key2, $uid, 0);
  488. \PhalApi\DI()->redis->hSet($key2, $pkuid2, 0);
  489. \PhalApi\DI()->redis->hSet($key2, $pkuid3, 0);
  490. $key3 = 'LivePK_Three_timer';
  491. \PhalApi\DI()->redis->hSet($key3, $room_id, $nowtime);
  492. $rs['info'][0]['addtime'] = $nowtime;
  493. $rs['info'][0]['room_id'] = $room_id;
  494. return $rs;
  495. }
  496. /**
  497. * 三人PK结束
  498. * @desc 用于三人PK结束处理业务
  499. * @return int code 操作码,0表示成功
  500. * @return array info
  501. * @return string msg 提示信息
  502. */
  503. public function endThreePK() {
  504. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  505. $uid = \App\checkNull($this->uid);
  506. $addtime = \App\checkNull($this->addtime);
  507. $type = \App\checkNull($this->type);
  508. $sign = \App\checkNull($this->sign);
  509. $checkdata = array(
  510. 'uid' => $uid,
  511. 'addtime' => $addtime,
  512. 'type' => $type,
  513. );
  514. $issign = \App\checkSign($checkdata, $sign);
  515. if(!$issign){
  516. $rs['code'] = 1001;
  517. $rs['msg'] = \PhalApi\T('签名错误');
  518. return $rs;
  519. }
  520. $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid);
  521. if(!$room_id) {
  522. $rs['code'] = 1002;
  523. $rs['msg'] = \PhalApi\T('未找到房间信息');
  524. return $rs;
  525. }
  526. $key1 = 'LivePK_Three';
  527. $key2 = 'LivePK_Three_gift';
  528. $key3 = 'LivePK_Three_timer';
  529. $pk_data_str = \PhalApi\DI()->redis->hGet($key1, $room_id);
  530. if(!$pk_data_str) {
  531. $rs['code'] = 1003;
  532. $rs['msg'] = \PhalApi\T('PK信息不存在');
  533. return $rs;
  534. }
  535. $pk_data = json_decode($pk_data_str, true);
  536. if($type == 0) {
  537. $pktime = \PhalApi\DI()->redis->hGet($key3, $room_id);
  538. if($pktime != $addtime) {
  539. $rs['code'] = 1004;
  540. $rs['msg'] = \PhalApi\T('时间不匹配');
  541. return $rs;
  542. }
  543. }
  544. // 获取三人礼物统计
  545. $gift_uid1 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid1']) ?: 0;
  546. $gift_uid2 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid2']) ?: 0;
  547. $gift_uid3 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid3']) ?: 0;
  548. // 计算获胜者
  549. $win_uid = 0;
  550. $max_gift = max($gift_uid1, $gift_uid2, $gift_uid3);
  551. if($type == 1) {
  552. // 手动结束,不计算胜负
  553. $win_uid = 0;
  554. } else {
  555. // 找出礼物最多的用户
  556. if($gift_uid1 == $max_gift && $gift_uid1 > 0) {
  557. $win_uid = $pk_data['uid1'];
  558. } elseif($gift_uid2 == $max_gift && $gift_uid2 > 0) {
  559. $win_uid = $pk_data['uid2'];
  560. } elseif($gift_uid3 == $max_gift && $gift_uid3 > 0) {
  561. $win_uid = $pk_data['uid3'];
  562. }
  563. // 如果有并列第一,则为平局
  564. $first_count = 0;
  565. if($gift_uid1 == $max_gift) $first_count++;
  566. if($gift_uid2 == $max_gift) $first_count++;
  567. if($gift_uid3 == $max_gift) $first_count++;
  568. if($first_count > 1) {
  569. $win_uid = 0; // 平局
  570. }
  571. }
  572. // 清除Redis数据
  573. \PhalApi\DI()->redis->hDel($key1, $room_id);
  574. \PhalApi\DI()->redis->hDel($key2, $pk_data['uid1']);
  575. \PhalApi\DI()->redis->hDel($key2, $pk_data['uid2']);
  576. \PhalApi\DI()->redis->hDel($key2, $pk_data['uid3']);
  577. \PhalApi\DI()->redis->hDel($key3, $room_id);
  578. $info = [
  579. 'win_uid' => $win_uid,
  580. 'uid1' => $pk_data['uid1'],
  581. 'uid2' => $pk_data['uid2'],
  582. 'uid3' => $pk_data['uid3'],
  583. 'gift1' => $gift_uid1,
  584. 'gift2' => $gift_uid2,
  585. 'gift3' => $gift_uid3,
  586. 'room_id' => $room_id
  587. ];
  588. $rs['info'][0] = $info;
  589. return $rs;
  590. }
  591. }