The first half of surge day 1. One question, "may this session emit Pro output?", with one method on the interface so nothing downstream knows which rail proved it. SteamEntitlement reads the lifetime SKU the way Valve intends: SteamAPI.Init() then SteamApps.BIsDlcInstalled(dlcAppId). Four different failure paths all resolve to the free tier rather than to Pro or to a crash — no DLC id configured, no Steam client, steam_api64.dll missing (a throw on first touch), and simply not owned. A copied folder run without Steam is the common case, not an exceptional one. NotConfigured() is the shipping default until Steamworks creates the DLC app; it answers false without ever touching the native library, so today's builds behave exactly as they did before this commit. HasProOutput is now IsPremium || DeveloperMode || rail, with an internal EntitlementOverride test seam (internal, because a public setter here is a licence bypass). Four tests: no id reads false, no client reads false without throwing, the fake reports what a test sets, and the view model takes its answer from the rail. Steamworks.NET 2024.8.0 added; the native DLL still comes from scripts/steam-sdk.sh, so the csproj change is three lines and no formatting churn.
20 lines
912 B
C#
20 lines
912 B
C#
namespace ytLive.Services.Entitlement;
|
|
|
|
/// <summary>
|
|
/// Where "is this copy licensed for Pro output?" comes from.
|
|
///
|
|
/// <para><b>One question, two sources.</b> The lifetime SKU is a Steam DLC; the monthly is a Polar
|
|
/// lease. Both answer this interface, and everything downstream — the output profile, the greyed
|
|
/// tier list, the notices — reads only this. Nothing outside <c>Services/Entitlement</c> may know
|
|
/// which rail proved it.</para>
|
|
///
|
|
/// <para><b>Fail closed.</b> An implementation that cannot reach its source, cannot load its
|
|
/// native library, or has no product id configured returns <c>false</c>. Pro is never a default,
|
|
/// never a cached "probably", and never the result of an exception being swallowed as true.</para>
|
|
/// </summary>
|
|
public interface IEntitlement
|
|
{
|
|
/// <summary>True when this session may emit above the free output budget.</summary>
|
|
bool IsPro { get; }
|
|
}
|