using Microsoft.Maui.Controls.Shapes; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; namespace DigitalSystem.Usuarios { public class chatClaseGmt { private static chatClaseGmt instance = null; private ClientWebSocket _cliente; public string Respuesta; public CollectionView usersChat { get; set; } public VerticalStackLayout usersgmtmensajes { get; set; } public Label userChatTo { get; set; } public Label openchat { get; set; } public Label userChat { get; set; } public Editor chatmessage { get; set; } public Label eviarChatlbl { get; set; } public List> listaDeMensajes = new List>(); private List listaUsers = new List(); private chatClaseGmt() { } public async Task ConectarAlchat() { var seconecta = ""; bool reconectar = true; if (_cliente != null) { if (_cliente.State == WebSocketState.Open) { reconectar = false; seconecta = "CLIENTE CONECTADO"; } } if (reconectar) { _cliente = new ClientWebSocket(); try { var ipChat = "192.168.200.9"; if (CapaDeNegocio.SettingsClase.GetInstance().Remote) ipChat = "177.125.138.9"; await _cliente.ConnectAsync(new Uri($"ws://{ipChat}:41459"), CancellationToken.None); seconecta = "CLIENTE CONECTADO"; } catch (Exception ex) { seconecta = ex.Message; } } return seconecta; } public async void EnviarMnesaje(string _mensaje) { var _btyMsg = Encoding.UTF8.GetBytes(_mensaje); if (_cliente.State == WebSocketState.Open) { var dicMensaje = JsonConvert.DeserializeObject>(_mensaje); if (dicMensaje.ContainsKey("para")) { var listaMsg = listaDeMensajes.FirstOrDefault(item => item.ContainsKey(dicMensaje["para"].ToString().Replace(" ", "_"))); if (listaMsg != null) { if (listaMsg.Count > 0) { listaMsg[dicMensaje["para"].ToString().Replace(" ", "_")] += $"[{_mensaje}]¬"; } else { listaDeMensajes.Add(new Dictionary { { dicMensaje["para"].ToString().Replace(" ", "_"), $"[{_mensaje}]¬" } }); } } else { listaDeMensajes.Add(new Dictionary { { dicMensaje["para"].ToString().Replace(" ", "_"), $"[{_mensaje}]¬" } }); } var bordo = new Border { Margin = new Thickness(0,2,40,2), StrokeShape = new RoundRectangle { CornerRadius = 10 } }; var label = new Label { Text = dicMensaje["mensaje"].ToString(), BackgroundColor = Colors.LightGreen, Padding = new Thickness(10, 0, 0, 0) }; bordo.Content = label; MainThread.BeginInvokeOnMainThread(() => { usersgmtmensajes.Children.Add(bordo); }); } await _cliente.SendAsync( new ArraySegment(_btyMsg), WebSocketMessageType.Text, true, CancellationToken.None ); } } public async void RecibirMnesaje() { try { while (_cliente.State == WebSocketState.Open) { ArraySegment buffer = new ArraySegment(new byte[8192]); using (var ms = new MemoryStream()) { WebSocketReceiveResult result; do { result = await _cliente.ReceiveAsync(buffer, CancellationToken.None); if (result != null) ms.Write(buffer.Array, 0, result.Count); } while (!result.EndOfMessage); ms.Position = 0; Respuesta = Encoding.UTF8.GetString(ms.ToArray()); Respuesta = Respuesta.Replace("#fin", ""); if (!string.IsNullOrEmpty(Respuesta)) { if (JsonConvert.DeserializeObject(Respuesta)[0]["mensaje"].ToString() == "ESTAS CONECTADO AL SERVICIO DE CHAT GMT") { ProcesarMensajes(Respuesta); Respuesta = ""; } else if (JsonConvert.DeserializeObject(Respuesta)[0]["mensaje"].ToString() != "se envio") { var mensaje = JsonConvert.DeserializeObject(Respuesta)[0]["mensaje"]; var user = JsonConvert.DeserializeObject(Respuesta)[0]["deuser"]; var listaMsg = listaDeMensajes.FirstOrDefault(item => item.ContainsKey(user.ToString().Replace(" ", "_"))); if (listaMsg != null) { if (listaMsg.Count > 0) { if (usersgmtmensajes.IsVisible) { var bordo = new Border { Margin = new Thickness(40, 2, 0, 2), StrokeShape = new RoundRectangle { CornerRadius = 10 } }; var label = new Label { Text = mensaje.ToString(), BackgroundColor = Colors.LightYellow, Padding = new Thickness(10, 0, 0, 0) }; bordo.Content = label; MainThread.BeginInvokeOnMainThread(() => { usersgmtmensajes.Children.Add(bordo); }); } listaMsg[user.ToString().Replace(" ", "_")] += Respuesta + "¬"; } else { listaDeMensajes.Add(new Dictionary { { user.ToString().Replace(" ", "_"), Respuesta + "¬" } }); } } else { listaDeMensajes.Add(new Dictionary { { user.ToString().Replace(" ", "_"), Respuesta + "¬" } }); } foreach (Window ventana in Application.Current.Windows.ToList()) { var colorActual = ((ContentPage)ventana.Page).BackgroundColor; for (int i = 0; i < 5; i++) { if (i % 2 == 0) { ((ContentPage)ventana.Page).BackgroundColor = Color.FromRgba(0, 0, 0, 127); } else { ((ContentPage)ventana.Page).BackgroundColor = Color.FromRgba(255, 0, 0, 127); } await Task.Delay(100); } ((ContentPage)ventana.Page).BackgroundColor = colorActual; } if (userChatTo.Text != user.ToString()) { foreach (Label lblUsers in listaUsers) { if (user.ToString() == lblUsers.Text.Replace(" nuevo mensaje", "")) { lblUsers.Text = $"{lblUsers.Text.Replace(" nuevo mensaje", "")} nuevo mensaje"; for (int i = 0; i < 25; i++) { lblUsers.TextColor = lblUsers.TextColor == Colors.Black ? Colors.Red : Colors.Black; await Task.Delay(100); } lblUsers.TextColor = Colors.Black; } } for (int i = 0; i < 25; i++) { openchat.FontSize = openchat.FontSize == 24 ? 5 : 24; userChat.TextColor = userChat.TextColor == Colors.Black ? Colors.Red : Colors.Black; await Task.Delay(100); } openchat.FontSize = 24; userChat.TextColor = Colors.Black; Console.Beep(300, 2000); } Respuesta = ""; } } } } } catch { } } private void ProcesarMensajes(string xRespuesta) { var resp = JsonConvert.DeserializeObject(xRespuesta); var mensaje = resp[0]["mensaje"].ToString(); var users = JsonConvert.DeserializeObject>(resp[1]["users"].ToString()); listaUsers = new List(); usersChat.ItemTemplate = new DataTemplate(() => { var vTemplate = new VerticalStackLayout { Padding = 10 }; foreach (var usergmt in users) { var label = new Label(); label.Text = usergmt; var tapReg = new TapGestureRecognizer(); tapReg.Tapped += TapReg_Tapped; label.GestureRecognizers.Add(tapReg); vTemplate.Children.Add(label); listaUsers.Add(label); } return vTemplate; }); usersChat.ItemsSource = new List { "nada"}; } private void TapReg_Tapped(object? sender, TappedEventArgs e) { ((Label)sender).Text = ((Label)sender).Text.Replace(" nuevo mensaje", ""); userChatTo.Text = ((Label)sender).Text.Replace(" nuevo mensaje", ""); usersgmtmensajes.IsVisible = true; var listaMess = listaDeMensajes.FirstOrDefault(items => items.ContainsKey(userChatTo.Text.Replace(" ", "_"))); if (listaMess != null) { var dataMsg = listaMess[userChatTo.Text.Replace(" ", "_")].ToString().TrimEnd('¬'); foreach (string dataM in dataMsg.Split('¬')) { var arrMsg = JArray.Parse(dataM); if (arrMsg[0]["deuser"] == null) { var bordo = new Border { Margin = new Thickness(0, 2, 40, 2), StrokeShape = new RoundRectangle { CornerRadius = 10 } }; var label = new Label { Text = arrMsg[0]["mensaje"].ToString(), BackgroundColor = Colors.LightGreen, Padding = new Thickness(10, 0, 0, 0) }; bordo.Content = label; MainThread.BeginInvokeOnMainThread(() => { usersgmtmensajes.Children.Add(bordo); }); } else { var bordo = new Border { Margin = new Thickness(40, 2,0, 2), StrokeShape = new RoundRectangle { CornerRadius = 10 } }; var label = new Label { Text = arrMsg[0]["mensaje"].ToString(), BackgroundColor = Colors.LightYellow, Padding = new Thickness(10, 0, 0, 0) }; bordo.Content = label; MainThread.BeginInvokeOnMainThread(() => { usersgmtmensajes.Children.Add(bordo); }); } } } usersChat.IsVisible = false; chatmessage.IsVisible = true; eviarChatlbl.IsVisible = true; } public void Desconectar() { try { _cliente.CloseAsync(WebSocketCloseStatus.NormalClosure, "cierre normal", CancellationToken.None); _cliente.Dispose(); } catch { } } public static chatClaseGmt GetInstance() { if (instance == null) { instance = new chatClaseGmt(); } return instance; } } }