Skip to content

Commit 6e6cd2b

Browse files
committed
fixed addons sometimes not adding to the lists
1 parent 83124f8 commit 6e6cd2b

File tree

9 files changed

+47
-36
lines changed

9 files changed

+47
-36
lines changed

src/Avalonia/Core/ViewModels/CampaignsViewModel.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ ScoresProvider scoresProvider
3939
_playtimeProvider = playtimeProvider;
4040

4141
_gamesProvider.GameChangedEvent += OnGameChanged;
42-
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonDownloaded;
42+
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonChanged;
43+
Game.InstalledAddonsProvider.AddonsChangedEvent += OnAddonChanged;
4344
}
4445

4546

@@ -215,15 +216,12 @@ private void OnGameChanged(GameEnum parameterName)
215216
}
216217
}
217218

218-
private void OnAddonDownloaded(IGame game, AddonTypeEnum addonType)
219+
private void OnAddonChanged(IGame game, AddonTypeEnum? addonType)
219220
{
220-
if (game.GameEnum != Game.GameEnum ||
221-
addonType is not AddonTypeEnum.TC)
221+
if (game.GameEnum == Game.GameEnum && (addonType is AddonTypeEnum.TC || addonType is null))
222222
{
223-
return;
223+
OnPropertyChanged(nameof(CampaignsList));
224224
}
225-
226-
OnPropertyChanged(nameof(CampaignsList));
227225
}
228226
}
229227
}

src/Avalonia/Core/ViewModels/DownloadsViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public DownloadsViewModel(IGame game)
1919
Game = game;
2020

2121
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonChanged;
22-
Game.InstalledAddonsProvider.AddonDeletedEvent += OnAddonChanged;
22+
Game.InstalledAddonsProvider.AddonsChangedEvent += OnAddonChanged;
2323
}
2424

2525

@@ -195,7 +195,7 @@ private void OnProgressChanged(object? sender, float e)
195195
OnPropertyChanged(nameof(ProgressBarValue));
196196
}
197197

198-
private void OnAddonChanged(IGame game, AddonTypeEnum addonType)
198+
private void OnAddonChanged(IGame game, AddonTypeEnum? addonType)
199199
{
200200
if (game.GameEnum != Game.GameEnum)
201201
{

src/Avalonia/Core/ViewModels/MapsViewModel.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ ScoresProvider scoresProvider
3939
_playtimeProvider = playtimeProvider;
4040

4141
_gamesProvider.GameChangedEvent += OnGameChanged;
42-
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonDownloaded;
42+
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonChanged;
43+
Game.InstalledAddonsProvider.AddonsChangedEvent += OnAddonChanged;
4344
}
4445

4546

@@ -218,15 +219,12 @@ private void OnGameChanged(GameEnum parameterName)
218219
}
219220
}
220221

221-
private void OnAddonDownloaded(IGame game, AddonTypeEnum addonType)
222+
private void OnAddonChanged(IGame game, AddonTypeEnum? addonType)
222223
{
223-
if (game.GameEnum != Game.GameEnum ||
224-
addonType is not AddonTypeEnum.Map)
224+
if (game.GameEnum == Game.GameEnum && (addonType is AddonTypeEnum.Map || addonType is null))
225225
{
226-
return;
226+
OnPropertyChanged(nameof(MapsList));
227227
}
228-
229-
OnPropertyChanged(nameof(MapsList));
230228
}
231229
}
232230
}

src/Avalonia/Core/ViewModels/ModsViewModel.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ ScoresProvider scoresProvider
3838
_playtimeProvider = playtimeProvider;
3939

4040
_gamesProvider.GameChangedEvent += OnGameChanged;
41-
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnModDownloaded;
41+
Game.DownloadableAddonsProvider.AddonDownloadedEvent += OnAddonChanged;
42+
Game.InstalledAddonsProvider.AddonsChangedEvent += OnAddonChanged;
4243
}
4344

4445

@@ -157,15 +158,12 @@ private void OnGameChanged(GameEnum parameterName)
157158
}
158159
}
159160

160-
private void OnModDownloaded(IGame game, AddonTypeEnum addonType)
161+
private void OnAddonChanged(IGame game, AddonTypeEnum? addonType)
161162
{
162-
if (game.GameEnum != Game.GameEnum ||
163-
addonType is not AddonTypeEnum.Mod)
163+
if (game.GameEnum == Game.GameEnum && (addonType is AddonTypeEnum.Mod || addonType is null))
164164
{
165-
return;
165+
OnPropertyChanged(nameof(ModsList));
166166
}
167-
168-
OnPropertyChanged(nameof(ModsList));
169167
}
170168
}
171169
}

