static void Main(string[] args) { //Init int year = DateTime.UtcNow.Year; int month = DateTime.UtcNow.Month; int day = DateTime.UtcNow.Day; string path = string.Empty; string datePrefix = string.Empty; //Parse arguments for (int i = 0; i < args.Length; i++) { switch (args[i]) { case "--daily": if (args.Length < i + 4) { Log("Insufficient arguments for --daily. Ignoring."); continue; } workType = WorkType.GetDaily; year = Convert.ToInt32(args[i + 1]); month = Convert.ToInt32(args[i + 2]); day = Convert.ToInt32(args[i + 3]); Log("Work: Daily for " + GetYYYYMMDD(year, month, day)); datePrefix = GetYYYYMMDD(year, month, day) + "_"; i += 3; break; case "--download": dataSource = DataSource.Download; Log("Source: Download"); break; case "--json": Log("Source: JSON"); dataSource = DataSource.Json; break; case "--out": if (args.Length < i + 2) { continue; } i++; path = args[i]; Log("Data folder: " + path); break; case "--rebuild": Log("Work: Rebuild"); year = FIRSTRUN_YEAR; month = FIRSTRUN_MONTH; day = FIRSTRUN_DAY; workType = WorkType.Rebuild; break; case "--silent": silent = true; Log("Running in silent mode."); break; case "--update": workType = WorkType.UpdateCurrent; datePrefix = GetYYYYMMDD(DateTime.UtcNow) + "_"; Log("Work: Update"); break; case "--yesterday": workType = WorkType.GetDaily; DateTime date = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0)); year = date.Year; month = date.Month; day = date.Day; Log("Work: Daily for " + GetYYYYMMDD(date) + " (yesterday)"); datePrefix = GetYYYYMMDD(date) + "_"; break; case "--test": Log(AppDomain.CurrentDomain.BaseDirectory + FILE_LOG_BLACKLIST); Environment.Exit(0); break; default: Log("Unrecognized parameter: " + args[i]); break; } } //Verify if (workType == WorkType.Unknown) { throw new Exception("No valid work type specified!"); } //Load player data if (workType != WorkType.UpdateCurrent) { LoadPlayerData(); } //Load blacklist LoadBlacklist(); //Work LeaderboardData data = null; switch (workType) { case WorkType.Rebuild: DateTime now = DateTime.UtcNow; while (!(year == now.Year && month == now.Month && day == now.Day)) { Log("Regenerating daily for " + GetYYYYMMDD(year, month, day)); data = LoadAndGenerate(path, year, month, day, GetYYYYMMDD(year, month, day) + "_"); DateTime next = new DateTime(year, month, day, 12, 00, 00).AddDays(1); year = next.Year; month = next.Month; day = next.Day; } break; default: data = LoadAndGenerate(path, year, month, day, datePrefix); break; } ExportBlacklist(); //Update local file with auto-blacklisted players if (workType != WorkType.UpdateCurrent && data != null) { //Save player data ExportPlayers(year, month, day, path); //Generate player pages if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + FILE_ADDITIONS)) { List <PlayerAddition> adds = DeserializeFromFile <List <PlayerAddition> >(AppDomain.CurrentDomain.BaseDirectory + FILE_ADDITIONS, "Player Profile Additions"); if (adds != null) { for (int i = 0; i < adds.Count; i++) { additions.Add(adds[i].id, adds[i]); } } } PageWriter pageWriter = new PageWriter(); Log("Writing player pages."); foreach (KeyValuePair <ulong, PlayerInfo> kp in players) { //When just doing a daily update, only rewrite the pages for players who participated in that daily if (workType == WorkType.GetDaily) { bool hasParticipated = false; for (int i = 0; i < data.allEntries.Length; i++) { if (data.allEntries[i].id == kp.Key) { hasParticipated = true; break; } } if (!hasParticipated) { continue; } } //Generate and write WriteFile(path + Convert.ToString((long)kp.Key, 16).PadLeft(16, '0') + ".html", pageWriter.GeneratePlayerPage(kp.Value), true); } Log("Finished writing player pages."); } Log("Done!"); #if DEBUG Console.ReadLine(); #endif }
static LeaderboardData LoadAndGenerate(string path, int year, int month, int day, string datePrefix) { bool ongoing = (workType == WorkType.UpdateCurrent); //Load entries LeaderboardData data = LoadEntries(path, year, month, day); Log("Finished reading data."); AutoBlacklist(data); //Filter pirates and blacklisted players data.FilterPirates(); data.FilterBlacklisted(); //Prepare extended entries Dictionary <ulong, ExtendedPlayerEntry> extendedEntries = new Dictionary <ulong, ExtendedPlayerEntry>(); for (int i = 0; i < data.allEntries.Length; i++) { extendedEntries.Add(data.allEntries[i].id, new ExtendedPlayerEntry(data.allEntries[i], year, month, day)); } //Prepare page writer PageWriter pw = new PageWriter(data.allEntries, year, month, day, ongoing); //Depth sort data.SortByDepth("all entries"); if (dataSource != DataSource.Json) { if (ongoing) { data.ExportJson(path + FILE_CURRENT); } else { data.ExportJson(path + GetYYYYMMDD(year, month, day) + ".json"); } } WriteFile(path + datePrefix + "depth.html", pw.GeneratePage(datePrefix + "depth.html", PageType.Depth, "depth.html", path)); if (workType == WorkType.UpdateCurrent) { File.Copy(path + datePrefix + "depth.html", path + "depth.html", true); } for (int i = 0; i < data.allEntries.Length; i++) { extendedEntries[data.allEntries[i].id].levelRank = i + 1; } //Score sort data.SortByScore("all entries"); WriteFile(path + datePrefix + "score.html", pw.GeneratePage(datePrefix + "score.html", PageType.Score, "score.html", path)); if (workType == WorkType.UpdateCurrent) { File.Copy(path + datePrefix + "score.html", path + "score.html", true); } for (int i = 0; i < data.allEntries.Length; i++) { extendedEntries[data.allEntries[i].id].scoreRank = i + 1; } //Normal, Hard and CO sort data.SortByTime(" all entries "); WriteFile(path + datePrefix + "time.html", pw.GeneratePage(datePrefix + "time.html", PageType.Time, "time.html", path)); if (workType == WorkType.UpdateCurrent) { File.Copy(path + datePrefix + "time.html", path + "time.html", true); } int normalRank = 1; int hardRank = 1; int specialRank = 1; for (int i = 0; i < data.allEntries.Length; i++) { ulong id = data.allEntries[i].id; switch (data.allEntries[i].runend) { case RunEndCause.NormalClear: extendedEntries[id].normalTimeRank = normalRank; normalRank++; break; case RunEndCause.HardClear: extendedEntries[id].hardTimeRank = hardRank; hardRank++; break; case RunEndCause.SpecialClear: extendedEntries[id].specialTimeRank = specialRank; specialRank++; break; } } //Stats WriteFile(path + datePrefix + "stats.html", pw.GenerateStats(datePrefix + "stats.html")); if (workType == WorkType.UpdateCurrent) { File.Copy(path + datePrefix + "stats.html", path + "stats.html", true); } //Add entries to players if (workType != WorkType.UpdateCurrent) { foreach (KeyValuePair <ulong, ExtendedPlayerEntry> kp in extendedEntries) { if (!players.ContainsKey(kp.Key)) { players.Add(kp.Key, new PlayerInfo()); } players[kp.Key].AddEntry(kp.Value); } } return(data); }