| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | <?phpnamespace 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);        }        $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;        }        //防止并发问题加文件锁        $Lock_file = "{$room_id}_lock_file.txt";        $i = 1;        while ($i < 30) {            $fp = fopen($Lock_file, "a+");            if($fp===false){                sleep(1);            }else{                flock($fp,LOCK_EX);//获取独占锁            }            $i++;        }        //获取当前房间问题        $questions = Redis::get($room_id . '_questions');        if($questions){            $questions = json_decode($questions);        }else{            $questions = [];        }        if(isset($questions[$cur_question -1])){            $response['info'] = $questions[$cur_question - 1];        }else{            $questions_id = [];            foreach ($questions as $k => $v) {                $questions_id[] = $v->question->question_id;            }            // $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;             $questions[] = $info;            Redis::set($room_id . '_questions', json_encode($questions));            $response['info'] = $info;        }        //解锁        if($fp!==false){            @flock($fp,LOCK_UN);            clearstatcache();        }        @fclose($fp);        @unlink($Lock_file);        //设置返回数据        $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;        }        //检测用户断线        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  && !isset($scores['questions'][$question_id][$user_id])){            $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]);                //问题超过或者到第4条为结束标志        if($questions_count > 4 && $message['cur_quc'] > 1){          $message['is_end'] = 1;        }        //发送消息        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);    }  }
 |