NodeController.php 7.7 KB

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