Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaCsSteam.cs

152 lines
4.9 KiB
C#

using Steamworks;
using Steamworks.Data;
using Barotrauma.Steam;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Threading.Tasks;
using System;
using Steamworks.Ugc;
namespace Barotrauma
{
partial class LuaCsSteam
{
private struct WorkshopItemDownload
{
public Steamworks.Ugc.Item Item;
public string Destination;
public LuaCsAction Callback;
}
double lastTimeChecked = 0;
List<WorkshopItemDownload> itemsBeingDownloaded = new List<WorkshopItemDownload>();
public LuaCsSteam()
{
}
private static void CopyFolder(string sourceDirName, string destDirName, bool copySubDirs, bool overwriteExisting = false)
{
// Get the subdirectories for the specified directory.
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
if (!dir.Exists)
{
throw new System.IO.DirectoryNotFoundException(
"Source directory does not exist or could not be found: "
+ sourceDirName);
}
IEnumerable<DirectoryInfo> dirs = dir.GetDirectories();
// If the destination directory doesn't exist, create it.
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
// Get the files in the directory and copy them to the new location.
IEnumerable<FileInfo> files = dir.GetFiles();
foreach (FileInfo file in files)
{
string tempPath = Path.Combine(destDirName, file.Name);
if (!overwriteExisting && File.Exists(tempPath)) { continue; }
file.CopyTo(tempPath, true);
}
// If copying subdirectories, copy them and their contents to new location.
if (copySubDirs)
{
foreach (DirectoryInfo subdir in dirs)
{
string tempPath = Path.Combine(destDirName, subdir.Name);
CopyFolder(subdir.FullName, tempPath, copySubDirs, overwriteExisting);
}
}
}
private async void DownloadWorkshopItemAsync(WorkshopItemDownload download, bool startDownload = false)
{
if (startDownload)
{
SteamManager.Workshop.NukeDownload(download.Item);
SteamUGC.Download(download.Item.Id, true);
itemsBeingDownloaded.Add(download);
}
if (download.Item.IsInstalled && Directory.Exists(download.Item.Directory))
{
if (download.Callback != null)
{
download.Callback(download.Item);
}
itemsBeingDownloaded.Remove(download);
CopyFolder(download.Item.Directory, download.Destination, true, true);
return;
}
}
public async void DownloadWorkshopItem(ulong id, string destination, LuaCsAction callback)
{
if (!LuaCsFile.IsPathAllowedException(destination)) { return; }
Option<Steamworks.Ugc.Item> itemOption = await SteamManager.Workshop.GetItem(id);
if (itemOption.TryUnwrap(out Steamworks.Ugc.Item item))
{
DownloadWorkshopItemAsync(new WorkshopItemDownload()
{
Item = item,
Destination = destination,
Callback = callback
}, true);
}
else
{
throw new Exception($"Tried to download invalid workshop item {id}.");
}
}
public void DownloadWorkshopItem(Steamworks.Ugc.Item item, string destination, LuaCsAction callback)
{
DownloadWorkshopItemAsync(new WorkshopItemDownload()
{
Item = item,
Destination = destination,
Callback = callback
}, true);
}
public async void GetWorkshopItem(UInt64 id, LuaCsAction callback)
{
Option<Steamworks.Ugc.Item> itemOption = await SteamManager.Workshop.GetItem(id);
if (itemOption.TryUnwrap(out Steamworks.Ugc.Item item))
{
callback(item);
}
else
{
callback(null);
}
}
public void Update()
{
if (itemsBeingDownloaded.Count > 0 && Timing.TotalTime > lastTimeChecked) // SteamUGC.OnDownloadItemResult for some reason doesn't work, so i need to do this stupid thing.
{
foreach (var item in itemsBeingDownloaded.ToArray())
{
DownloadWorkshopItemAsync(item);
}
lastTimeChecked = Timing.TotalTime + 15;
}
}
}
}