コード例 #1
0
        public async static Task <byte[]> GetFile(string buildConfig, string cdnConfig, string contenthash)
        {
            var foundTarget    = false;
            var contenthashMD5 = contenthash.ToByteArray().ToMD5();

            if (!NGDP.encodingDictionary.TryGetValue(contenthashMD5, out MD5Hash target))
            {
                Logger.WriteLine("Contenthash " + contenthash + " not found in encoding, loading build " + buildConfig + "..");

                await BuildCache.GetOrCreate(buildConfig, cdnConfig);

                if (NGDP.encodingDictionary.TryGetValue(contenthashMD5, out target))
                {
                    foundTarget = true;
                }

                // Remove build from cache, all encoding entries will be in encodingDictionary now for future reference
                BuildCache.Remove(buildConfig);
            }
            else
            {
                foundTarget = true;
            }

            if (!foundTarget)
            {
                throw new FileNotFoundException("Unable to find contenthash " + contenthash + " in encoding!");
            }

            return(await RetrieveFileBytes(target));
        }
コード例 #2
0
        public async Task <ActionResult> DumpByBuild(string buildConfigHash)
        {
            string installHash;

            // Force load build
            await BuildCache.GetOrCreate(buildConfigHash);

            var buildConfig = await Config.GetBuildConfig(buildConfigHash);

            if (buildConfig.install.Length == 2)
            {
                installHash = buildConfig.install[1].ToHexString().ToLower();
            }
            else
            {
                if (NGDP.encodingDictionary.TryGetValue(buildConfig.install[0], out var installEntry))
                {
                    installHash = installEntry[0].ToHexString().ToLower();
                }
                else
                {
                    throw new KeyNotFoundException("Install encoding key not found!");
                }
            }

            return(await DumpByHash(installHash));
        }
コード例 #3
0
        public static async Task <bool> FileExists(string buildConfig, uint filedataid)
        {
            var build = await BuildCache.GetOrCreate(buildConfig);

            if (build.root.entriesFDID.ContainsKey(filedataid))
            {
                return(true);
            }

            return(false);
        }
コード例 #4
0
        public static async Task <uint> GetFileDataIDByFilename(string buildConfig, string cdnConfig, string filename)
        {
            var build = await BuildCache.GetOrCreate(buildConfig, cdnConfig);

            using var hasher = new Jenkins96();
            var lookup = hasher.ComputeHash(filename, true);

            if (build.root.entriesLookup.TryGetValue(lookup, out var entry))
            {
                return(entry[0].fileDataID);
            }

            return(0);
        }
コード例 #5
0
        public static async Task <bool> FileExists(string buildConfig, string filename)
        {
            var build = await BuildCache.GetOrCreate(buildConfig);

            using (var hasher = new Jenkins96())
            {
                var lookup = hasher.ComputeHash(filename, true);

                if (build.root.entriesLookup.ContainsKey(lookup))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #6
0
        public async static Task <byte[]> GetFile(string buildConfig, string cdnConfig, uint filedataid)
        {
            var target = "";
            var build  = await BuildCache.GetOrCreate(buildConfig, cdnConfig);

            if (build.root.entriesFDID.TryGetValue(filedataid, out var entry))
            {
                var prioritizedEntry = entry.FirstOrDefault(subentry =>
                                                            subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS))
                                                            );

                var selectedEntry = (prioritizedEntry.fileDataID != 0) ? prioritizedEntry : entry.First();
                target = selectedEntry.md5.ToHexString().ToLower();
            }

            if (string.IsNullOrEmpty(target))
            {
                throw new FileNotFoundException("FileDataID " + filedataid + " not found in root for build " + buildConfig);
            }

            return(await GetFile(buildConfig, cdnConfig, target));
        }
コード例 #7
0
        public static async Task <uint[]> GetFileDataIDsInBuild(string buildConfig, string cdnConfig)
        {
            var rootcdn = await Database.GetRootCDNByBuildConfig(buildConfig);

            RootFile root;

            if (!string.IsNullOrEmpty(rootcdn))
            {
                root = await NGDP.GetRoot(rootcdn, true);
            }
            else
            {
                if (string.IsNullOrEmpty(cdnConfig))
                {
                    cdnConfig = await Database.GetCDNConfigByBuildConfig(buildConfig);
                }

                var build = await BuildCache.GetOrCreate(buildConfig, cdnConfig);

                root = build.root;
            }

            return(root.entriesFDID.Keys.ToArray());
        }
