房间在线人数 状态 使用腾讯回调

This commit is contained in:
2025-08-21 09:07:33 +08:00
parent 3a2e51027f
commit 1c5a3b2c08
2 changed files with 197 additions and 142 deletions

View File

@@ -1264,63 +1264,76 @@ class Room extends Model
return ['code' => 0, 'msg' => '房间不存在', 'data' => null]; return ['code' => 0, 'msg' => '房间不存在', 'data' => null];
} }
//查找数据库用户 //获取在房间的用户
$dblist = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select(); $in_room_users = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select();
//循环获取在线用户ID 拼接数据 if($in_room_users){
$user_id_array = []; foreach ($in_room_users as $v){
//机器人user_id $userss = db::name('user')->where(['id' => $v['user_id']])->field('is_online,is_robot')->find();
$robot_user_id = []; if($userss['is_online'] == 1 && $userss['is_robot'] == 1){//在线或者机器人都设置为在线
foreach ($dblist as $v) { db::name('vs_room_visitor')->where(['id' => $v['id']])->update(['on_line' => 1]);
//机器人 }else{
if(db::name('user')->where(['id' => $v['user_id']])->value('is_robot')){ db::name('vs_room_visitor')->where(['id' => $v['id']])->update(['on_line' => 0]);
$robot_user_id[] = $v['user_id'];
continue;
}
$user_id_array[] = 'u'.$v['user_id'];
}
//获取腾讯的在线用户
$online_users = model('Tencent')->query_user_online_status($user_id_array);
$online_user = [];
if(isset($online_users['ActionStatus']) && $online_users['ActionStatus'] == 'OK'){
if($online_users['QueryResult']){
foreach ($online_users['QueryResult'] as $v){
if($v['Status'] == "Online"){
//截取用户ID前面的 u 并获取用户ID
$user_id = substr($v['To_Account'],1);
$online_user[] = $user_id;
}
} }
} }
} }
if($dblist){ // //查找数据库用户
$onpit = db::name('vs_room_pit')->field('user_id')->where(['room_id' => $room_id])->select(); // $dblist = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select();
//合并数组 // //循环获取在线用户ID 拼接数据
$array = array_merge($online_user,$robot_user_id); // $user_id_array = [];
// $array = $online_user; // //机器人user_id
$arraypit = array_values((array)$onpit); // $robot_user_id = [];
foreach ($dblist as &$v){ // foreach ($dblist as $v) {
// if(in_array($v['user_id'],$arraypit)){ // //机器人
// //跳过本次循环 // if(db::name('user')->where(['id' => $v['user_id']])->value('is_robot')){
// $robot_user_id[] = $v['user_id'];
// continue; // continue;
// } // }
if(!in_array($v['user_id'],$array)){ // $user_id_array[] = 'u'.$v['user_id'];
//修改他的状态 // }
db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>$room_id])->update(['on_line' => 0]); // //获取腾讯的在线用户
//查询他是否在其他房间 // $online_users = model('Tencent')->query_user_online_status($user_id_array);
$room_id_list = db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>['neq',$room_id]])->find(); // $online_user = [];
if($room_id_list){ // if(isset($online_users['ActionStatus']) && $online_users['ActionStatus'] == 'OK'){
db::name('vs_room_visitor')->where(['user_id' => $v['user_id']])->delete(); // if($online_users['QueryResult']){
} // foreach ($online_users['QueryResult'] as $v){
}else{ // if($v['Status'] == "Online"){
//修改他的状态 // //截取用户ID前面的 u 并获取用户ID
db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>$room_id])->update(['on_line' => 1]); // $user_id = substr($v['To_Account'],1);
} // $online_user[] = $user_id;
} // }
}else{ // }
$lists = ['on_pit' => [], 'off_pit' => []]; // }
return ['code' => 1, 'msg' => '成功', 'data' => $lists]; // }
} //
// if($dblist){
// $onpit = db::name('vs_room_pit')->field('user_id')->where(['room_id' => $room_id])->select();
// //合并数组
// $array = array_merge($online_user,$robot_user_id);
//// $array = $online_user;
// $arraypit = array_values((array)$onpit);
// foreach ($dblist as &$v){
//// if(in_array($v['user_id'],$arraypit)){
//// //跳过本次循环
//// continue;
//// }
// if(!in_array($v['user_id'],$array)){
// //修改他的状态
// db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>$room_id])->update(['on_line' => 0]);
// //查询他是否在其他房间
// $room_id_list = db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>['neq',$room_id]])->find();
// if($room_id_list){
// db::name('vs_room_visitor')->where(['user_id' => $v['user_id']])->delete();
// }
// }else{
// //修改他的状态
// db::name('vs_room_visitor')->where(['user_id' => $v['user_id'],'room_id'=>$room_id])->update(['on_line' => 1]);
// }
// }
// }else{
// $lists = ['on_pit' => [], 'off_pit' => []];
// return ['code' => 1, 'msg' => '成功', 'data' => $lists];
// }
$list = db::name('vs_room_visitor')->alias('a') $list = db::name('vs_room_visitor')->alias('a')
@@ -1348,7 +1361,7 @@ class Room extends Model
}); });
} }
if(($label_type['data']['type_id'] == 1 || $label_type['data']['type_id'] == 3 || $label_type['data']['type_id'] == 4) && $label_type['data']['label_id'] == 1) {//2卡八麦聊天type_id = 1label_id = 1 if($label_type['data']['type_id'] == 7 || ($label_type['data']['type_id'] == 1 || $label_type['data']['type_id'] == 3 || $label_type['data']['type_id'] == 4) && $label_type['data']['label_id'] == 1) {//2卡八麦聊天type_id = 1 || 7(交友)label_id = 1
foreach ($list as &$val) { foreach ($list as &$val) {
if ($val['pit_number'] > 0) { if ($val['pit_number'] > 0) {
$lists['on_pit'][] = $val; $lists['on_pit'][] = $val;

View File

@@ -7,7 +7,6 @@ use fast\Http;
use think\Db; use think\Db;
use think\Log; use think\Log;
use think\Model; use think\Model;
use think\facade\Env;
use fast\Tencentst; use fast\Tencentst;
class Tencent extends Model class Tencent extends Model
@@ -728,7 +727,7 @@ class Tencent extends Model
} }
//修改用户信息 //修改用户信息
public function modify_user_infos($member_id, $member_name, $member_face_url) public function modify_user_infos($member_id, $member_name = '', $member_face_url = '')
{ {
$config = get_system_config(); $config = get_system_config();
$tencentyun_im_appid = $config['tencentyun_im_appid']; $tencentyun_im_appid = $config['tencentyun_im_appid'];
@@ -749,7 +748,6 @@ class Tencent extends Model
]; ];
$curlPost = json_encode($curlPost); $curlPost = json_encode($curlPost);
$reslut = $this->tencent_post_url($postUrl, $curlPost); $reslut = $this->tencent_post_url($postUrl, $curlPost);
Log::record("修改用户信息:".json_encode($reslut),"infos");
if($reslut['ActionStatus'] == 'OK'){ if($reslut['ActionStatus'] == 'OK'){
return ['code' => 1, 'msg' => '操作成功', 'data' => null]; return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}else{ }else{
@@ -888,5 +886,49 @@ class Tencent extends Model
} }
} }
//腾讯IM回调
public function tencent_call_back($data,$sign_data){
//回调鉴权
// $token = '2k1j90av9rtl2ozbnbqxzyrtuj4a4oy5';
// $sign = sha256($token.$sign_data['RequestTime']);
// // $datas = json_encode($data);
// // error_log($datas, 3, '1.txt');
// // $sign_datas = json_encode($sign_data);
// if($sign != $sign_data['Sign']){
// return ['ActionStatus' => 'FAIL', 'ErrorInfo' => '', 'ErrorCode' => 1];
// }
// dump($data);exit;
//在线状态更新
if($data['CallbackCommand'] == 'State.StateChange'){
$info = $data['Info'];
$reslut = $this->tencent_member_status_change($info);
}
return ['ActionStatus' => 'OK', 'ErrorInfo' => '', 'ErrorCode' => 0];
}
//腾讯IM监控在线状态更新
public function tencent_member_status_change($info){
$uid = substr($info['To_Account'],1);
$action = $info['Action'];
if($action == 'Disconnect') {
Db::name('user')->where('id', $uid)->update(['is_online' => 0, 'updatetime' => time()]);
$quit_room = Db::name('vs_room_visitor')->where('user_id', $uid)->select();
if($quit_room) {
foreach ($quit_room as &$v){
model('Room')->quit_room($v['user_id'], $v['room_id'],$v['user_id']);
}
}
} elseif ($action == 'Login') {
Db::name('user')->where('id', $uid)->update(['is_online' => 1, 'updatetime' => time()]);
}elseif ($action == 'Logout'){
Db::name('user')->where('id', $uid)->update(['is_online' => 0, 'updatetime' => time()]);
}
return true;
}
} }