public static List <Tournament> ParseHLReport(string filepath, RTADatabaseContext context)
        {
            var tournaments = new List <Tournament>();
            var data        = File.ReadAllText(filepath).Split(new[] { "@tourn@" }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var entry in data)
            {
                var tournEntry = entry.Split(new[] { "@group@" }, StringSplitOptions.RemoveEmptyEntries);

                var tournamentGroups  = new List <TournamentGroup>();
                var tournamentPlayers = new List <TournamentPlayer>();

                var tournData = tournEntry[0].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

                var mapVersion = tournData[7];
                var map        = context.Maps.FirstOrDefault(m => m.Version == mapVersion);
                if (map == null)
                {
                    map = new Map {
                        Version = mapVersion
                    };
                    context.Maps.Add(map);
                }

                var tournament = new Tournament
                {
                    IsFinished = true,
                    IsOfficial = true,
                    IsArchived = true,

                    NameRus     = tournData[0],
                    NameEng     = tournData[1],
                    Year        = int.Parse(tournData[2]),
                    IsSeasonal  = bool.Parse(tournData[3]),
                    Season      = byte.Parse(tournData[4]),
                    IsPrivate   = bool.Parse(tournData[5]),
                    DateCreated = DateTime.ParseExact(tournData[6], "yyyy.MM.dd", null),

                    Map = map,

                    Description = new TournamentDescription
                    {
                        //ContentRus =
                        //ContentEng =
                    }
                };

                for (int i = 1; i < tournEntry.Length; i++)
                {
                    var groupEntry = tournEntry[i].Split('#');
                    var groupData  = groupEntry[0].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

                    var group = new TournamentGroup
                    {
                        NameRus       = groupData[0],
                        NameEng       = groupData[1],
                        GroupFormatId = byte.Parse(groupData[2])
                    };

                    var matches = new List <Match>();
                    var tournamentGroupPlayers = new List <TournamentGroupPlayer>();

                    var matchData = groupEntry[1].Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var line in matchData)
                    {
                        var matchEntry = line.Replace("[confirmed]", "").Replace("[/confirmed]", "").
                                         Replace("[open]", "").Replace("[/open]", "").Replace("[denied]", "").Replace("[/denied]", "").Split(';');

                        var players = matchEntry[0].Split(' ');

                        var player1Name = players[0];
                        var player2Name = players[2];

                        var player1 = context.Players.FirstOrDefault(p => p.Name == player1Name);
                        if (player1 == null)
                        {
                            player1 = new Player
                            {
                                Name    = player1Name,
                                GuidKey = Guid.NewGuid().ToString(),
                                Stats   = new PlayerStats
                                {
                                    RatingClass         = "B",
                                    RatingPointsCurrent = 1200,
                                    RatingPointsMax     = 1200
                                }
                            };
                            context.Players.Add(player1);
                        }

                        var player2 = context.Players.FirstOrDefault(p => p.Name == player2Name);
                        if (player2 == null)
                        {
                            player2 = new Player
                            {
                                Name    = player2Name,
                                GuidKey = Guid.NewGuid().ToString(),
                                Stats   = new PlayerStats
                                {
                                    RatingClass         = "B",
                                    RatingPointsCurrent = 1200,
                                    RatingPointsMax     = 1200
                                }
                            };
                            context.Players.Add(player2);
                        }

                        var games = new List <Game>();
                        for (int j = 1; j < matchEntry.Length - 2; j++)
                        {
                            var items = matchEntry[j].Replace(",", "").
                                        Replace("Lazlo", "Laszlo").Replace("Shadwyn", "Ylaya").Replace("Gilrean", "Gilraen").Replace("Vlad", "Vladimir").Replace("Timerkhan", "Temkhan").
                                        Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);


                            if (items[0] != "?" && items[4] != "?")
                            {
                                var faction1Id = factionDictEng[items[0]];
                                var hero1      = items[1];
                                if (hero1 == "?" && faction1Id == 1)
                                {
                                    hero1 = "Temkhan";
                                }
                                else if (hero1 == "?" && faction1Id == 6)
                                {
                                    hero1 = "Arthas";
                                }

                                var faction2Id = factionDictEng[items[3]];
                                var hero2      = items[4];
                                if (hero2 == "?" && faction1Id == 1)
                                {
                                    hero2 = "Temkhan";
                                }
                                else if (hero2 == "?" && faction1Id == 6)
                                {
                                    hero2 = "Arthas";
                                }


                                if (hero1 != "?" && hero2 != "?")
                                {
                                    bool player1Won = items[2] == ">";

                                    var game = new Game
                                    {
                                        IsConfirmed = true,

                                        Faction1Id = faction1Id,
                                        Hero1Id    = context.Heroes.FirstOrDefault(h => h.NameEng == hero1).Id,

                                        Player1Won = player1Won,

                                        Faction2Id = faction2Id,
                                        Hero2Id    = context.Heroes.FirstOrDefault(h => h.NameEng == hero2).Id,

                                        DateSubmitted = DateTime.ParseExact(matchEntry[matchEntry.Length - 1], "yyyy.MM.dd", null),
                                    };

                                    SeedStatsUpdater.UpdateStats(player1.Stats, player2.Stats, faction1Id, faction2Id, player1Won);
                                    context.SaveChanges();

                                    games.Add(game);
                                }
                            }
                        }

                        var tournamentPlayer = tournamentPlayers.FirstOrDefault(tp => tp.Player == player1);
                        if (tournamentPlayer == null)
                        {
                            tournamentPlayer = new TournamentPlayer
                            {
                                Player = player1
                            };
                            tournamentPlayers.Add(tournamentPlayer);
                        }

                        if (!tournamentGroupPlayers.Any(tgp => tgp.TournamentPlayer == tournamentPlayer))
                        {
                            tournamentGroupPlayers.Add(new TournamentGroupPlayer {
                                TournamentPlayer = tournamentPlayer
                            });
                        }

                        tournamentPlayer = tournamentPlayers.FirstOrDefault(tp => tp.Player == player2);
                        if (tournamentPlayer == null)
                        {
                            tournamentPlayer = new TournamentPlayer
                            {
                                Player = player2
                            };
                            tournamentPlayers.Add(tournamentPlayer);
                        }

                        if (!tournamentGroupPlayers.Any(tgp => tgp.TournamentPlayer == tournamentPlayer))
                        {
                            tournamentGroupPlayers.Add(new TournamentGroupPlayer {
                                TournamentPlayer = tournamentPlayer
                            });
                        }


                        var date  = matchEntry[matchEntry.Length - 1];
                        var score = matchEntry[matchEntry.Length - 2].Split(' ');

                        var match = new Match
                        {
                            Player1 = player1,
                            Player2 = player2,

                            Games = games,

                            IsFinished = true,

                            DateFinished = DateTime.ParseExact(date, "yyyy.MM.dd", null),

                            Player1Score = int.Parse(score[0]),
                            Player2Score = int.Parse(score[2]),
                        };

                        matches.Add(match);
                    }

                    group.Matches = matches;
                    group.TournamentGroupPlayers = tournamentGroupPlayers;

                    tournamentGroups.Add(group);
                }

                tournament.TournamentPlayers = tournamentPlayers;
                tournament.TournamentGroups  = tournamentGroups;

                tournaments.Add(tournament);
            }
            ;

            return(tournaments);
        }
