Example #1
0
        public async Task <IActionResult> GetMatchData(string url, int id, int team1Id, int team2Id, int TournamentId, int TournamentLevel)
        {
            // ------------------------------------------------------------------------------------------------------------------------------
            // ------------------------------------------------------------------------------------------------------------------------------
            // --------------------- Test pobieranie spreparowanego pliku json, o nazwie game(url).json [url od 1 do 28] --------------------
            // -------------------------------------- https://localhost:44344/PreparedGames/game1.json --------------------------------------
            // ------------------------------------------------------------------------------------------------------------------------------
            // ------------------------------------------------------------------------------------------------------------------------------
            //var cuttedUrl = url.Substring(69, 10);
            //var matchId = Int32.Parse(cuttedUrl);
            //int liczbaGraczy = 10;
            var cuttedUrl    = url;
            var matchId      = Int32.Parse(cuttedUrl);
            int liczbaGraczy = 2;

            if (_matchRepository.Matches.Where(m => m.gameid == matchId).Any())
            {
                // Mecz o tym id znajduje się już w bazie.
                return(RedirectToAction("Index"));
            }

            MatchDto result = null;

            // mecze testowe przyjmują wartość ID nie większą niż 2k, reszta to dane z RiotGamesAPI
            if (matchId > 1000 && matchId < 20000)
            {
                // Wygenerowanie losowych wartości dla meczu x, z druzyna 1 i 2
                result = _riotApiService.CreateAndReturnMatchDataBasedOnId(matchId, team1Id, team2Id);
            }
            else
            {
                // pobranie danych z RiotGamesAPI
                result = await _riotApiService.GetMatchDataBasedOnId(Int32.Parse(cuttedUrl));
            }
            // musze to wrzucić do interfejsu, potem przemapowane dane {tylko intersujące nas dane} są zapisywane w bazie
            // mimo to i tak potem jeszcze rozdzielam je dla drużyn i graczy
            MatchSelectedData newMatch5v5 = new MatchSelectedData
            {
                gameid   = result.gameid,
                seasonId = result.seasonId,
                queueId  = result.queueId,
                gameType = result.gameType,
                participantIdentities = result.participantIdentities
                                        .Select(i => new ParticipantIdentity
                {
                    participantId = i.participantId,
                    playerInfo    = new PlayerInfo
                    {
                        participantId    = i.participantId,
                        summonerName     = i.player.summonerName,
                        platformId       = i.player.platformId,
                        currentAccountId = i.player.currentAccountId,
                        summonerId       = i.player.summonerId,
                        accountId        = i.player.accountId
                    }
                }).ToList(),
                gameDuration = result.gameDuration,
                gameMode     = result.gameMode,
                mapId        = result.mapId,
                participants = result.participants
                               .Select(p => new Participant
                {
                    participantId             = p.participantId,
                    teamId                    = p.teamId,
                    highestAchievedSeasonTier = p.highestAchievedSeasonTier,
                    championId                = p.championId,
                    spell1Id                  = p.spell1Id,
                    spell2Id                  = p.spell2Id,
                    stats = new Stats
                    {
                        ParticipantId = p.stats.ParticipantId,
                        Kills         = p.stats.Kills,
                        Deaths        = p.stats.Deaths,
                        Assists       = p.stats.Assists,
                        Win           = p.stats.Win
                    }
                }).ToList()
            };

            //zapisywanie danych pobranych z RiotAPI do lokalnej bazy, musze się zastanowić czy to jest mi wogole potrzebne na stałe w bazie czy nie lepiej cały czas pytać o to api
            _matchRepository.SaveMatch(newMatch5v5);

            // Pętla uaktualniająca baze dla wszystkich graczy biorących udział w grze
            for (int INDEX = 1; INDEX <= liczbaGraczy; INDEX++)
            {
                long SummonerId = newMatch5v5.participantIdentities.Where(p => p.participantId == INDEX)
                                  .Select(p => p.playerInfo.summonerId)
                                  .FirstOrDefault();

                int ParticipantId = newMatch5v5.participantIdentities
                                    .Where(p => p.participantId == INDEX)
                                    .Where(p => p.playerInfo.summonerId == SummonerId)
                                    .Select(p => p.participantId)
                                    .FirstOrDefault();

                GameStatistic gameStatistic = new GameStatistic
                {
                    MatchSelectedData = _matchRepository.Matches
                                        .Where(m => m.Id == newMatch5v5.Id).First(),

                    Win = newMatch5v5.participants
                          .Where(p => p.participantId == ParticipantId)
                          .Select(p => p.stats.Win).First(),

                    SummonerName = newMatch5v5.participantIdentities
                                   .Where(p => p.participantId == ParticipantId)
                                   .Select(p => p.playerInfo.summonerName).First(),

                    SummonerId = newMatch5v5.participantIdentities
                                 .Where(p => p.participantId == ParticipantId)
                                 .Select(p => p.playerInfo.summonerId).First(),

                    AccountId = newMatch5v5.participantIdentities
                                .Where(p => p.participantId == ParticipantId)
                                .Select(p => p.playerInfo.accountId).First(),

                    Summoner = _repository.SummonerInfos
                               .Where(p => p.id == newMatch5v5.participantIdentities
                                      .Where(m => m.participantId == ParticipantId)
                                      .Select(s => s.playerInfo.summonerId).First())
                               .First(),

                    Kills = newMatch5v5.participants
                            .Where(p => p.participantId == ParticipantId)
                            .Select(p => p.stats.Kills).First(),

                    Deaths = newMatch5v5.participants
                             .Where(p => p.participantId == ParticipantId)
                             .Select(p => p.stats.Deaths).First(),

                    Assists = newMatch5v5.participants
                              .Where(p => p.participantId == ParticipantId)
                              .Select(p => p.stats.Assists).First(),

                    ChampionId = newMatch5v5.participants
                                 .Where(p => p.participantId == ParticipantId)
                                 .Select(p => p.championId).First(),

                    TeamId = newMatch5v5.participants
                             .Where(p => p.participantId == ParticipantId)
                             .Select(p => p.teamId).First(),

                    GameMode = newMatch5v5.gameMode,

                    GameId = newMatch5v5.gameid,

                    GameDuration = newMatch5v5.gameDuration,

                    DatePlayed = DateTime.Now
                };
                //iteracyjne dodawanie statystyk dla każdego gracza biorącego udział w meczu, posiadającego konto w LOLHaven
                _matchRepository.AddStatsForEachPlayers(gameStatistic);
            }
            //Przekierowanie do akcji aktualizującej statystyki
            return(RedirectToAction("UploadGameStats", "Tournament", new { id, team1Id, team2Id, TournamentId, TournamentLevel }));
        }