示例#1
0
        /// <summary>
        /// Генерируем запрос серверу в зависимости от контекста
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public ApproveLoadWorldReason GenerateRequestAndDoJob(object context)
        {
            // По хорошему надо разнести на два вызова один для модов второй для стим с передачей параметров через контекст
            Loger.Log("Send hash to server");
            var modsResCheck = _sessionClient.TransObject2 <ModelModsFiles>(generateHashFiles(false), RequestTypePackage, ResponseTypePackage);
            var steamCheck   = _sessionClient.TransObject2 <ModelModsFiles>(generateHashFiles(true), RequestTypePackage, ResponseTypePackage);

            ApproveLoadWorldReason result = ApproveLoadWorldReason.LoginOk;

            if (modsResCheck.Files.Count > 0)
            {
                result = result | ApproveLoadWorldReason.ModsFilesFail;
                FileChecker.FileSynchronization(GenFilePaths.ModsFolderPath, modsResCheck);
            }

            if (steamCheck.Files.Count > 0)
            {
                result = result | ApproveLoadWorldReason.ModsSteamWorkShopFail;
                FileChecker.FileSynchronization(SteamFolder, steamCheck);
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Генерируем запрос серверу в зависимости от контекста
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public ApproveLoadWorldReason GenerateRequestAndDoJob(object context)
        {
            // each request - response Client-Server-Client ~100-200 ms, get all check hash in one request
            // каждый запрос-отклик к серверу ~100-200 мс, получаем за один запрос все файлы
            // ~40 000 files *512 SHA key ~ size of package ~ 2,5 Mb

            ApproveLoadWorldReason result = ApproveLoadWorldReason.LoginOk;
            bool downloading  = true;
            long totalSize    = 0;
            long downloadSize = 0;

            while (downloading)
            {
                var clientFileChecker = (ClientFileChecker)context;
                var model             = new ModelModsFiles()
                {
                    Files      = clientFileChecker.FilesHash,
                    FolderType = clientFileChecker.FolderType,
                };

                UpdateModsWindow.Title       = "OC_Hash_Downloading".Translate();
                UpdateModsWindow.HashStatus  = "";
                UpdateModsWindow.SummaryList = null;
                Loger.Log($"Send hash {clientFileChecker.Folder}");

                var res = _sessionClient.TransObject2 <ModelModsFiles>(model, RequestTypePackage, ResponseTypePackage);

                if (res.Files.Count > 0)
                {
                    if (totalSize == 0)
                    {
                        totalSize = res.TotalSize;
                    }
                    downloadSize += res.Files.Sum(f => f.Size);
                    Loger.Log($"Files that need for a change: {downloadSize}/{totalSize} count={res.Files.Count}");
                    var pr = downloadSize > totalSize || totalSize == 0 ? 100 : downloadSize * 100 / totalSize;
                    UpdateModsWindow.HashStatus = "OC_Hash_Downloading_Finish".Translate()
                                                  + pr.ToString() + "%";

                    result = result | ApproveLoadWorldReason.ModsFilesFail;
                    //Loger.Log("TTTTT 0");
                    FileChecker.FileSynchronization(clientFileChecker.Folder, res);
                    //Loger.Log("TTTTT 1");
                    clientFileChecker.RecalculateHash(res.Files.Select(f => f.FileName).ToList());
                    //Loger.Log("TTTTT 2");

                    var addList = res.Files
                                  .Select(f => f.FileName)
                                  .Where(f => f.Contains("\\"))
                                  .Select(f => f.Substring(0, f.IndexOf("\\")))
                                  //.Distinct() //вместо дистинкта группируем без разницы заглавных букв, но сохраняем оригинальное название
                                  .Select(f => new { orig = f, comp = f.ToLower() })
                                  .GroupBy(p => p.comp)
                                  .Select(g => g.Max(p => p.orig))
                                  .Where(f => UpdateModsWindow.SummaryList == null || !UpdateModsWindow.SummaryList.Any(sl => sl == f))
                                  .ToList();
                    if (UpdateModsWindow.SummaryList == null)
                    {
                        UpdateModsWindow.SummaryList = addList;
                    }
                    else
                    {
                        UpdateModsWindow.SummaryList.AddRange(addList);
                    }
                }
                downloading = res.TotalSize != 0;
            }
            return(result);
        }