| 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;
 
-     }
 
- }
 
 
  |