456 lines
17 KiB
PHP
456 lines
17 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace app\api\model;
|
||
|
|
|
||
|
|
use think\Db;
|
||
|
|
use think\Model;
|
||
|
|
use think\facade\Log;
|
||
|
|
class UserTencent extends Model
|
||
|
|
{
|
||
|
|
//获取黑名单
|
||
|
|
public function get_blacklist_list($uid, $rid, $page = 1, $page_limit = 20){
|
||
|
|
$page = intval($page);
|
||
|
|
$page_limit = $page_limit < 999 ? $page_limit : 999;
|
||
|
|
|
||
|
|
$data = [];
|
||
|
|
$data['room_black_list'] = [];
|
||
|
|
$data['room_visitor_list'] = [];
|
||
|
|
$type = 1;
|
||
|
|
if(!empty($rid)){
|
||
|
|
$room_info = db::name('room')->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];
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|