郑晓宇 6 年 前
コミット
21c1631e69

+ 28 - 13
app/Console/Commands/gamematch.php

@@ -8,6 +8,8 @@ use Illuminate\Support\Facades\Redis;
 use App\Model\Question;
 use App\Model\Option;
 use App\Model\User;
+use App\Model\Room;
+use App\Model\RoomUser;
 use Ramsey\Uuid\Uuid;
 use App\Jobs\Distribute;
 
@@ -52,6 +54,7 @@ class gamematch extends Command
             $user_id = Redis::lpop('match_list');
             if(!$user_id){
                 if($match_times > 5){
+                    $match_times = 0;
                     //获取是否有房间未满人
                     $room_id = $this->get_free_room();
                     if(!$room_id){
@@ -68,22 +71,21 @@ class gamematch extends Command
                     //发布启动机器人
                     Redis::publish("startRobot", $user->user_id);
                 }
-                sleep(1);
+                sleep(3);
                 $match_times++;
                 continue;
             }
             $match_times = 0;
             $info = [];
             $room_id = $this->get_free_room();
-            $user = User::select('user_id', 'avatar', 'name', 'win_rate')->where("user_id", $user_id)->first();
-            $user_client_id = Gateway::getClientIdByUid($user_id);
+            $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count','client_id')->where("user_id", $user_id)->first();
             if($user->is_robot && !$user->is_login){
                 if(Gateway::isUidOnline($user_id)){
                     //更新用户登陆状态
                     unset($update_data);
                     $update_data = [
                         "is_login" => 1,
-                        "client_id" => $user_client_id,
+                        "client_id" => $user->client_id,
                     ];
                     User::where("user_id", $user_id)->update($update_data);
                 }else{
@@ -94,17 +96,24 @@ class gamematch extends Command
                 //获取房间信息
                 $room = Room::where("room_id", $room_id)->first();
                 //把当前用户加入当前房间
-                Gateway::joinGroup($user_client_id, $room_id);
+                Gateway::joinGroup($user->client_id, $room_id);
                 RoomUser::insert([
                     'user_id' => $user_id, 
                     'room_id' => $room_id, 
                     'state' => 1,
+                    'created_at' => date('Y-m-d H:i:s'),
+                    'updated_at' => date('Y-m-d H:i:s'),
                 ]);
+                if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
+                    $win_rate = 0;
+                }else{
+                    $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
+                }
                 $info['user'] = [
                     "user_id" => $user_id,
                     "name" => $user->name,
                     "avatar" => $user->avatar,
-                    "win_rate" => $user->win_rate,
+                    "win_rate" => $win_rate,
                 ];
                 //获取房间玩家信息
                 $group_users = Gateway::getUidListByGroup($room_id);
@@ -112,7 +121,7 @@ class gamematch extends Command
                     //清理不在房间的用户
                     RoomUser::whereNotIn('user_id', array_values($group_users))->delete();
                 }
-                $info['players'] = User::select('user_id', 'avatar', 'name', 'win_rate')->whereIn("user_id", array_values($group_users))->get();
+                $info['players'] = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->whereIn("user_id", array_values($group_users))->get();
                 //发送可以开始消息
                 $message = [
                     "type" => 'player_join',
@@ -153,10 +162,9 @@ class gamematch extends Command
                     'title' => 'room_' . $user->name . date('YmdHis'),
                     'is_full' => 0,
                     'is_end' => 0,
-                    'start_at' => 0,
                     'user_limit' => 2,
                     'nickname' => $user->name,
-                    'user_id' => $user_idc,
+                    'user_id' => $user_id,
                     'created_at' => date('Y-m-d H:i:s'),
                     'updated_at' => date('Y-m-d H:i:s'),
                 ]);
@@ -164,20 +172,27 @@ class gamematch extends Command
                     "user_id" => $user_id,
                     "room_id" => $room_id,
                     "state" => 1,
+                    'created_at' => date('Y-m-d H:i:s'),
+                    'updated_at' => date('Y-m-d H:i:s'),
                 ]);
                 //把当前用户加入当前房间 保险点获取用户最新 client_id
-                Gateway::joinGroup($user_client_id, $room_id);
+                Gateway::joinGroup($user->client_id, $room_id);
                 echo "玩家新建房间: {$user_id}\n";
