123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
- declare(strict_types=1);
- namespace App\Controllers\WebAPI;
- use App\Controllers\BaseController;
- use App\Models\DetectLog;
- use App\Models\Ip;
- use App\Models\Node;
- use App\Models\User;
- use App\Services\DB;
- use App\Utils\ResponseHelper;
- use App\Utils\Tools;
- use Illuminate\Database\Eloquent\Builder;
- use Psr\Http\Message\ResponseInterface;
- use Slim\Http\ServerRequest;
- use Slim\Http\Response;
- final class UserController extends BaseController
- {
- /**
- * GET /mod_mu/users
- *
- * @param ServerRequest $request
- * @param Response $response
- * @param array $args
- *
- * @return ResponseInterface
- */
- public function index(Request $request, Response $response, array $args): ResponseInterface
- {
- $node_id = $request->getQueryParam('node_id');
- $node = Node::find($node_id);
- if ($node === null) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- $node->update(['node_heartbeat' => \time()]);
- if (($node->node_bandwidth_limit !== 0) && $node->node_bandwidth_limit < $node->node_bandwidth) {
- return $response->withJson([
- 'ret' => 1,
- 'data' => [],
- ]);
- }
- $users_raw = User::where('is_banned', 0)
- ->where('expire_in', '>', date('Y-m-d H:i:s'))
- ->where(static function (Builder $query) use ($node): void {
- $query->whereRaw(
- 'class >= ? AND IF(? = 0, 1, node_group = ?)',
- [$node->node_class, $node->node_group, $node->node_group]
- )->orWhere('is_admin', 1);
- })
- ->get();
- if (\in_array($node->sort, [11, 14])) {
- $key_list = [
- 'id', 'node_connector', 'node_speedlimit', 'node_iplimit', 'uuid', 'alive_ip',
- ];
- } else {
- $key_list = [
- 'id', 'node_connector', 'node_speedlimit', 'node_iplimit', 'method', 'port', 'passwd', 'alive_ip',
- ];
- }
- $alive_ip = (new Ip())->getUserAliveIpCount();
- $users = [];
- foreach ($users_raw as $user_raw) {
- if (isset($alive_ip[strval($user_raw->id)]) && $user_raw->node_connector !== 0) {
- $user_raw->alive_ip = $alive_ip[strval($user_raw->id)];
- }
- if ($user_raw->transfer_enable <= $user_raw->u + $user_raw->d) {
- if ($_ENV['keep_connect'] === true) {
- // 流量耗尽用户限速至 1Mbps
- $user_raw->node_speedlimit = 1;
- } else {
- continue;
- }
- }
- $user_raw = Tools::keyFilter($user_raw, $key_list);
- $users[] = $user_raw;
- }
- return ResponseHelper::etagJson($request, $response, [
- 'ret' => 1,
- 'data' => $users,
- ]);
- }
- /**
- * POST /mod_mu/users/traffic
- *
- * @param ServerRequest $request
- * @param Response $response
- * @param array $args
- *
- * @return ResponseInterface
- */
- public function addTraffic(Request $request, Response $response, array $args): ResponseInterface
- {
- $data = \json_decode($request->getBody()->__toString());
- if (!$data || !\is_array($data?->data)) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- $data = $data->data;
- $node_id = $request->getQueryParam('node_id');
- $node = Node::find($node_id);
- if ($node === null) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- $pdo = DB::getPdo();
- $stat = $pdo->prepare('UPDATE user SET t = UNIX_TIMESTAMP(), u = u + ?, d = d + ?, transfer_total = transfer_total + ? WHERE id = ?');
- $rate = (float) $node->traffic_rate;
- $sum = 0;
- foreach ($data as $log) {
- $u = $log?->u;
- $d = $log?->d;
- $user_id = $log?->user_id;
- if ($user_id) {
- $stat->execute([(int) ($u * $rate), (int) ($d * $rate), (int) ($u + $d), $user_id]);
- }
- $sum += $u + $d;
- }
- $node->increment('node_bandwidth', $sum);
- $node->online_user = count($data);
- $node->save();
- return $response->withJson([
- 'ret' => 1,
- 'data' => 'ok',
- ]);
- }
- /**
- * POST /mod_mu/users/aliveip
- *
- * @param ServerRequest $request
- * @param Response $response
- * @param array $args
- *
- * @return ResponseInterface
- */
- public function addAliveIp(Request $request, Response $response, array $args): ResponseInterface
- {
- $data = \json_decode($request->getBody()->__toString());
- if (!$data || !\is_array($data?->data)) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- $data = $data->data;
- $node_id = $request->getQueryParam('node_id');
- if ($node_id === null || !Node::where('id', $node_id)->exists()) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- foreach ($data as $log) {
- $ip = (string) $log?->ip;
- $userid = (int) $log?->user_id;
- Ip::insert([
- 'userid' => $userid,
- 'nodeid' => $node_id,
- 'ip' => $ip,
- 'datetime' => \time(),
- ]);
- }
- return $response->withJson([
- 'ret' => 1,
- 'data' => 'ok',
- ]);
- }
- /**
- * POST /mod_mu/users/detectlog
- *
- * @param ServerRequest $request
- * @param Response $response
- * @param array $args
- *
- * @return ResponseInterface
- */
- public function addDetectLog(Request $request, Response $response, array $args): ResponseInterface
- {
- $data = \json_decode($request->getBody()->__toString());
- if (!$data || !\is_array($data?->data)) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- $data = $data->data;
- $node_id = $request->getQueryParam('node_id');
- if ($node_id === null || !Node::where('id', $node_id)->exists()) {
- return $response->withJson([
- 'ret' => 0,
- ]);
- }
- foreach ($data as $log) {
- $list_id = (int) $log?->list_id;
- $user_id = (int) $log?->user_id;
- DetectLog::insert([
- 'user_id' => $user_id,
- 'list_id' => $list_id,
- 'node_id' => $node_id,
- 'datetime' => \time(),
- ]);
- }
- return $response->withJson([
- 'ret' => 1,
- 'data' => 'ok',
- ]);
- }
- }
|