Files
mier-php/application/api/model/UserTencent.php

456 lines
17 KiB
PHP
Raw Normal View History

2025-08-11 10:22:05 +08:00
<?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];
}
}