Пример #1
0
        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
        }
Пример #2
0
        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);
        }