2023-07-15 10:18:38 +08:00

235 lines
7.7 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Qiniu\Rtc;
use Qiniu\Auth;
use Qiniu\Config;
use Qiniu\Http\Error;
use Qiniu\Http\Client;
class AppClient
{
private $auth;
private $baseURL;
public function __construct(Auth $auth)
{
$this->auth = $auth;
$this->baseURL = sprintf("%s/%s/apps", Config::RTCAPI_HOST, Config::RTCAPI_VERSION);
}
/**
* 创建应用
*
* @param string $hub 绑定的直播 hub
* @param string $title app 的名称 注意Title 不是唯一标识,重复 create 动作将生成多个 app
* @param int $maxUsers 连麦房间支持的最大在线人数
* @param bool $noAutoKickUser 禁止自动踢人(抢流),默认为 false
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_1
*/
public function createApp($hub, $title, $maxUsers = null, $noAutoKickUser = null)
{
$params = array();
$params['hub'] = $hub;
$params['title'] = $title;
if (!empty($maxUsers)) {
$params['maxUsers'] = $maxUsers;
}
if ($noAutoKickUser !== null) {
$params['noAutoKickUser'] = $noAutoKickUser;
}
$body = json_encode($params);
return $this->post($this->baseURL, $body);
}
/**
* 更新一个应用的配置信息
*
* @param string $appId app 的唯一标识,创建的时候由系统生成
* @param string $hub app 的名称,可选
* @param string $title 绑定的直播 hub可选用于合流后 rtmp 推流
* @param int $maxUsers 连麦房间支持的最大在线人数,可选
* @param bool $noAutoKickUser 禁止自动踢人,可选
* @param null $mergePublishRtmp 连麦合流转推 RTMP 的配置,可选择。其详细配置可以参考文档
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_1
*/
public function updateApp($appId, $hub, $title, $maxUsers = null, $noAutoKickUser = null, $mergePublishRtmp = null)
{
$url = $this->baseURL . '/' . $appId;
$params = array();
$params['hub'] = $hub;
$params['title'] = $title;
if (!empty($maxUsers)) {
$params['maxUsers'] = $maxUsers;
}
if ($noAutoKickUser !== null) {
$params['noAutoKickUser'] = $noAutoKickUser;
}
if (!empty($mergePublishRtmp)) {
$params['mergePublishRtmp'] = $mergePublishRtmp;
}
$body = json_encode($params);
return $this->post($url, $body);
}
/**
* 获取应用信息
*
* @param string $appId
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_1
*/
public function getApp($appId)
{
$url = $this->baseURL . '/' . $appId;
return $this->get($url);
}
/**
* 删除应用
*
* @param string $appId app 的唯一标识,创建的时候由系统生成
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_1
*/
public function deleteApp($appId)
{
$url = $this->baseURL . '/' . $appId;
return $this->delete($url);
}
/**
* 获取房间内用户列表
*
* @param string $appId app 的唯一标识,创建的时候由系统生成
* @param string $roomName 操作所查询的连麦房间
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_2
*/
public function listUser($appId, $roomName)
{
$url = sprintf("%s/%s/rooms/%s/users", $this->baseURL, $appId, $roomName);
return $this->get($url);
}
/**
* 指定一个用户踢出房间
*
* @param string $appId app 的唯一标识,创建的时候由系统生成
* @param string $roomName 连麦房间
* @param string $userId 操作所剔除的用户
* @return mixed
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_2
*/
public function kickUser($appId, $roomName, $userId)
{
$url = sprintf("%s/%s/rooms/%s/users/%s", $this->baseURL, $appId, $roomName, $userId);
return $this->delete($url);
}
/**
* 停止一个房间的合流转推
*
* @param string $appId
* @param string $roomName
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_2
*/
public function stopMerge($appId, $roomName)
{
$url = sprintf("%s/%s/rooms/%s/merge", $this->baseURL, $appId, $roomName);
return $this->delete($url);
}
/**
* 获取应用中活跃房间
*
* @param string $appId 连麦房间所属的 app
* @param null $prefix 所查询房间名的前缀索引,可以为空。
* @param int $offset 分页查询的位移标记
* @param int $limit 此次查询的最大长度
* @return array
* @link https://doc.qnsdk.com/rtn/docs/server_overview#2_2
*/
public function listActiveRooms($appId, $prefix = null, $offset = null, $limit = null)
{
$query = array();
if (isset($prefix)) {
$query['prefix'] = $prefix;
}
if (isset($offset)) {
$query['offset'] = $offset;
}
if (isset($limit)) {
$query['limit'] = $limit;
}
if (isset($query) && !empty($query)) {
$query = '?' . http_build_query($query);
$url = sprintf("%s/%s/rooms%s", $this->baseURL, $appId, $query);
} else {
$url = sprintf("%s/%s/rooms", $this->baseURL, $appId);
}
return $this->get($url);
}
/**
* 生成加入房间的令牌
*
* @param string $appId app 的唯一标识,创建的时候由系统生成
* @param string $roomName 房间名称,需满足规格 ^[a-zA-Z0-9_-]{3,64}$
* @param string $userId 请求加入房间的用户 ID需满足规格 ^[a-zA-Z0-9_-]{3,50}$
* @param int $expireAt 鉴权的有效时间传入以秒为单位的64位 Unix 绝对时间
* @param string $permission 该用户的房间管理权限,"admin" 或 "user",默认为 "user"
* @return string
* @link https://doc.qnsdk.com/rtn/docs/server_overview#1
*/
public function appToken($appId, $roomName, $userId, $expireAt, $permission)
{
$params = array();
$params['appId'] = $appId;
$params['userId'] = $userId;
$params['roomName'] = $roomName;
$params['permission'] = $permission;
$params['expireAt'] = $expireAt;
$appAccessString = json_encode($params);
return $this->auth->signWithData($appAccessString);
}
private function get($url, $cType = null)
{
$rtcToken = $this->auth->authorizationV2($url, "GET", null, $cType);
$rtcToken['Content-Type'] = $cType;
$ret = Client::get($url, $rtcToken);
if (!$ret->ok()) {
return array(null, new Error($url, $ret));
}
return array($ret->json(), null);
}
private function delete($url, $contentType = 'application/json')
{
$rtcToken = $this->auth->authorizationV2($url, "DELETE", null, $contentType);
$rtcToken['Content-Type'] = $contentType;
$ret = Client::delete($url, $rtcToken);
if (!$ret->ok()) {
return array(null, new Error($url, $ret));
}
return array($ret->json(), null);
}
private function post($url, $body, $contentType = 'application/json')
{
$rtcToken = $this->auth->authorizationV2($url, "POST", $body, $contentType);
$rtcToken['Content-Type'] = $contentType;
$ret = Client::post($url, $body, $rtcToken);
if (!$ret->ok()) {
return array(null, new Error($url, $ret));
}
$r = ($ret->body === null) ? array() : $ret->json();
return array($r, null);
}
}