123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- <?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 App\Model\RoomUser;
- use App\Model\RoomQuestion;
- use App\Model\RoomAnswer;
- use App\Model\Room;
- use Illuminate\Support\Facades\Redis;
- use App\Jobs\Settlement;
- class GameController extends Controller
- {
- /**
- * 回答问题
- */
- public function Answer(Request $request)
- {
- if(!$request->session()->has('user_id')){
- $response['code'] = 400;
- $response['msg'] = '请先登录';
- return response()->json($response);
- }
- $answer_time = time();
- $question_id = $request->input('question_id');
- $option_id = $request->input('option_id');
- $user_id = $request->session()->get('user_id');
- //注册gateway地址
- Gateway::$registerAddress = '127.0.0.1:1238';
- //获取房间号
- $room_id = RoomUser::where(["user_id"=>$user_id,"state"=>1])->value('room_id');
- if(!$room_id){
- $response['code'] = 400;
- $response['msg'] = '没有加入房间';
- return response()->json($response);
- }
- //判断答案逻辑
- $is_true = Option::where([
- ["question_id", $question_id],
- ["option_id", $option_id],
- ["is_answer", 1],
- ])->count();
- //判断用户回答获取分数
- if($is_true){
- //获取当前题目开始时间
- $start_at = RoomQuestion::where(["question_id" => $question_id, "room_id" => $room_id])->value('start_at');
- $answer_diff = $answer_time - strtotime($start_at);
- if($request->input('anwser_time')){
- $anwser_time = (int) $request->input('anwser_time');
- $answer_diff = abs(10 - $anwser_time);
- }
- switch ($answer_diff) {
- case '0':
- $score = 100;
- break;
- case '1':
- $score = 90;
- break;
- case '2':
- $score = 80;
- break;
- case '3':
- $score = 70;
- break;
- case '4':
- $score = 60;
- break;
- case '5':
- $score = 50;
- break;
- case '6':
- $score = 40;
- break;
- case '7':
- $score = 30;
- break;
- case '8':
- $score = 20;
- break;
- case '9':
- $score = 10;
- break;
- default:
- $score = 0;
- break;
- }
- }else{
- $score = 0;
- }
- //写入记录
- $result = RoomAnswer::insert([
- "question_id" => $question_id,
- "option_id" => $option_id,
- "user_id" => $user_id,
- "room_id" => $room_id,
- "score" => $score,
- "created_at" => date('Y-m-d H:i:s'),
- "updated_at" => date('Y-m-d H:i:s'),
- ]);
- if(!$result){
- //发送消息
- $response['code'] = 400;
- $response['msg'] = '重复回答';
- return response()->json($response);
- }
- if($score){
- //增加总分
- RoomUser::where([
- "user_id" => $user_id,
- "room_id" => $room_id,
- ])->increment('score', $score);
- }
- $total_score = (int) RoomUser::where([
- "user_id" => $user_id,
- "room_id" => $room_id,
- ])->value('score');
- $message['score'] = $score;
- $message['total_score'] = $total_score;
- $message['user_id'] = $user_id;
- $message['type'] = 'answer';
- Gateway::sendToGroup($room_id, json_encode($message));
- //获取房间信息,最后一个回答触发结算程序
- $room_user_limit = Room::where("room_id", $room_id)->value("user_limit");
- //获取当前题目回答人数
- $answer_user_count = RoomAnswer::where([
- "room_id" => $room_id,
- "question_id" => $question_id,
- ])->count();
- if($room_user_limit == $answer_user_count){
- if(!isset($start_at)){
- $start_at = RoomQuestion::where(["question_id" => $question_id, "room_id" => $room_id])->value('start_at');
- }
- $next_date = date('YmdHis', strtotime("{$start_at} +10 seconds"));
- //先删除固定结算任务队列
- Redis::lrem("Game_settlement_{$next_date}", 1, $room_id);
- //执行结算队列
- Settlement::dispatch($room_id)->onQueue('settlement');
- }
- //发送消息
- $response['code'] = 0;
- $response['msg'] = '回答成功';
- //返回回答信息
- 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');
- //检查是否在房间中
- $is_in_room = RoomUser::where("user_id", $user_id)->where("state", 1)->count();
- if($is_in_room){
- $response['code'] = 400;
- $response['msg'] = "已在房间中";
- return response()->json($response);
- }
- //删除队列再加入匹配
- Redis::lrem('match_list', 1, $user_id);
- Redis::rpush('match_list', $user_id);
- $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);
- }
-
- }
|