get()->append([ 'last_check_at', 'last_push_at', 'online', 'is_online', 'available_status', 'cache_key' ]); } /** * 获取指定用户可用的服务器列表 * @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, '-')) { $server->port = (string) Helper::randomPort($server->port); $server->ports = $server->port; } $server->password = $server->generateShadowsocksPassword($user); return $server; })->toArray(); return $servers; } /** * 根据权限组获取可用的用户列表 * @param array $groupIds * @return Collection */ public static function getAvailableUsers(array $groupIds) { return User::toBase() ->whereIn('group_id', $groupIds) ->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(); } // 获取路由规则 public static function getRoutes(array $routeIds) { $routes = ServerRoute::select(['id', 'match', 'action', 'action_value'])->whereIn('id', $routeIds)->get(); // TODO: remove on 1.8.0 foreach ($routes as $k => $route) { $array = json_decode($route->match, true); if (is_array($array)) $routes[$k]['match'] = $array; } // TODO: remove on 1.8.0 return $routes; } /** * 根据协议类型和标识获取服务器 * @param int $serverId * @param string $serverType * @return Server|null */ public static function getServer($serverId, $serverType) { return Server::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(); } }