array( 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'), 'p' => array('name' => 'p', 'type' => 'int', 'default' => 1, 'desc' => '页码'), ), 'search' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'), 'key' => array('name' => 'key', 'type' => 'string', 'require' => true, 'desc' => '关键词'), 'p' => array('name' => 'p', 'type' => 'int', 'default' => 1, 'desc' => '页码'), ), 'checkLive' => array( 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '连麦主播流名'), 'uid_stream' => array('name' => 'uid_stream', 'type' => 'string', 'require' => true, 'desc' => '当前主播流名'), ), 'changeLive' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'), 'pkuid' => array('name' => 'pkuid', 'type' => 'int', 'require' => true, 'desc' => '连麦主播ID'), 'type' => array('name' => 'type', 'type' => 'int', 'require' => true, 'desc' => '标识'), 'sign' => array('name' => 'sign', 'type' => 'string', 'require' => true, 'desc' => '签名'), ), 'setPK' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'), 'pkuid' => array('name' => 'pkuid', 'type' => 'int', 'desc' => '连麦主播ID'), 'sign' => array('name' => 'sign', 'type' => 'string', 'desc' => '签名'), ), 'endPK' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'), 'addtime' => array('name' => 'addtime', 'type' => 'int', 'desc' => '时间戳'), 'type' => array('name' => 'type', 'type' => 'int', 'desc' => '标识'), 'sign' => array('name' => 'sign', 'type' => 'string','desc' => '签名'), ), 'setThreePK' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'), 'pkuid2' => array('name' => 'pkuid2', 'type' => 'int', 'desc' => '连麦主播ID2'), 'pkuid3' => array('name' => 'pkuid3', 'type' => 'int', 'desc' => '连麦主播ID3'), 'sign' => array('name' => 'sign', 'type' => 'string', 'desc' => '签名'), ), 'endThreePK' => array( 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'), 'addtime' => array('name' => 'addtime', 'type' => 'int', 'desc' => '时间戳'), 'type' => array('name' => 'type', 'type' => 'int', 'desc' => '标识'), 'sign' => array('name' => 'sign', 'type' => 'string','desc' => '签名'), ), ); } /** * 获取直播中的用户列表 * @desc 用于获取直播中的用户列表 * @return int code 操作码,0表示成功 * @return array info * @return string info[].uid 主播ID * @return string info[].pkuid PK对象ID,0表示未连麦 * @return string msg 提示信息 */ public function getLiveList() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid=\App\checkNull($this->uid); $p=\App\checkNull($this->p); if(!$p){ $p=1; } $where="uid!={$uid}"; $domain = new Domain_Livepk(); $list = $domain->getLiveList($uid,$where,$p); foreach($list as $k=>$v){ $userinfo=\App\getUserInfo($v['uid']); $v['sex']=$userinfo['sex']; $list[$k]=$v; } $rs['info']=$list; return $rs; } /** * 搜索直播用户 * @desc 用于搜索直播中用户 * @return int code 操作码,0表示成功 * @return array info * @return string info[].uid 主播ID * @return string info[].pkuid PK对象ID,0表示未连麦 * @return string msg 提示信息 */ public function search() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid=\App\checkNull($this->uid); $key=\App\checkNull($this->key); $p=\App\checkNull($this->p); if(!$p){ $p=1; } if($key==''){ $rs['code']=1001; $rs['msg']=\PhalApi\T('请输入您要搜索的主播昵称或ID'); return $rs; } $list=\PhalApi\DI()->notorm->user ->select('id') ->where("id!={$uid} and (id='{$key}' or user_nickname like '%{$key}%')") ->fetchAll(); if(!$list){ return $rs; } $uids=array_column($list,'id'); $uids_s=implode(',',$uids); $where="uid!={$uid} and uid in ({$uids_s})"; $domain = new Domain_Livepk(); $list = $domain->getLiveList($uid,$where,$p); foreach($list as $k=>$v){ $userinfo=\App\getUserInfo($v['uid']); $v['sex']=$userinfo['sex']; $list[$k]=$v; } $rs['info']=$list; return $rs; } /** * 检测要连麦主播是否直播中 * @desc 用于检测要连麦主播是否直播中 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function checkLive() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $stream=\App\checkNull($this->stream); $uid_stream=\App\checkNull($this->uid_stream); $domain = new Domain_Livepk(); $info = $domain->checkLive($stream); if(!$info){ $rs['code']=1001; $rs['msg']=\PhalApi\T('对方已关播'); return $rs; } //rtmp播流 /*$configpri = getConfigPri(); $nowtime=time(); $bizid = $configpri['tx_bizid']; $push_url_key = $configpri['tx_push_key']; $tx_acc_key = $configpri['tx_acc_key']; $push = $configpri['tx_push']; $pull = $configpri['tx_pull']; $now_time2 = $nowtime + 3*60*60; $txTime = dechex($now_time2); $live_code = $uid_stream ; $txSecret2 = md5($tx_acc_key . $live_code . $txTime); $safe_url2 = "?txSecret=" . $txSecret2."&txTime=" .$txTime; $play_url = "rtmp://" . $pull . "/live/" .$live_code .$safe_url2. "&bizid=" . $bizid;*/ //trtc播流 $stream_arr=explode('_', $stream); $liveuid=$stream_arr[0]; $play_url = \App\getTxTrtcUrl($liveuid,$uid_stream); $info=array( "pull" => $play_url ); $rs['info'][0]=$info; return $rs; } /** * 连麦成功后更新直播信息 * @desc 用于连麦成功后更新数据库信息 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function changeLive() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid = \App\checkNull($this->uid); $pkuid=\App\checkNull($this->pkuid); $type=\App\checkNull($this->type); $sign=\App\checkNull($this->sign); $checkdata=array( 'uid'=>$uid, 'pkuid'=>$pkuid, 'type'=>$type, ); $issign=\App\checkSign($checkdata,$sign); if(!$issign){ $rs['code']=1001; $rs['msg']=\PhalApi\T('签名错误'); return $rs; } $domain = new Domain_Livepk(); $info = $domain->changeLive($uid,$pkuid,$type); if($type == 0) { // 断开连麦 - 处理多人房间 $this->handleLeaveRoom($uid, $pkuid); } else { // 建立连麦 - 处理多人房间 $this->handleJoinRoom($uid, $pkuid); } // if($type==0){ // // $key1='LivePK'; // $key2='LivePK_gift'; // $key3='LivePK_timer'; // $key4='LiveConnect'; // $key5='LiveConnect_pull'; // // \Phalapi\DI()->redis -> hDel($key1,$uid); // \Phalapi\DI()->redis -> hDel($key1,$pkuid); // // \Phalapi\DI()->redis -> hDel($key2,$uid); // \Phalapi\DI()->redis -> hDel($key2,$pkuid); // // \Phalapi\DI()->redis -> hDel($key3,$uid); // \Phalapi\DI()->redis -> hDel($key3,$pkuid); // // \Phalapi\DI()->redis -> hDel($key4,$uid); // \Phalapi\DI()->redis -> hDel($key4,$pkuid); // // \Phalapi\DI()->redis -> hDel($key5,$uid); // \Phalapi\DI()->redis -> hDel($key5,$pkuid); // // }else{ // $key4='LiveConnect'; // \Phalapi\DI()->redis -> hSet($key4,$uid,$pkuid); // \Phalapi\DI()->redis -> hSet($key4,$pkuid,$uid); // // } return $rs; } /** * 处理加入房间逻辑 */ private function handleJoinRoom($uid, $pkuid) { // 检查pkuid是否已在房间中 $pkuid_room = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $pkuid); if($pkuid_room) { // pkuid已在房间中,uid加入该房间 $room_id = $pkuid_room; $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id); $members_array = explode(',', $room_members); if(!in_array($uid, $members_array)) { $members_array[] = $uid; $new_members = implode(',', $members_array); \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members); \PhalApi\DI()->redis->hSet('LiveRoomMaster', $uid, $room_id); } } else { // 检查uid是否已在房间中 $uid_room = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid); if($uid_room) { // uid已在房间中,pkuid加入该房间 $room_id = $uid_room; $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id); $members_array = explode(',', $room_members); if(!in_array($pkuid, $members_array)) { $members_array[] = $pkuid; $new_members = implode(',', $members_array); \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members); \PhalApi\DI()->redis->hSet('LiveRoomMaster', $pkuid, $room_id); } } else { // 都不在房间中,创建新房间 $room_id = $uid . '_' . time(); $members = $uid . ',' . $pkuid; \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $members); \PhalApi\DI()->redis->hSet('LiveRoomMaster', $uid, $room_id); \PhalApi\DI()->redis->hSet('LiveRoomMaster', $pkuid, $room_id); } } // 保持现有的LiveConnect逻辑 \PhalApi\DI()->redis->hSet('LiveConnect', $uid, $pkuid); \PhalApi\DI()->redis->hSet('LiveConnect', $pkuid, $uid); } /** * 处理离开房间逻辑 */ private function handleLeaveRoom($uid, $pkuid) { $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid); if($room_id) { $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id); $members_array = explode(',', $room_members); // 移除离开的用户 $members_array = array_filter($members_array, function($member) use ($uid) { return $member != $uid; }); if(count($members_array) < 2) { // 房间人数少于2人,解散房间 $this->dissolveRoom($room_id, $members_array); } else { // 更新房间成员 $new_members = implode(',', $members_array); \PhalApi\DI()->redis->hSet('LiveRoom', $room_id, $new_members); \PhalApi\DI()->redis->hDel('LiveRoomMaster', $uid); } } // 清除现有的连麦相关Redis键 $this->clearConnectKeys($uid, $pkuid); } /** * 解散房间 */ private function dissolveRoom($room_id, $remaining_members) { // 清除房间相关Redis键 \PhalApi\DI()->redis->hDel('LiveRoom', $room_id); foreach($remaining_members as $member) { \PhalApi\DI()->redis->hDel('LiveRoomMaster', $member); // 清除该成员的所有连麦关系 $all_connects = \PhalApi\DI()->redis->hGetAll('LiveConnect'); foreach($all_connects as $connect_uid => $connect_pkuid) { if($connect_uid == $member || $connect_pkuid == $member) { \PhalApi\DI()->redis->hDel('LiveConnect', $connect_uid); \PhalApi\DI()->redis->hDel('LiveConnect_pull', $connect_uid); } } } } /** * 清除连麦相关键 */ private function clearConnectKeys($uid, $pkuid) { $keys = ['LivePK', 'LivePK_gift', 'LivePK_timer', 'LiveConnect', 'LiveConnect_pull']; foreach($keys as $key) { \PhalApi\DI()->redis->hDel($key, $uid); \PhalApi\DI()->redis->hDel($key, $pkuid); } } /** * PK开始 * @desc 用于PK开始处理业务 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function setPK() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid = \App\checkNull($this->uid); $pkuid=\App\checkNull($this->pkuid); $sign=\App\checkNull($this->sign); $checkdata=array( 'uid'=>$uid, 'pkuid'=>$pkuid, ); $issign=\App\checkSign($checkdata,$sign); if(!$issign){ $rs['code']=1001; $rs['msg']=\PhalApi\T('签名错误'); return $rs; } $key1='LivePK'; $key2='LivePK_gift'; \Phalapi\DI()->redis -> hSet($key1,$uid,$pkuid); \Phalapi\DI()->redis -> hSet($key1,$pkuid,$uid); \Phalapi\DI()->redis -> hSet($key2,$uid,0); \Phalapi\DI()->redis -> hSet($key2,$pkuid,0); $nowtime=time(); $key3='LivePK_timer'; \Phalapi\DI()->redis -> hSet($key3,$uid,$nowtime); $rs['info'][0]['addtime']=$nowtime; return $rs; } /** * PK结束 * @desc 用于PK结束处理业务 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function endPK() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid = \App\checkNull($this->uid); $addtime=\App\checkNull($this->addtime); //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 endPK:'."\r\n",FILE_APPEND); //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 uid:'.json_encode($uid)."\r\n",FILE_APPEND); //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 addtime:'.json_encode($addtime)."\r\n",FILE_APPEND); $type=\App\checkNull($this->type); $sign=\App\checkNull($this->sign); $checkdata=array( 'uid'=>$uid, 'addtime'=>$addtime, 'type'=>$type, ); $issign=\App\checkSign($checkdata,$sign); if(!$issign){ $rs['code']=1001; $rs['msg']=\PhalApi\T('签名错误'); return $rs; } $key1='LivePK'; $key2='LivePK_gift'; $key3='LivePK_timer'; $pkuid = \Phalapi\DI()->redis -> hGet($key1,$uid); if(!$pkuid){ $pkuid=0; } if($type==0){ $pktime=\Phalapi\DI()->redis -> hGet($key3,$uid); //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 pktime:'.json_encode($pktime)."\r\n",FILE_APPEND); if(!$pktime){ $pktime=\Phalapi\DI()->redis -> hGet($key3,$pkuid); } //file_put_contents('./endPK.txt',date('Y-m-d H:i:s').' 提交参数信息 pktime:'.json_encode($pktime)."\r\n",FILE_APPEND); if($pktime!=$addtime){ $rs['code']=1002; $rs['msg']=\PhalApi\T('时间不匹配'); return $rs; } } $gift_uid=\Phalapi\DI()->redis -> hGet($key2,$uid); if(!$gift_uid){ $gift_uid=0; } $gift_pkuid=\Phalapi\DI()->redis -> hGet($key2,$pkuid); if(!$gift_pkuid){ $gift_pkuid=0; } $win_uid=0; if($type==1){ $win_uid=$pkuid; }else if($gift_uid > $gift_pkuid){ $win_uid=$uid; }else if($gift_uid < $gift_pkuid){ $win_uid=$pkuid; } \Phalapi\DI()->redis -> hDel($key1,$uid); \Phalapi\DI()->redis -> hDel($key1,$pkuid); \Phalapi\DI()->redis -> hDel($key2,$uid); \Phalapi\DI()->redis -> hDel($key2,$pkuid); \Phalapi\DI()->redis -> hDel($key3,$uid); \Phalapi\DI()->redis -> hDel($key3,$pkuid); $info=[ 'win_uid'=>$win_uid, 'pkuid'=>$pkuid, ]; $rs['info'][0]=$info; return $rs; } /** * 三人PK开始 * @desc 用于三人PK开始处理业务 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function setThreePK() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid = \App\checkNull($this->uid); $pkuid2 = \App\checkNull($this->pkuid2); $pkuid3 = \App\checkNull($this->pkuid3); $sign = \App\checkNull($this->sign); $checkdata = array( 'uid' => $uid, 'pkuid2' => $pkuid2, 'pkuid3' => $pkuid3, ); $issign = \App\checkSign($checkdata, $sign); if(!$issign){ $rs['code'] = 1001; $rs['msg'] = \PhalApi\T('签名错误'); return $rs; } // 检查三人是否都在连麦房间中 $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid); if(!$room_id) { $rs['code'] = 1002; $rs['msg'] = \PhalApi\T('未在连麦房间中'); return $rs; } $room_members = \PhalApi\DI()->redis->hGet('LiveRoom', $room_id); $members_array = explode(',', $room_members); if(count($members_array) < 3 || !in_array($pkuid2, $members_array) || !in_array($pkuid3, $members_array)) { $rs['code'] = 1003; $rs['msg'] = \PhalApi\T('房间成员不足三人或成员不匹配'); return $rs; } $key1 = 'LivePK_Three'; $key2 = 'LivePK_Three_gift'; $nowtime = time(); // 设置三人PK状态 $pk_data = json_encode(array( 'uid1' => $uid, 'uid2' => $pkuid2, 'uid3' => $pkuid3, 'room_id' => $room_id )); \PhalApi\DI()->redis->hSet($key1, $room_id, $pk_data); // 初始化礼物统计 \PhalApi\DI()->redis->hSet($key2, $uid, 0); \PhalApi\DI()->redis->hSet($key2, $pkuid2, 0); \PhalApi\DI()->redis->hSet($key2, $pkuid3, 0); $key3 = 'LivePK_Three_timer'; \PhalApi\DI()->redis->hSet($key3, $room_id, $nowtime); $rs['info'][0]['addtime'] = $nowtime; $rs['info'][0]['room_id'] = $room_id; return $rs; } /** * 三人PK结束 * @desc 用于三人PK结束处理业务 * @return int code 操作码,0表示成功 * @return array info * @return string msg 提示信息 */ public function endThreePK() { $rs = array('code' => 0, 'msg' => '', 'info' => array()); $uid = \App\checkNull($this->uid); $addtime = \App\checkNull($this->addtime); $type = \App\checkNull($this->type); $sign = \App\checkNull($this->sign); $checkdata = array( 'uid' => $uid, 'addtime' => $addtime, 'type' => $type, ); $issign = \App\checkSign($checkdata, $sign); if(!$issign){ $rs['code'] = 1001; $rs['msg'] = \PhalApi\T('签名错误'); return $rs; } $room_id = \PhalApi\DI()->redis->hGet('LiveRoomMaster', $uid); if(!$room_id) { $rs['code'] = 1002; $rs['msg'] = \PhalApi\T('未找到房间信息'); return $rs; } $key1 = 'LivePK_Three'; $key2 = 'LivePK_Three_gift'; $key3 = 'LivePK_Three_timer'; $pk_data_str = \PhalApi\DI()->redis->hGet($key1, $room_id); if(!$pk_data_str) { $rs['code'] = 1003; $rs['msg'] = \PhalApi\T('PK信息不存在'); return $rs; } $pk_data = json_decode($pk_data_str, true); if($type == 0) { $pktime = \PhalApi\DI()->redis->hGet($key3, $room_id); if($pktime != $addtime) { $rs['code'] = 1004; $rs['msg'] = \PhalApi\T('时间不匹配'); return $rs; } } // 获取三人礼物统计 $gift_uid1 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid1']) ?: 0; $gift_uid2 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid2']) ?: 0; $gift_uid3 = \PhalApi\DI()->redis->hGet($key2, $pk_data['uid3']) ?: 0; // 计算获胜者 $win_uid = 0; $max_gift = max($gift_uid1, $gift_uid2, $gift_uid3); if($type == 1) { // 手动结束,不计算胜负 $win_uid = 0; } else { // 找出礼物最多的用户 if($gift_uid1 == $max_gift && $gift_uid1 > 0) { $win_uid = $pk_data['uid1']; } elseif($gift_uid2 == $max_gift && $gift_uid2 > 0) { $win_uid = $pk_data['uid2']; } elseif($gift_uid3 == $max_gift && $gift_uid3 > 0) { $win_uid = $pk_data['uid3']; } // 如果有并列第一,则为平局 $first_count = 0; if($gift_uid1 == $max_gift) $first_count++; if($gift_uid2 == $max_gift) $first_count++; if($gift_uid3 == $max_gift) $first_count++; if($first_count > 1) { $win_uid = 0; // 平局 } } // 清除Redis数据 \PhalApi\DI()->redis->hDel($key1, $room_id); \PhalApi\DI()->redis->hDel($key2, $pk_data['uid1']); \PhalApi\DI()->redis->hDel($key2, $pk_data['uid2']); \PhalApi\DI()->redis->hDel($key2, $pk_data['uid3']); \PhalApi\DI()->redis->hDel($key3, $room_id); $info = [ 'win_uid' => $win_uid, 'uid1' => $pk_data['uid1'], 'uid2' => $pk_data['uid2'], 'uid3' => $pk_data['uid3'], 'gift1' => $gift_uid1, 'gift2' => $gift_uid2, 'gift3' => $gift_uid3, 'room_id' => $room_id ]; $rs['info'][0] = $info; return $rs; } }