UserController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. namespace App\Home\Controllers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use GatewayWorker\Lib\Gateway;
  6. use GuzzleHttp\Client;
  7. use App\Model\User;
  8. use App\Model\Room;
  9. use App\Model\RoomUser;
  10. use ErrorException;
  11. class UserController extends Controller
  12. {
  13. /**
  14. * 获取用户信息
  15. */
  16. public function Info(Request $request)
  17. {
  18. $cmcc_id = urldecode($request->input('user_id'));
  19. $mt = $request->input('mt');
  20. if(!$cmcc_id || !$mt){
  21. $response['code'] = 400;
  22. $response['msg'] = '缺少参数';
  23. return response()->json($response);
  24. }
  25. //获取当前系统是否存在
  26. $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->orWhere("user_id", $cmcc_id)->first();
  27. if(!$user){
  28. //请求用户信息
  29. $client = new Client([
  30. 'verify' => false,
  31. ]);
  32. $ip = '211.139.191.175';
  33. $port = '38083';
  34. $req_time = date('YmdHis');
  35. $sign = md5($cmcc_id . $req_time . $mt);
  36. $params['req_param'] = [
  37. "pub_info" => [
  38. "req_src" => 1,
  39. "ver" => "1.0",
  40. "req_time" => $req_time,
  41. "sign" => $sign,
  42. ],
  43. "page_info" => [
  44. "current_page" => 1,
  45. "page_size" => 10,
  46. ],
  47. "busi_info" => [],
  48. ];
  49. // $response = $client->request('POST', "http://{$ip}:{$port}/hgs/uc/queryusergameinfo",[
  50. // 'form_params' => [
  51. // 'username' => $user->name,
  52. // ]
  53. // ]);
  54. // $cmcc_user = $response->getBody()->getContents();
  55. //判断请求结果 todo ...
  56. //记录用户信息
  57. $date = date("Y-m-d H:i:s");
  58. $user_id = User::insertGetId([
  59. "name" => "测试用户_" . $cmcc_id,
  60. "avatar" => "https://picsum.photos/200/200/?image=". rand(1, 300),
  61. "cmcc_id" => $cmcc_id,
  62. "mt" => $cmcc_id,
  63. "win_count" => 0,
  64. "lose_count" => 0,
  65. "is_login" => 0,
  66. "is_robot" => 0,
  67. "created_at" => $date,
  68. "updated_at" => $date,
  69. ]);
  70. $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->first();
  71. }
  72. if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
  73. $win_rate = 0;
  74. }else{
  75. $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
  76. }
  77. //测试固定用户信息
  78. $info['user_id'] = $user->user_id;
  79. $info['name'] = $user->name;
  80. $info['avatar'] = $user->avatar;
  81. $info['win_rate'] = $win_rate;
  82. $info['play_next'] = 1;
  83. //设置session
  84. $request->session()->put('user_id', $user->user_id);
  85. $response['code'] = 0;
  86. $response['msg'] = '获取用户信息成功';
  87. $response['info'] = $info;
  88. return response()->json($response);
  89. }
  90. /**
  91. * 绑定Socket
  92. */
  93. public function Bind(Request $request)
  94. {
  95. if(!$request->session()->has('user_id')){
  96. $response['code'] = 400;
  97. $response['msg'] = '请先登录';
  98. return response()->json($response);
  99. }
  100. $user_id = $request->session()->get('user_id');
  101. $client_id = $request->input('client_id');
  102. //注册地址
  103. Gateway::$registerAddress = '127.0.0.1:1238';
  104. //异地登录机制
  105. $user = User::where("user_id", $user_id)->first();
  106. // var_dump($user,$client_id);exit;
  107. if($user->client_id && $user->client_id != $client_id){
  108. $message = [
  109. "type" => "replace_login",
  110. "msg" => "用户在其他地方登录了,当前用户端断开连接",
  111. ];
  112. try {
  113. $is_online = Gateway::isOnline($user->client_id);
  114. if($is_online){
  115. Gateway::sendToClient($user->client_id, json_encode($message));
  116. //断开旧ID
  117. Gateway::closeClient($user->client_id);
  118. }
  119. } catch (ErrorException $e) {
  120. }
  121. }
  122. //绑定用户ID
  123. Gateway::bindUid($client_id, $user_id);
  124. //更新用户最新client_id
  125. $update_data['client_id'] = $client_id;
  126. User::where("user_id", $user_id)->update($update_data);
  127. $response['info']['in_game'] = 0; //是否还在对战中
  128. //判断用户是否还在对战
  129. $room_id = RoomUser::where([
  130. "user_id" => $user_id,
  131. "state" => 1,
  132. ])->value("room_id");
  133. //查看房间状态
  134. $is_end = Room::where("room_id", $room_id)->value("is_end");
  135. if($room_id && !$is_end){
  136. Gateway::joinGroup($client_id, $room_id);
  137. $response['info']['in_game'] = 1;
  138. //获取房间玩家信息
  139. if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
  140. $win_rate = 0;
  141. }else{
  142. $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
  143. }
  144. $info['user'] = [
  145. "user_id" => $user_id,
  146. "name" => $user->name,
  147. "avatar" => $user->avatar,
  148. "win_rate" => $win_rate,
  149. ];
  150. $group_users = Gateway::getUidListByGroup($room_id);
  151. $players = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->whereIn("user_id", array_values($group_users))->get();
  152. foreach ($players as $k => $player) {
  153. if($player->win_count == 0 || ($player->win_count == 0 && $player->lose_count == 0)){
  154. $win_rate = 0;
  155. }else{
  156. $win_rate = $player->win_count / ($player->win_count + $player->lose_count);
  157. }
  158. $players[$k]->win_rate = round($win_rate,2) * 100;
  159. }
  160. $info['players'] = $players;
  161. //发送可以开始消息
  162. $message = [
  163. "type" => 'player_join',
  164. "msg" => "玩家加入房间",
  165. "info" => $info
  166. ];
  167. Gateway::sendToClient($client_id, json_encode($message));
  168. }elseif($room_id && $is_end){
  169. unset($update_data);
  170. $update_data['state'] = 2;
  171. //更新一下房间状态
  172. RoomUser::where([
  173. "user_id" => $user_id,
  174. "room_id" => $room_id,
  175. "state" => 1,
  176. ])->update($update_data);
  177. }
  178. $response['code'] = 0;
  179. $response['msg'] = '服务连接成功';
  180. return response()->json($response);
  181. }
  182. }