Beispiel #1
0
        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();
            }
        }