腾讯回调用户在线状态
This commit is contained in:
16
application/api/controller/Tencent.php
Normal file
16
application/api/controller/Tencent.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace app\api\controller;
|
||||
|
||||
use think\Controller;
|
||||
|
||||
class Tencent extends Controller
|
||||
{
|
||||
public function call_back()
|
||||
{
|
||||
$data = input('post.');
|
||||
$sign_data = input('get.');
|
||||
$reslut = model('Tencent')->tencent_call_back($data,$sign_data);
|
||||
return json($reslut);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user