private async Task <DialogTurnResult> CotacaoListagemStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            string mensagem = string.Empty;
            var    servico  = new CotacaoMoeda();

            try
            {
                var cotacoesSolicitadas = await servico.Listagem();

                mensagem  = cotacoesSolicitadas.Count > 1 ? "Cotações" : "Cotação";
                mensagem += ":\n\n";

                foreach (var cotacao in cotacoesSolicitadas)
                {
                    mensagem += $"**{cotacao.name} ({cotacao.code})**:  \n" +
                                $"Valor de Compra R$ {cotacao.bid} \n" +
                                $"Valor de Venda R$ {cotacao.ask} \n" +
                                $"Variação R$ {cotacao.varBid} \n" +
                                $"Porcentagem da Variação R$ {cotacao.pctChange} \n" +
                                $"Máximo R$ {cotacao.high} \n" +
                                $"Mínimo R$ {cotacao.low} \n";
                }
            }
            catch (Exception ex)
            {
                mensagem = "Desculpe, não consegui buscar essa informação no momento. Se importa de tentar novamente?";
            }

            return(await stepContext.NextAsync(mensagem, cancellationToken));
        }
        public object Post(
            [FromServices] IConfiguration config,
            CotacaoMoeda cotacao)
        {
            var conteudoCotacao = JsonSerializer.Serialize(cotacao);

            _logger.LogInformation($"Dados: {conteudoCotacao}");

            var body = Encoding.UTF8.GetBytes(conteudoCotacao);

            string topic  = config["AzureServiceBus:Topic"];
            var    client = new TopicClient(
                config["AzureServiceBus:ConnectionString"], topic);

            client.SendAsync(new Message(body)).Wait();
            _logger.LogInformation(
                $"Azure Service Bus - Envio para o tópico {topic} concluído");

            lock (_CONTADOR)
            {
                _CONTADOR.Incrementar();
            }

            return(new
            {
                Resultado = "Mensagem enviada com sucesso!"
            });
        }
예제 #3
0
        public async Task MoedaCotacao(IDialogContext context, LuisResult result)
        {
            var message = string.Empty;
            var service = new CotacaoMoeda();

            try
            {
                var moeda = result.Entities.FirstOrDefault(x => x.Type.Equals("Moeda"));
                message = "Cotações:\n\n";

                var list = await service.Cotacao(moeda?.Entity ?? string.Empty);

                foreach (var cotacao in list)
                {
                    var dataAtualizacao = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(cotacao.ultima_consulta), TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time"));
                    message += $"**{cotacao.nome}**: R$ {cotacao.valor.ToString("N4")}\n\n";
                    message += $"Data: {dataAtualizacao.ToString("dd/MM/yyyy HH:mm:ss")} | Fonte: {cotacao.fonte}\n\n";
                }
            }
            catch (Exception ex)
            {
                message = "Desculpe, não consegui buscar essa informação no momento. Se importa de tentar novamente?";
            }
            await context.PostAsync(message);

            context.Wait(MessageReceived);
        }
예제 #4
0
        public static void Save(CotacaoMoeda cotacao)
        {
            var horario  = DateTime.Now;
            var document = new CotacaoMoedaDocument();

            document.HistLancamento = cotacao.Sigla + horario.ToString("yyyyMMdd-HHmmss");
            document.Sigla          = cotacao.Sigla;
            document.Valor          = cotacao.Valor.Value;
            document.Data           = horario.ToString("yyyy-MM-dd HH:mm:ss");

            GetCollectionCotacoes().InsertOne(document);
        }
예제 #5
0
        public async Task MoedaListagem(IDialogContext context, LuisResult result)
        {
            var service = new CotacaoMoeda();
            var list    = await service.Listagem();

            await context.PostAsync("Moedas disponíveis para consulta:");

            foreach (var item in list)
            {
                await context.PostAsync($"{item.nome} ({item.moeda})");
            }

            context.Wait(MessageReceived);
        }
