Example #1
0
        /// <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();
        }
Example #2
0
        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"));
        }
Example #3
0
        private async Task <bool> LoadLocalData()
        {
            LocalVerions = await Util.LoadLocalFileToObj <VersionsModel>("vers.dat");

            LocalSkin = await Util.LoadLocalFileToObj <SkinModel>("skin.dat");

            return(true);
        }
Example #4
0
        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);
        }
Example #6
0
        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));
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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();
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
        }
Example #13
0
        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);
        }