コード例 #8
0
        public async static Task <byte[]> GetFileByFilename(string buildConfig, string cdnConfig, string filename, LocaleFlags locale = LocaleFlags.All_WoW)
        {
            var build = await BuildCache.GetOrCreate(buildConfig, cdnConfig);

            using var hasher = new Jenkins96();
            var lookup = hasher.ComputeHash(filename, true);
            var target = "";

            if (build.root.entriesLookup.TryGetValue(lookup, out var entry))
            {
                RootEntry prioritizedEntry;

                if (locale == LocaleFlags.All_WoW)
                {
                    prioritizedEntry = entry.FirstOrDefault(subentry =>
                                                            subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS))
                                                            );
                }
                else
                {
                    prioritizedEntry = entry.FirstOrDefault(subentry =>
                                                            subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && subentry.localeFlags.HasFlag(locale)
                                                            );
                }

                var selectedEntry = (prioritizedEntry.fileDataID != 0) ? prioritizedEntry : entry.First();
                target = selectedEntry.md5.ToHexString().ToLower();
            }

            if (string.IsNullOrEmpty(target))
            {
                var filedataid = await Database.GetFileDataIDByFilename(filename);

                if (filedataid != 0)
                {
                    if (build.root.entriesFDID.TryGetValue(filedataid, out var fdidentry))
                    {
                        RootEntry prioritizedEntry;

                        if (locale == LocaleFlags.All_WoW)
                        {
                            prioritizedEntry = fdidentry.FirstOrDefault(subentry =>
                                                                        subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS))
                                                                        );
                        }
                        else
                        {
                            prioritizedEntry = fdidentry.FirstOrDefault(subentry =>
                                                                        subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && subentry.localeFlags.HasFlag(locale)
                                                                        );
                        }

                        var selectedEntry = (prioritizedEntry.fileDataID != 0) ? prioritizedEntry : fdidentry.First();
                        target = selectedEntry.md5.ToHexString().ToLower();
                    }
                }
            }

            if (string.IsNullOrEmpty(target))
            {
                throw new FileNotFoundException("No file found in root for filename " + filename);
            }

            return(await GetFile(buildConfig, cdnConfig, target));
        }
コード例 #9
0
        public async Task <DataTablesResult> Get(string buildConfig, int draw, int start, int length, string src = "files")
        {
            if (string.IsNullOrEmpty(buildConfig))
            {
                throw new ArgumentException("Invalid arguments!");
            }

            var result = new DataTablesResult
            {
                draw = draw
            };

            Logger.WriteLine("Serving file table data for build " + buildConfig);

            var searching = false;

            if (string.IsNullOrWhiteSpace(Request.Query["search[value]"]))
            {
                Logger.WriteLine("Serving file table data " + start + "," + length + " for build " + buildConfig + " for draw " + draw);
            }
            else
            {
                searching = true;
                Logger.WriteLine("Serving file table data " + start + "," + length + " for build " + buildConfig + " for draw " + draw + " with filter " + Request.Query["search[value]"]);
            }

            var build = await BuildCache.GetOrCreate(buildConfig);

            result.recordsTotal = build.root.entriesFDID.Count;

            result.data = new List <List <object> >();

            result.recordsFiltered = result.recordsTotal;

            var entries = build.root.entriesFDID.OrderBy(x => x.Key).ToList();

            if (start + length > entries.Count)
            {
                length = entries.Count - start;
            }

            foreach (var entry in entries.GetRange(start, length))
            {
                var row = new List <object>
                {
                    entry.Value[0].fileDataID
                };

                var dbFile = await Database.GetFileByFileDataID(entry.Value[0].fileDataID);

                if (dbFile.ID == 0)
                {
                    Logger.WriteLine("WARNING! File " + entry.Value[0].fileDataID + " is not known in database!", ConsoleColor.Red);
                }

                // Filename
                if (!string.IsNullOrEmpty(dbFile.Filename))
                {
                    row.Add(dbFile.Filename);
                }
                else
                {
                    row.Add("");
                }

                // Lookup
                if (!string.IsNullOrEmpty(dbFile.Lookup))
                {
                    row.Add(dbFile.Lookup);
                }
                else if (entry.Value[0].lookup != 0)
                {
                    row.Add(entry.Value[0].lookup.ToString("X").ToLower().PadLeft(16, '0'));
                }
                else
                {
                    row.Add("000000000000000");
                }

                // Versions
                var versionList = new List <FileVersion>();

                foreach (var rootFileEntry in entry.Value)
                {
                    versionList.Add(
                        new FileVersion()
                    {
                        root_cdn    = build.buildConfig.root_cdn.ToHexString().ToLower(),
                        contenthash = rootFileEntry.md5.ToHexString().ToLower(),
                        buildconfig = buildConfig,
                        description = rootFileEntry.localeFlags.ToString().Replace("All_WoW", "") + " " + rootFileEntry.contentFlags.ToString(),
                        cdnconfig   = await Database.GetCDNConfigByBuildConfig(buildConfig)
                    }
                        );
                }

                row.Add(versionList);

                // Type
                if (!string.IsNullOrEmpty(dbFile.Type))
                {
                    row.Add(dbFile.Type);
                }
                else
                {
                    row.Add("unk");
                }

                result.data.Add(row);
            }

            return(result);
        }