Esempio n. 1
0
        public async Task <PublishResult> SubmitAsync(IProgress <float> progress = null)
        {
            var result = default(PublishResult);

            progress?.Report(0);

            if (consumerAppId == 0)
            {
                consumerAppId = SteamClient.AppId;
            }

            //
            // Checks
            //
            if (ContentFolder != null)
            {
                if (!System.IO.Directory.Exists(ContentFolder.FullName))
                {
                    throw new System.Exception($"UgcEditor - Content Folder doesn't exist ({ContentFolder.FullName})");
                }

                if (!ContentFolder.EnumerateFiles("*", System.IO.SearchOption.AllDirectories).Any())
                {
                    throw new System.Exception($"UgcEditor - Content Folder is empty");
                }
            }


            //
            // Item Create
            //
            if (creatingNew)
            {
                result.Result = Steamworks.Result.Fail;

                var created = await SteamUGC.Internal.CreateItem(consumerAppId, creatingType);

                if (!created.HasValue)
                {
                    return(result);
                }

                result.Result = created.Value.Result;

                if (result.Result != Steamworks.Result.OK)
                {
                    return(result);
                }

                FileId = created.Value.PublishedFileId;
                result.NeedsWorkshopAgreement = created.Value.UserNeedsToAcceptWorkshopLegalAgreement;
                result.FileId = FileId;
            }

            result.FileId = FileId;

            //
            // Item Update
            //
            {
                var handle = SteamUGC.Internal.StartItemUpdate(consumerAppId, FileId);
                if (handle == 0xffffffffffffffff)
                {
                    return(result);
                }

                if (Title != null)
                {
                    SteamUGC.Internal.SetItemTitle(handle, Title);
                }
                if (Description != null)
                {
                    SteamUGC.Internal.SetItemDescription(handle, Description);
                }
                if (MetaData != null)
                {
                    SteamUGC.Internal.SetItemMetadata(handle, MetaData);
                }
                if (Language != null)
                {
                    SteamUGC.Internal.SetItemUpdateLanguage(handle, Language);
                }
                if (ContentFolder != null)
                {
                    SteamUGC.Internal.SetItemContent(handle, ContentFolder.FullName);
                }
                if (PreviewFile != null)
                {
                    SteamUGC.Internal.SetItemPreview(handle, PreviewFile);
                }
                if (Visibility.HasValue)
                {
                    SteamUGC.Internal.SetItemVisibility(handle, Visibility.Value);
                }
                if (Tags != null && Tags.Count > 0)
                {
                    using (var a = SteamParamStringArray.From(Tags.ToArray()))
                    {
                        var val = a.Value;
                        SteamUGC.Internal.SetItemTags(handle, ref val);
                    }
                }

                if (KeyValueTagsToRemove != null)
                {
                    foreach (var key in KeyValueTagsToRemove)
                    {
                        SteamUGC.Internal.RemoveItemKeyValueTags(handle, key);
                    }
                }

                if (KeyValueTags != null)
                {
                    foreach (var keyWithValues in KeyValueTags)
                    {
                        var key = keyWithValues.Key;
                        foreach (var value in keyWithValues.Value)
                        {
                            SteamUGC.Internal.AddItemKeyValueTag(handle, key, value);
                        }
                    }
                }

                result.Result = Steamworks.Result.Fail;

                if (ChangeLog == null)
                {
                    ChangeLog = "";
                }

                var updating = SteamUGC.Internal.SubmitItemUpdate(handle, ChangeLog);

                while (!updating.IsCompleted)
                {
                    if (progress != null)
                    {
                        ulong total     = 0;
                        ulong processed = 0;

                        var r = SteamUGC.Internal.GetItemUpdateProgress(handle, ref processed, ref total);

                        switch (r)
                        {
                        case ItemUpdateStatus.PreparingConfig:
                        {
                            progress?.Report(0.1f);
                            break;
                        }

                        case ItemUpdateStatus.PreparingContent:
                        {
                            progress?.Report(0.2f);
                            break;
                        }

                        case ItemUpdateStatus.UploadingContent:
                        {
                            var uploaded = total > 0 ? ((float)processed / (float)total) : 0.0f;
                            progress?.Report(0.2f + uploaded * 0.7f);
                            break;
                        }

                        case ItemUpdateStatus.UploadingPreviewFile:
                        {
                            progress?.Report(0.8f);
                            break;
                        }

                        case ItemUpdateStatus.CommittingChanges:
                        {
                            progress?.Report(1);
                            break;
                        }
                        }
                    }

                    await Task.Delay(1000 / 60);
                }

                progress?.Report(1);

                var updated = updating.GetResult();

                if (!updated.HasValue)
                {
                    return(result);
                }

                result.Result = updated.Value.Result;

                if (result.Result != Steamworks.Result.OK)
                {
                    return(result);
                }

                result.NeedsWorkshopAgreement = updated.Value.UserNeedsToAcceptWorkshopLegalAgreement;
                result.FileId = FileId;
            }

            return(result);
        }