private void metroTileIniciar_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy) { return; } if (!validaEntradaDoUsuario("monitor")) { MessageBox.Show("Favor preencher todos os campos antes de iniciar"); return; } entradaUsuario = new EntradaUsuario(); usCulture = new CultureInfo(System.Configuration.ConfigurationManager.AppSettings["Culture"]); entradaUsuario.ativo = metroTextBoxAtivo.Text; entradaUsuario.referenciaVenda = Convert.ToDecimal(metroTextBoxRefVenda.Text, usCulture); entradaUsuario.referenciaCompra = Convert.ToDecimal(metroTextBoxRefCompra.Text, usCulture); if (entradaUsuario.referenciaVenda < entradaUsuario.referenciaCompra) { MessageBox.Show("Referência de venda não pode ser menor do que a referência de compra."); return; } ScraperAtivosDisponiveis.Atualizar(); if (!Validacao.ValidaAtivoEstaDisponivelAPI(entradaUsuario.ativo)) { DialogResult dialogResult = MessageBox.Show("Nós não fornecemos suporte para este ativo. Gostaria de saber para quais ativos temos suporte?" , "alerta" , MessageBoxButtons.YesNo , MessageBoxIcon.Warning); if (dialogResult == DialogResult.Yes) { string caminho = Path.Combine("Resources", "ativos_disponiveis.txt"); if (File.Exists(caminho)) { string caminhoAreaDeTralho = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), $"ativos_disponiveis_{DateTime.Now.Ticks.ToString()}.txt"); File.Copy(caminho, caminhoAreaDeTralho, true); Process.Start(Path.Combine("Resources", caminhoAreaDeTralho)); } MessageBox.Show("Tente novamente com um dos ativos suportados."); } return; } DefineStatusCaixasDeTexto(false); metroLabel10.Text = $"Monitoramento iniciado"; backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.WorkerSupportsCancellation = true; backgroundWorker1.RunWorkerAsync(); }
static void Main(string[] args) { Console.WriteLine("*************************************************"); Console.WriteLine("Aguarde um momento enquanto o sistema realiza as validações necessárias."); Console.WriteLine("*************************************************"); checarArquivoDeConfiguracao(); if (!Validacao.ValidaParametrosEntrada(args)) { Console.WriteLine("Os parâmetros de entrada não estão no formato correto. Seguir o exemplo:"); Console.WriteLine("'Ativo' 'Referência para venda' 'Referência para compra'"); Console.WriteLine("PETR4 22.67 22.59"); Console.WriteLine("Nota1: O preço de referência para venda deve ser maior do que o preço de referência para compra."); Console.WriteLine("Nota2: Altere as configurações padrões no arquivo \"stock - quote - alert.exe.config\" para colocar suas próprias informações."); Environment.Exit(0); } entradaUsuario = new EntradaUsuario(); usCulture = new CultureInfo(System.Configuration.ConfigurationManager.AppSettings["Culture"]); entradaUsuario.ativo = args[0]; entradaUsuario.referenciaVenda = Convert.ToDecimal(args[1], usCulture); entradaUsuario.referenciaCompra = Convert.ToDecimal(args[2], usCulture); if (!ScraperAtivosDisponiveis.Atualizar()) { Console.WriteLine("Não foi possível consultar novos ativos, vamos utilizar os ativos disponíveis na ultima atualização."); } if (!Validacao.ValidaAtivoEstaDisponivelAPI(entradaUsuario.ativo)) { Console.WriteLine("Nós não fornecemos suporte para este ativo. Gostaria de saber para quais ativos temos suporte?(S\\N)"); string answer = Console.ReadLine().ToUpper(); if (answer.Equals("S")) { foreach (var ativo in LeitorDeArquivos.ativosDisponveis()) { Console.WriteLine(ativo); } Console.WriteLine("Tente novamente com um dos ativos suportados."); Console.WriteLine("Pressione qualquer tecla para tentar novamente..."); //Console.ReadKey(); Environment.Exit(0); } else if (answer.Equals("N")) { Console.WriteLine("Tudo bem, a aplicação será encerrada."); Environment.Exit(0); } else { Console.WriteLine("Comando desconhecido a aplicação será encerrada."); Environment.Exit(1); } } timer = new System.Timers.Timer(); timer.Interval = 100; timer.Elapsed += OnTimedEvent; timer.Enabled = true; timer.Start(); Console.WriteLine("************************************************* "); Console.WriteLine("Para sair do programa pressione qualquer tecla... "); Console.WriteLine("*************************************************"); Console.ReadLine(); }
protected override void OnDoWork(DoWorkEventArgs e) { CultureInfo usCulture = new CultureInfo(System.Configuration.ConfigurationManager.AppSettings["Culture"]); workerThread = Thread.CurrentThread; try { bool bgWorkingRunning = false; while (!bgWorkingRunning) { if (this.CancellationPending) { break; } bgWorkingRunning = true; entradaUsuario = FormMain.entradaUsuario; JObject respostaAPI = APIAtivos.BuscarAtivo(entradaUsuario.ativo); if (!(respostaAPI["results"]["error"] is null)) { Console.WriteLine($"Falha ao conectar com a API às {DateTime.Now}. Detalhes: {respostaAPI["results"]["message"].ToString()}"); } else { Decimal precoAtivoAtual = Convert.ToDecimal(respostaAPI["results"][entradaUsuario.ativo]["price"], usCulture); entradaUsuario.precoAtual = precoAtivoAtual; if (precoAtivoAtual > entradaUsuario.referenciaVenda) { string corpoDoEmail = LeitorDeArquivos.modeloEmailVenda() .Replace("#Ativo", entradaUsuario.ativo) .Replace("#precoAtivo", precoAtivoAtual.ToString()) .Replace("#referenciaDeVenda", entradaUsuario.referenciaVenda.ToString()); if (Email.Enviar("[stock-quote-alert] Alerta para venda", corpoDoEmail)) { Console.WriteLine("E-mail enviado"); } else { Console.WriteLine("Falha ao enviar o email"); } } else if (precoAtivoAtual < entradaUsuario.referenciaCompra) { string corpoDoEmail = LeitorDeArquivos.modeloEmailCompra() .Replace("#Ativo", entradaUsuario.ativo) .Replace("#precoAtivo", precoAtivoAtual.ToString()) .Replace("#referenciaDeCompra", entradaUsuario.referenciaCompra.ToString()); Email.Enviar("[stock-quote-alert] Alerta para compra", corpoDoEmail); } } if (DateTime.Now.TimeOfDay < Convert.ToDateTime("10:00").TimeOfDay || DateTime.Now.TimeOfDay > Convert.ToDateTime("17:30").TimeOfDay) { //Os valores dos ativos não são atualizados antes das 10:00 e também não são atualizados depois das 17:30, então o app espera DateTime startTime = DateTime.Now; DateTime endtime = Convert.ToDateTime("10:00"); DateTime endOftheDay = Convert.ToDateTime("23:59"); TimeSpan duration = Convert.ToDateTime("10:00").AddDays(1).Subtract(DateTime.Now); if (((int)DateTime.Now.DayOfWeek) == 6) { duration = Convert.ToDateTime("10:00").AddDays(2).Subtract(DateTime.Now); } else if (((int)DateTime.Now.DayOfWeek) == 5) { duration = Convert.ToDateTime("10:00").AddDays(3).Subtract(DateTime.Now); } else { duration = TimeSpan.FromMilliseconds(1000 * 60 * 15); // A api é atualizada a cada 15 minutos, então a requisição será feita a cada 15 minutos } FormMain.entradaUsuario = entradaUsuario; this.ReportProgress(1); //Thread.Sleep(duration); //TODO: Remover esse comentário para o app funcionar durante o tempo que a API é atualizada Thread.Sleep(1000 * 60 * 1); } bgWorkingRunning = false; }