Пример #1
0
        private static buildConfigFile getBuildConfig(string program, string url, string hash)
        {
            string content = Encoding.UTF8.GetString(downloadAndReturnCDNFile(url + "/config/" + hash[0] + hash[1] + "/" + hash[2] + hash[3] + "/" + hash));

            var lines = content.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

            var buildConfig = new buildConfigFile();

            for (var i = 0; i < lines.Count(); i++)
            {
                if (lines[i].StartsWith("# Build") || lines[i].Length == 0)
                {
                    continue;
                }
                var cols = lines[i].Split(new string[] { " = " }, StringSplitOptions.RemoveEmptyEntries);
                switch (cols[0])
                {
                case "root":
                    buildConfig.root = cols[1];
                    break;

                case "download":
                    buildConfig.download = cols[1];
                    break;

                case "install":
                    buildConfig.install = cols[1];
                    break;

                case "encoding":
                    var encoding = cols[1].Split(' ');
                    buildConfig.encoding = encoding;
                    break;

                case "encoding-size":
                    var encodingSize = cols[1].Split(' ');
                    buildConfig.encodingSize = encodingSize;
                    break;

                case "build-name":
                    buildConfig.buildName = cols[1];
                    break;

                case "build-playbuild-installer":
                    buildConfig.buildPlaybuildInstaller = cols[1];
                    break;

                case "build-product":
                    buildConfig.buildProduct = cols[1];
                    break;

                case "build-uid":
                    buildConfig.buildUid = cols[1];
                    break;

                case "patch":
                    buildConfig.patch = cols[1];
                    break;

                case "patch-size":
                    buildConfig.patchSize = cols[1];
                    break;

                case "patch-config":
                    buildConfig.patchConfig = cols[1];
                    break;

                case "build-branch":     // Overwatch
                    buildConfig.buildBranch = cols[1];
                    break;

                case "build-number":     // Overwatch
                    buildConfig.buildNumber = cols[1];
                    break;

                default:
                    throw new Exception("Unknown BuildConfig variable '" + cols[0] + "'");
                }
            }

            return(buildConfig);
        }
