Example #1
0
        public static async Task PreencherDicas(this PartidaAtualViewModel partida, SummonerSpellListStatic spells)
        {
            DicaIncendiar();
            DicaBarao();
            DicaFirstBlood();

            void DicaIncendiar()
            {
                var incenciar = spells.SummonerSpells.First(k => k.Key == "SummonerDot");

                var inimigosComIncendiar = partida.Inimigos.Where(x => x.Participante.SummonerSpell1 == incenciar.Value.Id || x.Participante.SummonerSpell2 == incenciar.Value.Id).ToArray();

                if (inimigosComIncendiar.Count() == 1)
                {
                    partida.Dicas.Add(new Dica($"Matenha distância do jogador {inimigosComIncendiar.First().Nome} até os 15 minutos, pois ele possui o feitiço incendiar, que pode ser mortal caso você esteja com pouca vida."));
                }
                if (inimigosComIncendiar.Count() > 1)
                {
                    partida.Dicas.Add(new Dica($"Tenha cuidado com os jogadores {string.Join(", ", inimigosComIncendiar.Select(x => x.Nome).ToArray(), 0, inimigosComIncendiar.Count() - 1)} e {inimigosComIncendiar.Last().Nome} até os 15 minutos, pois eles possuem o feitiço incendiar, que pode ser mortal caso você esteja com pouca vida."));
                }
            }

            void DicaBarao()
            {
                if (partida.Inimigos.Select(x => x.TaxaPrimeiroBarao).RetornarMedia() > partida.Aliados.Select(x => x.TaxaPrimeiroBarao).RetornarMedia())
                {
                    partida.Dicas.Add(new Dica("Mantenha visão do barão a partir dos 20 minutos de partida. O time inimigo costuma matar ele mais cedo que o seu!"));
                }
            }

            void DicaFirstBlood()
            {
                if (partida.Inimigos.Select(x => x.TaxaFirstBlood).RetornarMedia() > partida.Aliados.Select(x => x.TaxaFirstBlood).RetornarMedia())
                {
                    partida.Dicas.Add(new Dica("Cuidado com confrontos no início da partida, o time inimigo costuma matar o primeiro oponente antes do seu!"));
                }
            }
        }
Example #2
0
        public async Task <PartidaAtualViewModel> PersistirDadosPartidaAtualAsync(int regiao, string jogador)
        {
            _logger.LogInformation($"Gravando partida do jogador {jogador}");

            var api = RiotApi.GetDevelopmentInstance(_apiConfiguration.Key);

            var estatisticasPrincipalJogador = await PersistirDadosJogadorAsync(regiao, jogador);

            if (!estatisticasPrincipalJogador.Desatualizado)
            {
                try
                {
                    var retorno = new PartidaAtualViewModel();

                    var partidaAtual = await api.Spectator.GetCurrentGameAsync((Region)regiao, estatisticasPrincipalJogador.InvocadorId);

                    var partidaAtualBanco =
                        await _context
                        .PartidaAtual
                        .Find(x =>
                              x.GameId == partidaAtual.GameId &&
                              x.Platform == partidaAtual.Platform &&
                              x.Aliados.Any(k => k.JogadorPrincipal && k.Participante.SummonerId == estatisticasPrincipalJogador.InvocadorId))
                        .FirstOrDefaultAsync();

                    if (partidaAtualBanco == null)
                    {
                        _logger.LogInformation("Gravando nova partida");

                        retorno.GameId   = partidaAtual.GameId;
                        retorno.Platform = partidaAtual.Platform;

                        estatisticasPrincipalJogador =
                            await PersistirDadosJogadorAsync(regiao,
                                                             partidaAtual.Participants.First(x => x.SummonerId == estatisticasPrincipalJogador.InvocadorId).SummonerName,
                                                             new List <int> {
                            (int)partidaAtual.Participants.First(x => x.SummonerId == estatisticasPrincipalJogador.InvocadorId).ChampionId
                        });

                        retorno.Aliados  = new List <JogadorPartidaAtual>();
                        retorno.Inimigos = new List <JogadorPartidaAtual>();

                        var ultimaVersao = await _util.RetornarUltimoPatchAsync();

                        var campeoes = await api.StaticData.Champions.GetAllAsync(ultimaVersao, Language.pt_BR, fullData : false);

                        var participantePrincipal = partidaAtual.Participants.First(x => x.SummonerId == estatisticasPrincipalJogador.InvocadorId);

                        var idTimeAliado = participantePrincipal.TeamId;

                        retorno.Aliados.Add(new JogadorPartidaAtual(estatisticasPrincipalJogador, participantePrincipal, true, campeoes, ultimaVersao, true));

                        //adicionar jogadorprincipal a lista de aliados
                        foreach (var item in partidaAtual.Participants.Where(x => x.SummonerId != estatisticasPrincipalJogador.InvocadorId).ToList())
                        {
                            var estatisticasJogador = await PersistirDadosJogadorAsync(regiao, item.SummonerName, new List <int> {
                                (int)item.ChampionId
                            });

                            if (item.TeamId == idTimeAliado)
                            {
                                retorno.Aliados.Add(new JogadorPartidaAtual(estatisticasJogador, item, true, campeoes, ultimaVersao));
                            }
                            else
                            {
                                retorno.Inimigos.Add(new JogadorPartidaAtual(estatisticasJogador, item, false, campeoes, ultimaVersao));
                            }
                        }

                        retorno.ChanceVitoriaAliados = ((retorno.Aliados.Sum(x => x.ChanceVitoria) / (decimal)retorno.Aliados.Count) + (retorno.Inimigos.Sum(x => 1 - x.ChanceVitoria) / (decimal)retorno.Inimigos.Count)) / 2;

                        retorno.ChanceVitoriaInimigos = 1 - retorno.ChanceVitoriaAliados;

                        var spells = await api.StaticData.SummonerSpells.GetAllAsync(ultimaVersao, Language.pt_BR);

                        await retorno.PreencherDicas(spells);

                        (retorno.ItensSugeridos, retorno.WardSugerida) = await _itensRegraNegocio.ObterSugestaoCampeao(participantePrincipal.ChampionId);

                        await _context.PartidaAtual.InsertOneAsync(retorno);

                        return(retorno);
                    }
                    else
                    {
                        _logger.LogInformation("Partida já existente no banco, pulando");
                        return(partidaAtualBanco);
                    }
                }
                catch (RiotSharpException ex)
                {
                    if (ex.HttpStatusCode == System.Net.HttpStatusCode.NotFound)
                    {
                        _logger.LogInformation(ex, "Partida em andamento não encontrada");

                        return(null);
                    }
                    else
                    {
                        _logger.LogError(ex, "Ocorreu um erro ao obter partida existente");

                        return(null);
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Ocorreu um erro ao obter partida existente");

                    return(null);
                }
            }
            return(null);
        }