src/ClientCommon/Config/ConfigProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,11 @@ private void SetGamePathValue(string? value, [CallerMemberName] string caller =
216216
{
217217
var setting = _dbContext.GamePaths.Find([caller]);
218218

219+
if (string.IsNullOrWhiteSpace(value))
220+
{
221+
value = null;
222+
}
223+
219224
if (setting is null)
220225
{
221226
_dbContext.GamePaths.Add(new() { Game = caller, Path = value });

src/Common/Helpers/Events.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
namespace Common.Helpers
55
{
6-
public delegate void AddonChanged(IGame game, AddonTypeEnum modType);
6+
public delegate void AddonChanged(IGame game, AddonTypeEnum? modType);
77
}

src/Common/Interfaces/IInstalledAddonsProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace Common.Interfaces
55
{
66
public interface IInstalledAddonsProvider
77
{
8-
event AddonChanged AddonDeletedEvent;
8+
event AddonChanged AddonsChangedEvent;
99

1010
/// <summary>
1111
/// Add addon to cache

src/Mods/Providers/DownloadableAddonsProvider.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed class DownloadableAddonsProvider : IDownloadableAddonsProvider
1818
private readonly ApiInterface _apiInterface;
1919

2020
private Dictionary<AddonTypeEnum, Dictionary<string, IDownloadableAddon>>? _cache;
21+
private readonly SemaphoreSlim _semaphore = new(1);
2122

2223
public event AddonChanged AddonDownloadedEvent;
2324

@@ -42,15 +43,19 @@ ApiInterface apiInterface
4243
/// <inheritdoc/>
4344
public async Task CreateCacheAsync()
4445
{
46+
await _semaphore.WaitAsync();
47+
4548
if (_cache is not null)
4649
{
50+
_semaphore.Release();
4751
return;
4852
}
4953

5054
var addons = await _apiInterface.GetAddonsAsync(_game.GameEnum).ConfigureAwait(false);
5155

5256
if (addons is null || addons.Count == 0)
5357
{
58+
_semaphore.Release();
5459
return;
5560
}
5661

@@ -61,6 +66,8 @@ public async Task CreateCacheAsync()
6166
_cache.TryAdd(addon.AddonType, []);
6267
_cache[addon.AddonType].TryAdd(addon.Id, addon);
6368
}
69+
70+
_semaphore.Release();
6471
}
6572

6673

src/Mods/Providers/InstalledAddonsProvider.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ public sealed class InstalledAddonsProvider : IInstalledAddonsProvider
2121
private readonly PlaytimeProvider _playtimeProvider;
2222

2323
private readonly Dictionary<AddonTypeEnum, Dictionary<string, IAddon>> _cache;
24-
private readonly SemaphoreSlim _semaphore = new(1);
24+
private static readonly SemaphoreSlim _semaphore = new(1);
2525

26-
public event AddonChanged AddonDeletedEvent;
26+
private bool _isCacheUpdating = false;
27+
28+
public event AddonChanged AddonsChangedEvent;
2729

2830
[Obsolete($"Don't create directly. Use {nameof(InstalledAddonsProvider)}.")]
2931
public InstalledAddonsProvider(
@@ -42,7 +44,8 @@ PlaytimeProvider playtimeProvider
4244
/// <inheritdoc/>
4345
public async Task CreateCache(bool createNew)
4446
{
45-
_semaphore.Wait();
47+
await _semaphore.WaitAsync();
48+
_isCacheUpdating = true;
4649

4750
if (createNew)
4851
{
@@ -55,7 +58,7 @@ await Task.Run(() =>
5558
{
5659
IEnumerable<string> files;
5760

58-
files = Directory.GetFiles(_game.CampaignsFolderPath).Where(static x => x.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) || x.EndsWith(".grp", StringComparison.OrdinalIgnoreCase));
61+
files = Directory.GetFiles(_game.CampaignsFolderPath, "*.zip");
5962
var camps = GetAddonsFromFiles(AddonTypeEnum.TC, files);
6063
_cache.Add(AddonTypeEnum.TC, camps);
6164

@@ -66,9 +69,11 @@ await Task.Run(() =>
6669
files = Directory.GetFiles(_game.ModsFolderPath, "*.zip");
6770
var mods = GetAddonsFromFiles(AddonTypeEnum.Mod, files);
6871
_cache.Add(AddonTypeEnum.Mod, mods);
69-
});
72+
}).WaitAsync(CancellationToken.None);
7073
}
7174

75+
_isCacheUpdating = false;
76+
AddonsChangedEvent?.Invoke(_game, null);
7277
_semaphore.Release();
7378

7479
_cache.ThrowIfNull();
@@ -110,7 +115,7 @@ public void DeleteAddon(IAddon addon)
110115

111116
_cache[addon.Type].Remove(addon.Id);
112117

113-
AddonDeletedEvent?.Invoke(_game, addon.Type);
118+
AddonsChangedEvent?.Invoke(_game, addon.Type);
114119
}
115120

116121
/// <inheritdoc/>
@@ -132,6 +137,11 @@ public void DisableAddon(string addonId)
132137
/// <inheritdoc/>
133138
public Dictionary<string, IAddon> GetInstalledAddons(AddonTypeEnum addonType)
134139
{
140+
if (_isCacheUpdating)
141+
{
142+
return [];
143+
}
144+
135145
_cache.ThrowIfNull();
136146

137147
_cache.TryGetValue(addonType, out var result);
@@ -233,8 +243,6 @@ newAddon.Version is not null &&
233243
Dictionary<string, string?>? incompatibles = null;
234244
IStartMap? startMap = null;
235245

236-
DukeVersionEnum? dukeVersion = null;
237-
238246
if (ArchiveFactory.IsArchive(pathToFile, out var _))
239247
{
240248
using var archive = ArchiveFactory.Open(pathToFile);
@@ -302,15 +310,12 @@ newAddon.Version is not null &&
302310
{
303311
if (manifest.SupportedGame.Version == DukeVersionEnum.Duke3D_13D.ToString())
304312
{
305-
dukeVersion = DukeVersionEnum.Duke3D_13D;
306313
}
307314
else if (manifest.SupportedGame.Version == DukeVersionEnum.Duke3D_Atomic.ToString())
308315
{
309-
dukeVersion = DukeVersionEnum.Duke3D_Atomic;
310316
}
311317
else if (manifest.SupportedGame.Version == DukeVersionEnum.Duke3D_WT.ToString())
312318
{
313-
dukeVersion = DukeVersionEnum.Duke3D_WT;
314319
}
315320
}
316321
}

0 commit comments

Comments
 (0)