123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- <?php
- namespace App\Home\Controllers;
- use App\Http\Controllers\Controller;
- use Illuminate\Http\Request;
- use GatewayWorker\Lib\Gateway;
- use GuzzleHttp\Client;
- use App\Model\User;
- use App\Model\Room;
- use App\Model\RoomUser;
- use ErrorException;
- class UserController extends Controller
- {
- /**
- * 获取用户信息
- */
- public function Info(Request $request)
- {
- $cmcc_id = urldecode($request->input('user_id'));
- $mt = $request->input('mt');
- if(!$cmcc_id || !$mt){
- $response['code'] = 400;
- $response['msg'] = '缺少参数';
- return response()->json($response);
- }
- //获取当前系统是否存在
- $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 ...
- //记录用户信息
- $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),
- "cmcc_id" => $cmcc_id,
- "mt" => $cmcc_id,
- "win_count" => 0,
- "lose_count" => 0,
- "is_login" => 0,
- "is_robot" => 0,
- "created_at" => $date,
- "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;
- }else{
- $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
- }
- //测试固定用户信息
- $info['user_id'] = $user->user_id;
- $info['name'] = $user->name;
- $info['avatar'] = $user->avatar;
- $info['win_rate'] = $win_rate;
- $info['play_next'] = 1;
- //设置session
- $request->session()->put('user_id', $user->user_id);
- $response['code'] = 0;
- $response['msg'] = '获取用户信息成功';
- $response['info'] = $info;
- return response()->json($response);
- }
- /**
- * 绑定Socket
- */
- public function Bind(Request $request)
- {
- if(!$request->session()->has('user_id')){
- $response['code'] = 400;
- $response['msg'] = '请先登录';
- return response()->json($response);
- }
- $user_id = $request->session()->get('user_id');
- $client_id = $request->input('client_id');
- //注册地址
- Gateway::$registerAddress = '127.0.0.1:1238';
- //异地登录机制
- $user = User::where("user_id", $user_id)->first();
- // var_dump($user,$client_id);exit;
- if($user->client_id && $user->client_id != $client_id){
- $message = [
- "type" => "replace_login",
- "msg" => "用户在其他地方登录了,当前用户端断开连接",
- ];
- 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
- $update_data['client_id'] = $client_id;
- User::where("user_id", $user_id)->update($update_data);
- $response['info']['in_game'] = 0; //是否还在对战中
- //判断用户是否还在对战
- $room_id = RoomUser::where([
- "user_id" => $user_id,
- "state" => 1,
- ])->value("room_id");
- //查看房间状态
- $is_end = Room::where("room_id", $room_id)->value("is_end");
- if($room_id && !$is_end){
- Gateway::joinGroup($client_id, $room_id);
- $response['info']['in_game'] = 1;
- //获取房间玩家信息
- 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" => $win_rate,
- ];
- $group_users = Gateway::getUidListByGroup($room_id);
- $players = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->whereIn("user_id", array_values($group_users))->get();
- foreach ($players as $k => $player) {
- if($player->win_count == 0 || ($player->win_count == 0 && $player->lose_count == 0)){
- $win_rate = 0;
- }else{
- $win_rate = $player->win_count / ($player->win_count + $player->lose_count);
- }
- $players[$k]->win_rate = round($win_rate,2) * 100;
- }
- $info['players'] = $players;
- //发送可以开始消息
- $message = [
- "type" => 'player_join',
- "msg" => "玩家加入房间",
- "info" => $info
- ];
- Gateway::sendToClient($client_id, json_encode($message));
- }elseif($room_id && $is_end){
- unset($update_data);
- $update_data['state'] = 2;
- //更新一下房间状态
- RoomUser::where([
- "user_id" => $user_id,
- "room_id" => $room_id,
- "state" => 1,
- ])->update($update_data);
- }
- $response['code'] = 0;
- $response['msg'] = '服务连接成功';
- return response()->json($response);
- }
- }
|