NodeController.php 7.4 KB

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