From 80d47d9c7f46931b59426da43014ab4d876c482f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E6=B8=85?= <18691022700@163.com> Date: Wed, 20 Aug 2025 21:33:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=85=BE=E8=AE=AF=E5=9B=9E=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=9C=A8=E7=BA=BF=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/Tencent.php | 16 ++++ application/api/model/Room.php | 119 ++++++++++++++----------- application/api/model/Tencent.php | 45 +++++++++- application/api/model/User.php | 2 +- 4 files changed, 127 insertions(+), 55 deletions(-) create mode 100644 application/api/controller/Tencent.php diff --git a/application/api/controller/Tencent.php b/application/api/controller/Tencent.php new file mode 100644 index 0000000..55a4b20 --- /dev/null +++ b/application/api/controller/Tencent.php @@ -0,0 +1,16 @@ +tencent_call_back($data,$sign_data); + return json($reslut); + } +} \ No newline at end of file diff --git a/application/api/model/Room.php b/application/api/model/Room.php index ab15f7b..9adfb87 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -1278,63 +1278,76 @@ class Room extends Model return ['code' => 0, 'msg' => '房间不存在', 'data' => null]; } - //查找数据库用户 - $dblist = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select(); - //循环获取在线用户ID 拼接数据 - $user_id_array = []; - //机器人user_id - $robot_user_id = []; - foreach ($dblist as $v) { - //机器人 - if(db::name('user')->where(['id' => $v['user_id']])->value('is_robot')){ - $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; - } + //获取在房间的用户 + $in_room_users = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select(); + if($in_room_users){ + foreach ($in_room_users as $v){ + $userss = db::name('user')->where(['id' => $v['user_id']])->field('is_online,is_robot')->find(); + if($userss['is_online'] == 1 && $userss['is_robot'] == 1){//在线或者机器人都设置为在线 + db::name('vs_room_visitor')->where(['id' => $v['id']])->update(['on_line' => 1]); + }else{ + db::name('vs_room_visitor')->where(['id' => $v['id']])->update(['on_line' => 0]); } } } - 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; +// //查找数据库用户 +// $dblist = db::name('vs_room_visitor')->where(['room_id' => $room_id])->field('user_id')->select(); +// //循环获取在线用户ID 拼接数据 +// $user_id_array = []; +// //机器人user_id +// $robot_user_id = []; +// foreach ($dblist as $v) { +// //机器人 +// if(db::name('user')->where(['id' => $v['user_id']])->value('is_robot')){ +// $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(!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]; - } +// } +// } +// +// 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') @@ -1362,7 +1375,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 = 1,label_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) { if ($val['pit_number'] > 0) { $lists['on_pit'][] = $val; diff --git a/application/api/model/Tencent.php b/application/api/model/Tencent.php index d19d426..42675ca 100644 --- a/application/api/model/Tencent.php +++ b/application/api/model/Tencent.php @@ -7,7 +7,6 @@ use fast\Http; use think\Db; use think\Log; use think\Model; -use think\facade\Env; use fast\Tencentst; class Tencent extends Model @@ -887,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; + } } diff --git a/application/api/model/User.php b/application/api/model/User.php index 23b6987..7ace1cd 100644 --- a/application/api/model/User.php +++ b/application/api/model/User.php @@ -278,7 +278,7 @@ class User extends Model public function get_user_home($from_uid,$uid) { $user_info = db::name('user')->alias('u')->join('user_data ud', 'u.id = ud.user_id') - ->field('u.id as user_id,u.nickname,u.user_code,u.avatar,u.sex,u.birthday,u.profile,ud.tag_id,ud.home_bgimages') + ->field('u.id as user_id,u.nickname,u.user_code,u.avatar,u.sex,u.birthday,u.profile,ud.tag_id,ud.home_bgimages,u.is_online') ->where(['u.id' => $uid,'u.status' => ['<>',0]])->find(); if(!$user_info){ return ['code' => 0, 'msg' => '用户不存在或已注销', 'data' => null];