예제 #6
0
        public async Task MoedaListagem(IDialogContext context, LuisResult result)
        {
            var message = string.Empty;
            var service = new CotacaoMoeda();

            try
            {
                var list = await service.Listagem();

                var cardActions = new List <CardAction>();

                cardActions.Add(new CardAction()
                {
                    Title = $"Todas as cotações",
                    Type  = ActionTypes.ImBack,
                    Value = $"Cotações do dia"
                });

                foreach (var item in list)
                {
                    cardActions.Add(new CardAction()
                    {
                        Title = $"{item.nome} ({item.moeda})",
                        Type  = ActionTypes.ImBack,
                        Value = $"Cotação {item.nome}"
                    });
                }

                var card = new HeroCard()
                {
                    Title    = "Moedas disponíveis",
                    Subtitle = "Clique na moeda que deseja consultar",
                    Buttons  = cardActions
                };

                var activity = context.MakeMessage();
                activity.Id = new Random().Next().ToString();
                activity.Attachments.Add(card.ToAttachment());

                await context.PostAsync(activity);
            }
            catch (Exception ex)
            {
                message = "Desculpe, não consegui buscar essa informação no momento. Se importa de tentar novamente?";
                await context.PostAsync(message);
            }

            context.Wait(MessageReceived);
        }
        public void Save(CotacaoMoeda cotacao)
        {
            var horario  = DateTime.Now;
            var document = new CotacaoMoedaDocument()
            {
                id             = $"{cotacao.Codigo}-{horario.ToString("yyyyMMdd-HHmmss")}",
                Sigla          = cotacao.Codigo,
                DataReferencia = horario.ToString("yyyy-MM-dd HH:mm:ss"),
                Valor          = cotacao.Valor.Value
            };

            using var client = GetDocumentClient();
            client.CreateDocumentAsync(
                UriFactory.CreateDocumentCollectionUri(
                    DB_COTACOES, COLLECTION_HISTORICO), document).Wait();
        }
예제 #8
0
        public async Task MoedaCotacao(IDialogContext context, LuisResult result)
        {
            var service = new CotacaoMoeda();
            var moeda   = result.Entities.FirstOrDefault(x => x.Type.Equals("Moeda"));
            await context.PostAsync("Cotações:");

            var list = await service.Cotacao(moeda?.Entity ?? string.Empty);

            foreach (var cotacao in list)
            {
                var dataAtualizacao = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(cotacao.ultima_consulta).ToLocalTime();
                await context.PostAsync($"{cotacao.nome}: R$ {cotacao.valor.ToString("N4")}");

                await context.PostAsync($"Data: {dataAtualizacao} | Fonte: {cotacao.fonte}");
            }
            context.Wait(MessageReceived);
        }
예제 #9
0
        public void Run([ServiceBusTrigger("queue-cotacoes", Connection = "AzureServiceBus")] string myQueueItem, ILogger log)
        {
            log.LogInformation($"ProcessarCotacao - Dados: {myQueueItem}");

            CotacaoMoeda cotacao = null;

            try
            {
                cotacao = JsonSerializer.Deserialize <CotacaoMoeda>(myQueueItem,
                                                                    new JsonSerializerOptions()
                {
                    PropertyNameCaseInsensitive = true
                });
            }
            catch
            {
                log.LogInformation($"ProcessarCotacao - Erro durante a deserialização");
            }

            if (cotacao == null)
            {
                return;
            }

            var validationResult = new CotacaoMoedaValidator().Validate(cotacao);

            if (validationResult.IsValid)
            {
                log.LogInformation($"ProcessarCotacao - Dados pós formatação: {JsonSerializer.Serialize(cotacao)}");
                _repository.Save(cotacao);
                log.LogInformation("ProcessarCotacao - Cotação registrada com sucesso!");
            }
            else
            {
                log.LogError("ProcessarCotacao - Dados invalidos para a Cotação");
                foreach (var error in validationResult.Errors)
                {
                    log.LogError($"ProcessarCotacao - {error.ErrorMessage}");
                }
            }
        }
예제 #10
0
        public static void Save(CotacaoMoeda cotacao)
        {
            var client = new MongoClient(
                Environment.GetEnvironmentVariable("MongoConnection"));
            IMongoDatabase db = client.GetDatabase(
                Environment.GetEnvironmentVariable("MongoDatabase"));

            var historico =
                db.GetCollection <CotacaoMoedaDocument>(
                    Environment.GetEnvironmentVariable("MongoCollection"));

            var horario  = DateTime.Now;
            var document = new CotacaoMoedaDocument();

            document.HistLancamento = cotacao.Sigla + horario.ToString("yyyyMMdd-HHmmss");
            document.Sigla          = cotacao.Sigla;
            document.Valor          = cotacao.Valor.Value;
            document.Data           = horario.ToString("yyyy-MM-dd HH:mm:ss");

            historico.InsertOne(document);
        }
