613 lines
14 KiB
PHP
Executable File
613 lines
14 KiB
PHP
Executable File
<?php
|
|
namespace app\im\controller;
|
|
|
|
use app\card\model\UserInfo;
|
|
use app\material\model\BrochureIm;
|
|
use app\material\model\ImVideo;
|
|
use app\shop\model\IndexUser;
|
|
use Redis;
|
|
use think\facade\Cache;
|
|
use think\facade\Config;
|
|
|
|
class Some {
|
|
|
|
|
|
public $redis;
|
|
|
|
public function __construct() {
|
|
|
|
$host = Config::get('cache.stores.redis.host');
|
|
|
|
$port = Config::get('cache.stores.redis.port');
|
|
|
|
$password = Config::get('cache.stores.redis.password');
|
|
|
|
if(empty($this->redis)||$this->redis->ping()!=true){
|
|
|
|
$this->redis = new Redis();
|
|
|
|
$this->redis->connect($host,$port);
|
|
|
|
if(!empty($password)){
|
|
|
|
$this->redis->auth($password); //设置密码
|
|
}
|
|
|
|
// $connect_status = $this->redis->ping();
|
|
|
|
// if($connect_status != "+PONG")
|
|
// if($connect_status != true)
|
|
// {
|
|
// $this->redis->connect($host,$port);
|
|
//
|
|
// if(!empty($password)){
|
|
//
|
|
// $this->redis->auth($password); //设置密码
|
|
// }
|
|
//
|
|
// }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $request
|
|
* @功能说明:建立连接回调(智能物料)
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:17
|
|
*/
|
|
public function mOnOpen($data,$fd) {
|
|
|
|
$room_key = $data['room_key'];
|
|
|
|
$uid = !empty($data['user_id'])?$data['user_id']:0;
|
|
|
|
$target_id= !empty($data['target_id'])?$data['target_id']:0;
|
|
|
|
$uniacid = !empty($data['uniacid'])?$data['uniacid']:0;
|
|
//是否是群主
|
|
$leader =!empty($data['presenter'])?$data['presenter']:0;
|
|
//1是文件 2是宣传册
|
|
$type = !empty($data['type'])?$data['type']:1;
|
|
//加入房间域
|
|
$this->redis->hset($room_key,$uid,$fd);
|
|
//加入组集合
|
|
$this->redis->sadd('group', $room_key);
|
|
//如果是群主
|
|
if($leader==1){
|
|
|
|
$key = $room_key.'-leader';
|
|
//群主
|
|
$this->redis->set($key,$uid,86400);
|
|
|
|
}
|
|
|
|
$bIm_model = new BrochureIm();
|
|
|
|
$dis = [
|
|
|
|
'user_id' => $uid,
|
|
|
|
'room_key' => $room_key,
|
|
|
|
'brochure_id' => $target_id,
|
|
|
|
'type' => $type,
|
|
];
|
|
|
|
$find = $bIm_model->dataInfo($dis);
|
|
|
|
$room_status = $bIm_model->where(['room_key'=>$room_key,'leader'=>1])->value('status');
|
|
|
|
$room_status = !empty($room_status)?$room_status:1;
|
|
|
|
if(empty($find)){
|
|
|
|
$key = $room_key.'-leader';
|
|
//群主
|
|
$user_id = $this->redis->get($key);
|
|
|
|
$user_info = new UserInfo();
|
|
|
|
$user_id = !empty($user_id)?$user_id:0;
|
|
|
|
$company_id = $user_info->where(['fans_id'=>$user_id])->value('company_id');
|
|
|
|
$insert = [
|
|
|
|
'uniacid' => $uniacid,
|
|
|
|
'user_id' => $uid,
|
|
|
|
'room_key' => $room_key,
|
|
|
|
'brochure_id' => $target_id,
|
|
|
|
'leader' => $leader,
|
|
|
|
'type' => $type,
|
|
|
|
'company_id' => !empty($company_id)?$company_id:0,
|
|
|
|
'status' => $room_status
|
|
|
|
];
|
|
|
|
$bIm_model->dataAdd($insert);
|
|
}else{
|
|
|
|
$bIm_model->dataUpdate($dis,['status'=>$room_status]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $frame
|
|
* @功能说明:接受消息回调(智能物料)
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:17
|
|
*/
|
|
public function mOnMessage($ws, $data,$fd) {
|
|
|
|
$room_key = $data['data']['room_key'];
|
|
//获取房间
|
|
$room = $this->redis->hGetAll($room_key);
|
|
|
|
if(!empty($room)){
|
|
|
|
foreach ($room as $k => $vv) {
|
|
//投递消息
|
|
$ws->push($vv, json_encode($data));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $data
|
|
* @param $fd
|
|
* @功能说明:保存音频
|
|
* @author chenniang
|
|
* @DataTime: 2021-08-10 17:25
|
|
*/
|
|
public function addVideo($ws, $data,$fd){
|
|
|
|
$room_key = $data['data']['room_key'];
|
|
|
|
$uniacid = !empty($data['data']['uniacid'])?$data['data']['uniacid']:0;
|
|
|
|
$video = FILE_UPLOAD_PATH.$data['data']['video'];
|
|
|
|
if(!empty($data['data']['video'])){
|
|
|
|
$im_video_model = new ImVideo();
|
|
|
|
$insert = [
|
|
|
|
'uniacid' => $uniacid,
|
|
|
|
'room_key' => $room_key,
|
|
|
|
'video' => $video,
|
|
|
|
];
|
|
|
|
$im_video_model->dataAdd($insert);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $frame
|
|
* @功能说明:接受消息回调(智能物料)
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:17
|
|
*/
|
|
public function onLogin($ws, $data,$fd) {
|
|
|
|
$room_key = $data['data']['room_key'];
|
|
|
|
// $room_key = '20210802093606035000000350';
|
|
//获取房间
|
|
$room = $this->redis->hgetall($room_key);
|
|
|
|
if(!empty($room)){
|
|
|
|
$user_model = new IndexUser();
|
|
|
|
$bIm_model = new BrochureIm();
|
|
|
|
$user_id = array_keys($room);
|
|
|
|
$key = $room_key.'-leader';
|
|
//获取群组的用户id
|
|
$leader_id = $this->redis->get($key);
|
|
|
|
if(!empty($leader_id)){
|
|
|
|
$user_key = array_search($leader_id,$user_id);
|
|
|
|
if(is_numeric($user_key)&&array_key_exists($user_key,$user_id)){
|
|
|
|
unset($user_id[$user_key]);
|
|
}
|
|
|
|
}
|
|
|
|
$user = $user_model->where('id','in',$user_id)->field('nickName,avatarUrl')->select()->toArray();
|
|
|
|
$list['data']['user'] = $user;
|
|
|
|
$list['action'] = $data['action'];
|
|
|
|
$list['data']['room_key'] = $room_key;
|
|
|
|
$list['data']['count'] = count($user_id);
|
|
|
|
$dis = [
|
|
|
|
'room_key' => $room_key,
|
|
|
|
'leader' => 1
|
|
];
|
|
//演示状态
|
|
$list['data']['is_start'] = $bIm_model->where($dis)->value('status');
|
|
|
|
foreach ($room as $k => $vv) {
|
|
//投递消息
|
|
$ws->push($vv, json_encode($list));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-28 16:50
|
|
* @功能说明:开始演示
|
|
*/
|
|
public function startAction($ws, $data,$fd){
|
|
|
|
$room_key = $data['data']['room_key'];
|
|
|
|
$bIm_model = new BrochureIm();
|
|
|
|
$dis = [
|
|
|
|
'room_key' => $room_key,
|
|
|
|
// 'leader' => 1
|
|
];
|
|
//修改演示状态
|
|
$bIm_model->dataUpdate($dis,['status'=>2]);
|
|
|
|
$bIm_model->dataUpdate(['room_key'=>$room_key],['time_long'=>0,'update_time'=>time()]);
|
|
|
|
$room = $this->redis->hGetAll($room_key);
|
|
|
|
$list['data']['is_start'] = 2;
|
|
|
|
$list['data']['room_key'] = $room_key;
|
|
|
|
$list['action'] = $data['action'];
|
|
|
|
if(!empty($room)){
|
|
|
|
foreach ($room as $k=>$vv){
|
|
//投递消息
|
|
$ws->push($vv, json_encode($list));
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $serv
|
|
* @param $task_id
|
|
* @param $worker_id
|
|
* @param $data
|
|
* @功能说明:完成异步任务回调
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:17
|
|
*/
|
|
public function onTask($serv, $task_id, $worker_id, $data) {
|
|
|
|
//返回字符串给worker进程——>触发onFinish
|
|
return "success";
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $serv
|
|
* @param $task_id
|
|
* @param $data
|
|
* @功能说明:完成任务投递回调
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:16
|
|
*/
|
|
public function onFinish($serv, $task_id, $data) {
|
|
//task_worker进程将任务处理结果发送给worker进程
|
|
echo "完成任务{$task_id}投递 处理结果:{$data}";
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $fd
|
|
* @功能说明:关闭连接回调
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-02 18:16
|
|
*/
|
|
public function onClose($ws, $fd) {
|
|
//退出并删除多余的分组fd
|
|
$group = $this->redis->sMembers('group');
|
|
|
|
foreach ($group as $v) {
|
|
|
|
$fangjian = $this->redis->hgetall($v);
|
|
|
|
foreach ($fangjian as $k => $vv) {
|
|
|
|
if ($fd == $vv) {
|
|
|
|
$this->redis->hdel($v, $vv);
|
|
|
|
}
|
|
}
|
|
}
|
|
// echo "{$fd}关闭了连接1";
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $fd
|
|
* @功能说明:解散群
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-27 18:04
|
|
*/
|
|
public function allLoginOut($ws,$data,$fd){
|
|
|
|
$room_key = $data['data']['room_key'];
|
|
|
|
$fangjian = $this->redis->hgetall($room_key);
|
|
|
|
$im_model = new BrochureIm();
|
|
|
|
$data['action'] = 'mOnMessage';
|
|
|
|
$data['data']['message_type'] = 2;
|
|
//给剩下的人发消息
|
|
$this->mOnMessage($ws,$data,$fd);
|
|
|
|
$bIm_model = new BrochureIm();
|
|
|
|
$dis = [
|
|
|
|
'room_key' => $room_key,
|
|
|
|
];
|
|
//修改演示状态
|
|
$bIm_model->where($dis)->update(['status'=>3]);
|
|
|
|
if(!empty($fangjian)){
|
|
|
|
foreach ($fangjian as $k => $vv) {
|
|
|
|
$this->redis->Hdel($room_key,$k);
|
|
|
|
$dis = [
|
|
|
|
'user_id' => $k,
|
|
|
|
'room_key'=> $room_key
|
|
];
|
|
|
|
$find = $im_model->dataInfo($dis);
|
|
|
|
if(!empty($find)&&$find['status']>1){
|
|
|
|
$time_long = time()-$find['update_time'];
|
|
|
|
$im_model->dataUpdate($dis,['time_long'=>$time_long+$find['time_long']]);
|
|
|
|
}
|
|
|
|
}
|
|
//删除房间
|
|
@$this->redis->sRem('group',$room_key);
|
|
}
|
|
|
|
|
|
// if(!empty($data['data']['url'])){
|
|
//
|
|
// $url = $data['data']['url'];
|
|
// //合并录音
|
|
// $im_model->addAudio($room_key,$url);
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $fd
|
|
* @功能说明:退出
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-23 17:44
|
|
*/
|
|
public function loginOut($ws, $fd){
|
|
|
|
$im_model = new BrochureIm();
|
|
//退出并删除多余的分组fd
|
|
$group = $this->redis->sMembers('group');
|
|
|
|
if(!empty($group)){
|
|
|
|
foreach ($group as $v) {
|
|
|
|
$fangjian = $this->redis->hgetall($v);
|
|
|
|
$data['data']['room_key'] = $v;
|
|
|
|
if(!empty($fangjian)){
|
|
|
|
foreach ($fangjian as $k => $vv) {
|
|
|
|
if ($fd == $vv) {
|
|
|
|
$this->redis->Hdel($v,$k);
|
|
|
|
$dis = [
|
|
|
|
'user_id' => $k,
|
|
|
|
'room_key'=> $v
|
|
];
|
|
|
|
$find = $im_model->dataInfo($dis);
|
|
|
|
if(!empty($find)&&$find['status']>1){
|
|
|
|
$time_long = time()-$find['update_time'];
|
|
|
|
$im_model->dataUpdate($dis,['time_long'=>$time_long+$find['time_long']]);
|
|
|
|
}
|
|
|
|
$data['action'] = 'onLogin';
|
|
//给剩下的人发消息
|
|
$this->onLogin($ws,$data,$fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
@$this->redis->sRem('group',$v);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @param $ws
|
|
* @param $fd
|
|
* @功能说明:退出
|
|
* @author chenniang
|
|
* @DataTime: 2021-07-23 17:44
|
|
*/
|
|
public function loginOutV2($ws, $fd){
|
|
|
|
$im_model = new BrochureIm();
|
|
//退出并删除多余的分组fd
|
|
$group = $this->redis->sMembers('group');
|
|
|
|
foreach ($group as $v) {
|
|
|
|
$fangjian = $this->redis->hgetall($v);
|
|
|
|
$key = $v.'-leader';
|
|
//获取群组的用户id
|
|
$leader_id = $this->redis->get($key);
|
|
//当前用户的id
|
|
$user_id = array_search($fd,$fangjian);
|
|
//如果是群组则全部退出
|
|
$is_all = !empty($user_id)&&$leader_id==$user_id?1:0;
|
|
|
|
$data['data']['room_key'] = $v;
|
|
//修改房间状态
|
|
if($is_all==1){
|
|
|
|
$start_key = $v.'-is_start';
|
|
|
|
$this->redis->set($start_key,0);
|
|
|
|
$data['action'] = 'mOnMessage';
|
|
|
|
$data['data']['message_type'] = 2;
|
|
//给剩下的人发消息
|
|
$this->mOnMessage($ws,$data,$fd);
|
|
|
|
}
|
|
|
|
if(!empty($fangjian)){
|
|
|
|
foreach ($fangjian as $k => $vv) {
|
|
|
|
if ($fd == $vv||$is_all==1) {
|
|
|
|
$this->redis->hdel($v, $k);
|
|
|
|
|
|
$dis = [
|
|
|
|
'user_id' => $k,
|
|
|
|
'room_key'=> $v
|
|
];
|
|
|
|
$find = $im_model->dataInfo($dis);
|
|
|
|
if(!empty($find)){
|
|
|
|
$time_long = time()-$find['update_time'];
|
|
|
|
$im_model->dataUpdate($dis,['time_long'=>$time_long+$find['time_long']]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
@$this->redis->sRem('group',$v);
|
|
|
|
}
|
|
//如果是群主断开链接
|
|
if($is_all==0){
|
|
|
|
$data['action'] = 'onLogin';
|
|
//给剩下的人发消息
|
|
$this->onLogin($ws,$data,$fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|