+                if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
+                    $win_rate = 0;
+                }else{
+                    $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
+                }
                 //当前用户信息
                 $info['user'] = [
                     "user_id" => $user_id,
                     "name" => $user->name,
                     "avatar" => $user->avatar,
-                    "win_rate" => $user->win_rate,
+                    "win_rate" => $win_rate,
                 ];
                 //获取房间玩家信息
                 $group_users = Gateway::getUidListByGroup($room_id);
-                $info['players'] = User::select('user_id', 'avatar', 'name', 'win_rate')->whereIn("user_id", array_values($group_users))->get();
+                $info['players'] = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->whereIn("user_id", array_values($group_users))->get();
                 //发送可以开始消息
                 $message = [
                     "type" => 'player_join',
@@ -199,7 +214,7 @@ class gamematch extends Command
         while (1) {
             $room = Room::select("room_id")->where("is_full",0)->where("is_end","<>",1)->first();
             if($room){
-                $users = RommUser::select("user_id")->where("room_id", $room->room_id)->where("state", 1)->get();
+                $users = RoomUser::select("user_id")->where("room_id", $room->room_id)->where("state", 1)->get();
                 foreach ($users as $user) {
                     //检查当前room玩家是否还在房间中
                     $is_online = Gateway::isUidOnline($user->user_id);

+ 26 - 20
app/Console/Commands/robot.php

@@ -50,9 +50,9 @@ class robot extends Command
         //获取机器人信息
         $user_id = $this->argument('user_id');
         if(!$user_id){
-            $user = User::inRandomOrder()->select('user_id','name')->where("is_robot",1)->where("is_login",0)->first();
+            $user = User::inRandomOrder()->select('user_id','name')->where("is_robot", 1)->where("is_login", 0)->first();
         }else{
-            $user = User::select('user_id','name')->where("is_robot",1)->where("is_login",0)->first();
+            $user = User::select('user_id','name')->where("is_robot",1)->where("user_id", $user_id)->where("is_login",0)->first();
         }
         if(!$user){
             echo "未找到机器人";
@@ -60,6 +60,9 @@ class robot extends Command
         }
         $worker = new Worker();
         $worker->onWorkerStart = function($worker) use($user){
+            //定义基本信息
+            $http_addr = 'http://183.234.61.252:8090/';
+            $http_addr = 'http://www.dt.com/';
             //定义请求客户端
             $room_id = ''; //定义当前机器人加入的room_id
             $client_id = ''; //定义当前机器人client_id
@@ -67,30 +70,37 @@ class robot extends Command
                 'cookies' => true,
                 'verify' => false,
             ]);
-            $response = $client->request('POST', 'http://183.234.61.252:8090/Home/User/Login',[
-                'form_params' => [
-                    'username' => $user->name,
+            $response = $client->request('GET', $http_addr . 'Home/User/Info', [
+                'query' => [
+                    'user_id' => $user->user_id,
+                    'mt' => 1,
                 ]
             ]);
-            $response = $client->request('GET', 'http://183.234.61.252:8090/Home/User/Info');
             // $robot = $response->getBody()->getContents();
 
-            $con = new AsyncTcpConnection('ws://183.234.61.252:8282');
+            // $con = new AsyncTcpConnection('ws://183.234.61.252:8282');
+            $con = new AsyncTcpConnection('ws://127.0.0.1:8282');
             $con->onConnect = function($con) use($client) {
             };
-            $con->onMessage = function($con, $data) use($client, &$room_id, &$client_id, $user){
+            $con->onMessage = function($con, $data) use($client, &$room_id, &$client_id, $user, $http_addr){
                 //注册地址
                 Gateway::$registerAddress = '127.0.0.1:1238';
                 //格式化参数
+                var_dump($data);
                 $json_data = json_decode($data);
                 //初始化
                 if($json_data->type == 'init'){
                     $client_id = $json_data->client_id;
-                    $response = $client->request('POST', 'http://183.234.61.252:8090/Home/User/Bind',[
+                    $response = $client->request('POST', $http_addr . 'Home/User/Bind', [
                         'form_params' => [
                             'client_id' => $client_id,
                         ]
                     ]);
+                    $result = json_decode($response->getBody()->getContents());
+                    echo $result->msg;
+                    if($result->code == 400 || ($result->code == 0 && $result->info->in_game == 1)){
+                        return 0;
+                    }
                     echo "client: {$client_id} 成功绑定socket\n";
                     $update_data = [
                         "is_login" => 1,
@@ -98,22 +108,17 @@ class robot extends Command
                     ];
                     //更新机器人登陆状态
                     User::where("user_id", $user->user_id)->update($update_data);
-                    //记录当前在线机器人
-                    // Redis::sadd('robot_list', $client_id);
-                    // Redis::lpush('online_robot_list', $client_id);
-
                     //启动匹配
-                    $response = $client->request('POST', 'http://183.234.61.252:8090/Home/Game/Join',[
+                    $response = $client->request('GET', $http_addr . 'Home/Game/Join',[
                         'form_params' => [
                             'client_id' => $client_id,
                         ]
                     ]);
                     echo "{$client_id} 成功加入匹配\n";
-
                 }
                 //唤起匹配
                 if($json_data->type == 'gotomatch'){
-                    $response = $client->request('POST', 'http://183.234.61.252:8090/Home/Game/Join',[
+                    $response = $client->request('POST', $http_addr . 'Home/Game/Join',[
                         'form_params' => [
                             'client_id' => $client_id,
                         ]
@@ -134,16 +139,17 @@ class robot extends Command
                     //随机几秒回答问题
                     $second = rand(0,6);
                     sleep($second);
-                    $response = $client->request('POST', 'http://183.234.61.252:8090/Home/Game/Answer',[
+                    echo "获得题目 {$json_data->info->question->question_id} : {$json_data->info->question->title}\n";
+                    $response = $client->request('POST', $http_addr . 'Home/Game/Answer',[
                         'form_params' => [
                             'question_id' => $question_id,
-                            'option_id' => $options[$answer],
+                            'option_id' => $options[$answer]->option_id,
                         ]
                     ]);
                 }
 
                 //结算
-                if($json_data->type == 'settlement'){
+                if($json_data->type == 'game_end'){
                     $update_data = [
                         "is_login" => 0,
                         "client_id" => '',
@@ -152,7 +158,7 @@ class robot extends Command
                     User::where("user_id", $user->user_id)->update($update_data);
                     unset($update_data);
                     $update_data['state'] = 2;
-                    User::where("user_id", $user->user_id)->where("state", 1)->update($update_data);
+                    RoomUser::where("user_id", $user->user_id)->where("state", 1)->update($update_data);
                     echo "已结算,关闭机器人";
                     die;
                 }

+ 20 - 9
app/Home/Controllers/GameController.php

@@ -58,25 +58,35 @@ class GameController extends Controller
             $answer_diff = $answer_time - strtotime($start_at);
             switch ($answer_diff) {
                 case '0':
-                case '1':
                     $score = 100;
                     break;
+                case '1':
+                    $score = 90;
+                    break;
                 case '2':
-                case '3':
                     $score = 80;
                     break;
+                case '3':
+                    $score = 70;
+                    break;
                 case '4':
-                case '5':
                     $score = 60;
                     break;
+                case '5':
+                    $score = 50;
+                    break;
                 case '6':
-                case '7':
                     $score = 40;
                     break;
+                case '7':
+                    $score = 30;
+                    break;
                 case '8':
-                case '9':
                     $score = 20;
                     break;
+                case '9':
+                    $score = 10;
+                    break;
                 default:
                     $score = 0;
                     break;
@@ -89,6 +99,7 @@ class GameController extends Controller
         $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'),
@@ -128,7 +139,7 @@ class GameController extends Controller
             }
             $next_date = date('YmdHis', strtotime("{$start_at} +10 seconds"));
             //先删除固定结算任务队列
-            Redis::lrem("Game_settlement_{$next_date}", $room_id);
+            Redis::lrem("Game_settlement_{$next_date}", 1, $room_id);
             //执行结算队列
             Settlement::dispatch($room_id)->onQueue('settlement');
         }
@@ -153,15 +164,15 @@ class GameController extends Controller
 
         $user_id = $request->session()->get('user_id');
         //检查是否在房间中
-        $is_in_room = RommUser::where("user_id", $user_id)->where("state", 1)->count();
+        $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',$user_id);
-        Redis::rpush('match_list',$user_id);
+        Redis::lrem('match_list', 1, $user_id);
+        Redis::rpush('match_list', $user_id);
 
         $response['code'] = 0;
         $response['msg'] = "已加入匹配队列";

+ 45 - 43
app/Home/Controllers/UserController.php

@@ -9,6 +9,7 @@ use GuzzleHttp\Client;
 use App\Model\User;
 use App\Model\Room;
 use App\Model\RoomUser;
+use ErrorException;
 
 class UserController extends Controller
 {
@@ -25,46 +26,42 @@ class UserController extends Controller
             $response['msg'] = '缺少参数';
             return response()->json($response);
         }
-        
-        //请求用户信息
-        $client = new Client([
-            'verify' => false,
-        ]);
-        $ip = '211.139.191.175';
-        $port = '38083';
-        $req_time = date('YmdHis');
-        $sign = md5($cmcc_id . $req_time . $mt);
-        $params['req_param'] = [
-            "pub_info" => [
-                "req_src" => 1,
-                "ver" => "1.0",
-                "req_time" => $req_time,
-                "sign" => $sign,
-            ],
-            "page_info" => [
-                "current_page" => 1,
-                "page_size" => 10,
-            ],
-            "busi_info" => [],
-        ];
-        // $response = $client->request('POST', "http://{$ip}:{$port}/hgs/uc/queryusergameinfo",[
-        //     'form_params' => [
-        //         'username' => $user->name,
-        //     ]
-        // ]);
-        // $cmcc_user = $response->getBody()->getContents();
-
-        //判断请求结果 todo ...
-
-        //记录用户信息 todo ...
 
         //获取当前系统是否存在
-        $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->first();
-        if($user){
+        $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->orWhere("user_id", $cmcc_id)->first();
+        if(!$user){
+            //请求用户信息
+            $client = new Client([
+                'verify' => false,
+            ]);
+            $ip = '211.139.191.175';
+            $port = '38083';
+            $req_time = date('YmdHis');
+            $sign = md5($cmcc_id . $req_time . $mt);
+            $params['req_param'] = [
+                "pub_info" => [
+                    "req_src" => 1,
+                    "ver" => "1.0",
+                    "req_time" => $req_time,
+                    "sign" => $sign,
+                ],
+                "page_info" => [
+                    "current_page" => 1,
+                    "page_size" => 10,
+                ],
+                "busi_info" => [],
+            ];
+            // $response = $client->request('POST', "http://{$ip}:{$port}/hgs/uc/queryusergameinfo",[
+            //     'form_params' => [
+            //         'username' => $user->name,
+            //     ]
+            // ]);
+            // $cmcc_user = $response->getBody()->getContents();
+
+            //判断请求结果 todo ...
 
-        }else{
-            $date = date("Y-m-d H:i:s");
             //记录用户信息
+            $date = date("Y-m-d H:i:s");
             $user_id = User::insertGetId([
                 "name" => "测试用户_" . $cmcc_id,
                 "avatar" => "https://picsum.photos/200/200/?image=". rand(1, 300),
@@ -78,7 +75,7 @@ class UserController extends Controller
                 "updated_at" => $date,
             ]);
             $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->first();
-        }
+        }     
 
         if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
             $win_rate = 0;
@@ -118,18 +115,23 @@ class UserController extends Controller
         Gateway::$registerAddress = '127.0.0.1:1238';
         //异地登录机制
         $user = User::where("user_id", $user_id)->first();
-        if($user->client_id != $client_id){
+        // var_dump($user,$client_id);exit;
+        if($user->client_id && $user->client_id != $client_id){
             $message = [
                 "type" => "replace_login",
                 "msg" => "用户在其他地方登录了,当前用户端断开连接",
             ];
-            if(Gateway::isOnline($client_id)){
-                Gateway::sendToClient($user->client_id, json_encode($message));
-                //断开旧ID
-                Gateway::closeClient($user->client_id);
+            try {
+                $is_online = Gateway::isOnline($user->client_id);
+                if($is_online){
+                    Gateway::sendToClient($user->client_id, json_encode($message));
+                    //断开旧ID
+                    Gateway::closeClient($user->client_id);
+                }
+            } catch (ErrorException $e) {
+                
             }
         }
-
         //绑定用户ID
         Gateway::bindUid($client_id, $user_id);
         //更新用户最新client_id

+ 4 - 1
app/Jobs/Distribute.php

@@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Redis;
 use App\Model\Question;
 use App\Model\Option;
 use App\Model\RoomQuestion;
+use GatewayWorker\Lib\Gateway;
 
 class Distribute implements ShouldQueue
 {
@@ -46,6 +47,8 @@ class Distribute implements ShouldQueue
         //获取当前房间题目数
         $questions_id = RoomQuestion::where("room_id", $this->room_id)->pluck("question_id");
         if(count($questions_id) < 5){
+            //注册地址
+            Gateway::$registerAddress = '127.0.0.1:1238';
             //获取题目
             $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);
@@ -70,7 +73,7 @@ class Distribute implements ShouldQueue
             ];
             Gateway::sendToGroup($this->room_id, json_encode($message));
             //设置下次结算固定时间
-            $room_list = Redis::rpush("Game_distribute_{$next_date}", $this->room_id);
+            $room_list = Redis::rpush("Game_settlement_{$next_date}", $this->room_id);
         }
     }
 }

+ 2 - 1
app/Jobs/Settlement.php

@@ -14,6 +14,7 @@ use App\Model\RoomQuestion;
 use App\Jobs\Distribute;
 use GuzzleHttp\Client;
 use Illuminate\Support\Facades\Redis;
+use GatewayWorker\Lib\Gateway;
 
 class Settlement implements ShouldQueue
 {
@@ -128,7 +129,7 @@ class Settlement implements ShouldQueue
                 $message['info'] = $info;
                 $message['winer'] = $winer;
                 $message['winer_score'] = $winer_score;
-                $message['type'] = 'end';
+                $message['type'] = 'game_end';
                 Gateway::sendToUid($user->user_id, $message);
             }
 

+ 6 - 6
database/migrations/2019_03_04_163108_create_room_log_table.php

@@ -24,10 +24,10 @@ class CreateRoomLogTable extends Migration
             $table->unsignedInteger('user_limit')->default(2)->comment('限定用户数量');
             $table->string('nickname')->comment('房主昵称');
             $table->unsignedBigInteger('user_id')->comment('房主ID');
-            $table->dateTime('start_at')->useCurrent()->comment('游戏开始时间');
+            $table->dateTime('start_at')->nullable()->useCurrent()->comment('游戏开始时间');
             $table->dateTime('created_at')->useCurrent()->comment('创建时间');
             $table->dateTime('updated_at')->useCurrent()->comment('更新时间');
-            $table->dateTime('deleted_at')->comment('删除时间');
+            $table->dateTime('deleted_at')->nullable()->comment('删除时间');
         });
 
         Schema::create('room_user', function (Blueprint $table) {
@@ -42,7 +42,7 @@ class CreateRoomLogTable extends Migration
             $table->unsignedTinyInteger('state')->default(1)->comment('游戏状态 1正在匹配 2已结束');
             $table->dateTime('created_at')->useCurrent()->comment('创建时间');
             $table->dateTime('updated_at')->useCurrent()->comment('更新时间');
-            $table->dateTime('deleted_at')->comment('删除时间');
+            $table->dateTime('deleted_at')->nullable()->comment('删除时间');
         });
 
         Schema::create('user', function (Blueprint $table) {
@@ -61,7 +61,7 @@ class CreateRoomLogTable extends Migration
             $table->char('client_id', 20)->nullable()->comment('连接客户端ID');
             $table->dateTime('created_at')->useCurrent()->comment('创建时间');
             $table->dateTime('updated_at')->useCurrent()->comment('更新时间');
-            $table->dateTime('deleted_at')->comment('删除时间');
+            $table->dateTime('deleted_at')->nullable()->comment('删除时间');
         });
 
         Schema::create('room_question', function (Blueprint $table) {
@@ -76,7 +76,7 @@ class CreateRoomLogTable extends Migration
             $table->dateTime('end_at')->useCurrent()->comment('结算时间');
             $table->dateTime('created_at')->useCurrent()->comment('创建时间');
             $table->dateTime('updated_at')->useCurrent()->comment('更新时间');
-            $table->dateTime('deleted_at')->comment('删除时间');
+            $table->dateTime('deleted_at')->nullable()->comment('删除时间');
         });
 
         Schema::create('room_answer', function (Blueprint $table) {
@@ -91,7 +91,7 @@ class CreateRoomLogTable extends Migration
             $table->unsignedInteger('score')->comment('分数');
             $table->dateTime('created_at')->useCurrent()->comment('创建时间');
             $table->dateTime('updated_at')->useCurrent()->comment('更新时间');
-            $table->dateTime('deleted_at')->comment('删除时间');
+            $table->dateTime('deleted_at')->nullable()->comment('删除时间');
             $table->unique(["room_id", "user_id", "question_id"], 'unique_ruq');
         });
     }

+ 1 - 1
routes/home.php

@@ -16,7 +16,7 @@ Route::post('User/Bind', 'UserController@Bind');
 //获取用户信息接口
 Route::get('User/Info', 'UserController@Info');
 //加入房间
-Route::post('Game/Join', 'GameController@Join');
+Route::get('Game/Join', 'GameController@Join');
 //退出房间
 Route::post('Game/Quit', 'GameController@Quit');
 //获取题目接口