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