UserController.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace App\Controllers\Mod_Mu;
  3. use App\Models\Node;
  4. use App\Models\TrafficLog;
  5. use App\Models\User;
  6. use App\Models\NodeOnlineLog;
  7. use App\Models\Ip;
  8. use App\Models\DetectLog;
  9. use App\Controllers\BaseController;
  10. use App\Utils\Tools;
  11. class UserController extends BaseController
  12. {
  13. // User List
  14. public function index($request, $response, $args)
  15. {
  16. $params = $request->getQueryParams();
  17. $node_id = $params['node_id'];
  18. $node = new Node();
  19. if ($node_id == '0') {
  20. $node = Node::where('node_ip', $_SERVER['REMOTE_ADDR'])->first();
  21. $node_id = $node->id;
  22. } else {
  23. $node = Node::where('id', '=', $node_id)->first();
  24. if ($node == null) {
  25. $res = [
  26. 'ret' => 0
  27. ];
  28. return $this->echoJson($response, $res);
  29. }
  30. }
  31. $node->node_heartbeat = time();
  32. $node->save();
  33. if ($node->mu_only != 0) {
  34. $users_raw = User::where(
  35. static function ($query) use ($node) {
  36. $query->where(
  37. static function ($query1) use ($node) {
  38. $query1->where('class', '>=', $node->node_class);
  39. }
  40. )->orwhere('is_admin', 1);
  41. }
  42. )->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
  43. } else {
  44. if ($node->node_group != 0) {
  45. $users_raw = User::where(
  46. static function ($query) use ($node) {
  47. $query->where(
  48. static function ($query1) use ($node) {
  49. $query1->where('class', '>=', $node->node_class)
  50. ->where('node_group', '=', $node->node_group);
  51. }
  52. )->orwhere('is_admin', 1);
  53. }
  54. )
  55. ->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
  56. } else {
  57. $users_raw = User::where(
  58. static function ($query) use ($node) {
  59. $query->where(
  60. static function ($query1) use ($node) {
  61. $query1->where('class', '>=', $node->node_class);
  62. }
  63. )->orwhere('is_admin', 1);
  64. }
  65. )->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
  66. }
  67. }
  68. if (($node->node_bandwidth_limit != 0) && $node->node_bandwidth_limit < $node->node_bandwidth) {
  69. $users = null;
  70. $res = [
  71. 'ret' => 1,
  72. 'data' => $users
  73. ];
  74. return $this->echoJson($response, $res);
  75. }
  76. $users = array();
  77. $key_list = array('email', 'method', 'obfs', 'obfs_param', 'protocol', 'protocol_param',
  78. 'forbidden_ip', 'forbidden_port', 'node_speedlimit', 'disconnect_ip',
  79. 'is_multi_user', 'id', 'port', 'passwd', 'u', 'd');
  80. foreach ($users_raw as $user_raw) {
  81. if ($user_raw->transfer_enable > $user_raw->u + $user_raw->d) {
  82. $user_raw = Tools::keyFilter($user_raw, $key_list);
  83. $user_raw->uuid = $user_raw->getUuid();
  84. $users[] = $user_raw;
  85. }
  86. }
  87. $res = [
  88. 'ret' => 1,
  89. 'data' => $users
  90. ];
  91. return $this->echoJson($response, $res);
  92. }
  93. // Update Traffic
  94. public function addTraffic($request, $response, $args)
  95. {
  96. $params = $request->getQueryParams();
  97. $data = $request->getParam('data');
  98. $this_time_total_bandwidth = 0;
  99. $node_id = $params['node_id'];
  100. if ($node_id == '0') {
  101. $node = Node::where('node_ip', $_SERVER['REMOTE_ADDR'])->first();
  102. $node_id = $node->id;
  103. }
  104. $node = Node::find($node_id);
  105. if ($node == null) {
  106. $res = [
  107. 'ret' => 0
  108. ];
  109. return $this->echoJson($response, $res);
  110. }
  111. if (count($data) > 0) {
  112. foreach ($data as $log) {
  113. $u = $log['u'];
  114. $d = $log['d'];
  115. $user_id = $log['user_id'];
  116. $user = User::find($user_id);
  117. if ($user == null) {
  118. continue;
  119. }
  120. $user->t = time();
  121. $user->u += $u * $node->traffic_rate;
  122. $user->d += $d * $node->traffic_rate;
  123. $this_time_total_bandwidth += $u + $d;
  124. if (!$user->save()) {
  125. $res = [
  126. 'ret' => 0,
  127. 'data' => 'update failed',
  128. ];
  129. return $this->echoJson($response, $res);
  130. }
  131. // log
  132. $traffic = new TrafficLog();
  133. $traffic->user_id = $user_id;
  134. $traffic->u = $u;
  135. $traffic->d = $d;
  136. $traffic->node_id = $node_id;
  137. $traffic->rate = $node->traffic_rate;
  138. $traffic->traffic = Tools::flowAutoShow(($u + $d) * $node->traffic_rate);
  139. $traffic->log_time = time();
  140. $traffic->save();
  141. }
  142. }
  143. $node->node_bandwidth += $this_time_total_bandwidth;
  144. $node->save();
  145. $online_log = new NodeOnlineLog();
  146. $online_log->node_id = $node_id;
  147. $online_log->online_user = count($data);
  148. $online_log->log_time = time();
  149. $online_log->save();
  150. $res = [
  151. 'ret' => 1,
  152. 'data' => 'ok',
  153. ];
  154. return $this->echoJson($response, $res);
  155. }
  156. public function addAliveIp($request, $response, $args)
  157. {
  158. $params = $request->getQueryParams();
  159. $data = $request->getParam('data');
  160. $node_id = $params['node_id'];
  161. if ($node_id == '0') {
  162. $node = Node::where('node_ip', $_SERVER['REMOTE_ADDR'])->first();
  163. $node_id = $node->id;
  164. }
  165. $node = Node::find($node_id);
  166. if ($node == null) {
  167. $res = [
  168. 'ret' => 0
  169. ];
  170. return $this->echoJson($response, $res);
  171. }
  172. if (count($data) > 0) {
  173. foreach ($data as $log) {
  174. $ip = $log['ip'];
  175. $userid = $log['user_id'];
  176. // log
  177. $ip_log = new Ip();
  178. $ip_log->userid = $userid;
  179. $ip_log->nodeid = $node_id;
  180. $ip_log->ip = $ip;
  181. $ip_log->datetime = time();
  182. $ip_log->save();
  183. }
  184. }
  185. $res = [
  186. 'ret' => 1,
  187. 'data' => 'ok',
  188. ];
  189. return $this->echoJson($response, $res);
  190. }
  191. public function addDetectLog($request, $response, $args)
  192. {
  193. $params = $request->getQueryParams();
  194. $data = $request->getParam('data');
  195. $node_id = $params['node_id'];
  196. if ($node_id == '0') {
  197. $node = Node::where('node_ip', $_SERVER['REMOTE_ADDR'])->first();
  198. $node_id = $node->id;
  199. }
  200. $node = Node::find($node_id);
  201. if ($node == null) {
  202. $res = [
  203. 'ret' => 0
  204. ];
  205. return $this->echoJson($response, $res);
  206. }
  207. if (count($data) > 0) {
  208. foreach ($data as $log) {
  209. $list_id = $log['list_id'];
  210. $user_id = $log['user_id'];
  211. // log
  212. $detect_log = new DetectLog();
  213. $detect_log->user_id = $user_id;
  214. $detect_log->list_id = $list_id;
  215. $detect_log->node_id = $node_id;
  216. $detect_log->datetime = time();
  217. $detect_log->save();
  218. }
  219. }
  220. $res = [
  221. 'ret' => 1,
  222. 'data' => 'ok',
  223. ];
  224. return $this->echoJson($response, $res);
  225. }
  226. }