Пример #2
0
        static void Main(string[] args)
        {
            if (args.Count() == 0)
            {
                Console.WriteLine("App requires a program code as argument.");
                Environment.Exit(1);
            }

            if (args.Count() > 1)
            {
                cacheDir = args[1];
            }
            else
            {
                cacheDir = @"\\huiskamer\2tb\";
            }

            if (!Directory.Exists(cacheDir))
            {
                Directory.CreateDirectory(cacheDir);
            }

            var sw = Stopwatch.StartNew();

            program = args[0];
            Console.WriteLine("Using program " + program);

            versions = getVersions(program);
            Console.WriteLine("Loaded " + versions.entries.Count() + " versions");

            cdns = getCDNs(program);
            Console.WriteLine("Loaded " + cdns.entries.Count() + " cdns");

            buildConfig = getBuildConfig(program, "http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", versions.entries[0].buildConfig);
            Console.WriteLine("BuildConfig for " + buildConfig.buildName + " loaded");

            cdnConfig = getCDNconfig(program, "http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", versions.entries[0].cdnConfig);
            Console.WriteLine("CDNConfig loaded, " + cdnConfig.builds.Count() + " builds, " + cdnConfig.archives.Count() + " archives");

            cdnBuildConfigs = new buildConfigFile[cdnConfig.builds.Count()];

            var allBuilds = true; // Whether or not to grab other builds mentioned in cdnconfig, adds a few min to execution if it has to DL everything fresh.

            Dictionary <string, string> hashes = new Dictionary <string, string>();

            if (allBuilds == true)
            {
                for (var i = 0; i < cdnConfig.builds.Count(); i++)
                {
                    cdnBuildConfigs[i] = getBuildConfig(program, "http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", cdnConfig.builds[i]);

                    Console.WriteLine("Retrieved additional build config in cdn config: " + cdnBuildConfigs[i].buildName);

                    Console.WriteLine("Loading encoding " + cdnBuildConfigs[i].encoding[1]);
                    var subBuildEncoding = getEncoding("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", cdnBuildConfigs[i].encoding[1], int.Parse(cdnBuildConfigs[i].encodingSize[1])); //Use of first encoding is unknown

                    string subBuildRootKey     = null;
                    string subBuildDownloadKey = null;
                    string subBuildInstallKey  = null;

                    foreach (var entry in subBuildEncoding.entries)
                    {
                        if (!hashes.ContainsKey(entry.key))
                        {
                            hashes.Add(entry.key, entry.hash);
                        }

                        if (entry.hash == cdnBuildConfigs[i].root.ToUpper())
                        {
                            subBuildRootKey = entry.key;
                        }
                        if (entry.hash == cdnBuildConfigs[i].download.ToUpper())
                        {
                            subBuildDownloadKey = entry.key;
                        }
                        if (entry.hash == cdnBuildConfigs[i].install.ToUpper())
                        {
                            subBuildInstallKey = entry.key;
                        }
                    }

                    if (subBuildRootKey != null && program != "pro") // Overwatch has it in archives
                    {
                        Console.WriteLine("Downloading root " + subBuildRootKey + " (in buildconfig: " + cdnBuildConfigs[i].root.ToUpper() + ")");
                        downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "data/" + subBuildRootKey[0] + subBuildRootKey[1] + "/" + subBuildRootKey[2] + subBuildRootKey[3] + "/" + subBuildRootKey);
                    }

                    if (subBuildDownloadKey != null)
                    {
                        Console.WriteLine("Downloading download " + subBuildDownloadKey);
                        downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "data/" + subBuildDownloadKey[0] + subBuildDownloadKey[1] + "/" + subBuildDownloadKey[2] + subBuildDownloadKey[3] + "/" + subBuildDownloadKey);
                    }

                    if (subBuildInstallKey != null)
                    {
                        Console.WriteLine("Downloading install " + subBuildInstallKey);
                        downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "data/" + subBuildInstallKey[0] + subBuildInstallKey[1] + "/" + subBuildInstallKey[2] + subBuildInstallKey[3] + "/" + subBuildInstallKey);
                    }

                    if (cdnBuildConfigs[i].patchConfig != null)
                    {
                        if (cdnBuildConfigs[i].patchConfig.Contains(" "))
                        {
                            throw new Exception("Patch config has multiple entries");
                        }
                        Console.WriteLine("Downloading patch config " + cdnBuildConfigs[i].patchConfig);
                        downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "config/" + cdnBuildConfigs[i].patchConfig[0] + cdnBuildConfigs[i].patchConfig[1] + "/" + cdnBuildConfigs[i].patchConfig[2] + cdnBuildConfigs[i].patchConfig[3] + "/" + cdnBuildConfigs[i].patchConfig);
                    }

                    if (cdnBuildConfigs[i].patch != null)
                    {
                        if (cdnBuildConfigs[i].patch.Contains(" "))
                        {
                            throw new Exception("Patch has multiple entries");
                        }
                        Console.WriteLine("Downloading patch " + cdnBuildConfigs[i].patch);
                        downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "patch/" + cdnBuildConfigs[i].patch[0] + cdnBuildConfigs[i].patch[1] + "/" + cdnBuildConfigs[i].patch[2] + cdnBuildConfigs[i].patch[3] + "/" + cdnBuildConfigs[i].patch);
                    }
                }
            }

            //Get all stuff from additional builds

            if (cdnConfig.patchArchives != null)
            {
                for (var i = 0; i < cdnConfig.patchArchives.Count(); i++)
                {
                    Console.WriteLine("Downloading patch archive " + cdnConfig.patchArchives[i]);
                    downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "patch/" + cdnConfig.patchArchives[i][0] + cdnConfig.patchArchives[i][1] + "/" + cdnConfig.patchArchives[i][2] + cdnConfig.patchArchives[i][3] + "/" + cdnConfig.patchArchives[i]);
                    downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "patch/" + cdnConfig.patchArchives[i][0] + cdnConfig.patchArchives[i][1] + "/" + cdnConfig.patchArchives[i][2] + cdnConfig.patchArchives[i][3] + "/" + cdnConfig.patchArchives[i] + ".index");
                }
            }

            Console.Write("Loading " + cdnConfig.archives.Count() + " indexes..");
            indexes = getIndexes("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", cdnConfig.archives);
            Console.Write("..done\n");
            Console.Write("Downloading " + cdnConfig.archives.Count() + " archives..");
            getArchives("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", cdnConfig.archives);
            Console.Write("..done\n");

            Console.Write("Loading encoding..");
            encoding = getEncoding("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", buildConfig.encoding[1], int.Parse(buildConfig.encodingSize[1])); //Use of first encoding is unknown

            string rootKey     = "";
            string downloadKey = "";
            string installKey  = "";

            foreach (var entry in encoding.entries)
            {
                if (entry.hash == buildConfig.root.ToUpper())
                {
                    rootKey = entry.key;
                }
                if (entry.hash == buildConfig.download.ToUpper())
                {
                    downloadKey = entry.key;
                }
                if (entry.hash == buildConfig.install.ToUpper())
                {
                    installKey = entry.key;
                }
                if (!hashes.ContainsKey(entry.key))
                {
                    hashes.Add(entry.key, entry.hash);
                }
            }

            Console.Write("..done\n");


            if (program != "pro")
            {
                Console.Write("Loading root..");
                if (rootKey == "")
                {
                    Console.WriteLine("Unable to find root key in encoding!");
                }
                else
                {
                    getRoot("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", rootKey);
                }
                Console.Write("..done\n");

                Console.Write("Loading download..");
                if (downloadKey == "")
                {
                    Console.WriteLine("Unable to find download key in encoding!");
                }
                else
                {
                    download = getDownload("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", downloadKey);
                }
                Console.Write("..done\n");

                Console.Write("Loading install..");
                if (installKey == "")
                {
                    Console.WriteLine("Unable to find install key in encoding!");
                }
                else
                {
                    getInstall("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/", installKey);
                }
                Console.Write("..done\n");
            }


            foreach (var index in indexes)
            {
                foreach (var entry in index.archiveIndexEntries)
                {
                    hashes.Remove(entry.headerHash);
                }
            }

            Console.WriteLine("Downloading " + hashes.Count() + " unarchived files..");

            foreach (var entry in hashes)
            {
                Console.WriteLine("Downloading " + entry.Key);
                downloadCDNFile("http://" + cdns.entries[0].hosts[0] + "/" + cdns.entries[0].path + "/" + "data/" + entry.Key[0] + entry.Key[1] + "/" + entry.Key[2] + entry.Key[3] + "/" + entry.Key);
            }

            Console.WriteLine("Done downloading unarchived files.");

            sw.Stop();

            GC.Collect();
            Console.WriteLine("Took " + sw.Elapsed + " to load");

            Console.ReadLine();
        }