Live.php 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231
  1. <?php
  2. // +—————————————————————————————————————————————————————————————————————
  3. // | Created by Yunbao
  4. // +—————————————————————————————————————————————————————————————————————
  5. // | Copyright (c) 2013~2022 http://www.yunbaokj.com All rights reserved.
  6. // +—————————————————————————————————————————————————————————————————————
  7. // | Author: https://gitee.com/yunbaokeji
  8. // +—————————————————————————————————————————————————————————————————————
  9. // | Date: 2022-02-17
  10. // +—————————————————————————————————————————————————————————————————————
  11. /**
  12. * 直播间
  13. */
  14. class Api_Live extends PhalApi_Api {
  15. public function getRules() {
  16. return array(
  17. 'getSDK' => array(
  18. 'uid' => array('name' => 'uid', 'type' => 'int', 'desc' => '用户ID'),
  19. ),
  20. 'createRoom' => array(
  21. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  22. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  23. 'title' => array('name' => 'title', 'type' => 'string','default'=>'', 'desc' => '直播标题 url编码'),
  24. 'province' => array('name' => 'province', 'type' => 'string', 'default'=>'', 'desc' => '省份'),
  25. 'city' => array('name' => 'city', 'type' => 'string', 'default'=>'', 'desc' => '城市'),
  26. 'lng' => array('name' => 'lng', 'type' => 'string', 'default'=>'0', 'desc' => '经度值'),
  27. 'lat' => array('name' => 'lat', 'type' => 'string', 'default'=>'0', 'desc' => '纬度值'),
  28. 'type' => array('name' => 'type', 'type' => 'int', 'default'=>'0', 'desc' => '直播房间类型,0是普通房间,1是私密房间,2是收费房间,3是计时房间'),
  29. 'type_val' => array('name' => 'type_val', 'type' => 'string', 'default'=>'', 'desc' => '类型值'),
  30. 'anyway' => array('name' => 'anyway', 'type' => 'int', 'default'=>'0', 'desc' => '直播类型 1 PC, 0 app'),
  31. 'liveclassid' => array('name' => 'liveclassid', 'type' => 'int', 'default'=>'0', 'desc' => '直播分类ID'),
  32. 'deviceinfo' => array('name' => 'deviceinfo', 'type' => 'string', 'default'=>'', 'desc' => '设备信息'),
  33. 'thumb' => array('name' => 'thumb', 'type' => 'string', 'desc' => '开播封面'),
  34. ),
  35. 'changeLive' => array(
  36. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  37. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  38. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  39. 'status' => array('name' => 'status', 'type' => 'int', 'require' => true, 'desc' => '直播状态 0关闭 1直播'),
  40. ),
  41. 'stopRoom' => array(
  42. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  43. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  44. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  45. 'type' => array('name' => 'type', 'type' => 'int', 'default'=>'0', 'desc' => '类型'),
  46. 'source' => array('name' => 'source', 'type' => 'string', 'desc' => '访问来源 socekt:断联socket,app传值空'),
  47. 'time' => array('name' => 'time', 'type' => 'string', 'desc' => '当前时间戳'),
  48. 'sign' => array('name' => 'sign', 'type' => 'string', 'desc' => '签名'),
  49. ),
  50. 'stopInfo' => array(
  51. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  52. ),
  53. 'checkLive' => array(
  54. 'uid' => array('name' => 'uid', 'type' => 'int', 'require' => true, 'desc' => '用户ID'),
  55. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  56. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  57. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  58. ),
  59. 'roomCharge' => array(
  60. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  61. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  62. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  63. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  64. ),
  65. 'timeCharge' => array(
  66. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  67. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  68. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  69. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  70. ),
  71. 'enterRoom' => array(
  72. 'uid' => array('name' => 'uid', 'type' => 'int', 'require' => true, 'desc' => '用户ID'),
  73. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  74. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  75. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  76. 'city' => array('name' => 'city', 'type' => 'string','default'=>'', 'desc' => '城市'),
  77. 'mobileid' => array('name' => 'mobileid', 'type' => 'string','default'=>'', 'desc' => '实际唯一识别码'),
  78. ),
  79. 'getUserLists' => array(
  80. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  81. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  82. 'p' => array('name' => 'p', 'type' => 'int', 'min' => 1, 'default'=>1,'desc' => '页数'),
  83. ),
  84. 'getPop' => array(
  85. 'uid' => array('name' => 'uid', 'type' => 'int', 'require' => true, 'desc' => '用户ID'),
  86. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  87. 'touid' => array('name' => 'touid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '对方ID'),
  88. ),
  89. 'getGiftList' => array(
  90. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  91. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  92. ),
  93. 'sendGift' => array(
  94. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  95. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  96. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  97. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  98. 'giftid' => array('name' => 'giftid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '礼物ID'),
  99. 'giftcount' => array('name' => 'giftcount', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '礼物数量'),
  100. 'touids' => array('name' => 'touids', 'type' => 'string', 'require' => true, 'desc' => '接收送礼物的麦上用户组'),
  101. ),
  102. 'sendBarrage' => array(
  103. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '用户ID'),
  104. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'desc' => '用户token'),
  105. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  106. 'stream' => array('name' => 'stream', 'type' => 'string', 'require' => true, 'desc' => '流名'),
  107. 'content' => array('name' => 'content', 'type' => 'string', 'min' => 1, 'require' => true, 'desc' => '弹幕内容'),
  108. ),
  109. 'getVotes' => array(
  110. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '主播ID'),
  111. ),
  112. 'getCoin' => array(
  113. 'uid' => array('name' => 'uid', 'type' => 'int', 'min' => 1, 'require' => true, 'desc' => '会员ID'),
  114. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'min' => 1, 'desc' => '会员token'),
  115. ),
  116. 'checkLiveing' => array(
  117. 'uid' => array('name' => 'uid', 'type' => 'int','desc' => '会员ID'),
  118. 'token' => array('name' => 'token', 'type' => 'string', 'require' => true, 'min' => 1, 'desc' => '会员token'),
  119. 'stream' => array('name' => 'stream', 'type' => 'string','desc' => '流名'),
  120. ),
  121. 'getLiveInfo' => array(
  122. 'liveuid' => array('name' => 'liveuid', 'type' => 'int', 'desc' => '主播ID'),
  123. ),
  124. );
  125. }
  126. /**
  127. * 获取SDK
  128. * @desc 用于获取SDK类型
  129. * @return int code 操作码,0表示成功
  130. * @return array info
  131. * @return string info[0].live_sdk SDK类型,0金山SDK 1腾讯SDK
  132. * @return object info[0].android 安卓CDN配置
  133. * @return object info[0].ios IOS CDN配置
  134. * @return string info[0].isshop 是否有店铺,0否1是
  135. * @return string msg 提示信息
  136. */
  137. public function getSDK() {
  138. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  139. $uid=checkNull($this->uid);
  140. $cdnset=include API_ROOT.'/../PhalApi/Config/cdnset.php';
  141. $rs['info'][0]=$cdnset;
  142. return $rs;
  143. }
  144. /**
  145. * 创建开播
  146. * @desc 用于用户开播生成记录
  147. * @return int code 操作码,0表示成功
  148. * @return array info
  149. * @return string info[0].userlist_time 用户列表请求间隔
  150. * @return string info[0].barrage_fee 弹幕价格
  151. * @return string info[0].votestotal 主播映票
  152. * @return string info[0].stream 流名
  153. * @return string info[0].push 推流地址
  154. * @return string info[0].pull 播流地址
  155. * @return string info[0].chatserver socket地址
  156. * @return array info[0].game_switch 游戏开关
  157. * @return string info[0].game_switch[][0] 开启的游戏类型
  158. * @return string info[0].game_bankerid 庄家ID
  159. * @return string info[0].game_banker_name 庄家昵称
  160. * @return string info[0].game_banker_avatar 庄家头像
  161. * @return string info[0].game_banker_coin 庄家余额
  162. * @return string info[0].game_banker_limit 上庄限额
  163. * @return object info[0].liang 用户靓号信息
  164. * @return string info[0].liang.name 号码,0表示无靓号
  165. * @return object info[0].vip 用户VIP信息
  166. * @return string info[0].vip.type VIP类型,0表示无VIP,1表示有VIP
  167. * @return string info[0].guard_nums 守护数量
  168. * @return string info[0].thumb 直播封面
  169. * @return string msg 提示信息
  170. */
  171. public function createRoom() {
  172. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  173. $uid = checkNull($this->uid);
  174. $token=checkNull($this->token);
  175. $configpub=getConfigPub();
  176. if($configpub['maintain_switch']==1){
  177. $rs['code']=1002;
  178. $rs['msg']=$configpub['maintain_tips'];
  179. return $rs;
  180. }
  181. $checkToken=checkToken($uid,$token);
  182. if($checkToken==700){
  183. $rs['code'] = $checkToken;
  184. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  185. return $rs;
  186. }
  187. $configpri=getConfigPri();
  188. if($configpri['auth_islimit']==1){
  189. $isauth=isAuth($uid);
  190. if(!$isauth){
  191. $rs['code']=1002;
  192. $rs['msg']='请先进行身份认证或等待审核';
  193. return $rs;
  194. }
  195. }
  196. $userinfo=getUserInfo($uid);
  197. if($configpri['level_islimit']==1){
  198. if( $userinfo['level'] < $configpri['level_limit'] ){
  199. $rs['code']=1003;
  200. $rs['msg']='等级小于'.$configpri['level_limit'].'级,不能直播';
  201. return $rs;
  202. }
  203. }
  204. $nowtime=time();
  205. $showid=$nowtime;
  206. $starttime=$nowtime;
  207. $title=checkNull($this->title);
  208. $province=checkNull($this->province);
  209. $city=checkNull($this->city);
  210. $lng=checkNull($this->lng);
  211. $lat=checkNull($this->lat);
  212. $type=checkNull($this->type);
  213. $type_val=checkNull($this->type_val);
  214. $anyway=checkNull($this->anyway);
  215. $liveclassid=checkNull($this->liveclassid);
  216. $deviceinfo=checkNull($this->deviceinfo);
  217. $thumb_str=checkNull($this->thumb);
  218. $sensitivewords=sensitiveField($title);
  219. if($sensitivewords==1001){
  220. $rs['code'] = 10011;
  221. $rs['msg'] = '输入非法,请重新输入';
  222. return $rs;
  223. }
  224. if( $type==1 && $type_val=='' ){
  225. $rs['code']=1002;
  226. $rs['msg']='密码不能为空';
  227. return $rs;
  228. }else if($type > 1 && $type_val<=0){
  229. $rs['code']=1002;
  230. $rs['msg']='价格不能小于等于0';
  231. return $rs;
  232. }
  233. $stream=$uid.'_'.$nowtime;
  234. $push=PrivateKeyA('rtmp',$stream,1);
  235. $pull=PrivateKeyA('rtmp',$stream,0);
  236. if(!$city){
  237. $city='好像在火星';
  238. }
  239. if(!$lng && $lng!=0){
  240. $lng='';
  241. }
  242. if(!$lat && $lat!=0){
  243. $lat='';
  244. }
  245. //APP原生上传后请求接口保存start
  246. $thumb="";
  247. if($thumb_str){
  248. $cloudtype=$configpri['cloudtype'];
  249. if($cloudtype==1){ //七牛云存储
  250. $thumb= $thumb_str.'?imageView2/2/w/600/h/600';
  251. }else{
  252. $thumb=$thumb_str;
  253. }
  254. }
  255. $dataroom=array(
  256. "uid"=>$uid,
  257. "showid"=>$showid,
  258. "starttime"=>$starttime,
  259. "title"=>$title,
  260. "province"=>$province,
  261. "city"=>$city,
  262. "stream"=>$stream,
  263. "thumb"=>$thumb,
  264. "pull"=>$pull,
  265. "lng"=>$lng,
  266. "lat"=>$lat,
  267. "type"=>$type,
  268. "type_val"=>$type_val,
  269. "isvideo"=>0,
  270. "islive"=>0,
  271. "anyway"=>$anyway,
  272. "liveclassid"=>$liveclassid,
  273. "deviceinfo"=>$deviceinfo,
  274. "hotvotes"=>0,
  275. );
  276. $domain = new Domain_Live();
  277. $result = $domain->createRoom($uid,$dataroom);
  278. if($result===false){
  279. $rs['code'] = 1011;
  280. $rs['msg'] = '开播失败,请重试';
  281. return $rs;
  282. }
  283. $userinfo['city']=$city;
  284. $userinfo['usertype']=50;
  285. $userinfo['sign']='0';
  286. DI()->redis -> set($token,json_encode($userinfo));
  287. $votestotal=$domain->getVotes($uid);
  288. $info['userlist_time']=$configpri['userlist_time'];
  289. $info['barrage_fee']=$configpri['barrage_fee'];
  290. $info['chatserver']=$configpri['chatserver'];
  291. $info['votestotal']=$votestotal;
  292. $info['stream']=$stream;
  293. $info['push']=$push;
  294. $info['pull']=$pull;
  295. // 腾讯APPID
  296. $info['tx_appid']=$configpri['tx_appid'];
  297. // 敏感词集合
  298. $dirtyarr=array();
  299. if($configpri['sensitive_words']){
  300. $dirtyarr=explode(',',$configpri['sensitive_words']);
  301. }
  302. $info['sensitive_words']=$dirtyarr;
  303. //返回直播封面
  304. if($thumb){
  305. $info['thumb']=get_upload_path($thumb);
  306. }else{
  307. $info['thumb']=$userinfo['avatar_thumb'];
  308. }
  309. $rs['info'][0] = $info;
  310. return $rs;
  311. }
  312. /**
  313. * 修改直播状态
  314. * @desc 用于主播修改直播状态
  315. * @return int code 操作码,0表示成功
  316. * @return array info
  317. * @return string info[0].msg 成功提示信息
  318. * @return string msg 提示信息
  319. */
  320. public function changeLive() {
  321. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  322. $uid = checkNull($this->uid);
  323. $token=checkNull($this->token);
  324. $stream=checkNull($this->stream);
  325. $status=checkNull($this->status);
  326. $checkToken=checkToken($uid,$token);
  327. if($checkToken==700){
  328. $rs['code'] = $checkToken;
  329. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  330. return $rs;
  331. }
  332. $domain = new Domain_Live();
  333. $info=$domain->changeLive($uid,$stream,$status);
  334. $rs['info'][0]['msg']='成功';
  335. return $rs;
  336. }
  337. /**
  338. * 关闭直播
  339. * @desc 用于用户结束直播
  340. * @return int code 操作码,0表示成功
  341. * @return array info
  342. * @return string info[0].msg 成功提示信息
  343. * @return string msg 提示信息
  344. */
  345. public function stopRoom() {
  346. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  347. $uid = checkNull($this->uid);
  348. $token=checkNull($this->token);
  349. $stream=checkNull($this->stream);
  350. $type=checkNull($this->type);
  351. $source=checkNull($this->source);
  352. $time=checkNull($this->time);
  353. $sign=checkNull($this->sign);
  354. if(!$source){ //非socket来源,app访问
  355. if(!$time){
  356. $rs['code'] = 1001;
  357. $rs['msg'] = '参数错误,请重试';
  358. return $rs;
  359. }
  360. $now=time();
  361. if($now-$time>300){
  362. $rs['code']=1001;
  363. $rs['msg']='参数错误';
  364. return $rs;
  365. }
  366. if(!$sign){
  367. $rs['code']=1001;
  368. $rs['msg']="参数错误,请重试";
  369. return $rs;
  370. }
  371. $checkdata=array(
  372. 'uid'=>$uid,
  373. 'token'=>$token,
  374. 'time'=>$time,
  375. 'stream'=>$stream,
  376. );
  377. $issign=checkSign($checkdata,$sign);
  378. if(!$issign){
  379. $rs['code']=1001;
  380. $rs['msg']='签名错误';
  381. return $rs;
  382. }
  383. }
  384. $key='stopRoom_'.$stream;
  385. $isexist=getcaches($key);
  386. if(!$isexist ){
  387. $domain = new Domain_Live();
  388. $checkToken=checkToken($uid,$token);
  389. setcaches($key,'1',10);
  390. if($checkToken==700){
  391. $domain->stopRoom($uid,$stream);
  392. $rs['code'] = $checkToken;
  393. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  394. return $rs;
  395. }
  396. $info=$domain->stopRoom($uid,$stream);
  397. }
  398. $rs['info'][0]['msg']='关播成功';
  399. return $rs;
  400. }
  401. /**
  402. * 直播结束信息
  403. * @desc 用于直播结束页面信息展示
  404. * @return int code 操作码,0表示成功
  405. * @return array info
  406. * @return string info[0].nums 人数
  407. * @return string info[0].length 时长
  408. * @return string info[0].votes 映票数
  409. * @return string msg 提示信息
  410. */
  411. public function stopInfo() {
  412. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  413. $stream=checkNull($this->stream);
  414. $domain = new Domain_Live();
  415. $info=$domain->stopInfo($stream);
  416. $rs['info'][0]=$info;
  417. return $rs;
  418. }
  419. /**
  420. * 检查直播状态
  421. * @desc 用于用户进房间时检查直播状态
  422. * @return int code 操作码,0表示成功
  423. * @return array info
  424. * @return string info[0].type 房间类型
  425. * @return string info[0].type_val 收费房间价格,默认0
  426. * @return string info[0].type_msg 提示信息
  427. * @return string info[0].live_type 房间类型 0 视频直播 1 语音聊天室
  428. * @return string msg 提示信息
  429. */
  430. public function checkLive() {
  431. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  432. $uid=checkNull($this->uid);
  433. $token=checkNull($this->token);
  434. $liveuid=checkNull($this->liveuid);
  435. $stream=checkNull($this->stream);
  436. $configpub=getConfigPub();
  437. if($configpub['maintain_switch']==1){
  438. $rs['code']=1002;
  439. $rs['msg']=$configpub['maintain_tips'];
  440. return $rs;
  441. }
  442. if($uid>0){
  443. $checkToken=checkToken($uid,$token);
  444. if($checkToken==700){
  445. $rs['code'] = $checkToken;
  446. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  447. return $rs;
  448. }
  449. }
  450. if($uid==$liveuid){
  451. $rs['code'] = 1011;
  452. $rs['msg'] = '不能进入自己的直播间';
  453. return $rs;
  454. }
  455. $domain = new Domain_Live();
  456. $info=$domain->checkLive($uid,$liveuid,$stream);
  457. if($info==1005){
  458. $rs['code'] = 1005;
  459. $rs['msg'] = '直播已结束';
  460. return $rs;
  461. }else if($info==1007){
  462. $rs['code'] = 1007;
  463. $rs['msg'] = '超管不能进入1v1房间';
  464. return $rs;
  465. }else if($info==1008){
  466. $rs['code'] = 1004;
  467. $rs['msg'] = '您已被踢出房间';
  468. return $rs;
  469. }
  470. $rs['info'][0]=$info;
  471. return $rs;
  472. }
  473. /**
  474. * 房间扣费
  475. * @desc 用于房间扣费
  476. * @return int code 操作码,0表示成功
  477. * @return array info
  478. * @return string info[0].coin 用户余额
  479. * @return string msg 提示信息
  480. */
  481. public function roomCharge() {
  482. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  483. $uid=checkNull($this->uid);
  484. $token=checkNull($this->token);
  485. $liveuid=checkNull($this->liveuid);
  486. $stream=checkNull($this->stream);
  487. $checkToken=checkToken($uid,$token);
  488. if($checkToken==700){
  489. $rs['code'] = $checkToken;
  490. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  491. return $rs;
  492. }
  493. $domain = new Domain_Live();
  494. $info=$domain->roomCharge($uid,$liveuid,$stream);
  495. if($info==1005){
  496. $rs['code'] = 1005;
  497. $rs['msg'] = '直播已结束';
  498. return $rs;
  499. }else if($info==1006){
  500. $rs['code'] = 1006;
  501. $rs['msg'] = '该房间非扣费房间';
  502. return $rs;
  503. }else if($info==1007){
  504. $rs['code'] = 1007;
  505. $rs['msg'] = '房间费用有误';
  506. return $rs;
  507. }else if($info==1008){
  508. $rs['code'] = 1008;
  509. $rs['msg'] = '余额不足';
  510. return $rs;
  511. }
  512. $rs['info'][0]['coin']=$info['coin'];
  513. return $rs;
  514. }
  515. /**
  516. * 房间计时扣费
  517. * @desc 用于房间计时扣费
  518. * @return int code 操作码,0表示成功
  519. * @return array info
  520. * @return string info[0].coin 用户余额
  521. * @return string msg 提示信息
  522. */
  523. public function timeCharge() {
  524. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  525. $uid=checkNull($this->uid);
  526. $token=checkNull($this->token);
  527. $liveuid=checkNull($this->liveuid);
  528. $stream=checkNull($this->stream);
  529. $checkToken=checkToken($uid,$token);
  530. if($checkToken==700){
  531. $rs['code'] = $checkToken;
  532. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  533. return $rs;
  534. }
  535. $domain = new Domain_Live();
  536. $key='timeCharge_'.$stream.'_'.$uid;
  537. $cache=getcaches($key);
  538. if($cache){
  539. $coin=$domain->getUserCoin($uid);
  540. $rs['info'][0]['coin']=$coin['coin'];
  541. return $rs;
  542. }
  543. $info=$domain->roomCharge($uid,$liveuid,$stream);
  544. if($info==1005){
  545. $rs['code'] = 1005;
  546. $rs['msg'] = '直播已结束';
  547. return $rs;
  548. }else if($info==1006){
  549. $rs['code'] = 1006;
  550. $rs['msg'] = '该房间非扣费房间';
  551. return $rs;
  552. }else if($info==1007){
  553. $rs['code'] = 1007;
  554. $rs['msg'] = '房间费用有误';
  555. return $rs;
  556. }else if($info==1008){
  557. $rs['code'] = 1008;
  558. $rs['msg'] = '余额不足';
  559. return $rs;
  560. }
  561. $rs['info'][0]['coin']=$info['coin'];
  562. setcaches($key,1,50);
  563. return $rs;
  564. }
  565. /**
  566. * 进入直播间
  567. * @desc 用于用户进入直播
  568. * @return int code 操作码,0表示成功
  569. * @return array info
  570. * @return string info[0].votestotal 直播映票
  571. * @return string info[0].barrage_fee 弹幕价格
  572. * @return string info[0].userlist_time 用户列表获取间隔
  573. * @return string info[0].chatserver socket地址
  574. * @return string info[0].nums 房间人数
  575. * @return string info[0].pull_url 播流地址
  576. * @return string msg 提示信息
  577. */
  578. public function enterRoom() {
  579. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  580. $uid=checkNull($this->uid);
  581. $token=checkNull($this->token);
  582. $liveuid=checkNull($this->liveuid);
  583. $city=checkNull($this->city);
  584. $stream=checkNull($this->stream);
  585. $mobileid=checkNull($this->mobileid);
  586. if($uid>0){
  587. $checkToken=checkToken($uid,$token);
  588. if($checkToken==700){
  589. $rs['code'] = $checkToken;
  590. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  591. return $rs;
  592. }
  593. }
  594. $domain = new Domain_Live();
  595. $userinfo=getUserInfo($uid);
  596. if(!$city){
  597. $city='好像在火星';
  598. }
  599. $userinfo['city']=$city;
  600. $stream2=explode('_',$stream);
  601. $showid=$stream2[1];
  602. $contribution='0';
  603. if($showid && $uid>0){
  604. $contribution=$domain->getContribut($uid,$liveuid,$showid);
  605. }
  606. $userinfo['contribution'] = $contribution;
  607. /* 等级+100 保证等级位置位数相同,最后拼接1 防止末尾出现0 */
  608. $userinfo['sign']=$userinfo['contribution'].'.'.($userinfo['level']+100).'1';
  609. $userinfo['usertype'] = 30;
  610. if($uid<0){
  611. $userinfo['id']=$mobileid;
  612. $token=$mobileid;
  613. }
  614. DI()->redis -> set($token,json_encode($userinfo));
  615. /* 用户列表 */
  616. $userlists=$this->getUserList($liveuid,$stream);
  617. $configpri=getConfigPri();
  618. $info=array(
  619. 'votestotal'=>$userlists['votestotal'],
  620. 'barrage_fee'=>$configpri['barrage_fee'],
  621. 'userlist_time'=>$configpri['userlist_time'],
  622. 'chatserver'=>$configpri['chatserver'],
  623. 'nums'=>$userlists['nums'],
  624. 'speak_limit'=>$configpri['speak_limit'],
  625. 'barrage_limit'=>$configpri['barrage_limit'],
  626. 'level'=>$userinfo['level']
  627. );
  628. $live_info=$domain->getLiveInfo($liveuid);
  629. $pull=$live_info['pull'];
  630. if($live_info['isvideo']!=1){
  631. $pull=PrivateKeyA('rtmp',$stream,0);
  632. }
  633. $info['pull']=$pull;
  634. $info['userlists']=$userlists['userlist'];
  635. /* 用户余额 */
  636. $domain2 = new Domain_User();
  637. $usercoin=$domain2->getBalance($uid);
  638. $info['coin']=(string)$usercoin['coin'];
  639. /** 敏感词集合*/
  640. $dirtyarr=array();
  641. if($configpri['sensitive_words']){
  642. $dirtyarr=explode(',',$configpri['sensitive_words']);
  643. }
  644. $info['sensitive_words']=$dirtyarr;
  645. $rs['info'][0]=$info;
  646. return $rs;
  647. }
  648. /**
  649. * 用户列表
  650. * @desc 用于直播间获取用户列表
  651. * @return int code 操作码,0表示成功
  652. * @return array info
  653. * @return string info[0].userlist 用户列表
  654. * @return string info[0].nums 房间人数
  655. * @return string info[0].votestotal 主播映票
  656. * @return string info[0].guard_type 守护类型
  657. * @return string msg 提示信息
  658. */
  659. public function getUserLists() {
  660. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  661. $liveuid=checkNull($this->liveuid);
  662. $stream=checkNull($this->stream);
  663. $p=$this->p;
  664. /* 用户列表 */
  665. $info=$this->getUserList($liveuid,$stream,$p);
  666. $rs['info'][0]=$info;
  667. return $rs;
  668. }
  669. protected function getUserList($liveuid,$stream,$p=1) {
  670. /* 用户列表 */
  671. $n=1;
  672. $pnum=20;
  673. $start=($p-1)*$pnum;
  674. $list=array();
  675. $uidlist=DI()->redis -> zRevRange('user_'.$stream,$start,$pnum,true);
  676. foreach($uidlist as $k=>$v){
  677. $userinfo=getUserInfo($k);
  678. $info=explode(".",$v);
  679. $userinfo['contribution']=(string)$info[0];
  680. $list[]=$userinfo;
  681. }
  682. if(!$list){
  683. $list=array();
  684. }
  685. $nums=DI()->redis->zCard('user_'.$stream);
  686. if(!$nums){
  687. $nums=0;
  688. }
  689. $rs['userlist']=$list;
  690. $rs['nums']=(string)$nums;
  691. /* 主播信息 */
  692. $domain = new Domain_Live();
  693. $rs['votestotal']=$domain->getVotes($liveuid);
  694. return $rs;
  695. }
  696. /**
  697. * 弹窗
  698. * @desc 用于直播间弹窗信息
  699. * @return int code 操作码,0表示成功
  700. * @return array info
  701. * @return string info[0].consumption 消费总数
  702. * @return string info[0].votestotal 票总数
  703. * @return string msg 提示信息
  704. */
  705. public function getPop() {
  706. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  707. $uid=checkNull($this->uid);
  708. $liveuid=checkNull($this->liveuid);
  709. $touid=checkNull($this->touid);
  710. $info=getUserInfo($touid);
  711. if(!$info){
  712. $rs['code']=1002;
  713. $rs['msg']='用户信息不存在';
  714. return $rs;
  715. }
  716. $info['action']='0';
  717. $rs['info'][0]=$info;
  718. return $rs;
  719. }
  720. /**
  721. * 礼物列表
  722. * @desc 用于获取礼物列表
  723. * @return int code 操作码,0表示成功
  724. * @return array info
  725. * @return string info[0].coin 余额
  726. * @return array info[0].giftlist 礼物列表
  727. * @return string info[0].giftlist[].id 礼物ID
  728. * @return string info[0].giftlist[].type 礼物类型
  729. * @return string info[0].giftlist[].mark 礼物标识
  730. * @return string info[0].giftlist[].giftname 礼物名称
  731. * @return string info[0].giftlist[].needcoin 礼物价格
  732. * @return string info[0].giftlist[].gifticon 礼物图片
  733. * @return string msg 提示信息
  734. */
  735. public function getGiftList() {
  736. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  737. $uid=checkNull($this->uid);
  738. $token=checkNull($this->token);
  739. $checkToken=checkToken($uid,$token);
  740. if($checkToken==700){
  741. $rs['code'] = $checkToken;
  742. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  743. return $rs;
  744. }
  745. $domain = new Domain_Live();
  746. $giftlist=$domain->getGiftList();
  747. $domain2 = new Domain_User();
  748. $coin=$domain2->getBalance($uid);
  749. $rs['info'][0]['giftlist']=$giftlist;
  750. $rs['info'][0]['coin']=$coin['coin'];
  751. return $rs;
  752. }
  753. /**
  754. * 赠送礼物
  755. * @desc 用于赠送礼物
  756. * @return int code 操作码,0表示成功
  757. * @return array info
  758. * @return string info[0].gifttoken 礼物token
  759. * @return string info[0].level 用户等级
  760. * @return string info[0].coin 用户余额
  761. * @return string msg 提示信息
  762. */
  763. public function sendGift() {
  764. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  765. $uid=checkNull($this->uid);
  766. $token=checkNull($this->token);
  767. $liveuid=checkNull($this->liveuid);
  768. $stream=checkNull($this->stream);
  769. $giftid=checkNull($this->giftid);
  770. $giftcount=checkNull($this->giftcount);
  771. $touids=checkNull($this->touids);
  772. $checkToken=checkToken($uid,$token);
  773. if($checkToken==700){
  774. $rs['code'] = $checkToken;
  775. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  776. return $rs;
  777. }
  778. $domain = new Domain_Live();
  779. $giftlist=$domain->getGiftList();
  780. $gift_info=array();
  781. foreach($giftlist as $k=>$v){
  782. if($giftid == $v['id']){
  783. $gift_info=$v;
  784. }
  785. }
  786. if(!$gift_info){
  787. $rs['code']=1002;
  788. $rs['msg']='礼物信息不存在';
  789. return $rs;
  790. }
  791. $domain = new Domain_Live();
  792. $result=$domain->sendGift($uid,$liveuid,$stream,$giftid,$giftcount,$touids);
  793. if($result==1001){
  794. $rs['code']=1001;
  795. $rs['msg']='余额不足';
  796. return $rs;
  797. }else if($result==1002){
  798. $rs['code']=1002;
  799. $rs['msg']='礼物信息不存在';
  800. return $rs;
  801. }else if($result==1004){
  802. $rs['code']=1004;
  803. $rs['msg']='请选择接收礼物用户';
  804. return $rs;
  805. }
  806. $rs['info'][0]['gifttoken']=$result['gifttoken'];
  807. $rs['info'][0]['level']=$result['level'];
  808. $rs['info'][0]['coin']=$result['coin'];
  809. unset($result['gifttoken']);
  810. unset($result['level']);
  811. unset($result['coin']);
  812. DI()->redis -> set($rs['info'][0]['gifttoken'],json_encode($result['list']));
  813. return $rs;
  814. }
  815. /**
  816. * 发送弹幕
  817. * @desc 用于发送弹幕
  818. * @return int code 操作码,0表示成功
  819. * @return array info
  820. * @return string info[0].barragetoken 礼物token
  821. * @return string info[0].level 用户等级
  822. * @return string info[0].coin 用户余额
  823. * @return string msg 提示信息
  824. */
  825. public function sendBarrage() {
  826. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  827. $uid=checkNull($this->uid);
  828. $token=checkNull($this->token);
  829. $liveuid=checkNull($this->liveuid);
  830. $stream=checkNull($this->stream);
  831. $giftid=0;
  832. $giftcount=1;
  833. $content=checkNull($this->content);
  834. if($content==''){
  835. $rs['code'] = 1003;
  836. $rs['msg'] = '弹幕内容不能为空';
  837. return $rs;
  838. }
  839. $checkToken=checkToken($uid,$token);
  840. if($checkToken==700){
  841. $rs['code'] = $checkToken;
  842. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  843. return $rs;
  844. }
  845. $domain = new Domain_Live();
  846. $result=$domain->sendBarrage($uid,$liveuid,$stream,$giftid,$giftcount,$content);
  847. if($result==1001){
  848. $rs['code']=1001;
  849. $rs['msg']='余额不足';
  850. return $rs;
  851. }else if($result==1002){
  852. $rs['code']=1002;
  853. $rs['msg']='礼物信息不存在';
  854. return $rs;
  855. }
  856. $rs['info'][0]['barragetoken']=$result['barragetoken'];
  857. $rs['info'][0]['level']=$result['level'];
  858. $rs['info'][0]['coin']=$result['coin'];
  859. unset($result['barragetoken']);
  860. DI()->redis -> set($rs['info'][0]['barragetoken'],json_encode($result));
  861. return $rs;
  862. }
  863. /**
  864. * 主播映票
  865. * @desc 用于获取主播映票
  866. * @return int code 操作码,0表示成功
  867. * @return array info
  868. * @return string info[0].votestotal 用户总数
  869. * @return string msg 提示信息
  870. */
  871. public function getVotes() {
  872. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  873. $liveuid=checkNull($this->liveuid);
  874. $domain = new Domain_Live();
  875. $info=$domain->getVotes($liveuid);
  876. $rs['info'][0]=$info;
  877. return $rs;
  878. }
  879. /**
  880. * 用户余额
  881. * @desc 用于获取用户余额
  882. * @return int code 操作码,0表示成功
  883. * @return array info
  884. * @return string info[0].coin 余额
  885. * @return string msg 提示信息
  886. */
  887. public function getCoin() {
  888. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  889. $uid=checkNull($this->uid);
  890. $token=checkNull($this->token);
  891. $checkToken=checkToken($uid,$token);
  892. if($checkToken==700){
  893. $rs['code'] = $checkToken;
  894. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  895. return $rs;
  896. }
  897. $domain2 = new Domain_User();
  898. $coin=$domain2->getBalance($uid);
  899. $rs['info'][0]['coin']=$coin['coin'];
  900. return $rs;
  901. }
  902. /**
  903. * 检测房间状态
  904. * @desc 用于检测房间状态
  905. * @return int code 操作码,0表示成功
  906. * @return array info
  907. * @return string info[0].status 状态 0关1开
  908. * @return string msg 提示信息
  909. */
  910. public function checkLiveing() {
  911. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  912. $uid=checkNull($this->uid);
  913. $token=checkNull($this->token);
  914. $stream=checkNull($this->stream);
  915. $domain = new Domain_Live();
  916. $checkToken=checkToken($uid,$token);
  917. if($checkToken==700){
  918. //将主播关播
  919. $domain->stopRoom($uid,$stream);
  920. $rs['code'] = $checkToken;
  921. $rs['msg'] = '您的登陆状态失效,请重新登陆!';
  922. return $rs;
  923. }
  924. $info=$domain->checkLiveing($uid,$stream);
  925. $rs['info'][0]['status']=$info;
  926. return $rs;
  927. }
  928. /**
  929. * 获取直播信息
  930. * @desc 用于个人中心进入直播间获取直播信息
  931. * @return int code 操作码,0表示成功
  932. * @return array info 直播信息
  933. * @return string msg 提示信息
  934. */
  935. public function getLiveInfo() {
  936. $rs = array('code' => 0, 'msg' => '', 'info' => array());
  937. $liveuid=checkNull($this->liveuid);
  938. if($liveuid<1){
  939. $rs['code'] = 1001;
  940. $rs['msg'] = '参数错误';
  941. return $rs;
  942. }
  943. $domain2 = new Domain_Live();
  944. $info=$domain2->getLiveInfo($liveuid);
  945. if(!$info){
  946. $rs['code'] = 1002;
  947. $rs['msg'] = '直播已结束';
  948. return $rs;
  949. }
  950. $rs['info'][0]=$info;
  951. return $rs;
  952. }
  953. }