session()->has('user_id')){ $response['code'] = 400; $response['msg'] = '请先登录'; return response()->json($response); } $room_id = $request->input('room_id'); if(!$room_id){ $response['code'] = 400; $response['msg'] = '缺少房间参数'; return response()->json($response); } //第几题 $cur_question = $request->input('cur_question'); if(!$cur_question){ $cur_question = 1; } //获取当前房间问题 $questions = Redis::get($room_id . '_questions'); if($questions){ $questions = json_decode($questions); }else{ $questions = []; } if(isset($questions[$cur_question])){ $response['info'] = $questions[$cur_question]; }else{ $questions_id = array_column($questions, 'question_id'); $question = Question::inRandomOrder()->select('question_id','title')->where("is_released",1)->whereNotIn("question_id", $questions_id)->first(); $options = Option::select('option_id','title')->where("question_id",$question->question_id)->get($question->question_id); $info['question'] = $question; $info['options'] = $options; $info['questions_count'] = count($questions) + 1; array_push($questions, $info); Redis::set($room_id . '_questions', json_encode($questions)); $response['info'] = $info; } //设置返回数据 $response['code'] = 0; $response['msg'] = '获取成功'; return response()->json($response); } /** * 回答问题 */ public function Answer(Request $request) { if(!$request->session()->has('user_id')){ $response['code'] = 400; $response['msg'] = '请先登录'; return response()->json($response); } $room_id = $request->input('room_id'); if(!$room_id){ $response['code'] = 400; $response['msg'] = '缺少房间参数'; return response()->json($response); } $message['is_end'] = 0; //是否结束答题标志 $question_id = $request->input('question_id'); $option_id = $request->input('option_id'); $user_id = $request->session()->get('user_id'); //获取当前房间问题条数 $questions = Redis::get($room_id . '_questions'); if($questions){ $questions = json_decode($questions); $questions_count = count($questions); }else{ $questions_count = 0; } //问题超过或者到第4条为结束标志 if($questions_count > 4){ $message['is_end'] = 1; } //检测用户断线 Gateway::$registerAddress = '127.0.0.1:1238'; //获取当前组存活用户 $clients = Gateway::getUidListByGroup($room_id); if(count($clients) < 2){ $message['is_end'] = 1; } //判断答案逻辑 $is_true = Option::where([ ["question_id", $question_id], ["option_id", $option_id], ["is_answer", 1], ])->count(); $scores = Redis::get($room_id.'_info'); if($scores){ $scores = json_decode($scores, 1); }else{ $scores = []; } if(!isset($scores[$user_id])){ $scores[$user_id] = 0; } if($is_true){ $scores[$user_id] = (int) $scores[$user_id] + 1; } $scores['questions'][$question_id][$user_id] = $is_true; Redis::set($room_id . '_info', json_encode($scores)); $message['is_true'] = $is_true; $message['scores'] = $scores; $message['user_id'] = $user_id; $message['online'] = count($clients); $message['type'] = 'answer'; $message['cur_quc'] = count($scores['questions'][$question_id]); //发送消息 Gateway::sendToGroup($room_id, json_encode($message)); $response['code'] = 0; $response['msg'] = '回答成功'; //用户退出房间关闭房间等逻辑 todo ... return response()->json($response); } /** * 加入房间 */ public function Join(Request $request) { if(!$request->session()->has('user_id')){ $response['code'] = 400; $response['msg'] = '请先登录'; return response()->json($response); } $user_id = $request->session()->get('user_id'); $username = $request->session()->get('username'); $avatar = $request->session()->get('avatar'); $client_id = $request->input('client_id'); $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]); Redis::lpush('match_list',$data); $response['code'] = 0; $response['msg'] = "已加入匹配队列"; return response()->json($response); } /** * 退出房间 */ public function Quit(Request $request) { if(!$request->session()->has('user_id')){ $response['code'] = 400; $response['msg'] = '请先登录'; return response()->json($response); } $username = $session->get('username'); $avatar = $session->get('avatar'); $user_id = $request->session()->get('user_id'); $username = $request->session()->get('username'); $avatar = $request->session()->get('avatar'); $client_id = $request->input('client_id'); $data = json_encode(['user_id'=>$user_id,'level'=>'T1','avatar'=>$avatar,'username'=>$username,'client_id'=>$client_id]); Redis::lrem('match_list',1,$data); //删除房间 Redis::del('T1'); $response['code'] = 0; $response['msg'] = "已取消匹配"; return response()->json($response); } }