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!")); } } }
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); }