123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579 |
- <?php
- // +—————————————————————————————————————————————————————————————————————
- // | Created by Yunbao
- // +—————————————————————————————————————————————————————————————————————
- // | Copyright (c) 2013~2022 http://www.yunbaokj.com All rights reserved.
- // +—————————————————————————————————————————————————————————————————————
- // | Author: https://gitee.com/yunbaokeji
- // +—————————————————————————————————————————————————————————————————————
- // | Date: 2022-02-17
- // +—————————————————————————————————————————————————————————————————————
- class Model_Live extends PhalApi_Model_NotORM {
- /* 创建房间 */
- public function createRoom($uid,$data) {
-
- /* 获取主播 推荐、热门 */
-
- $isexist=DI()->notorm->live
- ->select("uid,isvideo,islive")
- ->where('uid=?',$uid)
- ->fetchOne();
- if($isexist){
- /* 判断存在的记录是否为直播状态 */
- if($isexist['isvideo']==0 && $isexist['islive']==1){
- /* 若存在未关闭的直播 关闭直播 */
- $this->stopRoom($uid,$isexist['stream']);
-
- /* 加入 */
- $rs=DI()->notorm->live->insert($data);
-
- }else{
- /* 更新 */
- $rs=DI()->notorm->live->where('uid = ?', $uid)->update($data);
- }
- }else{
- /* 加入 */
- $rs=DI()->notorm->live->insert($data);
-
- }
- if(!$rs){
- return $rs;
- }
- return 1;
- }
-
-
- /* 修改直播状态 */
- public function changeLive($uid,$stream,$status){
- if($status==1){
- $info=DI()->notorm->live
- ->select("*")
- ->where('uid=? and stream=?',$uid,$stream)
- ->fetchOne();
- if($info){
- DI()->notorm->live
- ->where('uid=? and stream=?',$uid,$stream)
- ->update(array("islive"=>1));
- }
- return $info;
- }else{
- $this->stopRoom($uid,$stream);
- return 1;
- }
- }
-
-
- /* 关播 */
- public function stopRoom($uid,$stream) {
- $info=DI()->notorm->live
- ->select("uid,showid,starttime,title,province,city,stream,lng,lat,type,type_val,liveclassid,deviceinfo")
- ->where('uid=? and stream=? and islive="1"',$uid,$stream)
- ->fetchOne();
- if($info){
- $isdel=DI()->notorm->live
- ->where('uid=?',$uid)
- ->delete();
- if(!$isdel){
- return 0;
- }
- $nowtime=time();
- $info['endtime']=$nowtime;
- $info['time']=date("Y-m-d",$info['showid']);
- $votes=DI()->notorm->user_voterecord
- ->where('uid =? and showid=?',$uid,$info['showid'])
- ->sum('total');
- $info['votes']=0;
- if($votes){
- $info['votes']=$votes;
- }
- $nums=DI()->redis->zCard('user_'.$stream);
- DI()->redis->hDel("livelist",$uid);
- DI()->redis->del($uid.'_zombie');
- DI()->redis->del($uid.'_zombie_uid');
- DI()->redis->del('attention_'.$uid);
- DI()->redis->del('user_'.$stream);
- $info['nums']=$nums;
- $result=DI()->notorm->live_record->insert($info);
-
- }
- return 1;
- }
- /* 关播信息 */
- public function stopInfo($stream){
-
- $rs=array(
- 'nums'=>0,
- 'length'=>0,
- 'votes'=>0,
- );
-
- $stream2=explode('_',$stream);
- $liveuid=$stream2[0];
- $starttime=$stream2[1];
- $liveinfo=DI()->notorm->live_record
- ->select("starttime,endtime,nums,votes")
- ->where('uid=? and stream=?',$liveuid,$stream)
- ->fetchOne();
- if($liveinfo){
- $cha=$liveinfo['endtime'] - $liveinfo['starttime'];
- $rs['length']=getSeconds($cha,1);
- $rs['nums']=$liveinfo['nums'];
- }
- if($liveinfo['votes']){
- $rs['votes']=$liveinfo['votes'];
- }
- return $rs;
- }
-
- /* 直播状态 */
- public function checkLive($uid,$liveuid,$stream){
-
-
-
- $islive=DI()->notorm->live
- ->select("islive,type,type_val,starttime")
- ->where('uid=? and stream=?',$liveuid,$stream)
- ->fetchOne();
-
- if(!$islive || $islive['islive']==0){
- return 1005;
- }
- $rs['type']=$islive['type'];
- $rs['type_val']='0';
- $rs['type_msg']='';
-
-
- $configpub=getConfigPub();
-
- if($islive['type']==1){
- $rs['type_msg']=md5($islive['type_val']);
-
- }else if($islive['type']==2){
- $rs['type_msg']='本房间为收费房间,需支付'.$islive['type_val'].$configpub['name_coin'];
- $rs['type_val']=$islive['type_val'];
- $isexist=DI()->notorm->user_coinrecord
- ->select('id')
- ->where('uid=? and touid=? and showid=? and action=6 and type=0',$uid,$liveuid,$islive['starttime'])
- ->fetchOne();
- if($isexist){
- $rs['type']='0';
- $rs['type_val']='0';
- $rs['type_msg']='';
- }
- }else if($islive['type']==3){
- $rs['type_val']=$islive['type_val'];
- $rs['type_msg']='本房间为计时房间,每分钟需支付'.$islive['type_val'].$configpub['name_coin'];
- }
-
- return $rs;
-
- }
-
- /* 用户余额 */
- public function getUserCoin($uid){
- $userinfo=DI()->notorm->user
- ->select("coin")
- ->where('id=?',$uid)
- ->fetchOne();
- return $userinfo;
- }
-
- /* 房间扣费 */
- public function roomCharge($uid,$liveuid,$stream){
- $islive=DI()->notorm->live
- ->select("islive,type,type_val,starttime")
- ->where('uid=? and stream=?',$liveuid,$stream)
- ->fetchOne();
- if(!$islive || $islive['islive']==0){
- return 1005;
- }
-
- if($islive['type']==0 || $islive['type']==1 ){
- return 1006;
- }
-
- $total=$islive['type_val'];
- if($total<=0){
- return 1007;
- }
-
- /* 更新用户余额 消费 */
- $ifok=DI()->notorm->user
- ->where('id = ? and coin >= ?', $uid,$total)
- ->update(array('coin' => new NotORM_Literal("coin - {$total}"),'consumption' => new NotORM_Literal("consumption + {$total}")) );
- if(!$ifok){
- return 1008;
- }
- $action='6';
- if($islive['type']==3){
- $action='7';
- }
-
- $giftid=0;
- $giftcount=0;
- $showid=$islive['starttime'];
- $addtime=time();
-
- /* 更新直播 映票 累计映票 */
- DI()->notorm->user
- ->where('id = ?', $liveuid)
- ->update( array('votes' => new NotORM_Literal("votes + {$total}"),'votestotal' => new NotORM_Literal("votestotal + {$total}") ));
-
- $insert_votes=[
- 'type'=>'1',
- 'action'=>$action,
- 'uid'=>$liveuid,
- 'fromid'=>$uid,
- 'actionid'=>$giftid,
- 'nums'=>$giftcount,
- 'total'=>$total,
- 'showid'=>$showid,
- 'votes'=>$total,
- 'addtime'=>time(),
- ];
- DI()->notorm->user_voterecord->insert($insert_votes);
- /* 更新直播 映票 累计映票 */
- DI()->notorm->user_coinrecord
- ->insert(array("type"=>'0',"action"=>$action,"uid"=>$uid,"touid"=>$liveuid,"giftid"=>$giftid,"giftcount"=>$giftcount,"totalcoin"=>$total,"showid"=>$showid,"addtime"=>$addtime ));
-
- $userinfo2=DI()->notorm->user
- ->select('coin')
- ->where('id = ?', $uid)
- ->fetchOne();
- $rs['coin']=$userinfo2['coin'];
- return $rs;
-
- }
-
-
- /* 礼物列表 */
- public function getGiftList(){
- $rs=DI()->notorm->gift
- ->select("id,type,mark,giftname,needcoin,gifticon,swftime")
- ->order("list_order asc,addtime desc")
- ->fetchAll();
- return $rs;
- }
-
- /* 赠送礼物 */
- public function sendGift($uid,$liveuid,$stream,$giftid,$giftcount,$touids) {
- /* 礼物信息 */
- $giftinfo=DI()->notorm->gift
- ->select("type,mark,giftname,gifticon,needcoin,swftype,swf,swftime")
- ->where('id=?',$giftid)
- ->fetchOne();
- if(!$giftinfo){
- /* 礼物信息不存在 */
- return 1002;
- }
- $touids_arr=explode(',', $touids);
- if(empty($touids_arr)){
- return 1004;
- }
- $touid_nums=count($touids_arr);
- $personal_total=$giftinfo['needcoin']*$giftcount;
- $total= $personal_total*$touid_nums;
- $total_giftcount=$giftcount*$touid_nums;
-
- $addtime=time();
- $type='0';
- $action='1';
-
- $stream2=explode('_',$stream);
- $showid=$stream2[1];
- /* 更新用户余额 消费 */
- $ifok =DI()->notorm->user
- ->where('id = ? and coin >=?', $uid,$total)
- ->update(array('coin' => new NotORM_Literal("coin - {$total}"),'consumption' => new NotORM_Literal("consumption + {$total}") ) );
- if(!$ifok){
- /* 余额不足 */
- return 1001;
- }
- $multi_arr=[];
- foreach ($touids_arr as $k => $v) {
- $insert=array(
- "type"=>$type,
- "action"=>$action,
- "uid"=>$uid,
- "touid"=>$v,
- "giftid"=>$giftid,
- "giftcount"=>$giftcount,
- "totalcoin"=>$personal_total,
- "showid"=>$showid,
- "mark"=>$giftinfo['mark'],
- "addtime"=>$addtime,
- );
- $multi_arr[]=$insert;
- }
-
- DI()->notorm->user_coinrecord->insert_multi($multi_arr); //批量写入
- $gifttoken=md5(md5($action.$uid.$liveuid.$giftid.$giftcount.$total.$showid.$addtime.rand(100,999)));
- $swf=$giftinfo['swf'] ? get_upload_path($giftinfo['swf']):'';
- $result=[];
- $result['gifttoken']=$gifttoken;
- $result['list']=[];
-
- foreach ($touids_arr as $k => $v) {
- $anthor_total=$personal_total;
- //获取直播信息
- // 更新用户 魅力值 累计魅力值
- $istouid =DI()->notorm->user
- ->where('id = ?', $v)
- ->update( array('votes' => new NotORM_Literal("votes + {$anthor_total}"),'votestotal' => new NotORM_Literal("votestotal + {$personal_total}") ));
-
- $insert_votes=[
- 'type'=>'1',
- 'action'=>$action,
- 'uid'=>$v,
- 'fromid'=>$uid,
- 'actionid'=>$giftid,
- 'nums'=>$giftcount,
- 'total'=>$personal_total,
- 'showid'=>$showid,
- 'votes'=>$anthor_total,
- 'addtime'=>time(),
- ];
- DI()->notorm->user_voterecord->insert($insert_votes);
-
- // 更新主播热门
- if($giftinfo['mark']==1){
- DI()->notorm->live
- ->where('uid = ?', $v)
- ->update( array('hotvotes' => new NotORM_Literal("hotvotes + {$personal_total}") ));
- }
- $votestotal=$this->getVotes($liveuid);
- $userinfo2 =DI()->notorm->user
- ->select('consumption,coin')
- ->where('id = ?', $uid)
- ->fetchOne();
- $level=getLevel($userinfo2['consumption']);
- if($giftinfo['type']!=1){
- $giftinfo['isplatgift']='0';
- }
- $touserinfo=getUserInfo($v);
- $user_sendgift_info=array(
- "uid"=>$uid,
- "touid"=>$v,
- "to_username"=>$touserinfo['user_nicename'],
- "giftid"=>$giftid,
- "type"=>(string)$giftinfo['type'],
- "mark"=>$giftinfo['mark'],
- "giftcount"=>$giftcount,
- "totalcoin"=>$total,
- "giftname"=>$giftinfo['giftname'],
- "gifticon"=>get_upload_path($giftinfo['gifticon']),
- "swftime"=>$giftinfo['swftime'],
- "swftype"=>$giftinfo['swftype'],
- "swf"=>$swf,
- "level"=>$level,
- "coin"=>$userinfo2['coin'],
- "votestotal"=>$votestotal,
-
- );
- $result['list'][]=$user_sendgift_info;
- $result['level']=$level;
- $result['coin']=$userinfo2['coin'];
- }
-
- // 清除缓存
- delCache("userinfo_".$uid);
- delCache("userinfo_".$liveuid);
- return $result;
- }
-
- /* 发送弹幕 */
- public function sendBarrage($uid,$liveuid,$stream,$giftid,$giftcount,$content) {
- $configpri=getConfigPri();
-
- $giftinfo=array(
- "giftname"=>'弹幕',
- "gifticon"=>'',
- "needcoin"=>$configpri['barrage_fee'],
- );
-
- $total= $giftinfo['needcoin']*$giftcount;
- if($total<0){
- return 1002;
- }
- $addtime=time();
- $action='2';
- if($total>0){
- $type='0';
- // 更新用户余额 消费
- $ifok =DI()->notorm->user
- ->where('id = ? and coin >=?', $uid,$total)
- ->update(array('coin' => new NotORM_Literal("coin - {$total}"),'consumption' => new NotORM_Literal("consumption + {$total}") ) );
- if(!$ifok){
- // 余额不足
- return 1001;
- }
- // 更新直播 魅力值 累计魅力值
- $istouid =DI()->notorm->user
- ->where('id = ?', $liveuid)
- ->update( array('votes' => new NotORM_Literal("votes + {$total}"),'votestotal' => new NotORM_Literal("votestotal + {$total}") ));
-
- $stream2=explode('_',$stream);
- $showid=$stream2[1];
- if(!$showid){
- $showid=0;
- }
-
- $insert_votes=[
- 'type'=>'1',
- 'action'=>$action,
- 'uid'=>$liveuid,
- 'fromid'=>$uid,
- 'actionid'=>$giftid,
- 'nums'=>$giftcount,
- 'total'=>$total,
- 'showid'=>$showid,
- 'votes'=>$total,
- 'addtime'=>time(),
- ];
- DI()->notorm->user_voterecord->insert($insert_votes);
- // 写入记录 或更新
- $insert=array("type"=>$type,"action"=>$action,"uid"=>$uid,"touid"=>$liveuid,"giftid"=>$giftid,"giftcount"=>$giftcount,"totalcoin"=>$total,"showid"=>$showid,"addtime"=>$addtime );
- $isup=DI()->notorm->user_coinrecord->insert($insert);
- }
-
- $userinfo2 =DI()->notorm->user
- ->select('consumption,coin')
- ->where('id = ?', $uid)
- ->fetchOne();
-
- $level=getLevel($userinfo2['consumption']);
-
- /* 清除缓存 */
- delCache("userinfo_".$uid);
- delCache("userinfo_".$liveuid);
-
- $votestotal=$this->getVotes($liveuid);
-
- $barragetoken=md5(md5($action.$uid.$liveuid.$giftid.$giftcount.$total.$showid.$addtime.rand(100,999)));
-
- $result=array("uid"=>$uid,"content"=>$content,"giftid"=>$giftid,"giftcount"=>$giftcount,"totalcoin"=>$total,"giftname"=>$giftinfo['giftname'],"gifticon"=>$giftinfo['gifticon'],"level"=>$level,"coin"=>$userinfo2['coin'],"votestotal"=>$votestotal,"barragetoken"=>$barragetoken);
-
- return $result;
- }
-
-
- /* 主播总映票 */
- public function getVotes($liveuid){
- $userinfo=DI()->notorm->user
- ->select("votestotal")
- ->where('id=?',$liveuid)
- ->fetchOne();
- return $userinfo['votestotal'];
- }
-
- /* 获取用户本场贡献 */
- public function getContribut($uid,$liveuid,$showid){
- $sum=DI()->notorm->user_coinrecord
- ->where('action=1 and uid=? and touid=? and showid=? ',$uid,$liveuid,$showid)
- ->sum('totalcoin');
- if(!$sum){
- $sum=0;
- }
-
- return (string)$sum;
- }
- /* 检测房间状态 */
- public function checkLiveing($uid,$stream){
- $info=DI()->notorm->live
- ->select('uid')
- ->where('uid=? and stream=? ',$uid,$stream)
- ->fetchOne();
- if($info){
- return '1';
- }
-
- return '0';
- }
-
- /* 获取直播信息 */
- public function getLiveInfo($liveuid){
-
- $info=DI()->notorm->live
- ->select("uid,title,city,stream,pull,thumb,isvideo,type,type_val,anyway,starttime")
- ->where('uid=? and islive=1',$liveuid)
- ->fetchOne();
- if($info){
-
- $info=handleLive($info);
-
- }
-
- return $info;
- }
- }
|