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)); }
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)); }
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); }
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); }
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); }
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)); }
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()); }
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)); }
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); }