Files
midi-php/application/api/model/Friend.php

796 lines
38 KiB
PHP
Raw Normal View History

2025-08-16 11:29:29 +08:00
<?php
namespace app\api\model;
2025-08-16 18:48:10 +08:00
use think\Db;
2025-08-30 09:15:05 +08:00
use think\Log;
2025-08-16 11:29:29 +08:00
use think\Model;
class Friend extends Model
{
2025-08-16 18:48:10 +08:00
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;
2025-08-21 11:56:38 +08:00
$data['create_time'] = time();
2025-08-16 18:48:10 +08:00
$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]);
2025-09-10 18:51:31 +08:00
//清除房间用户的魅力
model('Room')->clear_user_charm($user_id, $room_id);
2025-08-16 18:48:10 +08:00
//推送给前端消息
2025-08-16 19:04:30 +08:00
$text['text'] = '交友开始';
2025-08-16 18:48:10 +08:00
$text['step'] = 2;
2025-08-19 10:20:04 +08:00
$text['friend_id'] = $id;
2025-08-21 09:18:58 +08:00
$text['end_time'] = $data['end_time'];
2025-08-20 15:15:47 +08:00
model('api/Chat')->sendMsg(1049,$room_id,$text);
2025-08-16 18:48:10 +08:00
return ['code' => 1, 'msg' => '操作成功!', 'data' => ['friend_id' => $id]];
}else{
2025-09-02 09:37:12 +08:00
return ['code' => 0, 'msg' => '交友麦位至少两位用户才能开始', 'data' => null];
2025-08-16 18:48:10 +08:00
}
}
//延时
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];
}
2025-08-21 11:56:38 +08:00
if (!$id || !$room_id) {
2025-08-16 18:48:10 +08:00
return ['code' => 0, 'msg' => '参数有误!', 'data' => null];
}
2025-08-21 11:56:38 +08:00
if($delay_times <= 0){
$delay_times = get_system_config_value('friend_delay_times');
}
2025-08-16 18:48:10 +08:00
//修改结束 时间
2025-08-21 12:03:04 +08:00
$res = db::name('vs_user_friending')->where('id', $id)->update([
'end_time' => Db::raw('end_time + ' . ($delay_times * 60))
]);
2025-08-16 18:48:10 +08:00
if(!$res){
return ['code' => 0, 'msg' => '操作失败!', 'data' => null];
}
//推送延时
$text['text'] = '延时';
2025-08-22 10:37:00 +08:00
$text['friend_id'] = $id;
2025-08-16 18:48:10 +08:00
$text['end_time'] = db::name('vs_user_friending')->where('id', $id)->value('end_time');
2025-08-20 15:15:47 +08:00
model('api/Chat')->sendMsg(1050,$room_id,$text);
2025-08-16 18:48:10 +08:00
return ['code' => 1, 'msg' => '操作成功!', 'data' => null];
}
//交友结束(结束牵手良缘)
public function end_friend($user_id,$room_id,$id,$is_system = 0){
2025-08-16 18:48:10 +08:00
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];
}
}
2025-08-16 18:48:10 +08:00
// 获取心动值最高的
2025-08-20 10:17:10 +08:00
$originalPairs = db::name('vs_user_friending_heart')
2025-08-16 18:48:10 +08:00
->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'];
2025-09-10 19:58:44 +08:00
$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);
2025-09-10 20:18:26 +08:00
return ['code' => 1, 'msg' => '操作成功!', 'data' => $return];
2025-09-10 19:58:44 +08:00
}
}else{
// 修改当前交友阶段
db::name('vs_room')->where(['id' => $room_id])->update(['step' => $step,'updatetime' => time()]);
2025-09-10 17:46:15 +08:00
}
2025-08-16 18:48:10 +08:00
}else{
$step = 1;//结束下一轮
2025-08-22 18:02:24 +08:00
// 修改当前交友阶段 分开写 放到前面是为了下麦
2025-09-10 20:18:26 +08:00
db::name('vs_room')->where(['id' => $room_id])->update(['step' => 1]);
2025-08-16 18:48:10 +08:00
//所有人下麦
$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;
2025-08-16 18:48:10 +08:00
}
//结束交友游戏
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;
2025-08-22 10:37:00 +08:00
$text['friend_id'] = $id;
2025-08-20 15:15:47 +08:00
model('api/Chat')->sendMsg(1049,$room_id,$text);
2025-08-30 09:56:56 +08:00
model('Room')->clear_user_charm(db::name('vs_room')->where(['id' => $room_id])->value('user_id'), $room_id);
2025-08-16 18:48:10 +08:00
return ['code' => 1, 'msg' => '操作成功!', 'data' => $return];
}
//心动值超过配置值 创建关系
public function createRelation($user_id,$room_id,$friend_id,$user1_id,$user2_id,$friending_config_id){
2025-09-10 17:46:15 +08:00
if (!$user1_id || !$user2_id || !$friend_id || !$room_id) {
2025-08-16 18:48:10 +08:00
return ['code' => 0, 'msg' => '参数有误!', 'data' => null];
}
$user1 = min($user1_id, $user2_id);
$user2 = max($user1_id, $user2_id);
2025-08-20 10:17:10 +08:00
$friending_heart = db::name('vs_user_friending_heart')
2025-08-21 10:56:23 +08:00
->where(['room_id'=>$room_id,'friend_id'=>$friend_id ,'user1_id' =>$user1,'user2_id' => $user2])->order('id desc')->find();
2025-09-10 16:40:55 +08:00
2025-08-20 10:17:10 +08:00
$originalPairs = db::name('vs_user_friending_heart')
2025-08-16 18:48:10 +08:00
->where(['id'=>$friending_heart['id']])
2025-08-21 10:56:23 +08:00
->update(['status' => 3,'friend_config_id' =>$friending_config_id]);
$msg = '';
2025-08-16 18:48:10 +08:00
if ($originalPairs) {
$relation = db::name('vs_relation')->where('id',$friending_config_id)->value('name');
2025-09-01 23:21:43 +08:00
if($friending_heart['heart_value'] >= get_system_config_value('friend_heart_create_room') && $friending_config_id > 0){
2025-08-16 18:48:10 +08:00
//创建小房间
2025-08-25 09:51:32 +08:00
$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
}
2025-08-16 18:48:10 +08:00
}
}else{
$text['text'] = '交友结束未创建房间';
}
2025-09-15 19:42:31 +08:00
$text['relation_name'] = $relation;
2025-09-15 19:40:47 +08:00
$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);
2025-08-16 18:48:10 +08:00
// 修改当前交友阶段
2025-09-10 20:18:26 +08:00
db::name('vs_room')->where(['id' => $room_id])->update(['step' => 1]);
2025-09-10 16:40:55 +08:00
db::name('vs_user_friending')->where(['id' => $friend_id])->update(['status' => 2]);
2025-08-16 18:48:10 +08:00
//所有人下麦
$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;
//更新关系结束时间
2025-08-20 10:17:10 +08:00
db::name('vs_user_friending_heart')->where(['id'=>$friending_heart['id']])->update(['contact_end_time' => $friendendtime]);
2025-08-16 18:48:10 +08:00
//关系增加时间
$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 牵手良缘
2025-08-20 15:15:47 +08:00
model('api/Chat')->sendMsg(1049,$room_id,$text);
2025-09-10 16:40:55 +08:00
return ['code' => 1, 'msg' => '创建关系成功!'.$msg, 'data' => null];
2025-08-16 18:48:10 +08:00
} else {
2025-08-25 16:19:46 +08:00
//推送给前端消息
$text['text'] = '交友结束';
$text['step'] = 1;//1 等待邂逅 2 心动连线 3 牵手良缘
model('api/Chat')->sendMsg(1049,$room_id,$text);
2025-09-10 16:40:55 +08:00
db::name('vs_user_friending')->where(['id' => $friend_id])->update(['status' => 2]);
2025-08-16 18:48:10 +08:00
return ['code' => 0, 'msg' => '创建关系失败!', 'data' => null];
}
}
//退出私密房间
public function outRoom($user_id,$room_id){
2025-08-22 15:18:36 +08:00
//推送给前端消息
$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);
// }
2025-08-16 18:48:10 +08:00
//注销房间
db::name('vs_room')->where(['id'=>$room_id])->update(['room_status'=>3]);
2025-08-25 15:52:32 +08:00
db::name('vs_room_cp_movie')->where(['room_id'=>$room_id])->update(['status'=>4]);
2025-08-25 16:13:18 +08:00
model('api/Tencent')->delete_group('room'.$room_id);
2025-08-16 18:48:10 +08:00
return ['code' => 1, 'msg' => '退出成功!', 'data' => null];
}
2025-08-16 11:29:29 +08:00
//房间内送礼
/*
* @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)
2025-08-16 11:29:29 +08:00
{
$res = model('GiveGift')->give_gift($uid, $to_uid, $gift_id, $gift_num, $from_type, $type, $room_id, $pit_number,$give_gift_ext);
2025-08-16 11:29:29 +08:00
if($res['code'] != 1){
return $res;
}
2025-08-30 09:31:57 +08:00
2025-08-16 11:29:29 +08:00
//送礼成功后续操作
2025-08-18 16:33:01 +08:00
//查看当前时间是否在交友表的创建时间和结束时间段内 用来区分是否要拉取心动值高的用户上麦
2025-08-21 11:56:38 +08:00
$friend = db::name('vs_user_friending')->where(['room_id' => $room_id,'status' => 1])->order('id desc')->find();
2025-08-26 15:07:18 +08:00
if($friend && time() >= $friend['create_time'] && time() <= $friend['end_time']){
2025-08-18 16:33:01 +08:00
$heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比
$sumPrice = $res['data']['gift_total'] * $heart_exp;
$user_idd = $to_uid;
if($heart_id){//有这个值就是助力 不参加抢麦操作
2025-08-20 10:17:10 +08:00
db::name('vs_user_friending_heart')->where(['id' => $heart_id])->setInc('heart_value', $sumPrice);
2025-08-18 16:33:01 +08:00
$this->pullHeartChange($room_id,$friend['id']);//聊天室心动值变化通知
//生成新排名 判断抱上麦 还是换麦
$this->pullUserPit($room_id,$friend['id']);
}else{
//判断送礼人或收礼人里面有主持和嘉宾
$host = $this->is_host($uid,$to_uid,$room_id);
2025-08-30 10:07:12 +08:00
$user_idd = explode(",", $user_idd); // 将字符串转换为数组
2025-08-18 16:33:01 +08:00
//判断是否是主持
if($host['is_preside'] == 1){
if(!in_array($uid,$host['is_preside_user'])){//主持不是当前送礼人,那就是在收礼人中
//从数组中剔除主持人 && $is_preside_user!= UID
2025-08-30 09:31:57 +08:00
$user_idd = array_diff($user_idd, $host['is_preside_user']); // 从数组中移除
2025-08-18 16:33:01 +08:00
if($user_idd){
//插入/更新心动表
2025-08-30 09:46:55 +08:00
$this->addUserHeart($uid,$user_idd,$friend['id'],$sumPrice,$room_id,$res['data']['gift_user_data']);
2025-08-18 16:33:01 +08:00
//送礼产生心动值并计算 判断拉取用户上麦还是换麦
//生成新排名 判断抱上麦 还是换麦
$this->pullUserPit($room_id,$friend['id']);
}
}
}else{
//插入/更新心动表
2025-08-29 19:36:34 +08:00
$this->addUserHeart($uid,$user_idd,$friend['id'],$sumPrice,$room_id,$res['data']['gift_user_data']);
2025-08-18 16:33:01 +08:00
//送礼产生心动值并计算 判断拉取用户上麦还是换麦
//生成新排名 判断抱上麦 还是换麦
$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');
2025-08-29 18:41:24 +08:00
$is_preside_user = [];
2025-08-18 16:33:01 +08:00
$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;
}
2025-08-21 15:05:10 +08:00
return ['is_preside' =>$is_preside,'is_preside_user' => $is_preside_user];
2025-08-18 16:33:01 +08:00
}
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;
2025-08-21 11:15:53 +08:00
model('api/Chat')->sendMsg(1054,$room_id,$text);
2025-09-05 19:44:15 +08:00
return $heart;
2025-08-18 16:33:01 +08:00
}
// 获取心跳值排行
public function getRanking($room_id,$friend_id) {
// 获取有心动值的用户对且不重复
2025-08-20 10:17:10 +08:00
$originalPairs = db::name('vs_user_friending_heart')
2025-09-15 21:16:53 +08:00
->where(['room_id'=>$room_id,'friend_id'=>$friend_id])
2025-08-18 16:33:01 +08:00
->order('heart_value DESC')->select();
// 初始化排名数组和已使用用户数组
$ranking = [];
$usedUsers = [];
// 优先选择高价值且无重复用户的对
$heart_ids = [];
2025-09-15 22:51:48 +08:00
foreach ($originalPairs as &$rel) {
2025-08-18 16:33:01 +08:00
// 检查当前用户对是否包含已使用的用户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);
2025-08-20 10:17:10 +08:00
$ranking_make_up = db::name('vs_user_friending_heart')
2025-08-18 16:33:01 +08:00
->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) {
2025-09-15 22:51:48 +08:00
// 如果两个用户都已使用,跳过这条记录
2025-08-18 16:33:01 +08:00
if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){
continue;
}
2025-09-15 22:51:48 +08:00
// 如果只有user1已使用将user2加入排名
2025-08-18 16:33:01 +08:00
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'];
2025-09-15 22:51:48 +08:00
$heart_ids[] = $rel1['id'];
2025-08-18 16:33:01 +08:00
}
2025-09-15 22:51:48 +08:00
// 如果只有user2已使用将user1加入排名
elseif(in_array($rel1['user2_id'], $usedUsers)){
2025-08-18 16:33:01 +08:00
$ranking1[] = [
'heart_value' => 0,
'id' => $rel1['id'],
'user1_id' => $rel1['user1_id'],
'user2_id' => -1,
];
$usedUsers[] = $rel1['user1_id'];
2025-09-15 22:51:48 +08:00
$heart_ids[] = $rel1['id'];
2025-08-18 16:33:01 +08:00
}
}
2025-09-15 22:51:48 +08:00
2025-08-18 16:33:01 +08:00
}
// 返回最终的排名列表
$ranking_rut = array_merge($ranking, $ranking1);
2025-09-10 19:30:15 +08:00
$nnum = count($ranking)*2 + count($ranking1);
if($nnum<6){
$make_up_num = 6 - $nnum;
2025-08-20 10:17:10 +08:00
$ranking_make_up = db::name('vs_user_friending_heart')
2025-08-18 16:33:01 +08:00
->where(array('room_id'=>$room_id,'friend_id'=>$friend_id ,'id'=>array('notin',$heart_ids)))
->limit($make_up_num)
->order('heart_value DESC')->select();
2025-08-29 19:08:43 +08:00
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'];
}
2025-08-18 16:33:01 +08:00
}
}
2025-08-29 19:08:43 +08:00
2025-08-18 16:33:01 +08:00
}
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);
2025-09-15 21:16:53 +08:00
//数组根据里面的heart_value 由大到小进行排序
usort($heart_data, function($a, $b) {
return $b['heart_value'] - $a['heart_value'];
});
2025-08-18 16:33:01 +08:00
$pit = [];
$pit_number_array = [2=>5,1=>6,3=>4,5=>2,6=>1,4=>3]; //麦位对应关系
2025-08-29 18:41:24 +08:00
$pit_number_array_reverse = [0=>2,1=>1,2=>3,3=>4,4=>5,5=>6];
2025-08-18 16:33:01 +08:00
if($heart_data){
//排麦位
$pit_unique = [];
2025-08-29 19:08:43 +08:00
$key = 0;
foreach($heart_data as $value) {
2025-08-18 16:33:01 +08:00
if(count($pit) >= 6){
break;
}
2025-08-29 18:41:24 +08:00
2025-09-15 22:51:48 +08:00
// 处理两个用户都存在的情况
2025-09-15 21:16:53 +08:00
if($value['user1_id'] != -1 && $value['user2_id'] != -1){
if(!in_array($value['user1_id'],$pit_unique)){
2025-09-15 22:51:48 +08:00
// 检查目标麦位是否已被占用
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']]);
}
2025-09-15 21:16:53 +08:00
}
}
2025-09-15 22:51:48 +08:00
// 处理只有user2存在的情况
elseif($value['user1_id'] == -1 && !in_array($value['user2_id'],$pit_unique)){
// 检查该键是否已被使用
if(!isset($pit[$pit_number_array_reverse[$key]])) {
2025-08-29 18:41:24 +08:00
$pit[$pit_number_array_reverse[$key]] = $value['user2_id'];
2025-09-15 22:51:48 +08:00
$pit_unique[] = $value['user2_id'];
2025-08-18 16:33:01 +08:00
}
}
2025-09-15 22:51:48 +08:00
// 处理只有user1存在的情况
elseif($value['user2_id'] == -1 && !in_array($value['user1_id'],$pit_unique)){
// 检查该键是否已被使用
if(!isset($pit[$pit_number_array_reverse[$key]])) {
2025-08-29 18:41:24 +08:00
$pit[$pit_number_array_reverse[$key]] = $value['user1_id'];
2025-09-15 22:51:48 +08:00
$pit_unique[] = $value['user1_id'];
2025-08-18 16:33:01 +08:00
}
}
2025-08-29 19:08:43 +08:00
$key++;
2025-08-18 16:33:01 +08:00
}
}
2025-09-15 22:51:48 +08:00
return $pit;
2025-08-18 16:33:01 +08:00
}
2025-09-15 22:51:48 +08:00
2025-08-18 16:33:01 +08:00
//换麦
2025-09-15 21:16:53 +08:00
public function changePitToPosPairs($room_id,$friendPlayPit){
2025-09-15 16:11:38 +08:00
$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){
2025-08-18 16:33:01 +08:00
// $this->room_pit_model->getOnPit($this->room_id, $value, $pit_null);
2025-09-15 16:11:38 +08:00
model('api/RoomPit')->OnPit($value, $room_id, $pit_null);
2025-08-29 19:08:43 +08:00
// db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $pit_null])->update(['user_id' => $value]);
2025-09-15 16:11:38 +08:00
}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);
}
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
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){
2025-08-18 16:33:01 +08:00
// $this->room_pit_model->getOnPit($this->room_id, $getRoomPitUser, $getRoomNullPitss);
2025-09-15 16:11:38 +08:00
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]);
}
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
model('api/RoomPit')->OnPit($value, $room_id, $friendPlayPit[$value]);
2025-08-18 16:33:01 +08:00
}
}
}
2025-09-15 16:11:38 +08:00
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]);
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
//获取目标麦位是否有人
$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;
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
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']]);
2025-08-18 16:33:01 +08:00
}
2025-08-21 10:56:23 +08:00
// $getRoomNullPit = $this->room_pit_model->where(['room_id'=>$room_id,'pit_number'=>['notin',[7,9]]])->select();
2025-09-15 16:11:38 +08:00
$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'];
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
//推送给前端消息
$text['text'] = '房间换麦位';
$text['list'] = $data_users;
model('api/Chat')->sendMsg(1053,$room_id,$text);
2025-08-18 16:33:01 +08:00
}
2025-09-15 16:11:38 +08:00
}
2025-08-18 16:33:01 +08:00
}
2025-09-15 21:16:53 +08:00
//换麦
public function changePitToPosPair($room_id,$friendPlayPit){
2025-09-15 22:51:48 +08:00
$new_pit_u = $friendPlayPit;
2025-09-15 21:16:53 +08:00
//按照键值排序数组
ksort($new_pit_u);
2025-09-15 22:51:48 +08:00
//查询原有麦位上有用户的数据 并且重组结果,键为麦位,值为用户,值必须存在,没值则不展示
$pit_users = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7],'user_id' => ['>', 0]])
2025-09-15 21:16:53 +08:00
->order('pit_number ASC')
2025-09-15 22:51:48 +08:00
->field('pit_number,user_id')->select();
$pit_user = [];
2025-09-16 00:29:10 +08:00
foreach ($pit_users as $value_pit_user){
2025-09-15 22:51:48 +08:00
$pit_user[$value_pit_user['pit_number']] = $value_pit_user['user_id'];
}
2025-09-15 21:16:53 +08:00
//比较两个数组,无论是键的差异还是值的差异,都输出字符串”有差异“否则输出”没有差异“
$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);
}
}
2025-08-18 16:33:01 +08:00
//交友厅游戏开始后送礼后一系列操作
//插入/更新心动表
2025-08-29 19:36:34 +08:00
public function addUserHeart($uid,$user_id,$friend_id,$value,$room_id,$user_data){
2025-08-18 16:33:01 +08:00
//给多个用户送礼
2025-08-30 09:46:55 +08:00
//数组重组 下标从0开始
$user_ids = array_values($user_id);
2025-08-29 19:36:34 +08:00
// $heart_value = $value;//心动值
$heart_value = 0;
$heart_exp = get_system_config_value('coin_charm_exp');//金币与魅力值转换比
2025-08-18 16:33:01 +08:00
for ($i = 0; $i < count($user_ids); $i++) {
2025-08-29 19:36:34 +08:00
foreach ($user_data as $cv){
if($user_ids[$i] == $cv['user_id']){
$heart_value = $cv['gift_price'] * $heart_exp;
}
}
2025-08-18 16:33:01 +08:00
// 处理用户ID顺序
2025-08-29 18:41:24 +08:00
$user1 = min($uid, $user_ids[$i]);
$user2 = max($uid, $user_ids[$i]);
2025-08-18 16:33:01 +08:00
// 更新心动关系表
2025-08-20 10:17:10 +08:00
$relation = db::name('vs_user_friending_heart')->where([
2025-08-18 16:33:01 +08:00
'user1_id' => $user1,
'user2_id' => $user2,
'friend_id' => $friend_id
])->find();
if ($relation) {
2025-08-20 10:17:10 +08:00
db::name('vs_user_friending_heart')->where([
2025-08-18 16:33:01 +08:00
'room_id' => $room_id,
'user1_id' => $user1,
'user2_id' => $user2,
'friend_id' => $friend_id
])->setInc('heart_value', $heart_value);
} else {
2025-08-20 10:17:10 +08:00
$relation['id'] = db::name('vs_user_friending_heart')->insert([
2025-08-18 16:33:01 +08:00
'room_id' => $room_id,
'user1_id' => $user1,
'user2_id' => $user2,
'friend_id' => $friend_id,
'heart_value' => $heart_value
]);
}
}
2025-08-29 18:41:24 +08:00
//修改用户心动连线状态
2025-09-10 18:39:54 +08:00
// $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]);
// }
2025-08-16 11:29:29 +08:00
}
}