internal async Task RefreshPackageIDs(Bot bot, ICollection <uint> packageIDs) { if ((bot == null) || (packageIDs == null) || (packageIDs.Count == 0)) { ASF.ArchiLogger.LogNullError(nameof(bot) + " || " + nameof(packageIDs)); return; } await PackagesRefreshSemaphore.WaitAsync().ConfigureAwait(false); try { HashSet <uint> missingPackageIDs = new HashSet <uint>(packageIDs.AsParallel().Where(packageID => AppIDsToPackageIDs.Values.All(packages => !packages.Contains(packageID)))); if (missingPackageIDs.Count == 0) { return; } Dictionary <uint, HashSet <uint> > appIDsToPackageIDs = await bot.GetAppIDsToPackageIDs(missingPackageIDs).ConfigureAwait(false); if ((appIDsToPackageIDs == null) || (appIDsToPackageIDs.Count == 0)) { return; } foreach (KeyValuePair <uint, HashSet <uint> > appIDtoPackageID in appIDsToPackageIDs) { if (!AppIDsToPackageIDs.TryGetValue(appIDtoPackageID.Key, out ConcurrentHashSet <uint> packages)) { packages = new ConcurrentHashSet <uint>(); AppIDsToPackageIDs[appIDtoPackageID.Key] = packages; } foreach (uint package in appIDtoPackageID.Value) { packages.Add(package); } } await Save().ConfigureAwait(false); } finally { PackagesRefreshSemaphore.Release(); } }