796 lines
38 KiB
PHP
796 lines
38 KiB
PHP
<?php
|
||
|
||
namespace app\api\model;
|
||
|
||
use think\Db;
|
||
use think\Log;
|
||
use think\Model;
|
||
|
||
class Friend extends Model
|
||
{
|
||
public function start_friend($user_id, $room_id){
|
||
// 判断用户是否在主持麦
|
||
$host = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => 9,'user_id' => $user_id])->find();
|
||
if(!$host){
|
||
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
|
||
}
|
||
|
||
$room_info = db::name('vs_room')->field('id,step,room_status')->where(['id' => $room_id,'room_status' =>1])->find();
|
||
if (!$room_info) {
|
||
return ['code' => 0, 'msg' => '房间不存在!', 'data' => null];
|
||
}
|
||
if($room_info['step'] == 2 || $room_info['step'] == 3){
|
||
return ['code' => 0, 'msg' => '交友正在进行中!', 'data' => null];
|
||
}
|
||
//在麦位上的用户
|
||
$pit_user = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7],'user_id' => ['<>',0]])->count();
|
||
|
||
if($pit_user >= 2) {
|
||
$data['room_id'] = $room_id;
|
||
$data['end_time'] = time() + get_system_config_value('friend_time') * 60;
|
||
$data['create_time'] = time();
|
||
$data['status'] = 1;
|
||
|
||
$id = db::name('vs_user_friending')->insertGetId($data);
|
||
|
||
if (!$id) {
|
||
return ['code' => 0, 'msg' => '操作失败!', 'data' => null];
|
||
}
|
||
//修改房间状态
|
||
db::name('vs_room')->where(['id' => $room_id])->update(['step' => 2]);
|
||
//清除房间用户的魅力
|
||
model('Room')->clear_user_charm($user_id, $room_id);
|
||
|
||
//推送给前端消息
|
||
$text['text'] = '交友开始';
|
||
$text['step'] = 2;
|
||
$text['friend_id'] = $id;
|
||
$text['end_time'] = $data['end_time'];
|
||
model('api/Chat')->sendMsg(1049,$room_id,$text);
|
||
return ['code' => 1, 'msg' => '操作成功!', 'data' => ['friend_id' => $id]];
|
||
}else{
|
||
return ['code' => 0, 'msg' => '交友麦位至少两位用户才能开始', 'data' => null];
|
||
}
|
||
}
|
||
|
||
|
||
//延时
|
||
public function delay($user_id,$room_id,$id,$delay_times){
|
||
// 判断用户是否在主持麦
|
||
$host = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => 9,'user_id' => $user_id])->find();
|
||
if(!$host){
|
||
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
|
||
}
|
||
|
||
if (!$id || !$room_id) {
|
||
return ['code' => 0, 'msg' => '参数有误!', 'data' => null];
|
||
}
|
||
if($delay_times <= 0){
|
||
$delay_times = get_system_config_value('friend_delay_times');
|
||
}
|
||
//修改结束 时间
|
||
$res = db::name('vs_user_friending')->where('id', $id)->update([
|
||
'end_time' => Db::raw('end_time + ' . ($delay_times * 60))
|
||
]);
|
||
if(!$res){
|
||
return ['code' => 0, 'msg' => '操作失败!', 'data' => null];
|
||
}
|
||
//推送延时
|
||
$text['text'] = '延时';
|
||
$text['friend_id'] = $id;
|
||
$text['end_time'] = db::name('vs_user_friending')->where('id', $id)->value('end_time');
|
||
model('api/Chat')->sendMsg(1050,$room_id,$text);
|
||
return ['code' => 1, 'msg' => '操作成功!', 'data' => null];
|
||
}
|
||
|
||
//交友结束(结束牵手良缘)
|
||
public function end_friend($user_id,$room_id,$id,$is_system = 0){
|
||
if (!$id || !$room_id) {
|
||
return ['code' => 0, 'msg' => '参数有误!', 'data' => null];
|
||
}
|
||
|
||
if($is_system == 0){
|
||
// 判断用户是否在主持麦
|
||
$host = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => 9,'user_id' => $user_id])->find();
|
||
if(!$host){
|
||
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
|
||
}
|
||
}
|
||
|
||
// 获取心动值最高的
|
||
$originalPairs = db::name('vs_user_friending_heart')
|
||
->where(['room_id'=>$room_id,'friend_id'=>$id ,'status' =>1])
|
||
->order('heart_value DESC')->find();
|
||
$friend_heart_value = get_system_config_value('friend_heart_value');
|
||
if($originalPairs && $originalPairs['heart_value'] >= $friend_heart_value){
|
||
$step = 3;//结束进入牵手良缘卡关系
|
||
//心动值达到伐值 返回用户信息与关系列表
|
||
$return['user1_id'] =$originalPairs['user1_id'];
|
||
$return['user1_avatar'] = db::name('user')->where(['id'=>$originalPairs['user1_id']])->value('avatar');
|
||
$return['user1_nickname'] = db::name('user')->where(['id'=>$originalPairs['user1_id']])->value('nickname');
|
||
$return['user2_id'] =$originalPairs['user2_id'];
|
||
$return['user2_avatar'] = db::name('user')->where(['id'=>$originalPairs['user2_id']])->value('avatar');
|
||
$return['user2_nickname'] = db::name('user')->where(['id'=>$originalPairs['user2_id']])->value('nickname');
|
||
$return['heart_value'] = $originalPairs['heart_value'];
|
||
$return['heart_id'] = $originalPairs['id'];
|
||
$room_updatatime = db::name('vs_room')->where(['id' => $room_id,'step' => $step])->value('updatetime');
|
||
if($room_updatatime){ //60秒内没操作 则创建关系无
|
||
if(time() - $room_updatatime > 60){
|
||
$this->createRelation(0,$room_id,$id,$return['user1_id'],$return['user2_id'],0);
|
||
return ['code' => 1, 'msg' => '操作成功!', 'data' => $return];
|
||
}
|
||
}else{
|
||
// 修改当前交友阶段
|
||
db::name('vs_room')->where(['id' => $room_id])->update(['step' => $step,'updatetime' => time()]);
|
||
}
|
||
}else{
|
||
$step = 1;//结束下一轮
|
||
// 修改当前交友阶段 分开写 放到前面是为了下麦
|
||
db::name('vs_room')->where(['id' => $room_id])->update(['step' => 1]);
|
||
//所有人下麦
|
||
$on_pit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7],'user_id' => ['<>',0]])->select();
|
||
if($on_pit){
|
||
foreach ($on_pit as $pit){
|
||
model('RoomPit')->DownPit($pit['user_id'], $room_id,$pit['pit_number']);
|
||
}
|
||
}
|
||
$return = null;
|
||
}
|
||
|
||
//结束交友游戏
|
||
if($step == 1){
|
||
db::name('vs_user_friending')->where(['id' => $id])->update(['status' => 2]);
|
||
}
|
||
//推送给前端消息
|
||
$text['text'] = $step == 1 ? '交友结束' : '牵手良缘';
|
||
$text['step'] = $step;//1 等待邂逅 2 心动连线 3 牵手良缘
|
||
$text['friend_user'] = $return;
|
||
$text['friend_id'] = $id;
|
||
model('api/Chat')->sendMsg(1049,$room_id,$text);
|
||
model('Room')->clear_user_charm(db::name('vs_room')->where(['id' => $room_id])->value('user_id'), $room_id);
|
||
return ['code' => 1, 'msg' => '操作成功!', 'data' => $return];
|
||
}
|
||
|
||
//心动值超过配置值 创建关系
|
||
public function createRelation($user_id,$room_id,$friend_id,$user1_id,$user2_id,$friending_config_id){
|
||
|
||
if (!$user1_id || !$user2_id || !$friend_id || !$room_id) {
|
||
return ['code' => 0, 'msg' => '参数有误!', 'data' => null];
|
||
}
|
||
|
||
$user1 = min($user1_id, $user2_id);
|
||
$user2 = max($user1_id, $user2_id);
|
||
$friending_heart = db::name('vs_user_friending_heart')
|
||
->where(['room_id'=>$room_id,'friend_id'=>$friend_id ,'user1_id' =>$user1,'user2_id' => $user2])->order('id desc')->find();
|
||
|
||
$originalPairs = db::name('vs_user_friending_heart')
|
||
->where(['id'=>$friending_heart['id']])
|
||
->update(['status' => 3,'friend_config_id' =>$friending_config_id]);
|
||
$msg = '';
|
||
if ($originalPairs) {
|
||
$relation = db::name('vs_relation')->where('id',$friending_config_id)->value('name');
|
||
if($friending_heart['heart_value'] >= get_system_config_value('friend_heart_create_room') && $friending_config_id > 0){
|
||
//创建小房间
|
||
$room_ids = model('api/Room')->user_create_room($user1,'的电影房',get_system_config_value('web_site').'/data/avatar/head_pic.png','交友房产生的一次性房间',7);
|
||
if($room_ids['code'] != 1){
|
||
$msg = 'cp电影房创建失败';
|
||
}else{
|
||
//记录小房间
|
||
$datda = [
|
||
'room_id' => $room_ids['data'],
|
||
'relation_id' => $friending_config_id,
|
||
'user_id' => $user1,
|
||
'user_id1' => $user2,
|
||
'time_day' => time() + get_system_config_value('friend_room_timea') * 60,
|
||
'createtime' => time(),
|
||
'status' => 1,
|
||
'type' => 1
|
||
];
|
||
db::name('vs_room_cp_movie')->insert($datda);
|
||
|
||
if($room_ids['data']){
|
||
$text['text'] = '交友结束并创建房间';
|
||
$text['room_id'] = $room_ids['data'];//前端用来让用户跳转的房间id
|
||
}
|
||
}
|
||
}else{
|
||
$text['text'] = '交友结束未创建房间';
|
||
}
|
||
$text['relation_name'] = $relation;
|
||
$text['user1_id'] = $user1;
|
||
$text['user2_id'] = $user2;
|
||
$text['user1_avatar'] = db::name('user')->where(['id'=>$user1])->value('avatar');
|
||
$text['user1_nickname'] = db::name('user')->where(['id'=>$user1])->value('nickname');
|
||
$text['user2_avatar'] = db::name('user')->where(['id'=>$user2])->value('avatar');
|
||
$text['user2_nickname'] = db::name('user')->where(['id'=>$user2])->value('nickname');
|
||
model('api/Chat')->sendMsg(1051,$room_id,$text);
|
||
|
||
// 修改当前交友阶段
|
||
db::name('vs_room')->where(['id' => $room_id])->update(['step' => 1]);
|
||
db::name('vs_user_friending')->where(['id' => $friend_id])->update(['status' => 2]);
|
||
//所有人下麦
|
||
$on_pit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7],'user_id' => ['<>',0]])->select();
|
||
if($on_pit){
|
||
foreach ($on_pit as $pit){
|
||
model('RoomPit')->DownPit($pit['user_id'], $room_id,$pit['pit_number']);
|
||
}
|
||
}
|
||
|
||
$shijian = floor($friending_heart['heart_value']/get_system_config_value('friend_heart_value')) * get_system_config_value('friend_heart_times');
|
||
$friendendtime = time() + $shijian * 3600;
|
||
|
||
//更新关系结束时间
|
||
db::name('vs_user_friending_heart')->where(['id'=>$friending_heart['id']])->update(['contact_end_time' => $friendendtime]);
|
||
|
||
//关系增加时间
|
||
$room_auction = model('RoomAuction')->room_auction_create_or_add($user1_id,$user2_id,$friending_config_id,$shijian*3600,0);
|
||
|
||
//推送给前端消息
|
||
$text['text'] = '交友结束';
|
||
$text['step'] = 1;//1 等待邂逅 2 心动连线 3 牵手良缘
|
||
model('api/Chat')->sendMsg(1049,$room_id,$text);
|
||
|
||
return ['code' => 1, 'msg' => '创建关系成功!'.$msg, 'data' => null];
|
||
} else {
|
||
//推送给前端消息
|
||
$text['text'] = '交友结束';
|
||
$text['step'] = 1;//1 等待邂逅 2 心动连线 3 牵手良缘
|
||
model('api/Chat')->sendMsg(1049,$room_id,$text);
|
||
db::name('vs_user_friending')->where(['id' => $friend_id])->update(['status' => 2]);
|
||
return ['code' => 0, 'msg' => '创建关系失败!', 'data' => null];
|
||
}
|
||
}
|
||
|
||
|
||
//退出私密房间
|
||
public function outRoom($user_id,$room_id){
|
||
//推送给前端消息
|
||
$text['text'] = '退出私密小屋';
|
||
model('api/Chat')->sendMsg(1055,$room_id,$text);
|
||
|
||
|
||
// //查询在房间的用户
|
||
// $users = db::name('vs_room_visitor')->where(['room_id'=>$room_id])->select();
|
||
// if($users){
|
||
// //退出房间
|
||
// foreach ($users as $v){
|
||
// //退出房间
|
||
// model('Room')->quit_room($v['user_id'], $room_id,$v['user_id']);
|
||
// }
|
||
// }else{
|
||
// model('Room')->quit_room($user_id, $room_id,$user_id);
|
||
// }
|
||
|
||
//注销房间
|
||
db::name('vs_room')->where(['id'=>$room_id])->update(['room_status'=>3]);
|
||
db::name('vs_room_cp_movie')->where(['room_id'=>$room_id])->update(['status'=>4]);
|
||
model('api/Tencent')->delete_group('room'.$room_id);
|
||
|
||
return ['code' => 1, 'msg' => '退出成功!', 'data' => null];
|
||
}
|
||
|
||
|
||
|
||
|
||
//房间内送礼
|
||
/*
|
||
* @param $uid 用户id
|
||
* @param $to_uid 接收用户id组
|
||
* @param $gift_id 礼物id
|
||
* @param $gift_num 礼物数量
|
||
* @param $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼
|
||
* @param $type 1金币购买 2送背包礼物
|
||
* @param $room_id 房间id
|
||
* @param $pit_number 坑位
|
||
*/
|
||
public function room_give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number, $heart_id,$give_gift_ext)
|
||
{
|
||
$res = model('GiveGift')->give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number,0,$give_gift_ext);
|
||
if($res['code'] != 1){
|
||
return $res;
|
||
}
|
||
|
||
//送礼成功后续操作
|
||
//查看当前时间是否在交友表的创建时间和结束时间段内 用来区分是否要拉取心动值高的用户上麦
|
||
$friend = db::name('vs_user_friending')->where(['room_id' => $room_id,'status' => 1])->order('id desc')->find();
|
||
if($friend && time() >= $friend['create_time'] && time() <= $friend['end_time']){
|
||
$heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比
|
||
$sumPrice = $res['data']['gift_total'] * $heart_exp;
|
||
$user_idd = $to_uid;
|
||
|
||
if($heart_id){//有这个值就是助力 不参加抢麦操作
|
||
db::name('vs_user_friending_heart')->where(['id' => $heart_id])->setInc('heart_value', $sumPrice);
|
||
$this->pullHeartChange($room_id,$friend['id']);//聊天室心动值变化通知
|
||
//生成新排名 判断抱上麦 还是换麦
|
||
$this->pullUserPit($room_id,$friend['id']);
|
||
}else{
|
||
//判断送礼人或收礼人里面有主持和嘉宾
|
||
$host = $this->is_host($uid,$to_uid,$room_id);
|
||
$user_idd = explode(",", $user_idd); // 将字符串转换为数组
|
||
//判断是否是主持
|
||
if($host['is_preside'] == 1){
|
||
if(!in_array($uid,$host['is_preside_user'])){//主持不是当前送礼人,那就是在收礼人中
|
||
//从数组中剔除主持人 && $is_preside_user!= UID
|
||
$user_idd = array_diff($user_idd, $host['is_preside_user']); // 从数组中移除
|
||
if($user_idd){
|
||
//插入/更新心动表
|
||
$this->addUserHeart($uid,$user_idd,$friend['id'],$sumPrice,$room_id,$res['data']['gift_user_data']);
|
||
//送礼产生心动值并计算 判断拉取用户上麦还是换麦
|
||
//生成新排名 判断抱上麦 还是换麦
|
||
$this->pullUserPit($room_id,$friend['id']);
|
||
}
|
||
}
|
||
}else{
|
||
//插入/更新心动表
|
||
$this->addUserHeart($uid,$user_idd,$friend['id'],$sumPrice,$room_id,$res['data']['gift_user_data']);
|
||
//送礼产生心动值并计算 判断拉取用户上麦还是换麦
|
||
//生成新排名 判断抱上麦 还是换麦
|
||
$this->pullUserPit($room_id,$friend['id']);
|
||
}
|
||
}
|
||
}
|
||
return ['code' => 1, 'msg' => '送礼成功', 'data' => null];
|
||
}
|
||
|
||
//是否主持
|
||
public function is_host($uid,$to_uid,$room_id){
|
||
//获取当前主持人和嘉宾
|
||
$host[] = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 9])->value('user_id');
|
||
$host[] = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 10])->value('user_id');
|
||
|
||
$is_preside_user = [];
|
||
$is_preside = 0;
|
||
$user_ids = explode(",", $to_uid);
|
||
foreach ($user_ids as $value) {
|
||
//判断收礼人是否是主持
|
||
if (in_array($value, $host)) {
|
||
$is_preside = 1;
|
||
$is_preside_user[] = $value;
|
||
}
|
||
}
|
||
//送礼人是主持或嘉宾
|
||
if (in_array($uid, $host)) {
|
||
$is_preside = 1;
|
||
$is_preside_user[] = $uid;
|
||
}
|
||
return ['is_preside' =>$is_preside,'is_preside_user' => $is_preside_user];
|
||
}
|
||
|
||
function pullHeartChange($room_id,$friend_id){
|
||
//聊天室心动值变化通知
|
||
$newRanking = $this->getRanking($room_id,$friend_id);
|
||
//心动值和心动表id
|
||
if(!isset($newRanking[0]['heart_value']) || $newRanking[0]['heart_value'] <= 0){
|
||
$heart1 = -1;
|
||
$heartId1 = -1;
|
||
}else{
|
||
$heart1 = $newRanking[0]['heart_value'];
|
||
$heartId1 = $newRanking[0]['id'];
|
||
}
|
||
if(!isset($newRanking[1]['heart_value']) || $newRanking[1]['heart_value'] <= 0){
|
||
$heart2 = -1;
|
||
$heartId2 = -1;
|
||
}else{
|
||
$heart2 = $newRanking[1]['heart_value'];
|
||
$heartId2 = $newRanking[1]['id'];
|
||
}
|
||
if(!isset($newRanking[2]['heart_value']) || $newRanking[2]['heart_value'] <= 0){
|
||
$heart3 = -1;
|
||
$heartId3 = -1;
|
||
}else{
|
||
$heart3 = $newRanking[2]['heart_value'];
|
||
$heartId3 = $newRanking[2]['id'];
|
||
}
|
||
$heart[0] = [
|
||
"heartNum" => $heart1,
|
||
"heartId" => $heartId1,
|
||
];
|
||
$heart[1] = [
|
||
"heartNum" => $heart2,
|
||
"heartId" => $heartId2,
|
||
];
|
||
$heart[2] = [
|
||
"heartNum" => $heart3,
|
||
"heartId" => $heartId3,
|
||
];
|
||
|
||
// $push = new Push(0, $this->room_id); //实例化推送类
|
||
// $push->heartChatRoom($heart);
|
||
//推送给前端消息
|
||
$text['text'] = '心动值变化通知';
|
||
$text['list'] = $heart;
|
||
model('api/Chat')->sendMsg(1054,$room_id,$text);
|
||
return $heart;
|
||
}
|
||
|
||
// 获取心跳值排行
|
||
public function getRanking($room_id,$friend_id) {
|
||
// 获取有心动值的用户对且不重复
|
||
$originalPairs = db::name('vs_user_friending_heart')
|
||
->where(['room_id'=>$room_id,'friend_id'=>$friend_id])
|
||
->order('heart_value DESC')->select();
|
||
// 初始化排名数组和已使用用户数组
|
||
$ranking = [];
|
||
$usedUsers = [];
|
||
// 优先选择高价值且无重复用户的对
|
||
$heart_ids = [];
|
||
foreach ($originalPairs as &$rel) {
|
||
// 检查当前用户对是否包含已使用的用户ID
|
||
if (!in_array($rel['user1_id'], $usedUsers) &&
|
||
!in_array($rel['user2_id'], $usedUsers)) {
|
||
// 将符合条件的用户对添加到排名列表中
|
||
$ranking[] = [
|
||
'heart_value' => $rel['heart_value'],
|
||
'id' => $rel['id'],
|
||
'user1_id' => $rel['user1_id'],
|
||
'user2_id' => $rel['user2_id'],
|
||
];
|
||
// 更新已使用用户列表
|
||
$usedUsers = array_merge($usedUsers, [$rel['user1_id'], $rel['user2_id']]);
|
||
$heart_ids[] = $rel['id'];
|
||
// 如果排名列表达到3对用户,则停止循环
|
||
if (count($ranking) >= 3) break;
|
||
}
|
||
}
|
||
$ranking1 = [];
|
||
$ranking2 = [];
|
||
if(count($ranking)<3){
|
||
$make_up_num = 3 - count($ranking);
|
||
$ranking_make_up = db::name('vs_user_friending_heart')
|
||
->where(['room_id'=>$room_id,'friend_id'=>$friend_id ,'id'=> ['notin',$heart_ids]])
|
||
->limit($make_up_num)
|
||
->order('heart_value DESC')->select();
|
||
foreach ($ranking_make_up as $rel1) {
|
||
// 如果两个用户都已使用,跳过这条记录
|
||
if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){
|
||
continue;
|
||
}
|
||
|
||
// 如果只有user1已使用,将user2加入排名
|
||
if(in_array($rel1['user1_id'], $usedUsers)){
|
||
$ranking1[] = [
|
||
'heart_value' => 0,
|
||
'id' => $rel1['id'],
|
||
'user1_id' => -1,
|
||
'user2_id' => $rel1['user2_id'],
|
||
];
|
||
$usedUsers[] = $rel1['user2_id'];
|
||
$heart_ids[] = $rel1['id'];
|
||
}
|
||
// 如果只有user2已使用,将user1加入排名
|
||
elseif(in_array($rel1['user2_id'], $usedUsers)){
|
||
$ranking1[] = [
|
||
'heart_value' => 0,
|
||
'id' => $rel1['id'],
|
||
'user1_id' => $rel1['user1_id'],
|
||
'user2_id' => -1,
|
||
];
|
||
$usedUsers[] = $rel1['user1_id'];
|
||
$heart_ids[] = $rel1['id'];
|
||
}
|
||
}
|
||
|
||
}
|
||
// 返回最终的排名列表
|
||
$ranking_rut = array_merge($ranking, $ranking1);
|
||
$nnum = count($ranking)*2 + count($ranking1);
|
||
if($nnum<6){
|
||
$make_up_num = 6 - $nnum;
|
||
$ranking_make_up = db::name('vs_user_friending_heart')
|
||
->where(array('room_id'=>$room_id,'friend_id'=>$friend_id ,'id'=>array('notin',$heart_ids)))
|
||
->limit($make_up_num)
|
||
->order('heart_value DESC')->select();
|
||
if($ranking_make_up){
|
||
foreach ($ranking_make_up as $rel1) {
|
||
if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){
|
||
continue;
|
||
}
|
||
if(in_array($rel1['user1_id'], $usedUsers)){
|
||
$ranking2[] = [
|
||
'heart_value' => 0,
|
||
'id' => $rel1['id'],
|
||
'user1_id' => -1,
|
||
'user2_id' => $rel1['user2_id'],
|
||
];
|
||
$usedUsers[] = $rel1['user2_id'];
|
||
}
|
||
if(in_array($rel1['user2_id'], $usedUsers)){
|
||
$ranking2[] = [
|
||
'heart_value' => 0,
|
||
'id' => $rel1['id'],
|
||
'user1_id' => $rel1['user1_id'],
|
||
'user2_id' => -1,
|
||
];
|
||
$usedUsers[] = $rel1['user1_id'];
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
return array_merge($ranking_rut, $ranking2);
|
||
}
|
||
|
||
|
||
//抱上麦 还是换麦
|
||
public function pullUserPit($room_id,$friend_id){
|
||
$friendPlayPit = $this->friendPlayPit($room_id,$friend_id); // 获取实际应该对应的麦位
|
||
$this->changePitToPosPair($room_id,$friendPlayPit);//换麦,上下麦
|
||
$this->pullHeartChange($room_id,$friend_id);//聊天室心动值变化通知
|
||
}
|
||
|
||
//交友处理麦位排名
|
||
public function friendPlayPit($room_id,$friend_id){
|
||
//查询当前交友心动值表
|
||
$heart_data = $this->getRanking($room_id,$friend_id);
|
||
//数组根据里面的heart_value 由大到小进行排序
|
||
usort($heart_data, function($a, $b) {
|
||
return $b['heart_value'] - $a['heart_value'];
|
||
});
|
||
$pit = [];
|
||
$pit_number_array = [2=>5,1=>6,3=>4,5=>2,6=>1,4=>3]; //麦位对应关系
|
||
$pit_number_array_reverse = [0=>2,1=>1,2=>3,3=>4,4=>5,5=>6];
|
||
if($heart_data){
|
||
//排麦位
|
||
$pit_unique = [];
|
||
$key = 0;
|
||
foreach($heart_data as $value) {
|
||
if(count($pit) >= 6){
|
||
break;
|
||
}
|
||
|
||
// 处理两个用户都存在的情况
|
||
if($value['user1_id'] != -1 && $value['user2_id'] != -1){
|
||
if(!in_array($value['user1_id'],$pit_unique)){
|
||
// 检查目标麦位是否已被占用
|
||
if(!isset($pit[$pit_number_array_reverse[$key]])) {
|
||
$pit[$pit_number_array_reverse[$key]] = $value['user1_id'];
|
||
$pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user2_id'];
|
||
$pit_unique = array_merge($pit_unique, [$value['user1_id'], $value['user2_id']]);
|
||
}
|
||
}
|
||
}
|
||
// 处理只有user2存在的情况
|
||
elseif($value['user1_id'] == -1 && !in_array($value['user2_id'],$pit_unique)){
|
||
// 检查该键是否已被使用
|
||
if(!isset($pit[$pit_number_array_reverse[$key]])) {
|
||
$pit[$pit_number_array_reverse[$key]] = $value['user2_id'];
|
||
$pit_unique[] = $value['user2_id'];
|
||
}
|
||
}
|
||
// 处理只有user1存在的情况
|
||
elseif($value['user2_id'] == -1 && !in_array($value['user1_id'],$pit_unique)){
|
||
// 检查该键是否已被使用
|
||
if(!isset($pit[$pit_number_array_reverse[$key]])) {
|
||
$pit[$pit_number_array_reverse[$key]] = $value['user1_id'];
|
||
$pit_unique[] = $value['user1_id'];
|
||
}
|
||
}
|
||
$key++;
|
||
}
|
||
}
|
||
return $pit;
|
||
}
|
||
|
||
|
||
|
||
//换麦
|
||
public function changePitToPosPairs($room_id,$friendPlayPit){
|
||
$now_pit_u = array_flip($friendPlayPit);
|
||
//按照键值排序数组
|
||
ksort($now_pit_u);
|
||
//查询现在麦位上有用户的数据 并且重组结果,键为麦位,值为用户,值必须存在,没值则不展示
|
||
$pit_user = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7],'user_id' => ['>', 0]])
|
||
->order('pit_number ASC')
|
||
->column('pit_number,user_id');
|
||
//比较两个数组,无论是键的差异还是值的差异,都输出字符串”有差异“否则输出”没有差异“
|
||
$result = array_diff_assoc($pit_user, $now_pit_u);
|
||
$result2 = array_diff_assoc($now_pit_u, $pit_user);
|
||
if(!empty($result) || !empty($result2)){
|
||
// var_dump('有差异');
|
||
//获取实际麦位上的用
|
||
$newPitUser = array_keys($friendPlayPit);
|
||
//获取当前麦位上的用户
|
||
$oldPitUser = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7]])->column('user_id');
|
||
//获取交集
|
||
$intersection = array_intersect($newPitUser,$oldPitUser);
|
||
//取差集
|
||
$diff = array_diff($newPitUser,$oldPitUser);
|
||
$changeData = [];
|
||
if($diff){
|
||
//推下麦
|
||
foreach($diff as $key => $value){
|
||
if(in_array($value,$oldPitUser)){
|
||
//查询当前空麦位
|
||
$pit_null = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]);
|
||
if($pit_null){
|
||
// $this->room_pit_model->getOnPit($this->room_id, $value, $pit_null);
|
||
model('api/RoomPit')->OnPit($value, $room_id, $pit_null);
|
||
// db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $pit_null])->update(['user_id' => $value]);
|
||
}else{
|
||
//下麦
|
||
$UserRoomPit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $value])->value('pit_number');
|
||
model('api/RoomPit')->DownPit($value, $room_id, $UserRoomPit);
|
||
}
|
||
}
|
||
|
||
if(in_array($value,$newPitUser)){
|
||
//推上麦
|
||
//获取目标麦位是否有人
|
||
$getRoomPitUser= db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $friendPlayPit[$value]])->value('user_id');
|
||
if($getRoomPitUser){
|
||
//查询当前空麦位
|
||
$getRoomNullPitss = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10,$friendPlayPit[$value]]);
|
||
if($getRoomNullPitss){
|
||
// $this->room_pit_model->getOnPit($this->room_id, $getRoomPitUser, $getRoomNullPitss);
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $getRoomNullPitss])->update(['user_id' => $getRoomPitUser]);
|
||
}else{
|
||
model('api/RoomPit')->DownPit($getRoomPitUser, $room_id, $friendPlayPit[$value]);
|
||
}
|
||
}
|
||
model('api/RoomPit')->OnPit($value, $room_id, $friendPlayPit[$value]);
|
||
}
|
||
}
|
||
}
|
||
if($intersection){//交换麦位
|
||
//查询麦上的用户
|
||
$newPitUserStr = implode(',',$newPitUser);
|
||
$getRoomPit = db::name('vs_room_pit')->where("room_id=".$room_id." AND user_id in (".$newPitUserStr.")")->column('pit_number');
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['in', $getRoomPit]])->update(['user_id' => 0]);
|
||
$changePitUser = [];
|
||
foreach ($friendPlayPit as $key => $value){
|
||
if(empty($value)){
|
||
$value = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]);
|
||
}
|
||
//获取目标麦位是否有人
|
||
$isPitHaveUser= db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $value])->value('user_id');
|
||
if($isPitHaveUser && !in_array($isPitHaveUser,$newPitUser)){
|
||
$changePitUser[$key]['user_id'] = $isPitHaveUser;
|
||
$changePitUser[$key]['pit_number'] = $value;
|
||
}
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $value])->update(['user_id' => $key]);
|
||
}
|
||
//处理原麦位上的用户
|
||
foreach ($changePitUser as $key_change => $value_change){
|
||
//判断是否在左边 1,,2,,3 麦位上
|
||
if(in_array($value_change['pit_number'],[1,2,3])){
|
||
$null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [4,5,6,7,8,9,10]);
|
||
if(empty($null_pit)){
|
||
$null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]);
|
||
}
|
||
}else{
|
||
$null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [1,2,3,7,8,9,10]);
|
||
if(empty($null_pit)){
|
||
$null_pit = model('api/RoomPit')->getRoomNullPitWithout($room_id, [7,8,9,10]);
|
||
}
|
||
}
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $null_pit])->update(['user_id' => $value_change['user_id']]);
|
||
}
|
||
// $getRoomNullPit = $this->room_pit_model->where(['room_id'=>$room_id,'pit_number'=>['notin',[7,9]]])->select();
|
||
$getRoomNullPit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7]])->select();
|
||
$data_users = [];
|
||
foreach($getRoomNullPit as $key_data => $value_data){
|
||
$data_users[$key_data]['user_id'] = $value_data['user_id'];
|
||
$data_users[$key_data]['nickname'] = db::name('user')->where('id',$value_data['user_id'])->value('nickname');
|
||
$data_users[$key_data]['avatar'] = db::name('user')->where('id',$value_data['user_id'])->value('avatar');
|
||
$data_users[$key_data]['sex'] = db::name('user')->where('id',$value_data['user_id'])->value('sex');
|
||
//获取用户在此房间今天的魅力值
|
||
$charm =[];
|
||
if($value_data['user_id']){
|
||
$charm = db::name('vs_room_user_charm')->where(['user_id' => $value_data['user_id'],'room_id' => $room_id])->value('charm');
|
||
}
|
||
$data_users[$key_data]['dress'] = model('Decorate')->user_decorate_detail($value_data['user_id'],1);
|
||
$data_users[$key_data]['charm'] = $charm??0;
|
||
$data_users[$key_data]['pit_number'] = $value_data['pit_number'];
|
||
}
|
||
//推送给前端消息
|
||
$text['text'] = '房间换麦位';
|
||
$text['list'] = $data_users;
|
||
model('api/Chat')->sendMsg(1053,$room_id,$text);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
//换麦
|
||
public function changePitToPosPair($room_id,$friendPlayPit){
|
||
$new_pit_u = $friendPlayPit;
|
||
//按照键值排序数组
|
||
ksort($new_pit_u);
|
||
//查询原有麦位上有用户的数据 并且重组结果,键为麦位,值为用户,值必须存在,没值则不展示
|
||
$pit_users = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7],'user_id' => ['>', 0]])
|
||
->order('pit_number ASC')
|
||
->field('pit_number,user_id')->select();
|
||
$pit_user = [];
|
||
foreach ($pit_users as $value_pit_user){
|
||
$pit_user[$value_pit_user['pit_number']] = $value_pit_user['user_id'];
|
||
}
|
||
//比较两个数组,无论是键的差异还是值的差异,都输出字符串”有差异“否则输出”没有差异“
|
||
$result = array_diff_assoc($pit_user, $new_pit_u);//第一个数组中存在但其他数组中不存在的键/值对
|
||
$result2 = array_diff_assoc($new_pit_u, $pit_user);
|
||
if(!empty($result) || !empty($result2)){//换麦
|
||
if($result){//原有麦位上的用户,且不在新麦位上的用户
|
||
foreach ($result as $key_result => $value_result){
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $key_result])->update(['user_id' => 0]);
|
||
}
|
||
}
|
||
//新麦位上的用户
|
||
foreach ($new_pit_u as $key_result2 => $value_result2){
|
||
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $key_result2])->update(['user_id' => $value_result2]);
|
||
}
|
||
|
||
$getRoomNullPit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',7]])->select();
|
||
$data_users = [];
|
||
foreach($getRoomNullPit as $key_data => $value_data){
|
||
$data_users[$key_data]['user_id'] = $value_data['user_id'];
|
||
$data_users[$key_data]['nickname'] = db::name('user')->where('id',$value_data['user_id'])->value('nickname');
|
||
$data_users[$key_data]['avatar'] = db::name('user')->where('id',$value_data['user_id'])->value('avatar');
|
||
$data_users[$key_data]['sex'] = db::name('user')->where('id',$value_data['user_id'])->value('sex');
|
||
//获取用户在此房间今天的魅力值
|
||
$charm =[];
|
||
if($value_data['user_id']){
|
||
$charm = db::name('vs_room_user_charm')->where(['user_id' => $value_data['user_id'],'room_id' => $room_id])->value('charm');
|
||
}
|
||
$data_users[$key_data]['dress'] = model('Decorate')->user_decorate_detail($value_data['user_id'],1);
|
||
$data_users[$key_data]['charm'] = $charm??0;
|
||
$data_users[$key_data]['pit_number'] = $value_data['pit_number'];
|
||
}
|
||
//推送给前端消息
|
||
$text['text'] = '房间换麦位';
|
||
$text['list'] = $data_users;
|
||
model('api/Chat')->sendMsg(1053,$room_id,$text);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//交友厅游戏开始后送礼后一系列操作
|
||
//插入/更新心动表
|
||
public function addUserHeart($uid,$user_id,$friend_id,$value,$room_id,$user_data){
|
||
//给多个用户送礼
|
||
//数组重组 下标从0开始
|
||
$user_ids = array_values($user_id);
|
||
// $heart_value = $value;//心动值
|
||
$heart_value = 0;
|
||
$heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比
|
||
for ($i = 0; $i < count($user_ids); $i++) {
|
||
foreach ($user_data as $cv){
|
||
if($user_ids[$i] == $cv['user_id']){
|
||
$heart_value = $cv['gift_price'] * $heart_exp;
|
||
}
|
||
}
|
||
// 处理用户ID顺序
|
||
$user1 = min($uid, $user_ids[$i]);
|
||
$user2 = max($uid, $user_ids[$i]);
|
||
// 更新心动关系表
|
||
$relation = db::name('vs_user_friending_heart')->where([
|
||
'user1_id' => $user1,
|
||
'user2_id' => $user2,
|
||
'friend_id' => $friend_id
|
||
])->find();
|
||
|
||
if ($relation) {
|
||
db::name('vs_user_friending_heart')->where([
|
||
'room_id' => $room_id,
|
||
'user1_id' => $user1,
|
||
'user2_id' => $user2,
|
||
'friend_id' => $friend_id
|
||
])->setInc('heart_value', $heart_value);
|
||
} else {
|
||
$relation['id'] = db::name('vs_user_friending_heart')->insert([
|
||
'room_id' => $room_id,
|
||
'user1_id' => $user1,
|
||
'user2_id' => $user2,
|
||
'friend_id' => $friend_id,
|
||
'heart_value' => $heart_value
|
||
]);
|
||
}
|
||
}
|
||
//修改用户心动连线状态
|
||
// $relation = db::name('vs_user_friending_heart')->where("(user1_id=".$uid." OR user2_id=".$uid.") AND friend_id=$friend_id AND room_id=$room_id AND status!=3")->order('heart_value desc')->find();
|
||
// if($relation){
|
||
// db::name('vs_user_friending_heart')->where("(user1_id=".$uid." OR user2_id=".$uid.") AND friend_id=$friend_id AND room_id=$room_id AND status!=3")->update(['status'=>2]);
|
||
// db::name('vs_user_friending_heart')->where(['id'=>$relation['id']])->update(['status'=>1]);
|
||
// }
|
||
|
||
}
|
||
} |