Files
yusheng-php/application/api/model/RoomPk.php
2025-08-07 20:21:47 +08:00

551 lines
27 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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' => ''];
}
}
}
}