예제 #11
0
        private async Task <DialogTurnResult> CotacaoStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var LUISResponse = (LUISResponse)stepContext.Options;

            if (string.IsNullOrWhiteSpace(LUISResponse.Entidade))
            {
                return(await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Ops, não entendi qual moeda você deseja cotar, poderia repetir?") }, cancellationToken));
            }

            string mensagem = string.Empty;
            var    servico  = new CotacaoMoeda();

            try
            {
                var cotacoesSolicitadas = await servico.Cotacao(LUISResponse.Entidade);

                mensagem  = cotacoesSolicitadas.Count > 1 ? "Cotações" : "Cotação";
                mensagem += ":\n\n";

                foreach (var cotacao in cotacoesSolicitadas)
                {
                    //var dataAtualizacao = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(Double.Parse(cotacao.timestamp)), TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time"));
                    mensagem += $"**{cotacao.name} ({cotacao.code})**:  \n" +
                                $"Valor de Compra R$ {cotacao.bid} \n" +
                                $"Valor de Venda R$ {cotacao.ask} \n" +
                                $"Variação R$ {cotacao.varBid} \n" +
                                $"Porcentagem da Variação R$ {cotacao.pctChange} \n" +
                                $"Máximo R$ {cotacao.high} \n" +
                                $"Mínimo R$ {cotacao.low} \n";
                    //mensagem += $"Data: {dataAtualizacao.ToString("dd/MM/yyyy HH:mm:ss")}\n\n";
                }
            }
            catch (Exception ex)
            {
                mensagem = "Desculpe, não consegui buscar essa informação no momento. Se importa de tentar novamente?";
            }

            return(await stepContext.NextAsync(mensagem, cancellationToken));
        }
        public static void Run(
            [RabbitMQTrigger("queue-cotacoes", ConnectionStringSetting = "BrokerRabbitMQ")] string inputMessage,
            ILogger log)
        {
            CotacaoMoeda cotacao = null;

            try
            {
                cotacao = JsonSerializer.Deserialize <CotacaoMoeda>(inputMessage,
                                                                    new JsonSerializerOptions()
                {
                    PropertyNameCaseInsensitive = true
                });
            }
            catch
            {
                log.LogError("MoedasRabbitMQTrigger - Erro durante a deserialização!");
            }

            if (cotacao != null)
            {
                var validationResult = new CotacaoMoedaValidator().Validate(cotacao);
                if (validationResult.IsValid)
                {
                    log.LogInformation($"MoedasRabbitMQTrigger - Dados pós formatação: {JsonSerializer.Serialize(cotacao)}");
                    CotacoesMoedasRepository.Save(cotacao);
                    log.LogInformation("MoedasRabbitMQTrigger - Cotação registrada com sucesso!");
                }
                else
                {
                    log.LogError("MoedasRabbitMQTrigger - Dados inválidos para a Cotação");
                    foreach (var error in validationResult.Errors)
                    {
                        log.LogError($"MoedasRabbitMQTrigger - {error.ErrorMessage}");
                    }
                }
            }
        }
예제 #13
0
        public async Task <CotacaoMoeda> GetCotacao(DateTime?date = null)
        {
            date ??= DateTime.Today;
            using var request = new HttpRequestMessage(HttpMethod.Get, GetUrl(date.Value));
            var client   = _clientFactory.CreateClient();
            var response = await client.SendAsync(request);

            var cotacaoMoeda = new CotacaoMoeda();

            if (response.IsSuccessStatusCode)
            {
                using var responseStream = await response.Content.ReadAsStreamAsync();

                var result = await JsonSerializer.DeserializeAsync <ResultBC>(responseStream);

                if (!result.Value.Any())
                {
                    return(await GetCotacao(date.Value.AddDays(-1)));
                }
                cotacaoMoeda.DataFechamentoCotacao = date.Value;
                cotacaoMoeda.Cotacao = (long)(result.Value.FirstOrDefault().CotacaoCompra * 10000);
            }
            return(cotacaoMoeda);
        }
예제 #14
0
        public async Task <Resultado> Post(
            [FromServices] IConfiguration configuration,
            CotacaoMoeda cotacao)
        {
            var conteudoCotacao = JsonSerializer.Serialize(cotacao);

            _logger.LogInformation($"Dados: {conteudoCotacao}");

            var body = Encoding.UTF8.GetBytes(conteudoCotacao);

            string queue  = configuration["Queue-AzureServiceBus"];
            var    client = new QueueClient(
                configuration.GetConnectionString("AzureServiceBus"),
                queue);
            await client.SendAsync(new Message(body));

            _logger.LogInformation(
                $"Azure Service Bus - Envio para a queue {queue} concluído");

            return(new Resultado()
            {
                Mensagem = "Informações de cotação de moeda enviadas com sucesso!"
            });
        }