Exemple #2
0
        protected override void Seed(RTADatabaseContext context)
        {
            string currentPath = AppDomain.CurrentDomain.BaseDirectory;

            // Heroes
            var lines = File.ReadAllLines(currentPath + "/SeedFiles/Heroes.txt");

            foreach (var line in lines)
            {
                string[] heroData = line.Split('\t');
                var      hero     = new Hero
                {
                    FactionId = byte.Parse(heroData[0]),
                    NameEng   = heroData[1],
                    NameRus   = heroData[2]
                };

                context.Heroes.Add(hero);
            }

            // Players & Rating
            lines = File.ReadAllLines(currentPath + "/SeedFiles/Players.txt");
            foreach (var line in lines)
            {
                string[] playerData = line.Split('\t');
                var      player     = new Player()
                {
                    Name      = playerData[0],
                    AccountId = null,
                    GuidKey   = Guid.NewGuid().ToString(),
                    Stats     = new PlayerStats
                    {
                        RatingClass          = playerData[1],
                        RatingPointsCurrent  = int.Parse(playerData[2]),
                        RatingPointsMax      = int.Parse(playerData[3]),
                        GoldMedals           = int.Parse(playerData[4]),
                        SilverMedals         = int.Parse(playerData[5]),
                        BronzeMedals         = int.Parse(playerData[6]),
                        TournamentExperience = int.Parse(playerData[7])
                    }
                };

                context.Players.Add(player);
            }

            context.SaveChanges();


            // Factions from GoogleDocs
            var factionDictRus = new Dictionary <string, byte>
            {
                { "Маги", 1 },
                { "Лига", 2 },
                { "Гномы", 3 },
                { "Люди", 4 },
                { "Демоны", 5 },
                { "Некроманты", 6 },
                { "Орки", 7 },
                { "Эльфы", 8 }
            };


            //Tournaments from HLReport data
            //var tournamentList = ParseHLReport(currentPath + "/SeedFiles/HLReport_Tournaments.txt");

            var tournamentList = HLReportParser.ParseHLReport(currentPath + "/SeedFiles/HLReport_Tournaments.txt", context);


            //Tournament from GoogleDocs data
            var tournamentData        = File.ReadAllText(currentPath + "/SeedFiles/Masters2019.txt").Split('@');
            var tournamentPlayersList = tournamentData[0].Split('\t').Select(name => new TournamentPlayer
            {
                Player = context.Players.FirstOrDefault(p => p.Name == name)
            }).ToList();

            var tournamentMatchData = tournamentData[1].Split(';');

            var tournamentMatches = new List <Match>();

            foreach (var item in tournamentMatchData)
            {
                var matchData = item.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

                string playerName = matchData[0];
                var    player1    = context.Players.First(p => p.Name == playerName);

                playerName = matchData[1];
                var player2 = context.Players.First(p => p.Name == playerName);

                var games = new List <Game>();
                for (int i = 8; i < matchData.Length; i++)
                {
                    var gameData  = matchData[i].Split('\t');
                    var hero1Name = gameData[5];
                    var hero2Name = gameData[7];

                    bool player1Won = gameData[2] == ">";

                    var faction1Id = factionDictRus[gameData[4]];
                    var faction2Id = factionDictRus[gameData[6]];

                    var hero1 = context.Heroes.FirstOrDefault(h => h.NameRus == hero1Name).Id;
                    var hero2 = context.Heroes.FirstOrDefault(h => h.NameRus == hero2Name).Id;

                    var game = new Game
                    {
                        DateSubmitted = DateTime.ParseExact(gameData[0], "dd.MM.yyyy HH:mm:ss", null),

                        Player1Won = player1Won,

                        Faction1Id = faction1Id,
                        Hero1Id    = hero1,

                        Faction2Id = faction2Id,
                        Hero2Id    = hero2,

                        IsConfirmed = true
                    };

                    SeedStatsUpdater.UpdateStats(player1.Stats, player2.Stats, faction1Id, faction2Id, player1Won);
                    context.SaveChanges();

                    games.Add(game);
                }

                var match = new Match
                {
                    Player1Id = player1.Id,
                    Player2Id = player2.Id,

                    IsFinished     = true,
                    IsBestOfFormat = true,

                    NumberOfGames = int.Parse(matchData[2]),
                    Player1Score  = int.Parse(matchData[3]),
                    Player2Score  = int.Parse(matchData[4]),

                    Bracket = new TournamentBracket
                    {
                        BracketTag           = matchData[5],
                        NextBracketTagWinner = matchData[6],
                        NextBracketTagLoser  = matchData[7]
                    },

                    Games = games
                };

                match.IsTechnicalResult = (match.NumberOfGames / 2 + 1) != match.Player1Score;
                if (match.Games.Count != 0)
                {
                    match.DateFinished = match.Games.Last().DateSubmitted;
                }

                tournamentMatches.Add(match);
            }

            var masters2019 = new Tournament
            {
                NameRus = "Турнир Masters 2019",
                NameEng = "Masters Tournament 2019",
                Map     = new Map
                {
                    Version      = "RTA 16.1",
                    ChangelogRus = "[Список изменений]"
                },
                Year = 2019,

                IsOfficial = true,
                IsFinished = true,
                IsPrivate  = true,

                DateCreated = new DateTime(2019, 8, 26, 12, 10, 00),

                Description = new TournamentDescription
                {
                    ContentRus = File.ReadAllText(currentPath + "/SeedFiles/description-SpringTactics2020.txt"),
                },

                TournamentPlayers = tournamentPlayersList,

                TournamentGroups = new List <TournamentGroup>
                {
                    new TournamentGroup
                    {
                        GroupFormatId          = 4,
                        NameRus                = "Плей-офф",
                        NameEng                = "Playoffs",
                        TournamentGroupPlayers = new List <TournamentGroupPlayer>(tournamentPlayersList.Select(tp => new TournamentGroupPlayer
                        {
                            TournamentPlayer = tp
                        })),
                        Matches    = tournamentMatches,
                        IsFinished = true
                    }
                }
            };

            tournamentList.Add(masters2019);


            var springTactics2020 = new Tournament
            {
                NameRus = "Весенний Тактический Турнир 2020",
                NameEng = "Spring Tactics Tournament 2020",

                Year        = 2020,
                DateCreated = new DateTime(2020, 3, 21),

                IsOfficial = true,
                IsSeasonal = true,
                Season     = 2,

                TournamentGroups = new List <TournamentGroup>
                {
                    new TournamentGroup
                    {
                        NameRus       = "Группа A",
                        GroupFormatId = 1,
                    },
                    new TournamentGroup
                    {
                        NameRus       = "Группа B",
                        GroupFormatId = 1,
                    },
                    new TournamentGroup
                    {
                        NameRus       = "Группа C",
                        GroupFormatId = 1,
                    },
                    new TournamentGroup
                    {
                        NameRus       = "Группа D",
                        GroupFormatId = 1,
                    },
                    new TournamentGroup
                    {
                        NameRus       = "Плей-офф",
                        GroupFormatId = 4,
                    },
                },

                Map = new Map
                {
                    Version         = "RTA 16.4",
                    ChangelogRus    = File.ReadAllText(currentPath + "/SeedFiles/changelog-RTA16.4.txt"),
                    DownloadLinkRus = "http://heroesleague.ru/public/homm5/rta/maps/RTA16.4.h5m"
                },

                Description = new TournamentDescription
                {
                    ContentRus = File.ReadAllText(currentPath + "/SeedFiles/description-SpringTactics2020.txt"),
                },

                HostsId = "391a1272-0a44-4749-8962-27f5c49d2a0d"
            };

            tournamentList.Add(springTactics2020);

            foreach (var tourn in tournamentList)
            {
                context.Tournaments.Add(tourn);
            }

            // News
            var articles = new List <Article>
            {
                new Article
                {
                    Title    = "Турнир Masters 2019 завершен!",
                    LangId   = 1,
                    Content  = File.ReadAllText(currentPath + "/SeedFiles/article-masters2019.txt"),
                    AuthorId = "391a1272-0a44-4749-8962-27f5c49d2a0d",
                    Date     = new DateTime(2019, 10, 22)
                },
                new Article
                {
                    Title    = "RTA обновлена до версии 2.0",
                    LangId   = 1,
                    Content  = File.ReadAllText(currentPath + "/SeedFiles/article-RTA2.0.txt"),
                    AuthorId = "391a1272-0a44-4749-8962-27f5c49d2a0d",
                    Date     = new DateTime(2020, 5, 2)
                },
                new Article
                {
                    Title    = "Открыта регистрация на Весенний Тактический Турнир 2020",
                    LangId   = 1,
                    Content  = File.ReadAllText(currentPath + "/SeedFiles/article-SpringTactics2020.txt"),
                    AuthorId = "391a1272-0a44-4749-8962-27f5c49d2a0d",
                    Date     = new DateTime(2020, 3, 21)
                },
            };

            foreach (var article in articles)
            {
                context.Articles.Add(article);
            }


            context.SaveChanges();
        }