Files
ProjectQuint/Assets/ProjectQuint/Runtime/Unity/Bootstrap/ProfileRatingThumbnailCatalog.cs
T

80 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ProjectQuint.Core.Progression;
using ProjectQuint.Library;
using ProjectQuint.Persistence;
namespace ProjectQuint.Bootstrap
{
internal sealed class ProfileRatingThumbnailCatalog
{
private long _sourceSignature = long.MinValue;
public IReadOnlyList<SongLibraryEntry> Songs { get; private set; } = Array.Empty<SongLibraryEntry>();
public int Revision { get; private set; }
public void Refresh(IReadOnlyList<RatingSummary> contexts,
IReadOnlyList<SongLibraryEntry> activeSongs, int songsRevision, BmsPackRegistry registry)
{
var requestedChartIds = new HashSet<string>(StringComparer.Ordinal);
foreach (var context in contexts ?? Array.Empty<RatingSummary>())
{
foreach (var entry in context.BestPlays ?? Array.Empty<RatingChartEntry>())
{
if (!string.IsNullOrWhiteSpace(entry.ChartId))
requestedChartIds.Add(entry.ChartId);
}
}
var signature = 17L;
unchecked
{
signature = signature * 31 + (songsRevision);
foreach (var chartId in requestedChartIds.OrderBy(id => id, StringComparer.Ordinal))
signature = signature * 31 + StringComparer.Ordinal.GetHashCode(chartId);
foreach (var pack in registry?.Packs ?? Array.Empty<BmsPackDefinition>())
{
var cachePath = registry.CachePathFor(pack);
var cache = new FileInfo(cachePath);
signature = signature * 31 + StringComparer.OrdinalIgnoreCase.GetHashCode(pack.Id ?? string.Empty);
signature = signature * 31 + (cache.Exists ? cache.Length : 0L);
signature = signature * 31 + (cache.Exists ? cache.LastWriteTimeUtc.Ticks : 0L);
}
}
if (signature == _sourceSignature)
return;
var songsByChartId = new Dictionary<string, SongLibraryEntry>(StringComparer.Ordinal);
void AddSong(SongLibraryEntry song)
{
if (song == null)
return;
var chartId = ChartIdentityResolver.Resolve(song).Value;
if (requestedChartIds.Contains(chartId) && !songsByChartId.ContainsKey(chartId))
songsByChartId.Add(chartId, song);
}
foreach (var song in activeSongs ?? Array.Empty<SongLibraryEntry>())
AddSong(song);
foreach (var pack in registry?.Packs ?? Array.Empty<BmsPackDefinition>())
{
foreach (var song in SongLibraryScanner.LoadCachedThumbnailEntries(
registry.CachePathFor(pack),
pack.ContentRoot,
pack.Id,
requestedChartIds))
AddSong(song);
}
Songs = songsByChartId.Values.ToArray();
_sourceSignature = signature;
unchecked
{
Revision++;
}
}
}
}