Ejemplo n.º 1
0
        /// <summary>
        /// Método que corresponde al patrón Chain of Responsibility.
        /// En caso de que el precio minimo correspondiente al perfil que envía el mensaje
        /// esté fijado en el valor inicial de -1, se pide un valor de Precio Minimo,
        /// y se agrega el ID a la lista de UsuariosPreguntados.
        ///
        /// En caso de que el Perfil correspondiente tenga el valor inicial de Precio Minimo,
        /// y esté en la lista de preguntados, se procesa el valor ingresado en el
        /// último mensaje para validarlo.
        /// De ser correcto, se modifica el campo Precio Minimo de Perfil y se pasa al siguiente eslabón.
        /// De no ser correcto, se pide al usuario que ingrese un valor adecuado.
        ///
        ///
        /// Si al ingresar al método, el valor de Precio minimo no es el inicial, se asume que ya fue fijado por el usuario,
        /// por lo que se envía el mensaje hacia el siguiente eslabón.
        /// </summary>
        /// <param name="m">Mensaje que se transmite por patrón COR</param>
        public override async void Handle(Mensaje m)
        {
            Perfil perfil = BibliotecaPerfiles.GetUsuario(m.Id);

            if (perfil.PrecioMin == -1)
            {
                if (!perfil.RegistroPreguntas.PrecioMin)
                {
                    perfil.RegistroPreguntas.PrecioMin = true;
                    await Preguntar(m.Id, m.Plataforma);
                }
                else
                {
                    /// <summary>
                    /// Intento parsear el contenido del mensaje a un numero entero, si lo consigue pasa al siguiente eslabón.
                    /// </summary>

                    try
                    {
                        int precioMin = Int32.Parse(m.Contenido);
                        EditorPerfil.SetPrecioMin(m.Id, precioMin);
                        //Si está todo OK, paso al siguiente eslabón
                        Siguiente.Handle(m);
                    }
                    /// <summary>
                    /// Si el parseo falla, por ejemplo si recibo una letra, captura la excepción y envia un mensaje al usuario
                    /// pidiendo que ingrese un valor valido de edad
                    /// </summary>
                    catch (FormatException)
                    {
                        await Respuesta.PedirAclaracion(m.Id, m.Plataforma);
                        await Preguntar(m.Id, m.Plataforma);
                    }
                    catch (NullReferenceException)
                    {
                        await Respuesta.PedirAclaracion(m.Id, m.Plataforma);
                        await Preguntar(m.Id, m.Plataforma);
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                        await Respuesta.ErrorPrecioMin(m.Id, m.Plataforma);
                        await Preguntar(m.Id, m.Plataforma);
                    }
                    catch (ArgumentNullException)
                    {
                        await Respuesta.PedirAclaracion(m.Id, m.Plataforma);
                        await Preguntar(m.Id, m.Plataforma);
                    }
                }
            }

            else
            {
                Siguiente.Handle(m);
            }
        }