Files
Kirill Chikalin 275dc598c7 update libs
2025-02-13 17:48:12 +03:00

99 lines
3.8 KiB
C#

using AssetStoreTools.Api.Responses;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace AssetStoreTools.Api
{
internal class UnityPackageUploadSettings
{
public string VersionId { get; set; }
public string UnityPackagePath { get; set; }
public string RootGuid { get; set; }
public string RootPath { get; set; }
public string ProjectPath { get; set; }
}
internal class UnityPackageUploader : PackageUploaderBase
{
private UnityPackageUploadSettings _settings;
private Uri _uploadUri;
public UnityPackageUploader(UnityPackageUploadSettings settings)
{
_settings = settings;
}
protected override void ValidateSettings()
{
if (string.IsNullOrEmpty(_settings.VersionId))
throw new Exception("Version Id is unset");
if (string.IsNullOrEmpty(_settings.UnityPackagePath)
|| !File.Exists(_settings.UnityPackagePath))
throw new Exception("Package file could not be found");
if (!_settings.UnityPackagePath.EndsWith(".unitypackage"))
throw new Exception("Provided package file is not .unitypackage");
}
public override async Task<PackageUploadResponse> Upload(IAssetStoreClient client, IProgress<float> progress = null, CancellationToken cancellationToken = default)
{
try
{
ValidateSettings();
var endpoint = Constants.Api.UploadUnityPackageUrl(_settings.VersionId);
var query = new Dictionary<string, string>()
{
{ "root_guid", _settings.RootGuid },
{ "root_path", _settings.RootPath },
{ "project_path", _settings.ProjectPath }
};
_uploadUri = ApiUtility.CreateUri(endpoint, query, true);
}
catch (Exception e)
{
return new PackageUploadResponse() { Success = false, Status = UploadStatus.Fail, Exception = e };
}
return await Task.Run(() => UploadTask(client, progress, cancellationToken));
}
private PackageUploadResponse UploadTask(IAssetStoreClient client, IProgress<float> progress, CancellationToken cancellationToken)
{
try
{
using (FileStream requestFileStream = new FileStream(_settings.UnityPackagePath, FileMode.Open, FileAccess.Read))
{
var content = new StreamContent(requestFileStream, UploadChunkSizeBytes);
var response = client.Put(_uploadUri, content, cancellationToken);
WaitForUploadCompletion(response, requestFileStream, progress, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
EnsureSuccessResponse(response.Result);
var responseStr = response.Result.Content.ReadAsStringAsync().Result;
return new PackageUploadResponse(responseStr);
}
}
catch (OperationCanceledException e)
{
return new PackageUploadResponse() { Success = false, Cancelled = true, Status = UploadStatus.Cancelled, Exception = e };
}
catch (TimeoutException e)
{
return new PackageUploadResponse() { Success = true, Status = UploadStatus.ResponseTimeout, Exception = e };
}
catch (Exception e)
{
return new PackageUploadResponse() { Success = false, Exception = e, Status = UploadStatus.Fail };
}
}
}
}