/// <summary> /// Endpoint que se utiliza para insertar un mensaje nuevo /// </summary> /// <param name="request">Recibe una petición con un valor de tipo Mensaje</param> private void ep_Mensaje_Nuevo(Request request) { try { if (Usuario == null) { Send("error", "El usuario no ha iniciado sesión", false, 404); return; } Mensaje mensajeRecibido = JsonConvert.DeserializeObject <Mensaje>(Convert.ToString(request.Value)); if (mensajeRecibido == null) { Send("error", "No se ha podido obtener el mensaje recibido", false, 404); return; } if (string.IsNullOrEmpty(mensajeRecibido.NickUsuarioRemitente) && mensajeRecibido.IdGrupo != 0) { // Send("error", "Se requiere un grupo o un usuario remitente", false, 404); return; } Usuario usuarioRemitente = null; Mensaje mensaje = null; if (mensajeRecibido.IdGrupo == 0 && string.IsNullOrEmpty(mensajeRecibido.NickUsuarioRemitente)) { mensaje = new Mensaje() { IdGrupo = 0, IdUsuarioRemitente = 0, IdUsuario = mensajeRecibido.IdUsuario, Contenido = mensajeRecibido.Contenido, RutaContenido = mensajeRecibido.RutaContenido, Binario = mensajeRecibido.Binario, FechaAlta = DateTime.Now }; } else { bool isEmpty = false; DataSet result = BD.sp_Usuarios_Select(ref isEmpty, mensajeRecibido.NickUsuarioRemitente); if (isEmpty) { Send("error", "El usuario remitente no existe", false, 404); return; } usuarioRemitente = new Usuario() { Id = Convert.ToInt32(result.Tables[0].Rows[0]["Id"]), Correo = Convert.ToString(result.Tables[0].Rows[0]["Correo"]), Nick = string.IsNullOrEmpty(Convert.ToString(result.Tables[0].Rows[0]["Nick"])) ? Convert.ToString(result.Tables[0].Rows[0]["Correo"]) : Convert.ToString(result.Tables[0].Rows[0]["Nick"]), Password = Convert.ToString(result.Tables[0].Rows[0]["Password"]) }; mensaje = new Mensaje() { IdGrupo = 0, IdUsuarioRemitente = usuarioRemitente.Id, IdUsuario = mensajeRecibido.IdUsuario, Contenido = mensajeRecibido.Contenido, RutaContenido = mensajeRecibido.RutaContenido, Binario = mensajeRecibido.Binario, FechaAlta = DateTime.Now }; } if (!BD.sp_Mensajes_Insert(mensaje)) { Send("error", "No se pudo enviar el mensaje", false, 404); return; } mensaje.Contenido = $"{Usuario.Nick}: {mensaje.Contenido}"; Send(request.Key, mensaje, status: 200); } catch (Exception ex) { Send("error", ex.Message, status: 200); Fun.PrintLog(Fun.Log.Error, ex.Message, "Client.ep_Mensaje_Nuevo"); } }
/// <summary> /// Endpoint que se utiliza para insertar un mensaje nuevo con un archivo /// </summary> /// <param name="request">Recibe una petición con un valor de tipo Mensaje</param> private void ep_Mensaje_Archivo_Nuevo(Request request) { try { if (Usuario == null) { Send("error", "El usuario no ha iniciado sesión", false, 404); return; } Mensaje mensajeRecibido = JsonConvert.DeserializeObject <Mensaje>(Convert.ToString(request.Value)); if (mensajeRecibido == null) { Send("error", "No se ha podido obtener el mensaje recibido", false, 404); return; } if (string.IsNullOrEmpty(mensajeRecibido.NickUsuarioRemitente) && mensajeRecibido.IdGrupo != 0) { // Send("error", "Se requiere un grupo o un usuario remitente", false, 404); return; } Usuario usuarioRemitente = null; Mensaje mensaje = null; bool isEmpty = false; DataSet result = null; if (mensajeRecibido.IdGrupo == 0 && string.IsNullOrEmpty(mensajeRecibido.NickUsuarioRemitente)) { mensaje = new Mensaje() { IdGrupo = 0, IdUsuarioRemitente = 0, IdUsuario = mensajeRecibido.IdUsuario, Contenido = mensajeRecibido.Contenido, RutaContenido = mensajeRecibido.RutaContenido, Binario = mensajeRecibido.Binario, FechaAlta = DateTime.Now }; } else { isEmpty = false; result = BD.sp_Usuarios_Select(ref isEmpty, mensajeRecibido.NickUsuarioRemitente); if (isEmpty) { Send("error", "El usuario remitente no existe", false, 404); return; } usuarioRemitente = new Usuario() { Id = Convert.ToInt32(result.Tables[0].Rows[0]["Id"]), Correo = Convert.ToString(result.Tables[0].Rows[0]["Correo"]), Nick = string.IsNullOrEmpty(Convert.ToString(result.Tables[0].Rows[0]["Nick"])) ? Convert.ToString(result.Tables[0].Rows[0]["Correo"]) : Convert.ToString(result.Tables[0].Rows[0]["Nick"]), Password = Convert.ToString(result.Tables[0].Rows[0]["Password"]) }; mensaje = new Mensaje() { IdGrupo = 0, IdUsuarioRemitente = usuarioRemitente.Id, IdUsuario = mensajeRecibido.IdUsuario, Contenido = mensajeRecibido.Contenido, RutaContenido = mensajeRecibido.RutaContenido, Binario = mensajeRecibido.Binario, FechaAlta = DateTime.Now }; } if (!BD.sp_Mensajes_Insert(mensaje)) { Send("error", "No se pudo enviar el mensaje", false, 404); return; } isEmpty = false; int?idMensaje = BD.sp_Mensajes_SelectMaxIdentity(); if (!idMensaje.HasValue) { Send(request.Key, "No se encontro el mensaje solicitado", false, 404); return; } result = BD.sp_Mensajes_Select(ref isEmpty, idMensaje.Value); if (isEmpty) { Send(request.Key, "No se encontro el mensaje solicitado", false, 404); return; } DataTable dt = result.Tables[0]; Mensaje mensajeInsertado = new Mensaje() { Id = idMensaje.Value, IdGrupo = !Convert.IsDBNull(dt.Rows[0]["IdGrupo"]) ? Convert.ToInt32(Convert.ToString(dt.Rows[0]["IdGrupo"])) : 0, IdUsuario = !Convert.IsDBNull(dt.Rows[0]["IdUsuario"]) ? Convert.ToInt32(Convert.ToString(dt.Rows[0]["IdUsuario"])) : 0, Contenido = !Convert.IsDBNull(dt.Rows[0]["Contenido"]) ? Convert.ToString(dt.Rows[0]["Contenido"]) : string.Empty, RutaContenido = !Convert.IsDBNull(dt.Rows[0]["RutaContenido"]) ? Convert.ToString(dt.Rows[0]["RutaContenido"]) : string.Empty, Binario = !Convert.IsDBNull(dt.Rows[0]["Binario"]) ? (byte[])dt.Rows[0]["Binario"] : null, FechaAlta = !Convert.IsDBNull(dt.Rows[0]["FechaAlta"]) ? Convert.ToDateTime(dt.Rows[0]["FechaAlta"]) : DateTime.Now }; Send(request.Key, mensajeInsertado, status: 200); } catch (Exception ex) { Send("error", ex.Message, status: 200); Fun.PrintLog(Fun.Log.Error, ex.Message, "Client.ep_Mensaje_Archivo_Nuevo"); } }
/// <summary> /// Método que contiene una estructura ciclica para escuchar peticiones del cliente /// </summary> /// <param name="client"></param> public async void ListenRequests(Client client) { while (true) { try { bool isEmptyValue = false; string mensaje = string.Empty; Request request = null; string strRequest = await Reader.ReadLineAsync(); if (!DebugRequest(ref request, ref mensaje, ref isEmptyValue, strRequest)) { if (!string.IsNullOrEmpty(mensaje)) { Fun.PrintLog(Fun.Log.Warning, mensaje, "Masengger.Client.ListenRequests.DebugRequest"); } Stop(); break; } if (request == null) { continue; } switch (request.Key) { case "login_validuser": { ep_Login_ValidUser(request); break; } case "register_create": { ep_Register_Create(request); break; } case "user_getByNick": { ep_User_GetByNick(request); break; } case "user_list": { ep_User_List(request); break; } case "user_connected_list": { ep_User_Connected_List(request); break; } case "file_get": { ep_File_Get(request); break; } case "mensaje_nuevo": { ep_Mensaje_Nuevo(request); break; } case "mensaje_archivo_nuevo": { ep_Mensaje_Archivo_Nuevo(request); break; } case "mensajes_lista": { ep_Mensajes_Lista(request); break; } case "video_get": { ep_Video_Get(request); break; } default: { break; } } } catch (Exception ex) { // se ignora este error porque al ocurre de parar el hilo, es decir, es un error controlado if (ex.Message == "Thread was being aborted.") { break; } // errores que pasan cuando se pierde la conexión con el cliente de forma inesperada if (ex.Message == "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host." || ex.Message == "Cannot read from a closed TextReader." || ex.Message.Contains("Cannot access a disposed object.") || ex.Message == "The stream is currently in use by a previous operation on the stream.") { Stop(); break; } Fun.PrintLog(Fun.Log.Error, ex.Message, "Client.ListenClient"); } } }