V2rayController.php 9.2 KB

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