Files
yusheng-php/application/api/model/RoomPk.php

551 lines
27 KiB
PHP
Raw Normal View History

2025-08-07 20:21:47 +08:00
<?php
namespace app\api\model;
use think\Db;
use think\Model;
class RoomPk extends Model
{
protected $table = 'fa_vs_room_pk';
// 发起PK邀请 10秒不接受 自动关闭这个申请
public function send_pk($room_id_a, $create_user_id, $room_id_b)
{
if(!$room_id_a || !$create_user_id ){
return ['code' => 0, 'msg' => '参数错误', 'data' => ''];
}
//逃跑次数
$escape_number = db::name('vs_user_pk_close')->where(['user_id' => $create_user_id, 'create_time' => ['between',[strtotime(date('Y-m-d')),time()]]])->find();
if($escape_number){
if($escape_number['close_num'] >= 3){
return ['code' => 0, 'msg' => '今天pk您已中断3次今天已不能再发起PK', 'data' => ''];
}elseif($escape_number['close_num'] == 2){
$second = get_system_config_value('second_close_time') * 60;//分钟转为秒
if($escape_number['update_time'] + $second > time()){
return ['code' => 0, 'msg' => '今天pk您已中断2次'.$second/60 .'分钟内不能发起PK', 'data' => ''];
}
}elseif($escape_number['close_num'] == 1){
$first_close = get_system_config_value('first_close_time') * 60;//分钟转为秒
if($escape_number['update_time'] + $first_close > time()){
return ['code' => 0, 'msg' => '今天pk您已中断1次'.$first_close/60 .'分钟内不能发起PK', 'data' => ''];
}
}
}
//判断发起者是否是房间的主持
$is_host = db::name('vs_room_host')->where('room_id', $room_id_a)->where('user_id', $create_user_id)->where(['type' => 1,'delete_time' =>null ])->find();
$owner = db::name('vs_room')->where('id', $room_id_a)->value('user_id');
if (!$is_host && $owner != $create_user_id) {
return ['code' => 0, 'msg' => '您不是此房间的主持人,请联系房主', 'data' => ''];
}
//没有接收者
if(!$room_id_b){
$where = [
'a.id' => ['<>',$room_id_a],
'a.room_status' => 1,
'a.apply_status' => 2,
'a.is_pk' => 1,
'a.is_show_room' => 1,
'b.pit_number' => 9,
'b.user_id' => ['<>',0],
'a.type_id' => 1,
'a.label_id' => 1,
];
$room_id_b = db::name('vs_room')->alias('a')->join('vs_room_pit b','a.id = b.room_id')
->field('a.id as room_id,a.room_name,a.room_cover,a.room_number,b.user_id')
->where($where)
->orderRaw('rand()')
->value('a.id');
}
if(!$room_id_b){
return ['code' => 0, 'msg' => '暂无推荐房间可PK', 'data' => ''];
}
//查看推荐是否正在pk中
$is_pks = db::name('vs_room_pk')->where(['room_id_a' => $room_id_b,'status' => 1])->find();
if (!$is_pks) {
$is_pks = db::name('vs_room_pk')->where(['room_id_b' => $room_id_b,'status' => 1])->find();
if ($is_pks) {
return ['code' => 0, 'msg' => '此房间正在PK中请勿重复操作', 'data' => ''];
}
}else{
return ['code' => 0, 'msg' => '此房间正在PK中请勿重复操作', 'data' => ''];
}
//查看他是否有PK没有被拒绝和接受的
$is_pk = db::name('vs_room_pk')->where(['room_id_a' => $room_id_a,'status' => 1])->find();
if ($is_pk) {
return ['code' => 0, 'msg' => '您已发起过PK请勿重复操作', 'data' => ''];
}
//接受PK的房只有在聊天模式下接受
$room_mode = db::name('vs_room')->where('id', $room_id_b)->field('type_id,label_id')->find();
if ($room_mode['type_id'] != 1 || $room_mode['label_id'] != 1) {
return ['code' => 0, 'msg' => '此房间模式不支持PK', 'data' => ''];
}
$data = [
'room_id_a' => $room_id_a,
'create_user_id' => $create_user_id,
'room_id_b' => $room_id_b,
'status' => 1,
'createtime' => time(),
];
$res = $this->insertGetId($data);
if ($res) {
//发送消息给对方在主持麦的用户
$SendUserName = db::name('user')->where('id', $create_user_id)->value('nickname');//发送者昵称
$text = [
'SendRoomId' => $room_id_a,//发起者所在房间id
'AcceptRoomId' => $room_id_b,//接受者所在房间id
'PkId' => $res,
'text' => $SendUserName.'邀请您进行直播Pk快来一起嗨',
];
model('Chat')->sendMsg(1029,$room_id_b,$text);
//1-禁麦位2-清空消息3-清空魅力值4-加入黑名单5-踢出房间6-关闭麦克风7-申请上麦8-同意上麦9-拒绝上麦10-点歌11-开启PK',
model('Room')->room_operation_record($create_user_id,$room_id_a,10,0,0,$res);
return ['code' => 1, 'msg' => '成功', 'data' => ''];
} else {
return ['code' => 0, 'msg' => '失败', 'data' => ''];
}
}
// 接受/拒绝 PK邀请
public function accept_pk($pk_id ,$type,$user_id = 0)
{
$pk_info = db::name('vs_room_pk')->where('pk_id', $pk_id)->find();
if($user_id == 0 && $type == 2){
$user_id = -1;//申请倒计时结束系统拒绝
}
if($type == 1){
//逃跑次数
$escape_number = db::name('vs_user_pk_close')->where(['user_id' => $user_id, 'create_time' => ['between',[strtotime(date('Y-m-d')),time()]]])->find();
if($escape_number){
if($escape_number['close_num'] >= 3){
$text = [
'type' => $type,
'text' => '对方无法接受PK邀请请重新选择PK房间',
];
model('Chat')->sendMsg(1030,$pk_info['room_id_a'],$text);
return ['code' => 0, 'msg' => '今天pk您已中断3次今天已不能再接受PK', 'data' => ''];
}elseif($escape_number['close_num'] == 2){
$second = get_system_config_value('second_close_time') * 60;//分钟转为秒
if($escape_number['update_time'] + $second > time()){
$text = [
'type' => $type,
'text' => '对方无法接受PK邀请请重新选择PK房间',
'user_id' => $pk_info['create_user_id'],
];
model('Chat')->sendMsg(1030,$pk_info['room_id_a'],$text);
return ['code' => 0, 'msg' => '今天pk您已中断2次'.$second/60 .'分钟内不能接受PK', 'data' => ''];
}
}elseif($escape_number['close_num'] == 1){
$first_close = get_system_config_value('first_close_time') * 60;//分钟转为秒
if($escape_number['update_time'] + $first_close > time()){
$text = [
'type' => $type,
'text' => '对方无法接受PK邀请请重新选择PK房间',
'user_id' => $pk_info['create_user_id'],
];
model('Chat')->sendMsg(1030,$pk_info['room_id_a'],$text);
return ['code' => 0, 'msg' => '今天pk您已中断1次'.$first_close/60 .'分钟内不能接受PK', 'data' => ''];
}
}
}
//判断发起方还在主持麦位吗
$is_host = db::name('vs_room_pit')->where(['room_id' => $pk_info['room_id_a'],'pit_number' =>9])->value('user_id');
if($is_host != $pk_info['create_user_id']){
$this->accept_pk($pk_id,2);
return ['code' => 0, 'msg' => '对方主持已离开暂不能响应PK邀请', 'data' => ''];
}
//判断发起者是否和别人开启了pk
$is_pk = db::name('vs_room_pk')->where(['pk_id' => ['<>',$pk_id],'room_id_a' => $pk_info['room_id_a'],'status' => ['in',[1,2,3,4]]])->find();
$is_pk1 = db::name('vs_room_pk')->where(['pk_id' => ['<>',$pk_id],'room_id_b' => $pk_info['room_id_a'],'status' => ['in',[1,2,3,4]]])->find();
if($is_pk || $is_pk1){
return ['code' => 0, 'msg' => '发起方已经重新开启了PK请重新选择PK房间', 'data' => ''];
}
$data = [
'receive_user_id' => $user_id,
'status' => 2,//1-申请2-链接中3-PK进行中4-已结束5-拒绝 -6断开链接
'updatetime' => time(),
];
}else{
$data = [
'receive_user_id' => $user_id,
'status' => 5,//1-申请2-链接中3-PK进行中4-已结束5-拒绝 -6断开链接
'updatetime' => time(),
];
}
//开启事务
db::startTrans();
$res = db::name('vs_room_pk')->where('pk_id', $pk_id)->update($data);
if ($res) {
//修改上次的pk_room_id
$wq = db::name('vs_room')->where('id', $pk_info['room_id_a'])->update(['last_pk_room_id' => $pk_info['room_id_b'],'updatetime' => time()]);
if(!$wq){
db::rollback();
return ['code' => 0, 'msg' => '修改房间失败', 'data' => ''];
}
$we = db::name('vs_room')->where('id', $pk_info['room_id_b'])->update(['last_pk_room_id' => $pk_info['room_id_a'],'updatetime' => time()]);
if(!$we){
db::rollback();
return ['code' => 0, 'msg' => '修改房间失败', 'data' => ''];
}
db::commit();
//发送消息给对方
if($type == 1){//1接受,2拒绝
$texta = [
'type' => $type,
'room_id' => $pk_info['room_id_b'],
'user_id' => $pk_info['create_user_id'],
'text' => '对方接受了您的PK',
'pk_id' => $pk_id,
];
$textb = [
'type' => $type,
'room_id' => $pk_info['room_id_a'],
'user_id' => $user_id,
'text' => '接受了对方的PK',
'pk_id' => $pk_id,
];
model('Chat')->sendMsg(1030,$pk_info['room_id_a'],$texta);
model('Chat')->sendMsg(1030,$pk_info['room_id_b'],$textb);
}else{
$text = [
'type' => $type,
'text' => '对方拒绝了您的PK邀请请重新选择PK房间',
'user_id' => $pk_info['create_user_id'],
];
model('Chat')->sendMsg(1030,$pk_info['room_id_a'],$text);
}
return ['code' => 1, 'msg' => '成功!', 'data' => ''];
} else {
db::rollback();
return ['code' => 0, 'msg' => '失败', 'data' => ''];
}
}
// 开始PK
public function start_pk($user_id,$pk_id,$pk_times = 5)
{
// 判断用户是否两者的主持
$pk_info = db::name('vs_room_pk')->where('pk_id', $pk_id)->find();
if(!$pk_info){
return ['code' => 0, 'msg' => '此房间不存在!', 'data' => ''];
}
if($pk_info['status'] == 3){
return ['code' => 0, 'msg' => '此房间已开始PK请勿重复操作', 'data' => ''];
}
if($pk_info['status'] == 4 || $pk_info['status'] == 5 || $pk_info['status'] == 6){
return ['code' => 0, 'msg' => '此房间已结束PK请勿重复操作', 'data' => ''];
}
if($user_id != $pk_info['create_user_id'] && $user_id != $pk_info['receive_user_id']){
return ['code' => 0, 'msg' => '您不是此房间的主持人,请联系房主', 'data' => ''];
}
$data = [
'status' => 3,//1-申请2-链接中3-PK进行中4-已结束5-拒绝 -6断开链接
'start_time' => time(),
'updatetime' => time(),
'pk_times' => $pk_times
];
$res = db::name('vs_room_pk')->where('pk_id', $pk_id)->update($data);
if ($res) {
$text = [
'pk_end_times' => time() + $pk_times * 60,
'text' => 'pk 开始!',
'pk_id' => $pk_id,
];
model('Chat')->sendMsg(1031,$pk_info['room_id_a'],$text);
model('Chat')->sendMsg(1031,$pk_info['room_id_b'],$text);
return ['code' => 1, 'msg' => '成功', 'data' => ''];
} else {
return ['code' => 0, 'msg' => '失败', 'data' => ''];
}
}
//搜索 或 推荐房间列表
public function search_pk_room($user_id,$room_id,$page,$limit)
{
//自己当前房间
$room_id_a = db::name('vs_room')->where('user_id', $user_id)->value('id');
$room_id_b = db::name('vs_room_pit')->where(['pit_number' => 9, 'user_id' => $user_id])->value('room_id') ?? 0;
$room_id_c = [$room_id_a,$room_id_b];
$where = [
'a.id' => ['not in',$room_id_c],
'a.room_status' => 1,
'a.apply_status' => 2,
'a.is_pk' => 1,
'a.is_show_room' => 1,
'b.pit_number' => 9,
'b.user_id' => ['<>',0],
'a.type_id' => ['in',[1,3,4]],
'a.label_id' => 1,
];
if($room_id){
//是纯数字
if(is_numeric($room_id)){
$where['a.room_number'] = $room_id;
}else{
$where['a.room_name'] = ['like','%'.$room_id.'%'];
}
}
$list = db::name('vs_room')->alias('a')->join('vs_room_pit b','a.id = b.room_id')
->field('a.id as room_id,a.room_name,a.room_cover,a.room_number,b.user_id')
->where($where)
// ->orderRaw('rand()')
->page($page,$limit)
->select();
return ['code' => 1, 'msg' => '成功', 'data' => $list];
}
// pk结束
public function end_pk($pk_id,$type = 1,$user_id = 0)
{
$pk_info = db::name('vs_room_pk')->where('pk_id', $pk_id)->find();
if($type == 1){//pk结束
$data = [
'status' => 4,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'end_time' => time(),
'updatetime' => time(),
];
}elseif($type == 2){//断开链接
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
'updatetime' => time(),
];
}elseif($type == 3){//中途关闭
if($user_id == 0){
return ['code' => 0, 'msg' => '参数错误', 'data' => ''];
}else{
//查询pk信息现在在哪个阶段
if($pk_info['status'] == 4){
if($pk_info['shibaifang_id'] == $user_id){
$data = [
'status' => 7,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接 7-败方申请断开链接',
'close_time' => time(),
'close_user_id' => $user_id,
'updatetime' => time(),
];
}else{
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
'close_user_id' => $user_id,
'updatetime' => time(),
];
}
}elseif($pk_info['status'] == 7){
if($pk_info['shibaifang_id'] != $user_id){
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
];
}
$data['updatetime'] = time();
}elseif ($pk_info['status'] == 2){
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
'updatetime' => time(),
];
}
else{
$data['end_time'] = time();
//今天逃跑次数
$where = [
'create_time' => ['between',[strtotime(date('Y-m-d')),time()]],
'user_id' => $user_id,
];
$close = db::name('vs_user_pk_close')->where($where)->find();
if($close){
db::name('vs_user_pk_close')->where($where)->update(
['update_time' => time(),
'pk_id' => $close['pk_id'].','.$pk_id,
'close_num' => $close['close_num'] + 1
]);
}else{
db::name('vs_user_pk_close')->insert(
['user_id' => $user_id,
'create_time' => time(),
'update_time' => time(),
'pk_id' => $pk_id,
'close_num' => 1
]);
}
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
'close_user_id' => $user_id,
'updatetime' => time(),
];
}
}
}else{
$data = [
'status' => 6,//1-申请2-链接中3-PK进行中4-已结束惩罚阶段5-拒绝 -6断开链接
'close_time' => time(),
'close_user_id' => $user_id,
'updatetime' => time(),
];
}
$res = db::name('vs_room_pk')->where('pk_id', $pk_id)->update($data);
$pk_info = db::name('vs_room_pk')->where('pk_id', $pk_id)->find(); //这个不要删除是为了更新下面的$pk_info['end_time']
if ($res) {
if($type == 1){//1-pk结束2-断开链接3-中途关闭
if($pk_info['create_value_a'] > $pk_info['receive_value_b']){
db::name('vs_room_pk')->where('pk_id', $pk_id)->update(['shibaifang_id' => $pk_info['receive_user_id']]);
$texta = [
'type' => 1,//胜利
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
$textb = [
'type' => 0,//失败
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
model('Chat')->sendMsg(1032,$pk_info['room_id_a'],$texta);
model('Chat')->sendMsg(1032,$pk_info['room_id_b'],$textb);
}elseif($pk_info['create_value_a'] < $pk_info['receive_value_b']){
db::name('vs_room_pk')->where('pk_id', $pk_id)->update(['shibaifang_id' => $pk_info['create_user_id']]);
$texta = [
'type' => 0,//失败
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
$textb = [
'type' => 1,//胜利
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
model('Chat')->sendMsg(1032,$pk_info['room_id_a'],$texta);
model('Chat')->sendMsg(1032,$pk_info['room_id_b'],$textb);
}else{
db::name('vs_room_pk')->where('pk_id', $pk_id)->update(['shibaifang_id' => -1]);
$texta = [
'type' => 2,//失败
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
$textb = [
'type' => 2,//胜利
'victory_name' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_name'),
'victory_cover' => db::name('vs_room')->where('id', $pk_info['room_id_b'])->value('room_cover'),
'defeated_name' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_name'),
'defeated_cover' => db::name('vs_room')->where('id', $pk_info['room_id_a'])->value('room_cover'),
'text' => 'pk 结束!',
'end_time' => $pk_info['end_time'] + 300,
];
model('Chat')->sendMsg(1032,$pk_info['room_id_a'],$texta);
model('Chat')->sendMsg(1032,$pk_info['room_id_b'],$textb);
}
}elseif($type == 2){
$text = [
'type' => 1,//正常断开
'text' => 'pk结束已断开链接',
];
model('Chat')->sendMsg(1033,$pk_info['room_id_a'],$text);
model('Chat')->sendMsg(1033,$pk_info['room_id_b'],$text);
}elseif($type == 3){
if($pk_info['status'] == 7){
if($pk_info['shibaifang_id'] == $user_id){
if($user_id == $pk_info['create_user_id']){
$pk_room_id = $pk_info['room_id_b'];
}elseif($user_id == $pk_info['receive_user_id']){
$pk_room_id = $pk_info['room_id_a'];
}else{
return json(['code' => 0,'msg' => '您不是本场PK的对手']);
}
$FromUserInfo = db::name('user')->where('id',$user_id)->field('id as user_id,nickname,avatar,sex')->find();
$text = [
'FromUserInfo' => $FromUserInfo,
'text' => '对方申请提前结束PK',
];
model('Chat')->sendMsg(1037,$pk_room_id,$text);
}
}else if($pk_info['status'] == 6){
$text = [
'type' => 1,//正常断开
'text' => 'pk结束已断开链接',
];
model('Chat')->sendMsg(1033,$pk_info['room_id_a'],$text);
model('Chat')->sendMsg(1033,$pk_info['room_id_b'],$text);
}
else{
$text = [
'type' => 2,//中途中断
'text' => '本场PK由于中途断开不计输赢',
];
model('Chat')->sendMsg(1033,$pk_info['room_id_a'],$text);
model('Chat')->sendMsg(1033,$pk_info['room_id_b'],$text);
}
}else{
$text = [
'type' => 3,//没开始结束关闭
'text' => 'pk结束已关闭',
];
model('Chat')->sendMsg(1033,$pk_info['room_id_a'],$text);
model('Chat')->sendMsg(1033,$pk_info['room_id_b'],$text);
}
return ['code' => 1, 'msg' => '成功', 'data' => ''];
} else {
return ['code' => 0, 'msg' => '失败', 'data' => ''];
}
}
//不接受 PK
public function refuse_pk($is_pk, $room_id)
{
$is_pks = db::name('vs_room')->where('id', $room_id)->value('is_pk');
if ($is_pk == $is_pks) {
return ['code' => 1, 'msg' => '成功', 'data' => ''];
}else{
$data = [
'is_pk' => $is_pk,
];
$res = db::name('vs_room')->where('id', $room_id)->update($data);
if ($res) {
return ['code' => 1, 'msg' => '成功', 'data' => ''];
} else {
return ['code' => 0, 'msg' => '失败', 'data' => ''];
}
}
}
}