get()->append([ 'last_check_at', 'last_push_at', 'online', 'is_online', 'available_status', 'cache_key', 'load_status' ]); } /** * 获取指定用户可用的服务器列表 * @param User $user * @return array */ public static function getAvailableServers(User $user): array { $servers = Server::whereJsonContains('group_ids', (string) $user->group_id) ->where('show', true) ->orderBy('sort', 'ASC') ->get() ->append(['last_check_at', 'last_push_at', 'online', 'is_online', 'available_status', 'cache_key', 'server_key']); $servers = collect($servers)->map(function ($server) use ($user) { // 判断动态端口 if (str_contains($server->port, '-')) { $port = $server->port; $server->port = (int) Helper::randomPort($port); $server->ports = $port; } else { $server->port = (int) $server->port; } $server->password = $server->generateServerPassword($user); $server->rate = $server->getCurrentRate(); return $server; })->toArray(); return $servers; } /** * 根据权限组获取可用的用户列表 * @param array $groupIds * @return Collection */ public static function getAvailableUsers(Server $node) { $users = User::toBase() ->whereIn('group_id', $node->group_ids) ->whereRaw('u + d < transfer_enable') ->where(function ($query) { $query->where('expired_at', '>=', time()) ->orWhere('expired_at', NULL); }) ->where('banned', 0) ->select([ 'id', 'uuid', 'speed_limit', 'device_limit' ]) ->get(); return HookManager::filter('server.users.get', $users, $node); } // 获取路由规则 public static function getRoutes(array $routeIds) { $routes = ServerRoute::select(['id', 'match', 'action', 'action_value'])->whereIn('id', $routeIds)->get(); return $routes; } /** * 根据协议类型和标识获取服务器 * @param int $serverId * @param string $serverType * @return Server|null */ public static function getServer($serverId, ?string $serverType) { return Server::query() ->when($serverType, function ($query) use ($serverType) { $query->where('type', Server::normalizeType($serverType)); }) ->where(function ($query) use ($serverId) { $query->where('code', $serverId) ->orWhere('id', $serverId); }) ->orderByRaw('CASE WHEN code = ? THEN 0 ELSE 1 END', [$serverId]) ->first(); } }