find($rid); if(empty($room_info)){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } $type = 2; $uid = $room_info['room_owner_uid']; } //黑名单列表 $map = []; $map[] = ['type', '=', $type]; if($type == 1){ $map[] = ['a.uid', '=', $uid]; $user_black_list = db::name('user_black')->where('uid', $uid)->column('receive_uid'); }else{ $map[] = ['a.rid', '=', $rid]; $user_black_list = db::name('user_black')->where('rid', $rid)->column('receive_uid'); } $user_black = db::name('user_black')->alias('a')->join('yy_user b', 'a.receive_uid = b.uid')->field('a.receive_uid as uid, b.nick_name, b.special_uid, b.base64_nick_name,b.head_pic,b.sex')->where($map)->select(); foreach ($user_black as $k => &$v) { // $user_nobility_level_info = model('User')->get_user_nobility_level_info($v['uid']); // if($user_nobility_level_info['code'] == 200){ // $v['user_level_info'] = $user_nobility_level_info['data']; // } $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); $v['head_pic'] = localpath_to_netpath($v['head_pic']); $data['room_black_list'][] = $v; } //房间在线人数 if(!empty($rid)){ $map = []; $map[] = ['rid', '=', $rid]; $user_id_list = db::name('room_visitor')->where($map)->column('uid'); if (!empty($user_id_list)) { $map = []; $map[] = ['uid', 'in', $user_id_list]; $map[] = ['uid', 'not in', $user_black_list]; $user_list = db::name('user')->field('uid,base64_nick_name,head_pic,sex,special_uid')->where($map)->page($page, $page_limit)->select(); foreach ($user_list as $k => &$v) { // $user_nobility_level_info = model('User')->get_user_nobility_level_info($v['uid']); // if($user_nobility_level_info['code'] == 200){ // $v['user_level_info'] = $user_nobility_level_info['data']; // } $v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'); $v['head_pic'] = localpath_to_netpath($v['head_pic']); $data['room_visitor_list'][] = $v; } } } return ['code' => 200, 'msg' => '获取成功', 'data' => $data]; } //添加腾讯IM黑名单 public function add_blacklist($uid, $rid, $user_id){ $type = 1; if(!empty($rid)){ $room_info = db::name('room')->find($rid); if(empty($room_info)){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } $room_admin_array = explode(',', $room_info['room_admin_uid']); if($uid != $room_info['room_owner_uid'] && !in_array($uid, $room_admin_array)){ return ['code' => 201, 'msg' => '无权限拉黑', 'data' => null]; } $type = 2; if($user_id == $room_info['room_owner_uid']){ return ['code' => 201, 'msg' => '不能拉黑房主', 'data' => null]; } if($user_id == $room_info['room_host_uid']){ return ['code' => 201, 'msg' => '不能拉黑主持', 'data' => null]; } // $uid = $room_info['room_owner_uid']; } if($uid == $user_id){ return ['code' => 201, 'msg' => '拉黑用户不能为自己', 'data' => null]; } $map = []; $map[] = ['type', '=', $type]; if($type == 1){ $map[] = ['uid', '=', $uid]; }else{ $map[] = ['rid', '=', $rid]; } $map[] = ['receive_uid', '=', $user_id]; $user_black_info = db::name('user_black')->where($map)->find(); if($user_black_info){ return ['code' => 201, 'msg' => '该用户已被加入黑名单', 'data' => null]; } Db::startTrans(); try { //添加到黑名单 $insert = []; $insert['type'] = $type; if($type == 1){ $insert['uid'] = $uid; }else{ $insert['rid'] = $rid; } $insert['receive_uid'] = $user_id; $insert['add_time'] = time(); $reslut = db::name('user_black')->insert($insert); if(!$reslut){ Db::rollback(); return ['code' => 201, 'msg' => '添加失败', 'data' => null]; } if($type == 1){ //添加腾讯IM $user_id = explode(',',$user_id); $uid = strval($uid); $reslut = model('Tencent')->black_list_add($uid,$user_id); if($reslut['code'] != 200){ Db::rollback(); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } } Db::commit(); return ['code' => 200, 'msg' => '添加成功', 'data' => null]; } catch (\Exception $e) { // 回滚事务 dump($e); Db::rollback(); return ['code' => 201, 'msg' => '添加失败', 'data' => null]; } } //删除腾讯IM黑名单 public function remove_blacklist($uid, $rid, $user_id){ $type = 1; if(!empty($rid)){ $room_info = db::name('room')->find($rid); if(empty($room_info)){ return ['code' => 201, 'msg' => '该房间不存在', 'data' => null]; } $room_admin_array = explode(',', $room_info['room_admin_uid']); if($uid != $room_info['room_owner_uid'] && !in_array($uid, $room_admin_array)){ return ['code' => 201, 'msg' => '无权限拉黑', 'data' => null]; } $type = 2; // $uid = $room_info['room_owner_uid']; } $map = []; $map[] = ['type', '=', $type]; if($type == 1){ $map[] = ['uid', '=', $uid]; }else{ $map[] = ['rid', '=', $rid]; } $map[] = ['receive_uid', '=', $user_id]; $user_black_info = db::name('user_black')->where($map)->find(); if(!$user_black_info){ return ['code' => 201, 'msg' => '该用户没有被加入黑名单', 'data' => null]; } Db::startTrans(); try { //删除腾讯IM黑名单 $reslut = db::name('user_black')->where('id', $user_black_info['id'])->delete(); if(!$reslut){ Db::rollback(); return ['code' => 201, 'msg' => '移除失败', 'data' => null]; } if($type == 1){ $user_id = explode(',',$user_id); $uid = strval($uid); $reslut = model('Tencent')->black_list_delete($uid,$user_id); if($reslut['code'] != 200){ Db::rollback(); return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null]; } } Db::commit(); return ['code' => 200, 'msg' => '移除成功', 'data' => null]; } catch (\Exception $e) { // 回滚事务 dump($e); Db::rollback(); return ['code' => 201, 'msg' => '移除失败', 'data' => null]; } } //腾讯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'] == 'Group.CallbackAfterNewMemberJoin'){ $rid = $data['GroupId']; $member_list = $data['NewMemberList']; $reslut = $this->tencent_group_join_call_back($rid, $member_list[0]['Member_Account']); } //退出群聊 if($data['CallbackCommand'] == 'Group.CallbackAfterMemberExit'){ $rid = $data['GroupId']; $member_list = $data['ExitMemberList']; $reslut = $this->tencent_group_quit_call_back($rid, $member_list[0]['Member_Account']); } //在线状态更新 if($data['CallbackCommand'] == 'State.StateChange'){ $info = $data['Info']; $reslut = $this->tencent_member_status_change($info); } if(isset($data['CallbackCommand']) && ($data['CallbackCommand'] == 'C2C.CallbackBeforeSendMsg')) { $from_uid = $data['From_Account']; $to_uid = $data['To_Account']; if($data['MsgBody'][0]['MsgType'] == 'TIMCustomElem') { $send_data = $data['MsgBody'][0]['MsgContent']['Data']; $white_data = ['700001', '700002','700003','700004','700005','700006','700007','700008','700009']; // if(in_array($send_data, $white_data)) { return ['ActionStatus' => 'OK', 'ErrorInfo' => '', 'ErrorCode' => 0]; // } } //是否有权限私聊 $reslut = $this->user_tencent_message_logs($from_uid); if($reslut['code'] == 201){ return ['ActionStatus' => 'OK', 'ErrorInfo' => $reslut['msg'], 'ErrorCode' => 120001]; } return ['ActionStatus' => 'OK', 'ErrorInfo' => '', 'ErrorCode' => 0]; } //群聊消息发送前的回调 if(isset($data['CallbackCommand']) && ($data['CallbackCommand'] == 'Group.CallbackBeforeSendMsg')) { // $send_message_type = $data['MsgBody'][0]['MsgType']; // $rid = $data['GroupId']; // $from_uid = $data['From_Account']; // Log::write($data,'chat'); // //普通群组监控 // if($send_message_type == 'TIMCustomElem'){ // //是否有权限私聊 // $reslut = $this->user_tencent_message_logs($from_uid); // if($reslut['code'] == 201){ // return ['ActionStatus' => 'OK', 'ErrorInfo' => $reslut['msg'], 'ErrorCode' => 120001]; // } // } return ['ActionStatus' => 'OK', 'ErrorInfo' => '', 'ErrorCode' => 0]; } return ['ActionStatus' => 'OK', 'ErrorInfo' => '', 'ErrorCode' => 0]; } //腾讯IM监控加入群聊 public function tencent_group_join_call_back($rid, $uid){ //进入房间 $in_room = db::name('room_visitor')->where(['uid' => $uid, 'rid' => $rid])->find(); $rid_strlen = strlen($rid); if(empty($in_room) && $rid_strlen < 7) { $insert_vistor_room_data = [ 'uid' => $uid, 'rid' => $rid, 'add_time' => time(), 'update_time' => time(), ]; db::name('room_visitor')->insert($insert_vistor_room_data); }else{ db::name('room_visitor')->where('vid', $in_room['vid'])->update(['is_delete' => 1, 'end_time' => 0, 'update_time' => time()]); } //该用户是否在该房间麦上 $room_micro = db::name('room_micro')->where('rid',$rid)->where('uid', $uid)->find(); if(!empty($room_micro)){ db::name('room_micro')->where('id', $room_micro['id'])->update(['is_online' => 1, 'update_time' => time()]); } $count = Db::name('room_visitor')->where('rid', $rid)->count(); //获取房间机器人数 $robot_num = Db::name('room')->where('rid',$rid)->value('robot_num'); $count = $robot_num + $count; $data = [ 'onilne_num' => $count, ]; $push_data = []; $push_data['code'] = 210; $push_data['msg'] = "用户进入房间"; $push_data['data'] = $data; $result = model('WebSocketPush')->send_to_group($rid, $push_data); model('api/room')->is_visitor_room($uid,$rid); model('api/room')->push_room_micro_data($rid); } //腾讯IM监控退出群聊 public function tencent_group_quit_call_back($rid, $uid){ model('api/room')->quit_room($uid, $rid); $count = Db::name('room_visitor')->where('rid', $rid)->count(); //获取房间机器人数 $robot_num = Db::name('room')->where('rid',$rid)->value('robot_num'); $count = $robot_num + $count; $data = [ 'onilne_num' => $count, ]; $push_data = []; $push_data['code'] = 210; $push_data['msg'] = "用户退出房间"; $push_data['data'] = $data; $result = model('WebSocketPush')->send_to_group($rid, $push_data); } //腾讯IM监控在线状态更新 public function tencent_member_status_change($info){ $uid = $info['To_Account']; $action = $info['Action']; if($action == 'Disconnect') { Db::name('user')->where('uid', $uid)->update(['is_online' => 2, 'update_time' => time()]); $quit_room = Db::name('room_visitor')->where('uid', $uid)->order('vid', 'asc')->select(); if($quit_room) { foreach ($quit_room as $k => $v){ model('room')->quit_room($uid, $v['rid']); $count = Db::name('room_visitor')->where('rid', $v['rid'])->count(); //获取房间机器人数 $robot_num = Db::name('room')->where('rid',$v['rid'])->value('robot_num'); $count = $robot_num + $count; $data = [ 'onilne_num' => $count, ]; $push_data = []; $push_data['code'] = 210; $push_data['msg'] = "用户退出房间"; $push_data['data'] = $data; $result = model('WebSocketPush')->send_to_group($v['rid'], $push_data); } } } elseif ($action == 'Login') { Db::name('user')->where('uid', $uid)->update(['is_online' => 1, 'update_time' => time()]); } } public function user_tencent_message_logs($uid){ $user_info = db::name('user')->find($uid); if($user_info['login_status'] != 1) { return ['code' => 201, 'msg' => '已被封禁!', 'data' => null]; } // 用户IP是否被封禁 $map = []; $map[] = ['type', '=', 3]; $map[] = ['type_text', '=', $user_info['login_ip']]; $map[] = ['is_delete', '=', 1]; $block_ip = db::name('block')->where($map)->find(); // dump($block_ip); if($block_ip){ return ['code' => 201, 'msg' => '当前IP地址已被封禁。', 'data' => null]; } //用户设备号是否被封禁 $map = []; $map[] = ['type', '=', 1]; $map[] = ['type_text', '=', $user_info['last_login_device']]; $map[] = ['is_delete', '=', 1]; $block_device = db::name('block')->where($map)->find(); // dump($block_device); if($block_device){ return ['code' => 201, 'msg' => '当前设备号已被封禁。', 'data' => null]; } if($user_info['is_real'] != 1) { return ['code' => 201, 'msg' => '未实名不能发送消息。', 'data' => null]; } //查询总消费是否达标 $pay_money = Db::name('user_recharge')->where(['uid'=>$uid,'pay_status'=>2])->sum('money'); $chate_money = get_system_config('chate_money'); if($pay_money < $chate_money){ return ['code' => 201, 'msg' => "充值大于{$chate_money}元可私聊", 'data' => null]; } return ['code' => 200, 'msg' => '成功', 'data' => null]; } }