|
@@ -0,0 +1,167 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Home\Controllers;
|
|
|
+
|
|
|
+use App\Http\Controllers\Controller;
|
|
|
+use Illuminate\Http\Request;
|
|
|
+use GatewayWorker\Lib\Gateway;
|
|
|
+use App\Model\Question;
|
|
|
+use App\Model\Option;
|
|
|
+use Illuminate\Support\Facades\Redis;
|
|
|
+
|
|
|
+class GameController extends Controller
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取问题
|
|
|
+ */
|
|
|
+ public function Question(Request $request)
|
|
|
+ {
|
|
|
+ if(!$request->session()->has('user_id')){
|
|
|
+ $response['code'] = 400;
|
|
|
+ $response['msg'] = '请先登录';
|
|
|
+ return response()->json($response);
|
|
|
+ }
|
|
|
+ if(!$request->session()->has('room_id')){
|
|
|
+ $response['code'] = 400;
|
|
|
+ $response['msg'] = '请先匹配对手';
|
|
|
+ return response()->json($response);
|
|
|
+ }
|
|
|
+ $room_id = $request->session()->get('room_id');
|
|
|
+ //获取当前房间问题
|
|
|
+ $questions = Redis::smembers($room_id);
|
|
|
+ $question = Question::inRandomOrder()->select('question_id','title')->where("is_released",1)->whereNotIn("question_id", $questions)->first();
|
|
|
+ $options = Option::select('option_id','title')->where("question_id",$question->question_id)->get($question->question_id);
|
|
|
+ Redis::sadd($room_id, $question->question_id);
|
|
|
+ //设置返回数据
|
|
|
+ $response['code'] = 0;
|
|
|
+ $response['msg'] = '获取成功';
|
|
|
+ $response['info']['question'] = $question;
|
|
|
+ $response['info']['options'] = $options;
|
|
|
+ $response['info']['questions_count'] = count($questions) + 1;
|
|
|
+ return response()->json($response);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 回答问题
|
|
|
+ */
|
|
|
+ public function Answer(Request $request)
|
|
|
+ {
|
|
|
+ if(!$request->session()->has('user_id')){
|
|
|
+ $response['code'] = 400;
|
|
|
+ $response['msg'] = '请先登录';
|
|
|
+ return response()->json($response);
|
|
|
+ }
|
|
|
+ if(!$request->session()->has('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');
|
|
|
+ $room_id = $request->session()->get('room_id');
|
|
|
+ $user_id = $request->session()->get('user_id');
|
|
|
+ //获取当前房间问题条数
|
|
|
+ $questions = Redis::smembers($room_id);
|
|
|
+ //问题超过或者到第4条为结束标志
|
|
|
+ if(count($questions) > 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);
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ Redis::set($room_id, json_encode($scores));
|
|
|
+ $message['is_true'] = $is_true;
|
|
|
+ $message['scores'] = $scores;
|
|
|
+ $message['user_id'] = $user_id;
|
|
|
+ $message['online'] = count($clients);
|
|
|
+ $message['type'] = 'answer';
|
|
|
+ //发送消息
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|