diff --git a/PalworldModUploader/MainWindow.xaml b/PalworldModUploader/MainWindow.xaml index 85320d1..1e36232 100644 --- a/PalworldModUploader/MainWindow.xaml +++ b/PalworldModUploader/MainWindow.xaml @@ -170,9 +170,9 @@ - + diff --git a/PalworldModUploader/MainWindow.xaml.cs b/PalworldModUploader/MainWindow.xaml.cs index 8d15be7..3ec7177 100644 --- a/PalworldModUploader/MainWindow.xaml.cs +++ b/PalworldModUploader/MainWindow.xaml.cs @@ -48,7 +48,7 @@ public partial class MainWindow : Window private const string WorkshopAgreementUrl = "https://steamcommunity.com/sharedfiles/workshoplegalagreement"; private readonly ObservableCollection _modEntries = new(); - private ulong[] _subscribedItemIds = Array.Empty(); + private Dictionary _subscribedItemIds = new(); private readonly JsonSerializerOptions _jsonOptions = new() { AllowTrailingCommas = true, @@ -116,7 +116,7 @@ private async void OnLoaded(object? sender, RoutedEventArgs e) WorkshopDirTextBox.Text = _workshopContentDirectory; LoadModsFromDirectory(_workshopContentDirectory); - if (!foundSubscribed && _subscribedItemIds.Length == 0) + if (!foundSubscribed && _subscribedItemIds.Count == 0) { StatusTextBlock.Text = "No workshop subscriptions were detected via Steam. Using the configured directory."; } @@ -156,9 +156,9 @@ private async Task DiscoverWorkshopContentDirectoryAsync() private async Task RefreshSubscribedItemsAsync() { - _subscribedItemIds = Array.Empty(); + _subscribedItemIds = new Dictionary(); - var subscribedItemIds = new List(); + var subscribedItemIds = new Dictionary(); uint pageNumber = 1; uint processedResults = 0; @@ -207,9 +207,9 @@ private async Task RefreshSubscribedItemsAsync() } } - _subscribedItemIds = subscribedItemIds.ToArray(); + _subscribedItemIds = subscribedItemIds; - return receivedAnyResult && _subscribedItemIds.Length > 0; + return receivedAnyResult && _subscribedItemIds.Count > 0; } private async Task<(SteamUGCQueryCompleted_t Data, bool IoFailure)?> SendSubscribedItemsQueryAsync(uint pageNumber) @@ -255,7 +255,7 @@ private async Task RefreshSubscribedItemsAsync() } } - private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, ICollection subscribedItemIds) + private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, IDictionary subscribedItemIds) { for (uint i = 0; i < data.m_unNumResultsReturned; i++) { @@ -265,7 +265,8 @@ private void ProcessSubscriptionResults(SteamUGCQueryCompleted_t data, ICollecti } var publishedFileId = details.m_nPublishedFileId; - subscribedItemIds.Add(publishedFileId.m_PublishedFileId); + var isOwnedByUser = details.m_ulSteamIDOwner == SteamUser.GetSteamID().m_SteamID; + subscribedItemIds[publishedFileId.m_PublishedFileId] = isOwnedByUser; } } @@ -364,14 +365,16 @@ private void LoadModsFromDirectory(string baseDirectory) var dirInfo = new DirectoryInfo(directory); var entry = new ModDirectoryEntry(dirInfo.Name, dirInfo.FullName); - if (ulong.TryParse(dirInfo.Name, out var directoryId) && _subscribedItemIds.Contains(directoryId)) + if (ulong.TryParse(dirInfo.Name, out var directoryId) && _subscribedItemIds.TryGetValue(directoryId, out var isOwnedByUser)) { entry.IsSubscribed = true; entry.SubscribedPublishedFileId = directoryId; + entry.IsOwnedByUser = isOwnedByUser; } else { entry.Metadata = LoadMetadata(dirInfo.FullName); + entry.IsOwnedByUser = false; } var infoPath = Path.Combine(dirInfo.FullName, "Info.json"); @@ -532,7 +535,7 @@ private void UpdateModDetails() PalSchemaTypeCheckBox.IsEnabled = canEditInstallRules; InstallRuleManualWarning.Visibility = (canEdit && !isInstallRuleStandard) ? Visibility.Visible : Visibility.Collapsed; - UploadButton.IsEnabled = !_selectedEntry.IsSubscribed; + //UploadButton.IsEnabled = _selectedEntry.IsOwnedByUser; OpenModDirectoryButton.IsEnabled = true; OpenInSteamButton.IsEnabled = true; SaveModInfoButton.IsEnabled = false; @@ -642,7 +645,7 @@ private async void ReloadButton_Click(object sender, RoutedEventArgs e) PersistWorkshopDirectory(_workshopContentDirectory); LoadModsFromDirectory(_workshopContentDirectory); - if (!foundSubscribed && _subscribedItemIds.Length == 0) + if (!foundSubscribed && _subscribedItemIds.Count == 0) { StatusTextBlock.Text = "No workshop subscriptions were detected via Steam. Loaded the configured directory."; } diff --git a/PalworldModUploader/ViewModels/ModDirectoryEntry.cs b/PalworldModUploader/ViewModels/ModDirectoryEntry.cs index 8b22e1d..1dec878 100644 --- a/PalworldModUploader/ViewModels/ModDirectoryEntry.cs +++ b/PalworldModUploader/ViewModels/ModDirectoryEntry.cs @@ -12,6 +12,7 @@ public sealed class ModDirectoryEntry : INotifyPropertyChanged private ModInfo? _info; private WorkshopMetadata? _metadata; private bool _isSubscribed; + private bool _isOwnedByUser; private string? _infoLoadError; private ulong? _subscribedPublishedFileId; @@ -93,6 +94,21 @@ public bool IsSubscribed } } + public bool IsOwnedByUser + { + get => _isOwnedByUser; + set + { + if (_isOwnedByUser == value) + { + return; + } + + _isOwnedByUser = value; + OnPropertyChanged(nameof(IsOwnedByUser)); + } + } + public string? InfoLoadError { get => _infoLoadError;