Criado por Luiz Cardamone
aproximadamente 4 anos atrás
|
||
using ChatApp.DTO; using ChatApp.Models; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ChatApp { public class ApiClient { HttpClient _httpClient; public delegate void NovaMensagensDelegate(Mensagem[] mensagens); public delegate void AlterarListaUsuariosDelegate(Usuarios[] usuarios); public string Apelido { get; private set; } public event NovaMensagensDelegate AoReceberMensagens; public event AlterarListaUsuariosDelegate AoAlterarNovaListaUsuarios; int _sequencialMensagens; int _sequencialUsuarios; volatile bool _rodando; System.Timers.Timer _timer; public ApiClient() { _timer = new System.Timers.Timer(); _timer.AutoReset = false; _timer.Interval = 1000; _timer.Elapsed += _timer_Elapsed; _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri("http://localhost:5000"); } private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { try { var mensagens = PegarNovasMensagens(); AoReceberMensagens?.Invoke(mensagens); } catch { } try { var usuarios = PegarNovosUsuarios(); AoAlterarNovaListaUsuarios?.Invoke(usuarios); } catch { } } finally { if (_rodando) _timer.Start(); } } private Mensagem[] PegarNovasMensagens() { var result = _httpClient.GetAsync($"/mensagens?sequencial={_sequencialMensagens}").Result; result.EnsureSuccessStatusCode(); var conteudo = JsonConvert.DeserializeObject<Mensagem[]>(result.Content.ReadAsStringAsync().Result); if (conteudo.Any()) { _sequencialMensagens = conteudo.Max(c => c.Id); } return conteudo; } public Usuarios[] PegarNovosUsuarios() { var result = _httpClient.GetAsync($"/usuarios?sequencial={_sequencialUsuarios}").Result; result.EnsureSuccessStatusCode(); var conteudo = JsonConvert.DeserializeObject<Usuarios[]>(result.Content.ReadAsStringAsync().Result); if (conteudo.Any()) { conteudo = conteudo .Where(c => c.Nome != Apelido) .ToArray(); if(conteudo.Any()) { _sequencialUsuarios = conteudo.Max(c => c.Id); } } return conteudo; } public void EnviarMensagem(OutputMensagem mensagem) { mensagem.Remetente = Apelido; var json = JsonConvert.SerializeObject(mensagem); var result = _httpClient.PostAsync("mensagens", new StringContent(json, Encoding.UTF8, "application/json")).Result; result.EnsureSuccessStatusCode(); } public void FazerLogin(string apelido) { var json = JsonConvert.SerializeObject(new { nome = apelido }); var resultado = _httpClient .PostAsync("usuarios", new StringContent(json, Encoding.UTF8, "application/json")) .Result; //content-type: application/json; charset=utf-8 var resultadoContent = JsonConvert.DeserializeObject<InputLogin>( resultado.Content.ReadAsStringAsync().Result); if (resultado.StatusCode == System.Net.HttpStatusCode.BadRequest) { throw new Exception(Convert.ToString(resultadoContent.Erro)); } Apelido = apelido; } public void IniciarRecebimento() { _rodando = true; _timer.Start(); } } }
DTO namespace ChatApp.DTO { public class InputLogin { public string Erro { get; set; } } } using Newtonsoft.Json; namespace ChatApp.DTO { public class OutputMensagem { [JsonProperty("remetente")] public string Remetente { get; set; } [JsonProperty("destinatario")] public string Destinatario { get; set; } [JsonProperty("texto")] public string Texto { get; set; } [JsonProperty("reservada")] public bool Reservada { get; set; } } }
MODELS namespace ChatApp.Models { public class Mensagem { public int Id { get; set; } public string Remetente { get; set; } public string Texto { get; set; } public string Destinatario { get; set; } public bool Reservada { get; set; } } } namespace ChatApp.Models { public class Usuarios { public int Id { get; set; } public string Nome { get; set; } } }
Quer criar suas próprias Notas gratuitas com a GoConqr? Saiba mais.