Files
se-launcher/PluginLoader/SteamAPI.cs
pas2704 46d915911b
All checks were successful
Build / Build Launcher (push) Successful in 1m12s
Prevent unnecessarily downloading subscribed/legacy workshop items
Fix gitignore
2024-08-25 22:30:28 -04:00

64 lines
1.8 KiB
C#

using NLog;
using Steamworks;
namespace PluginLoader;
public static class SteamAPI
{
public static bool IsSubscribed(ulong id)
{
var state = (EItemState)SteamUGC.GetItemState(new(id));
return (state & EItemState.k_EItemStateSubscribed) == EItemState.k_EItemStateSubscribed;
}
public static void SubscribeToItem(ulong id)
{
SteamUGC.SubscribeItem(new(id));
}
public static void Update(IEnumerable<ulong> ids)
{
var enumerable = ids as ulong[] ?? ids.ToArray();
LogFile.Log.Info("Updating {Count} workshop items", enumerable.Length);
try
{
UpdateInternal(enumerable);
}
catch (Exception e)
{
LogFile.Log.Error(e, "An error occurred while updating workshop items");
throw;
}
}
private static void UpdateInternal(IEnumerable<ulong> ids)
{
var count = 0;
using var callback = Callback<DownloadItemResult_t>.Create(t =>
{
if (t.m_eResult == EResult.k_EResultOK)
Interlocked.Increment(ref count);
LogFile.Log.Log(t.m_eResult == EResult.k_EResultOK ? LogLevel.Info : LogLevel.Error,
"Download finished for {Id} with {State}", t.m_nPublishedFileId.m_PublishedFileId, t.m_eResult);
});
//items could have other flags besides installed
var toDownload = ids.Where(b =>
((EItemState)SteamUGC.GetItemState(new(b)) & EItemState.k_EItemStateInstalled) == 0).ToArray();
foreach (var id in toDownload)
{
LogFile.Log.Info("Updating workshop item {Id}", id);
SteamUGC.DownloadItem(new(id), true);
}
while (count < toDownload.Length)
{
Steamworks.SteamAPI.RunCallbacks();
Thread.Sleep(10);
}
}
}