Ctrl K
ComunidadGuías…

server/src/steam_integration.h

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
/**
 * @file src/steam_integration.h
 * @brief Local Steam library discovery and launch helpers.
 *
 * Steam is intentionally treated as a provider: this module does not own the
 * applications catalog or configuration.  Callers can reconcile the returned
 * records with their other providers using stable_id.
 */
#pragma once

#include <cstdint>
#include <filesystem>
#include <optional>
#include <string>
#include <string_view>
#include <vector>

namespace platf::steam {

  struct vdf_node {
    std::string value;
    std::vector<std::pair<std::string, vdf_node>> children;

    const vdf_node *find(const std::string &key) const;
  };

  // Parse Valve's quoted-key/quoted-value format. Comments and escaped quotes
  // are accepted; malformed trailing input is ignored after valid entries.
  vdf_node parse_vdf(const std::string &contents);

  struct game_t {
    std::uint32_t app_id = 0;
    // Opaque local-art revision supplied by the session-user scanner.
    std::string session_artwork_revision;
    std::string stable_id;  // "steam:<appid>"
    std::string name;
    std::filesystem::path install_dir;
    std::filesystem::path library_path;
    std::filesystem::path icon_path;
    std::filesystem::path header_path;
    // Best available local artwork source. Steam commonly stores this as a
    // JPEG/WebP; callers must inspect artwork_format before using it as a
    // client catalog image (it is not converted by this provider).
    std::filesystem::path portrait_path;
    // Alias used by catalog/API consumers that call portrait art "box art".
    std::filesystem::path boxart_path;
    std::filesystem::path artwork_path;
    // Managed PNG generated from artwork_path for catalog clients that do
    // not accept Steam's native JPEG/WebP files.
    std::filesystem::path artwork_client_path;
    std::string artwork_format;
    std::string app_type;
    // Resolved Steam launch metadata used to start the game without routing
    // through an already-running Steam client's immutable environment.
    std::filesystem::path launch_executable;
    std::filesystem::path launch_working_dir;
    std::filesystem::path proton_path;
    std::filesystem::path proton_runtime_path;
    std::filesystem::path steam_client_path;
    std::filesystem::path compatdata_path;
    std::string launch_arguments;
    std::string launch_options;
    std::string launch_os;
    bool installed = false;
    std::uint64_t last_played = 0;
    std::uint64_t playtime_minutes = 0;
    std::uint32_t state_flags = 0;
    std::uint64_t last_updated = 0;
  };

  // Discover installed games from the supplied Steam roots. A root may be a
  // Steam installation directory or a steamapps directory. Duplicate app IDs
  // are collapsed deterministically. If roots is empty, common OS locations
  // are searched.
  std::vector<game_t> discover(const std::vector<std::filesystem::path> &roots = {});
  // Discover installed games plus games recorded in Steam's local user
  // library/play-history metadata. This remains entirely local and does not
  // require a Steam Web API key or a public profile.
  std::vector<game_t> discover_catalog(const std::vector<std::filesystem::path> &roots = {});
  std::vector<std::filesystem::path> default_library_roots();
  // On the Linux machine host this reports the active desktop session's
  // scanner status without exposing that user's library paths to the host.
  bool available();

  // Return a URI/argv-safe launch target after validating the app ID.
  std::string launch_uri(std::uint32_t app_id);
  std::string launch_command(std::uint32_t app_id);

  // Re-resolve cached catalog commands for the active session. Gaming Mode
  // requires Steam to own the launch; Desktop Mode retains the configured command.
  std::string runtime_launch_command(std::string_view app_id, const std::string &configured_command, bool gamescope_session);

  // An already-running Steam broker cannot inherit environment changes from
  // a later `steam -applaunch` process. Features whose behavior is carried by
  // environment variables must therefore resolve a direct game command.
  inline bool requires_direct_environment_launch(bool frame_limiter_enabled, bool smooth_motion_enabled, bool hdr_enabled) {
    return frame_limiter_enabled || smooth_motion_enabled || hdr_enabled;
  }

#ifdef __linux__
  struct session_launch_policy_t {
    std::string provider = "disabled";
    std::uint32_t limit_millihz = 0;
    std::string preset = "custom";
    bool always_show_graph = false;
    std::string limiter_method = "late";
    bool smooth_motion = false;
    bool smooth_motion_graphics_queue = false;
    bool hdr = false;
    bool wayland_hdr_compatibility = false;
    bool proton_dualsense_compatibility = false;
    bool playstation_controller_attached = false;
  };

  // Build and recognize the one canonical machine-host command that delegates
  // Steam metadata parsing and direct launch to the selected desktop UID. The
  // returned argv never contains a path or shell fragment from Steam metadata.
  std::string session_launch_command(std::uint32_t app_id, const session_launch_policy_t &policy);
  std::optional<std::vector<std::string>> session_launch_arguments(std::string_view command);
#endif

  // Build a direct Linux launch that preserves Steam's user launch options
  // while placing ArtLight's game-process wrapper at %command%. Falls back
  // to the Steam broker when local metadata is incomplete.
  std::string launch_command(const game_t &game);
  bool launch(std::uint32_t app_id);

}  // namespace platf::steam