NodeController.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controllers\User;
  4. use App\Controllers\UserController;
  5. use App\Models\Node;
  6. use App\Models\User;
  7. use App\Utils\Tools;
  8. use App\Utils\URL;
  9. use Psr\Http\Message\ResponseInterface;
  10. use Slim\Http\Request;
  11. use Slim\Http\Response;
  12. /**
  13. * User NodeController
  14. */
  15. final class NodeController extends UserController
  16. {
  17. /**
  18. * @param array $args
  19. */
  20. public function userNodePage(Request $request, Response $response, array $args): ResponseInterface
  21. {
  22. $user = $this->user;
  23. $query = Node::query();
  24. $query->where('type', 1)->whereNotIn('sort', [9]);
  25. if (! $user->is_admin) {
  26. $group = ($user->node_group !== 0 ? [0, $user->node_group] : [0]);
  27. $query->whereIn('node_group', $group);
  28. }
  29. $nodes = $query->orderBy('node_class')->orderBy('name')->get();
  30. $all_node = [];
  31. foreach ($nodes as $node) {
  32. /** @var Node $node */
  33. $array_node = [];
  34. $array_node['id'] = $node->id;
  35. $array_node['name'] = $node->name;
  36. $array_node['class'] = $node->node_class;
  37. $array_node['info'] = $node->info;
  38. $array_node['flag'] = $node->getNodeFlag();
  39. $array_node['online_user'] = $node->getNodeOnlineUserCount();
  40. $array_node['online'] = $node->getNodeOnlineStatus();
  41. $array_node['latest_load'] = $node->getNodeLatestLoadText();
  42. $array_node['traffic_rate'] = $node->traffic_rate;
  43. $array_node['status'] = $node->status;
  44. $array_node['traffic_used'] = (int) Tools::flowToGB($node->node_bandwidth);
  45. $array_node['traffic_limit'] = (int) Tools::flowToGB($node->node_bandwidth_limit);
  46. $array_node['bandwidth'] = $node->getNodeSpeedlimit();
  47. $all_connect = [];
  48. if (in_array($node->sort, [0])) {
  49. if ($node->mu_only !== 1) {
  50. $all_connect[] = 0;
  51. }
  52. if ($node->mu_only !== -1) {
  53. $mu_node_query = Node::query();
  54. $mu_node_query->where('sort', 9)->where('type', '1');
  55. if (! $user->is_admin) {
  56. $mu_node_query->where('node_class', '<=', $user->class)->whereIn('node_group', $group);
  57. }
  58. $mu_nodes = $mu_node_query->get();
  59. foreach ($mu_nodes as $mu_node) {
  60. if (User::where('port', $mu_node->server)->where('is_multi_user', '<>', 0)->first() !== null) {
  61. $all_connect[] = $node->getOffsetPort($mu_node->server);
  62. }
  63. }
  64. }
  65. } else {
  66. $all_connect[] = 0;
  67. }
  68. $array_node['connect'] = $all_connect;
  69. $all_node[$node->node_class + 1000][] = $array_node;
  70. }
  71. return $response->write(
  72. $this->view()
  73. ->assign('nodes', $all_node)
  74. ->display('user/node/index.tpl')
  75. );
  76. }
  77. /**
  78. * @param array $args
  79. */
  80. public function userNodeAjax(Request $request, Response $response, array $args): ResponseInterface
  81. {
  82. $id = $args['id'];
  83. $point_node = Node::find($id);
  84. $prefix = explode(' - ', $point_node->name);
  85. return $response->write(
  86. $this->view()
  87. ->assign('point_node', $point_node)
  88. ->assign('prefix', $prefix[0])
  89. ->assign('id', $id)
  90. ->display('user/node/nodeajax.tpl')
  91. );
  92. }
  93. /**
  94. * @param array $args
  95. */
  96. public function userNodeInfo(Request $request, Response $response, array $args): ResponseInterface
  97. {
  98. $user = $this->user;
  99. $node = Node::find($args['id']);
  100. if ($node === null) {
  101. return $response->write('非法访问');
  102. }
  103. if (! $user->is_admin) {
  104. if ($user->node_group !== $node->node_group && $node->node_group !== 0) {
  105. return $response->write('无权查看该分组的节点');
  106. }
  107. if ($user->class < $node->node_class) {
  108. return $response->write('无权查看该等级的节点');
  109. }
  110. }
  111. switch ($node->sort) {
  112. case 0:
  113. return $response->write(
  114. $this->view()
  115. ->assign('node', $node)
  116. ->assign('mu', $request->getQueryParams()['ismu'])
  117. ->registerClass('URL', URL::class)
  118. ->display('user/node/node_ss_ssr.tpl')
  119. );
  120. case 11:
  121. $server = $node->getV2RayItem($user);
  122. $nodes = [
  123. 'url' => URL::getV2Url($user, $node),
  124. 'info' => [
  125. '连接地址:' => $server['add'],
  126. '连接端口:' => $server['port'],
  127. 'UUID:' => $user->uuid,
  128. 'AlterID:' => $server['aid'],
  129. '传输协议:' => $server['net'],
  130. ],
  131. ];
  132. if ($server['net'] === 'ws') {
  133. $nodes['info']['PATH:'] = $server['path'];
  134. $nodes['info']['HOST:'] = $server['host'];
  135. }
  136. if ($server['net'] === 'kcp') {
  137. $nodes['info']['伪装类型:'] = $server['type'];
  138. }
  139. if ($server['tls'] === 'tls') {
  140. $nodes['info']['TLS:'] = 'TLS';
  141. }
  142. return $response->write(
  143. $this->view()
  144. ->assign('node', $nodes)
  145. ->display('user/node/node_v2ray.tpl')
  146. );
  147. case 13:
  148. $server = $node->getV2RayPluginItem($user);
  149. if ($server !== null) {
  150. $nodes = [
  151. 'url' => URL::getItemUrl($server, 1),
  152. 'info' => [
  153. '连接地址:' => $server['address'],
  154. '连接端口:' => $server['port'],
  155. '加密方式:' => $server['method'],
  156. '连接密码:' => $server['passwd'],
  157. '混淆方式:' => $server['obfs'],
  158. '混淆参数:' => $server['obfs_param'],
  159. ],
  160. ];
  161. } else {
  162. $nodes = [
  163. 'url' => '',
  164. 'info' => [
  165. '您的加密方式非 AEAD 系列' => '无法使用此节点.',
  166. ],
  167. ];
  168. }
  169. return $response->write(
  170. $this->view()
  171. ->assign('node', $nodes)
  172. ->display('user/node/node_ss_v2ray_plugin.tpl')
  173. );
  174. case 14:
  175. $server = $node->getTrojanItem($user);
  176. $nodes = [
  177. 'url' => URL::getTrojanUrl($user, $node),
  178. 'info' => [
  179. '连接地址:' => $server['address'],
  180. '连接端口:' => $server['port'],
  181. '连接密码:' => $server['passwd'],
  182. ],
  183. ];
  184. if ($server['host'] !== $server['address']) {
  185. $nodes['info']['HOST&PEER:'] = $server['host'];
  186. }
  187. return $response->write(
  188. $this->view()
  189. ->assign('node', $nodes)
  190. ->display('user/node/node_trojan.tpl')
  191. );
  192. default:
  193. return $response->write(404);
  194. }
  195. }
  196. }