NodeController.php 7.5 KB

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