NodeController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. namespace App\Http\Controllers\Muv2;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Models\SsNode;
  5. use App\Http\Models\SsNodeInfo;
  6. use App\Http\Models\SsNodeLabel;
  7. use App\Http\Models\SsNodeOnlineLog;
  8. use App\Http\Models\User;
  9. use App\Http\Models\UserLabel;
  10. use App\Http\Models\UserTrafficLog;
  11. use App\Http\V2Ray\Generator;
  12. use Illuminate\Http\Request;
  13. use Response;
  14. class NodeController extends Controller
  15. {
  16. protected static $userLevel;
  17. // 获取节点用户列表
  18. public function users(Request $request)
  19. {
  20. $nodeId = $request->route('id');
  21. $node = SsNode::query()->where('id', $nodeId)->first(); // 节点是否存在
  22. if (!$node) {
  23. return Response::json([
  24. "ret" => 0
  25. ], 400);
  26. }
  27. // 找出该节点的标签
  28. $nodeLabels = SsNodeLabel::query()->where('node_id', $nodeId)->pluck('label_id');
  29. // 找出有相同标签的用户
  30. $userLabels = UserLabel::query()->whereIn('label_id', $nodeLabels)->pluck('user_id');
  31. //提取用户信息
  32. $userIds = User::query()->where('enable', 1)->whereIn('id', $userLabels)->where('id', '<>', $this->systemConfig['free_node_users_id'])->pluck('id')->toArray();
  33. $users = User::query()->where('id', '<>', $this->systemConfig['free_node_users_id'])->select(
  34. "id", "username", "passwd", "t", "u", "d", "transfer_enable",
  35. "port", "protocol", "obfs", "enable", "expire_time as expire_time_d", "method",
  36. "v2ray_uuid", "v2ray_level", "v2ray_alter_id")->get();
  37. $data = [];
  38. foreach ($users as $user) {
  39. $user['switch'] = 1;
  40. $user['email'] = $user['username'];
  41. $user['expire_time'] = strval((new \DateTime($user['expire_time_d']))->getTimestamp()); // datetime 转timestamp
  42. if (in_array($user->id, $userIds)) {
  43. $user->enable = 1;
  44. } else {
  45. $user->enable = 0;
  46. }
  47. // 用户信息
  48. $user->v2ray_user = [
  49. "uuid" => $user->v2ray_uuid,
  50. "email" => sprintf("%[email protected]", $user->v2ray_uuid),
  51. "alter_id" => $user->v2ray_alter_id,
  52. "level" => $user->v2ray_level,
  53. ];
  54. array_push($data, $user);
  55. }
  56. if ($this->systemConfig['is_free_node']) {
  57. if ($this->systemConfig['free_node_id'] == $nodeId) {
  58. $user = User::query()->whereIn('id', $userLabels)->where('id', $this->systemConfig['free_node_users_id'])->select(
  59. "id", "enable", "username", "passwd", "t", "u", "d", "transfer_enable",
  60. "port", "protocol", "obfs", "enable", "expire_time as expire_time_d", "method",
  61. "v2ray_uuid", "v2ray_level", "v2ray_alter_id")->first();
  62. //datetime 转timestamp
  63. $user['switch'] = 1;
  64. $user['email'] = $user['username'];
  65. $user['expire_time'] = strval((new \DateTime($user['expire_time_d']))->getTimestamp());
  66. //v2ray用户信息
  67. $user->v2ray_user = [
  68. "uuid" => $user->v2ray_uuid,
  69. "email" => sprintf("%[email protected]", $user->v2ray_uuid),
  70. "alter_id" => $user->v2ray_alter_id,
  71. "level" => $user->v2ray_level,
  72. ];
  73. array_push($data, $user);
  74. }
  75. }
  76. $load = '1';
  77. $uptime = time();
  78. $log = new SsNodeInfo();
  79. $log->node_id = $nodeId;
  80. $log->load = $load;
  81. $log->uptime = $uptime;
  82. $log->log_time = time();
  83. $log->save();
  84. return Response::json([
  85. 'msg' => 'ok',
  86. 'data' => $data,
  87. ]);
  88. }
  89. // 写在线用户日志
  90. public function onlineUserLog(Request $request)
  91. {
  92. $nodeId = $request->route('id');
  93. $count = $request->get('count');
  94. $log = new SsNodeOnlineLog();
  95. $log->node_id = $nodeId;
  96. $log->online_user = $count;
  97. $log->log_time = time();
  98. if (!$log->save()) {
  99. return response()->json([
  100. "ret" => 0,
  101. "msg" => "update failed",
  102. ]);
  103. }
  104. return response()->json([
  105. "ret" => 1,
  106. "msg" => "ok",
  107. ]);
  108. }
  109. // 节点信息
  110. public function info(Request $request)
  111. {
  112. $nodeId = $request->route('id');
  113. $load = $request->get('load');
  114. $uptime = $request->get('uptime');
  115. $log = new SsNodeInfo();
  116. $log->node_id = $nodeId;
  117. $log->load = $load;
  118. $log->uptime = $uptime;
  119. $log->log_time = time();
  120. if (!$log->save()) {
  121. return response()->json([
  122. "ret" => 0,
  123. "msg" => "update failed",
  124. ]);
  125. }
  126. return response()->json([
  127. "ret" => 1,
  128. "msg" => "ok",
  129. ]);
  130. }
  131. // PostTraffic
  132. public function postTraffic(Request $request)
  133. {
  134. $nodeId = $request->route('id');
  135. $input = $request->getContent();
  136. $data = json_decode($input, true);
  137. $node = SsNode::query()->where('id', $nodeId)->first();
  138. foreach ($data as $vo) {
  139. $user = User::query()->where('id', $vo['user_id'])->first();
  140. if (!$user) {
  141. continue;
  142. }
  143. $user->t = time();
  144. $user->u = $user->u + ($vo['u'] * $node->traffic_rate);
  145. $user->d = $user->d + ($vo['d'] * $node->traffic_rate);
  146. $user->save();
  147. // 记录流量日志
  148. $this->addUserTrafficLog($vo['user_id'], $nodeId, $vo['u'], $vo['d'], $node->traffic_rate);
  149. }
  150. return response()->json([
  151. 'ret' => 1,
  152. "msg" => "ok",
  153. ]);
  154. }
  155. // V2ray Users
  156. public function v2rayUsers(Request $request)
  157. {
  158. $nodeId = $request->route('id');
  159. $node = SsNode::query()->where('id', $nodeId)->first();
  160. $users = User::query()->whereIn('status', [0, 1])->where('enable', 1)->where('id', '<>', $this->systemConfig['free_node_users_id'])->get();
  161. $v2ray = new Generator();
  162. $v2ray->setPort($node->v2ray_port);
  163. foreach ($users as $user) {
  164. $email = sprintf("%[email protected]", $user->v2ray_uuid);
  165. $v2ray->addUser($user->v2ray_uuid, $user->v2ray_level, $user->v2ray_alter_id, $email);
  166. }
  167. if ($this->systemConfig['is_free_node']) {
  168. if ($request->route('id') == $this->systemConfig['free_node_id']) {
  169. $freeuser = User::query()->where('enable', 1)->where('id', $this->systemConfig['free_node_users_id'])->first();
  170. $email = sprintf("%[email protected]", $freeuser->v2ray_uuid);
  171. $v2ray->addUser($freeuser->v2ray_uuid, $freeuser->v2ray_level, $freeuser->v2ray_alter_id, $email);
  172. }
  173. }
  174. return Response::json($v2ray->getArr());
  175. }
  176. // 写入流量日志
  177. private function addUserTrafficLog($userId, $nodeId, $u, $d, $rate)
  178. {
  179. $totalTraffic = flowAutoShow(($u + $d) * $rate);
  180. $traffic = new UserTrafficLog();
  181. $traffic->user_id = $userId;
  182. $traffic->u = $u;
  183. $traffic->d = $d;
  184. $traffic->node_id = $nodeId;
  185. $traffic->rate = $rate;
  186. $traffic->traffic = $totalTraffic;
  187. $traffic->log_time = time();
  188. return $traffic->save();
  189. }
  190. }