Files
HelperLib/OmegaLeo.HelperLib.Steamworks/SteamUgcCallResults.cs
T
2026-10-24 11:38:40 +01:00

122 lines
6.7 KiB
C#

using OmegaLeo.HelperLib.Shared.Attributes;
namespace OmegaLeo.HelperLib.Steamworks
{
[Documentation(nameof(SteamUgcSubmitItemUpdateResult), "Result of ISteamUGC::SubmitItemUpdate (SubmitItemUpdateResult_t).", null, null)]
public sealed class SteamUgcSubmitItemUpdateResult
{
[Documentation(nameof(Result), "Numeric EResult value (1 = OK).", null, null)]
public int Result { get; private set; }
[Documentation(nameof(UserNeedsToAcceptWorkshopLegalAgreement), "True when the user must accept the Workshop legal agreement before the item becomes visible.", null, null)]
public bool UserNeedsToAcceptWorkshopLegalAgreement { get; private set; }
[Documentation(nameof(PublishedFileId), "The updated Workshop item ID.", null, null)]
public ulong PublishedFileId { get; private set; }
[Documentation(nameof(IoFailure), "True when the result could not be retrieved; the other fields are then not valid.", null, null)]
public bool IoFailure { get; private set; }
[Documentation(nameof(IsSuccess), "True when the result was retrieved and EResult is OK.", null, null)]
public bool IsSuccess => !IoFailure && Result == 1;
internal static SteamUgcSubmitItemUpdateResult FromCallResult(SteamApiCallResult callResult)
{
// SubmitItemUpdateResult_t { EResult m_eResult; bool m_bUserNeedsToAcceptWorkshopLegalAgreement; PublishedFileId_t m_nPublishedFileId; }
// Offsets 0/4/8 under both pack 4 and pack 8.
return new SteamUgcSubmitItemUpdateResult
{
IoFailure = IsFailure(callResult, SteamCallbackIds.SubmitItemUpdateResult, 16),
Result = callResult.ReadInt32(0),
UserNeedsToAcceptWorkshopLegalAgreement = callResult.ReadBoolean(4),
PublishedFileId = callResult.ReadUInt64(8)
};
}
internal static bool IsFailure(SteamApiCallResult callResult, int expectedCallbackId, int minimumSize)
{
return callResult.IoFailure || callResult.CallbackId != expectedCallbackId || callResult.Payload.Length < minimumSize;
}
}
[Documentation(nameof(SteamUgcCreateItemResult), "Result of ISteamUGC::CreateItem (CreateItemResult_t).", null, null)]
public sealed class SteamUgcCreateItemResult
{
[Documentation(nameof(Result), "Numeric EResult value (1 = OK).", null, null)]
public int Result { get; private set; }
[Documentation(nameof(PublishedFileId), "The new Workshop item ID. Pass it to StartItemUpdate to upload content.", null, null)]
public ulong PublishedFileId { get; private set; }
[Documentation(nameof(UserNeedsToAcceptWorkshopLegalAgreement), "True when the user must accept the Workshop legal agreement before the item becomes visible.", null, null)]
public bool UserNeedsToAcceptWorkshopLegalAgreement { get; private set; }
[Documentation(nameof(IoFailure), "True when the result could not be retrieved; the other fields are then not valid.", null, null)]
public bool IoFailure { get; private set; }
[Documentation(nameof(IsSuccess), "True when the result was retrieved and EResult is OK.", null, null)]
public bool IsSuccess => !IoFailure && Result == 1;
internal static SteamUgcCreateItemResult FromCallResult(SteamApiCallResult callResult)
{
// CreateItemResult_t { EResult m_eResult; PublishedFileId_t m_nPublishedFileId; bool m_bUserNeedsToAcceptWorkshopLegalAgreement; }
// Pack 8 (Windows): offsets 0/8/16, size 24. Pack 4 (Linux/macOS): offsets 0/4/12, size 16.
var large = SteamCallbackDispatcher.UsesLargeCallbackPack;
var idOffset = large ? 8 : 4;
var legalOffset = large ? 16 : 12;
return new SteamUgcCreateItemResult
{
IoFailure = SteamUgcSubmitItemUpdateResult.IsFailure(callResult, SteamCallbackIds.CreateItemResult, legalOffset + 1),
Result = callResult.ReadInt32(0),
PublishedFileId = callResult.ReadUInt64(idOffset),
UserNeedsToAcceptWorkshopLegalAgreement = callResult.ReadBoolean(legalOffset)
};
}
}
[Documentation(nameof(SteamUgcQueryCompletedResult), "Result of ISteamUGC::SendQueryUGCRequest (SteamUGCQueryCompleted_t). Release the query handle with ReleaseQueryUgcRequest when done.", null, null)]
public sealed class SteamUgcQueryCompletedResult
{
[Documentation(nameof(QueryHandle), "The UGC query handle the results belong to.", null, null)]
public ulong QueryHandle { get; private set; }
[Documentation(nameof(Result), "Numeric EResult value (1 = OK).", null, null)]
public int Result { get; private set; }
[Documentation(nameof(NumResultsReturned), "Number of items returned in this page.", null, null)]
public uint NumResultsReturned { get; private set; }
[Documentation(nameof(TotalMatchingResults), "Total number of items matching the query.", null, null)]
public uint TotalMatchingResults { get; private set; }
[Documentation(nameof(CachedData), "True when the results came from the local cache.", null, null)]
public bool CachedData { get; private set; }
[Documentation(nameof(NextCursor), "Cursor for the next page (cursor-based queries only).", null, null)]
public string NextCursor { get; private set; } = string.Empty;
[Documentation(nameof(IoFailure), "True when the result could not be retrieved; the other fields are then not valid.", null, null)]
public bool IoFailure { get; private set; }
[Documentation(nameof(IsSuccess), "True when the result was retrieved and EResult is OK.", null, null)]
public bool IsSuccess => !IoFailure && Result == 1;
internal static SteamUgcQueryCompletedResult FromCallResult(SteamApiCallResult callResult)
{
// SteamUGCQueryCompleted_t { UGCQueryHandle_t m_handle; EResult m_eResult; uint32 m_unNumResultsReturned;
// uint32 m_unTotalMatchingResults; bool m_bCachedData; char m_rgchNextCursor[256]; }
// Offsets 0/8/12/16/20/21 under both pack 4 and pack 8.
return new SteamUgcQueryCompletedResult
{
IoFailure = SteamUgcSubmitItemUpdateResult.IsFailure(callResult, SteamCallbackIds.SteamUgcQueryCompleted, 21),
QueryHandle = callResult.ReadUInt64(0),
Result = callResult.ReadInt32(8),
NumResultsReturned = callResult.ReadUInt32(12),
TotalMatchingResults = callResult.ReadUInt32(16),
CachedData = callResult.ReadBoolean(20),
NextCursor = callResult.ReadString(21, 256)
};
}
}
}