/// <summary> /// 页面被加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Page_Loaded(object sender, RoutedEventArgs e) { MainWindow context = (MainWindow)Window.GetWindow(this); context.Title = "下载Minecraft"; Thread getMinecraftListThread = new Thread((ThreadStart) delegate { VersionsModel m = Versions.GetAll("http://bmclapi.bangbang93.com/"); foreach (VersionsInfo info in m.versions) { if (info.type == "release") { Releases.Add(info); } else { Snapshots.Add(info); } } Thread.Sleep(1000); Dispatcher.Invoke(delegate { Version.DisplayMemberPath = "id"; lastest.Content = "最新预览版:" + m.latest.snapshot + " 最新正式版:" + m.latest.release; Version.ItemsSource = Releases; ProgressBar.Visibility = Visibility.Collapsed; ProgressBarMain.IsActive = false; }); GC.Collect(); }); getMinecraftListThread.SetApartmentState(ApartmentState.STA); getMinecraftListThread.IsBackground = true; getMinecraftListThread.Start(); }
public void MergeVers() { if (Version.FileVers == null || Version.FileVers.Count == 0) { return; } int serial = Version.FileVers[0].SerialNo + 1; string urlbase = Version.FileVers[0].UrlBase; if (urlbase == null) { urlbase = ""; } if (urlbase.Length > 0 && urlbase.EndsWith("/") == false) { urlbase = urlbase + "/"; } long downloadsize = 0; FileList fl = new FileList(); fl.Files = new List <FileModel>(); foreach (var item in StagedVersFiles.Values) { if (string.IsNullOrEmpty(item.Url) || item.LocalPath.StartsWith("http", StringComparison.CurrentCultureIgnoreCase) == false) { item.Url = urlbase + item.LocalPath; } downloadsize += item.Size; fl.Files.Add(item); } var listdata = Util.FileListToString(fl); StreamWriter sw = new StreamWriter(GetFullPath($"{BambooBalerDirName}/list{serial}.txt"), false, Encoding.UTF8); sw.WriteLine(listdata); sw.Close(); foreach (var item in Version.FileVers) { File.Delete(GetFullPath($"{BambooBalerDirName}/list{item.SerialNo}.txt")); } Version.FileVers.Clear(); Version.FileVers.Add(ChangesVer); VerInfoModel merged = new VerInfoModel(); merged.SerialNo = serial; merged.Title = "merged version"; merged.UpdateTime = DateTime.Now; merged.ChangeCount = StagedVersFiles.Count; merged.DownloadSize = downloadsize; VersionsModel data = new VersionsModel(); data.SkinVer = Version.SkinVer; data.LaunchTarget = Version.LaunchTarget; data.FileVers = new List <VerInfoModel>(); data.FileVers.Add(merged); Util.SaveObjToFile(data, GetFullPath($"{BambooBalerDirName}/vers.dat")); }
private async Task <bool> LoadLocalData() { LocalVerions = await Util.LoadLocalFileToObj <VersionsModel>("vers.dat"); LocalSkin = await Util.LoadLocalFileToObj <SkinModel>("skin.dat"); return(true); }
public void VersionsController_Show_ReturnsTheResultOfTheServiceCallAsTheModel() { var document = new StubDocument(); var versionsModel = new VersionsModel(PagedList<DocumentVersion>.Empty, document.Id); A.CallTo(() => _documentVersionsAdminService.GetVersions(document, 1)).Returns(versionsModel); PartialViewResult result = _versionsController.Show(document, 1); result.Model.Should().Be(versionsModel); }
public void VersionsController_Show_ReturnsTheResultOfTheServiceCallAsTheModel() { var document = new StubDocument(); var versionsModel = new VersionsModel(PagedList <DocumentVersion> .Empty, document.Id); A.CallTo(() => _documentVersionsAdminService.GetVersions(document, 1)).Returns(versionsModel); PartialViewResult result = _versionsController.Show(document, 1); result.Model.Should().Be(versionsModel); }
public IActionResult Versions() { var versions = new VersionsModel { RestAPI = GetVersion <Startup>(), DatabaseAccessLayer = GetVersion <DatabaseAccess>(), DDragonAccessLayer = GetVersion <DataDragonWrapper>(), RiotAPIAccessLayer = GetVersion <RiotAPIWrapper>(), Shared = GetVersion <TimeUtils>(), }; return(Ok(versions)); }
public async Task <bool> LoadProjDir(string dir) { StagedVersFiles.Clear(); Vers.Clear(); Vers.Add(ChangesVer); VersFileListMap.Clear(); VersFileListMap[ChangesVer.SerialNo] = Changes; Changes.Clear(); ChangesVer.ChangeCount = 0; ChangesVer.DownloadSize = 0; Version = await LoadProjectFile <VersionsModel>($"{BambooBalerDirName}/vers.dat"); if (Version == null || Version.FileVers == null) { Version = new VersionsModel(); Version.FileVers = new List <VerInfoModel>(); return(false); } //load files from low version to high version by overwrite. for (int i = Version.FileVers.Count - 1; i >= 0; i--) { int serial = Version.FileVers[i].SerialNo; string path = $"{BambooBalerDirName}/list{serial}.txt"; Vers.Add(Version.FileVers[i]); string liststr = await LoadProjectFile(path); FileList list = new FileList(); Util.StringToFileList(liststr, list); VersFileListMap[serial] = list.Files; foreach (var file in list.Files) { file.SyncOperateStr(); if ((FileOperateType)file.Operate == FileOperateType.Delete) { StagedVersFiles.Remove(file.LocalPath); continue; } StagedVersFiles[file.LocalPath] = file; } } return(true); }
private async Task <bool> GetDownloadList(VersionsModel svrVers) { if (VersionDistance.HasUpdate == false || svrVers == null) { return(false); } int startVer = 0; if (LocalVerions?.FileVers?.Count > 0) { startVer = LocalVerions.FileVers[0].SerialNo; } Dictionary <string, FileModel> files = new Dictionary <string, FileModel>(); //load each version list. merge to files dictionary. new version overwrite old one. for (int i = svrVers.FileVers.Count - 1; i >= 0; i--) { VerInfoModel ver = svrVers.FileVers[i]; string liststr = await LoadSvrFileToStr($"{BambooBalerDirName}/list{ver.SerialNo}.txt"); FileList list = new FileList(); Util.StringToFileList(liststr, list); if (list.Files == null) { continue; } foreach (var item in list.Files) { files[item.LocalPath] = item; } } //convert file list to file operate list. Files.Clear(); foreach (var item in files.Values) { Files.Add(Util.FileModelToFileOperate(item)); } return(false); }
public void DumpConfigFile() { VersionsModel vers = new VersionsModel(); vers.FileVers = new List <VerInfoModel>(); vers.FileVers.Add(new VerInfoModel()); Util.SaveObjToFile(vers, "vers.dat", true); SkinModel skin = new SkinModel(); skin.Controls = new List <SkinControlInfo>(); skin.Controls.Add(new SkinControlInfo()); skin.WindowSize = new Int32Rect(100, 200, 720, 1280); skin.Title = "Bamboo Launcher"; Util.SaveObjToFile(skin, "skin.dat", true); StreamWriter sw = new StreamWriter("list.txt", false, Encoding.UTF8); sw.WriteLine("/skin.dat,/skin.dat,size,0,md5,updatetm"); sw.WriteLine("http://cdn.com/aaaa.uasset,/Proj/Content/Meshes/aaa.uasset,size,0,md5,updatetm"); sw.WriteLine(",/Proj/Content/file-to-delete.uasset,0,3,,"); sw.Close(); }
public async Task <bool> ConfirmChanges(string verTitle, string verDetail, bool forceUpdate, string urlbase) { await CheckSkinUpdate(); if (urlbase == null) { urlbase = ""; } if (urlbase.Length > 0 && urlbase.EndsWith("/") == false) { urlbase = urlbase + "/"; } int newserial = 0; if (Version.FileVers?.Count > 0) { newserial = Version.FileVers[0].SerialNo + 1; } //make sure baler dir existed. if (Directory.Exists(GetFullPath(BambooBalerDirName)) == false) { Directory.CreateDirectory(GetFullPath(BambooBalerDirName)); } FileList list = new FileList(); list.Files = Changes; foreach (var item in Changes) { item.Url = urlbase + item.LocalPath; } var liststr = Util.FileListToString(list); StreamWriter sw = new StreamWriter(GetFullPath($"{BambooBalerDirName}/list{newserial}.txt"), false, Encoding.UTF8); sw.WriteLine(liststr); sw.Close(); VersionsModel data = new VersionsModel(); data.SkinVer = Version.SkinVer; data.LaunchTarget = Version.LaunchTarget; data.FileVers = Version.FileVers; data.LauncherMd5 = Util.Md5File(GetFullPath("BambooLauncher.exe")); VerInfoModel newver = new VerInfoModel(); newver.SerialNo = newserial; newver.Title = verTitle; newver.Detail = verDetail; newver.ForceUpdate = forceUpdate; newver.ChangeCount = ChangesVer.ChangeCount; newver.DownloadSize = ChangesVer.DownloadSize; newver.UrlBase = urlbase; newver.UpdateTime = DateTime.Now; data.FileVers.Insert(0, newver); Util.SaveObjToFile(data, GetFullPath($"{BambooBalerDirName}/vers.dat")); Vers.Add(newver); Changes.Clear(); ChangesVer.ChangeCount = 0; ChangesVer.DownloadSize = 0; return(true); }
public async Task <bool> Update() { bool hasAnyError = false; progress.Reset(); progress.Total = Files.Count; long lastDownloadSize = VersionDistance.DownloadSize; foreach (var item in Files) { FileOperateType operate = (FileOperateType)Enum.Parse(typeof(FileOperateType), item.Operate); progress.CurPos++; string sizeStr = new FileSize(lastDownloadSize).ToString(); //progress.Status = item.LocalPath + "\r\n总剩余 " + sizeStr + " " + Util.FileSizeToDownloadTime(lastDownloadSize); lastDownloadSize -= item.nsize; if (lastDownloadSize < 0) { lastDownloadSize = 0; } //local file existed and not in force update mode. then check whether need skip. if (File.Exists(item.LocalPath) && operate != FileOperateType.ForceUpdate) { if (operate == FileOperateType.Delete) { File.Delete(item.LocalPath); item.Result = "deleted"; continue; } FileInfo fi = new FileInfo(item.LocalPath); if (fi.Length == item.nsize) { string md5 = Util.Md5File(item.LocalPath); if (md5 == item.Md5) // same as server { item.Result = "skiped(same)"; continue; } } // changed but shoud skip changed local files. if (operate == FileOperateType.SkipOnChanged) { item.Result = "skiped(skip on changed)"; continue; } } progress.Status = item.LocalPath + "\r\n总剩余 " + sizeStr + " " + Util.FileSizeToDownloadTime(lastDownloadSize); //update the file. item.Result = await DownloadFile(item.Url, item.LocalPath); if (item.Result != "ok") { hasAnyError = true; } } //update state if (hasAnyError) { //should treat as update failed? } LocalVerions = ServerVerions; Util.SaveObjToFile(LocalVerions, "vers.dat"); IsDownloading = false; await Task.Delay(100); progress.Percent = 100; progress.Status = "ok"; return(true); }
public async Task <bool> Init() { if (File.Exists("launcher.dat")) { config = await Util.LoadLocalFileToObj <Config>("launcher.dat"); } if (config == null || string.IsNullOrEmpty(config.ServerUrl)) { config = new Config(); config.ServerUrl = "http://127.0.0.1:4500"; Util.SaveObjToFile(config, "launcher.dat"); } ServerUrl = config.ServerUrl; client = new HttpClient(); client.BaseAddress = new Uri(ServerUrl); client.Timeout = TimeSpan.FromSeconds(300); //5 minutes //load local data first. await LoadLocalData(); //load server data ServerVerions = await LoadSvrFileToObj <VersionsModel>($"{BambooBalerDirName}/vers.dat"); //check launcher update if (string.IsNullOrEmpty(ServerVerions?.LauncherMd5) == false) { string exeName = Process.GetCurrentProcess().MainModule.FileName; string exeDir = Path.GetDirectoryName(exeName); string launchermd5 = Util.Md5File(exeName); HasLauncherUpdate = !launchermd5.Equals(ServerVerions.LauncherMd5, StringComparison.CurrentCultureIgnoreCase); if (string.IsNullOrEmpty(launchermd5)) { HasLauncherUpdate = false; } if (HasLauncherUpdate) { string oldname = "oldlauncher.exe"; //remove oldone. if (File.Exists(oldname)) { try { File.Delete(oldname); } catch { } } //rename cur exe try { File.Move(exeName, exeDir + "/" + oldname); } catch { } //download new file await DownloadFile("BambooLauncher.exe", exeName); } } //check update VersionDistance = CheckUpdates(ServerVerions, LocalVerions); await UpdateSkin(); await GetDownloadList(ServerVerions); return(ServerVerions != null); }
private VersionDistance CheckUpdates(VersionsModel svrVer, VersionsModel localVer) { progress.Reset(); VersionDistance dst = new VersionDistance(); dst.HasUpdate = false; dst.MustUpdate = false; dst.HasSkinUpdate = false; dst.DownloadSize = 0; dst.DownloadVersions = 0; //server versions is empty. if (svrVer == null || svrVer.FileVers == null || svrVer.FileVers.Count == 0) { progress.Status = "请求服务器数据失败"; return(dst); } //local versions is empty if (localVer == null || localVer.FileVers == null || localVer.FileVers.Count == 0) { dst.HasUpdate = true; dst.MustUpdate = true; dst.HasSkinUpdate = true; dst.DownloadVersions = 0; dst.DownloadSize = 0; foreach (var item in svrVer.FileVers) { dst.DownloadSize += item.DownloadSize; dst.DownloadVersions++; if (item.ForceUpdate) { dst.MustUpdate = true; } } progress.Status = Util.GetDistanceReportString(dst); return(dst); } //check skin update dst.HasSkinUpdate = svrVer.SkinVer > localVer.SkinVer; //local is newer than server, this is not possible, maybe changed by user. VerInfoModel svrLatest = svrVer.FileVers[0]; VerInfoModel localLatest = localVer.FileVers[0]; if (localLatest.SerialNo >= svrLatest.SerialNo) { return(dst); } dst.DownloadVersions = 0; dst.HasUpdate = true; for (int i = svrVer.FileVers.Count - 1; i >= 0; i--) { VerInfoModel ver = svrVer.FileVers[i]; if (ver.SerialNo <= localLatest.SerialNo) { continue; } dst.DownloadSize += ver.DownloadSize; dst.DownloadVersions++; if (ver.ForceUpdate) { dst.MustUpdate = true; } } progress.Status = Util.GetDistanceReportString(dst); return(dst); }