UserController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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 = $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. $is_robot = $request->input('is_robot');
  26. if(!$is_robot && !env("YANSHI")){
  27. //请求用户信息
  28. $client = new Client([
  29. 'verify' => false,
  30. ]);
  31. $ip = '211.139.191.175';
  32. $port = '38083';
  33. $req_time = date('YmdHis');
  34. $sign = md5($cmcc_id . $req_time . $mt);
  35. $params['req_param'] = [
  36. "pub_info" => [
  37. "req_src" => "1",
  38. "ver" => "1.0",
  39. "mt" => $mt,
  40. "user_id" => $cmcc_id,
  41. "req_time" => $req_time,
  42. "sign" => $sign,
  43. ],
  44. "page_info" => [],
  45. "busi_info" => [],
  46. ];
  47. $result = $client->request('POST', "http://{$ip}:{$port}/hgs/uc/queryusergameinfo",[
  48. 'json' => $params
  49. ]);
  50. if($result->getStatusCode() != 200){
  51. $response['code'] = 400;
  52. $response['msg'] = '请求远程接口错误';
  53. return response()->json($response);
  54. }
  55. $cmcc_user = json_decode($result->getBody()->getContents());
  56. if($cmcc_user->rsp_param->pub_info->code != "0000"){
  57. $response['code'] = 400;
  58. $response['msg'] = '用户信息错误';
  59. return response()->json($response);
  60. }
  61. //是否存在用户
  62. $has_user = User::where("cmcc_id", $cmcc_id)->count();
  63. if($has_user){
  64. //更新信息
  65. $update_data['name'] = $cmcc_user->rsp_param->busi_info->user->name;
  66. $update_data['avatar'] = $cmcc_user->rsp_param->busi_info->user->portrait_url;
  67. $update_data['mt'] = $mt;
  68. User::where("cmcc_id", $cmcc_id)->update($update_data);
  69. }else{
  70. //记录用户信息
  71. $date = date("Y-m-d H:i:s");
  72. $user_id = User::insertGetId([
  73. "name" => $cmcc_user->rsp_param->busi_info->user->name,
  74. "avatar" => $cmcc_user->rsp_param->busi_info->user->portrait_url,
  75. "cmcc_id" => $cmcc_id,
  76. "mt" => $mt,
  77. "win_count" => 0,
  78. "lose_count" => 0,
  79. "is_login" => 0,
  80. "is_robot" => 0,
  81. "created_at" => $date,
  82. "updated_at" => $date,
  83. ]);
  84. }
  85. $play_next = $cmcc_user->rsp_param->busi_info->user->play_next;
  86. }else{
  87. $play_next = 0;
  88. }
  89. if(env('YANSHI')){
  90. $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->orWhere("user_id", $cmcc_id)->first();
  91. if(!$user){
  92. //记录用户信息
  93. $date = date("Y-m-d H:i:s");
  94. $user_id = User::insertGetId([
  95. "name" => $cmcc_id,
  96. "avatar" => "https://picsum.photos/200/200/?image=". rand(1, 300),,
  97. "cmcc_id" => $cmcc_id,
  98. "mt" => $mt,
  99. "win_count" => 0,
  100. "lose_count" => 0,
  101. "is_login" => 0,
  102. "is_robot" => 0,
  103. "created_at" => $date,
  104. "updated_at" => $date,
  105. ]);
  106. }
  107. }
  108. //重新获取用户信息
  109. $user = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->where("cmcc_id", $cmcc_id)->orWhere("user_id", $cmcc_id)->first();
  110. if(!$user){
  111. $response['code'] = 400;
  112. $response['msg'] = '获取用户信息错误,请联系管理员';
  113. return response()->json($response);
  114. }
  115. if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
  116. $win_rate = 0;
  117. }else{
  118. $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
  119. }
  120. //用户信息
  121. $info['user_id'] = $user->user_id;
  122. $info['name'] = $user->name;
  123. $info['avatar'] = $user->avatar;
  124. $info['win_rate'] = round($win_rate, 2) * 100;
  125. $info['play_next'] = $play_next;
  126. //设置session
  127. $request->session()->put('user_id', $user->user_id);
  128. $response['code'] = 0;
  129. $response['msg'] = '获取用户信息成功';
  130. $response['info'] = $info;
  131. return response()->json($response);
  132. }
  133. /**
  134. * 绑定Socket
  135. */
  136. public function Bind(Request $request)
  137. {
  138. if(!$request->session()->has('user_id')){
  139. $response['code'] = 400;
  140. $response['msg'] = '请先登录';
  141. return response()->json($response);
  142. }
  143. $user_id = $request->session()->get('user_id');
  144. $client_id = $request->input('client_id');
  145. //注册地址
  146. Gateway::$registerAddress = '127.0.0.1:1238';
  147. //异地登录机制
  148. $user = User::where("user_id", $user_id)->first();
  149. // var_dump($user,$client_id);exit;
  150. if($user->client_id && $user->client_id != $client_id){
  151. $message = [
  152. "type" => "replace_login",
  153. "msg" => "用户在其他地方登录了,当前用户端断开连接",
  154. ];
  155. try {
  156. $is_online = Gateway::isOnline($user->client_id);
  157. if($is_online){
  158. Gateway::sendToClient($user->client_id, json_encode($message));
  159. //断开旧ID
  160. Gateway::closeClient($user->client_id);
  161. }
  162. } catch (ErrorException $e) {
  163. }
  164. }
  165. //绑定用户ID
  166. Gateway::bindUid($client_id, $user_id);
  167. //更新用户最新client_id
  168. $update_data['client_id'] = $client_id;
  169. User::where("user_id", $user_id)->update($update_data);
  170. $response['info']['in_game'] = 0; //是否还在对战中
  171. //判断用户是否还在对战
  172. $room_id = RoomUser::where([
  173. "user_id" => $user_id,
  174. "state" => 1,
  175. ])->value("room_id");
  176. //查看房间状态
  177. $is_end = Room::where("room_id", $room_id)->value("is_end");
  178. if($room_id && !$is_end){
  179. Gateway::joinGroup($client_id, $room_id);
  180. $response['info']['in_game'] = 1;
  181. //获取房间玩家信息
  182. if($user->win_count == 0 || ($user->win_count == 0 && $user->lose_count == 0)){
  183. $win_rate = 0;
  184. }else{
  185. $win_rate = $user->win_count / ($user->win_count + $user->lose_count);
  186. }
  187. $info['user'] = [
  188. "user_id" => $user_id,
  189. "name" => $user->name,
  190. "avatar" => $user->avatar,
  191. "win_rate" => round($win_rate, 2) * 100,
  192. ];
  193. //获取房间玩家信息
  194. $room_users = RoomUser::where("room_id", $room_id)->pluck("user_id");
  195. $players = User::select('user_id', 'avatar', 'name', 'win_count', 'lose_count')->whereIn("user_id", $room_users)->get();
  196. foreach ($players as $k => $player) {
  197. if($player->win_count == 0 || ($player->win_count == 0 && $player->lose_count == 0)){
  198. $win_rate = 0;
  199. }else{
  200. $win_rate = $player->win_count / ($player->win_count + $player->lose_count);
  201. }
  202. $players[$k]->win_rate = round($win_rate,2) * 100;
  203. }
  204. $info['players'] = $players;
  205. //发送可以开始消息
  206. $message = [
  207. "type" => 'player_join',
  208. "msg" => "玩家加入房间",
  209. "info" => $info
  210. ];
  211. Gateway::sendToClient($client_id, json_encode($message));
  212. }elseif($room_id && $is_end){
  213. unset($update_data);
  214. $update_data['state'] = 2;
  215. //更新一下房间状态
  216. RoomUser::where([
  217. "user_id" => $user_id,
  218. "room_id" => $room_id,
  219. "state" => 1,
  220. ])->update($update_data);
  221. }
  222. $response['code'] = 0;
  223. $response['msg'] = '服务连接成功';
  224. return response()->json($response);
  225. }
  226. }