예제 #1
0
        public async Task <TaskResult <ResourceCompleterCheckResult?> > CheckAndDownloadTaskAsync()
        {
            _retryFiles.Clear();

            if (!(ResourceInfoResolvers?.Any() ?? false))
            {
                return(new TaskResult <ResourceCompleterCheckResult?>(TaskResultStatus.Success, value: null));
            }

            var totalLostFiles = new List <IGameResource>();

            foreach (var resolver in ResourceInfoResolvers)
            {
                resolver.GameResourceInfoResolveEvent += GameResourceInfoResolveStatus;

                await foreach (var lostFile in resolver.ResolveResourceAsync())
                {
                    totalLostFiles.Add(lostFile);
                }
            }

            if (!totalLostFiles.Any())
            {
                return(new TaskResult <ResourceCompleterCheckResult?>(TaskResultStatus.Success, value: null));
            }

            totalLostFiles.Shuffle();
            NeedToDownload = totalLostFiles.Count;

            var downloadList =
                (
                    from f in totalLostFiles
                    select new DownloadFile
            {
                Completed = WhenCompleted,
                DownloadPath = f.Path,
                DownloadUri = f.Uri,
                FileName = f.FileName,
                FileSize = f.FileSize,
                CheckSum = f.CheckSum,
                FileType = f.Type,
                TimeOut = 10000
            }).ToList();

            if (downloadList.First().FileType.Equals("GameJar", StringComparison.OrdinalIgnoreCase))
            {
                downloadList.First().Changed = (_, args) =>
                {
                    DownloadFileCompletedEvent?.Invoke(this,
                                                       new DownloadFileCompletedEventArgs(null, null, downloadList.First(), args.Speed));
                };
            }

            var(item1, item2) = await DownloadFiles(downloadList);

            return(new TaskResult <ResourceCompleterCheckResult?>(item1, value: item2));
        }
예제 #2
0
        private void WhenCompleted(object?sender, DownloadFileCompletedEventArgs e)
        {
            TotalDownloaded++;
            InvokeDownloadProgressChangedEvent((double)TotalDownloaded / NeedToDownload, e.AverageSpeed);
            DownloadFileCompletedEvent?.Invoke(this, e);

            if (!(e.Success ?? false))
            {
                _retryFiles.Add(e.File);
                return;
            }

            if (!CheckFile)
            {
                return;
            }

            Check(e.File, ref _retryFiles);
        }