Ejemplo n.º 1
0
        private bool EnviarPush(Comunicacion comunicacion)
        {
            Aplicacion aplicacion = comunicacion.Categoria.Aplicacion;

            // No se envía push si no
            if (string.IsNullOrEmpty(Aplicacion.CloudKey) ||
                string.IsNullOrEmpty(Aplicacion.Usuario) ||
                string.IsNullOrEmpty(Aplicacion.Clave))
            {
                log.Info($"No se enviará push de la comunicación {comunicacion.ComunicacionID} porque la aplicación {aplicacion.Nombre} no tiene los datos de configuración del servicio push (CloudKey, Usuario, Clave).");
                return(false);
            }

            try
            {
                // Obtener el canal
                IParametrosServicio pSrv = Servicios.ParametrosServicio();
                string    claveCanal     = "CanalPush";
                Parametro canal          = pSrv.GetByName(claveCanal);
                if (canal == null || string.IsNullOrWhiteSpace(canal.Valor))
                {
                    log.Info($"No se enviará push de la comunicación {comunicacion.ComunicacionID} porque el parámetro {claveCanal} no existe o no tiene valor.");
                    return(false);
                }

                string descripcion = comunicacion.Descripcion.Length > 50
                    ? comunicacion.Descripcion.Substring(0, 50) + "..."
                    : comunicacion.Descripcion;
                using (CloudPush push = new CloudPush(Aplicacion.CloudKey, Aplicacion.Usuario, Aplicacion.Clave))
                {
                    Respuesta respuesta = push.EnviarMensaje(comunicacion.Titulo, descripcion, true, canal.Valor,
                                                             comunicacion.ComunicacionID.ToString());
                    if (respuesta.Meta.Code != 200)
                    {
                        log.Info($"Comunicacion: {comunicacion.ComunicacionID} - El servidor devolvió un error al solicitar push: Código: {respuesta.Meta.Code} Estado: {respuesta.Meta.Status} Mensaje: {respuesta.Meta.Message} Método: {respuesta.Meta.Method_Name}.");
                        return(false);
                    }
                    else
                    {
                        log.Info($"Comunicacion: {comunicacion.ComunicacionID} - Push OK");
                        log.Info($"CloudKey: {Aplicacion.CloudKey}");
                        return(true);
                    }
                }
            }
            catch (Exception e)
            {
                log.Error("Error en push", e);
                return(false);
            }
        }
Ejemplo n.º 2
0
        public MainPage()
        {
            this.InitializeComponent();

            /*
             *
             * PushNotificationChannel result = sCode.Result;
             * string uri = result.Uri;*/
            var obj = new CloudPush();

            Task sCode = Task.Run(async() =>
            {
                await obj.InitAsync();
            });
        }
Ejemplo n.º 3
0
        static void Main(string[] args)
        {
            DateTime inicio = DateTime.Now;

            log4net.Config.XmlConfigurator.Configure();
            ILog log = LogManager.GetLogger(typeof(PublicadorPush));

            log.Info("#########################");
            log.Info("INICIO");

            int pushPublicaciones = 0, pushRecordatorios = 0, errores = 0;
            PushNewsEntities db = new PushNewsEntities();

            DateTime instantePrepararBd = DateTime.Now;

            log.Debug($"Tiempo preparar db: {(instantePrepararBd - inicio).TotalSeconds}.");

            Dictionary <string, string> parametrosGenerales = db.Parametros
                                                              .Where(p => p.AplicacionID == null)
                                                              .ToDictionary(k => k.Nombre, v => v.Valor);

            DateTime instanteParametrosCargados = DateTime.Now;

            log.Debug($"Tiempo cargar parámetros: {(instanteParametrosCargados - instantePrepararBd).TotalSeconds}");
            // Cargar el parámetro CanalPush. Si no se da un valor para este parámetro
            // en la tabla de parámetros, no se pueden enviar notificaciones push.
            if (!parametrosGenerales.TryGetValue("CanalPush", out string canal) || string.IsNullOrWhiteSpace(canal))
            {
                log.Error("Imposible enviar notificaciones push: Falta el parámetro \"CanalPush\".");
                return;
            }

            // Cargar el parámetro HorasEnvioPush. Este parámetro indica el intervalo en horas
            // hacia atrás en el tiempo en el que se buscan comunicaciones con envíos pendientes
            // (de publicación o de recordatorio). Si no está especificado, se utiliza como valor
            // por defecto 1h.

            double horas = 1;

            if (parametrosGenerales.TryGetValue("HorasEnvioPush", out string horasAtras))
            {
                horas = double.TryParse(horasAtras, out double aux) ? aux : 1;
            }

            DateTime instanteParametrosProcesados = DateTime.Now;

            log.Debug($"Tiempo procesar parámetros: {(instanteParametrosProcesados - instanteParametrosCargados).TotalSeconds} ");

            DateTime ahora      = DateTime.Now;
            DateTime horaInicio = ahora.AddHours(-1 * horas);

            log.Info($"Buscar notificaciones de publicación pendientes entre {horaInicio:G} y {ahora:G}.");

            // Comunicaciones pendientes de push ordenadas por aplicación:
            // Las comunicaciones a enviar son aquellas que no han sido ya notificadas por push y no son instantáneas
            // o que tienen recordatorios pendientes, cuya aplicación tiene todos los datos necesarios para utilizar
            // el servicio push (CloudKey, Usuario y Clave), que no han sido borradas, que están activas y cuya fecha
            // de publicación está dentro del intervalo acutal de envío de notificaciones.
            //IComunicacionesServicio srv = factoria.ComunicacionesServicio();
            //IEnumerable<Comunicaciones> comunicacionesPendientes = srv.ComunicacionesPendientes();
            //srv.Get(c =>
            //// Condiciones generales: comunicación no borrada, activa y cuya aplicación tiene cloudkey, usuario y clave.
            //!c.Borrado && c.Activo
            //&& !string.IsNullOrEmpty(c.Categoria.Aplicacion.CloudKey)
            //&& !string.IsNullOrEmpty(c.Categoria.Aplicacion.Usuario)
            //&& !string.IsNullOrEmpty(c.Categoria.Aplicacion.Clave)
            //&& (
            //    // Condiciones para notificaciones: que no sea instantánea, que no esté ya enviada y que esté
            //    // dentro del intervalo acutal de notificación.
            //    (!c.Instantanea && !c.PushEnviada && c.FechaPublicacion < ahora && c.FechaPublicacion > horaInicio)
            //    ||
            //    // Condiciones para recordatorios: que tenga recordatorio configurado, que no esté ya enviado
            //    // y que la fecha de recordatorio esté dentro del intervalo actual de notificación.
            //    (!c.PushRecordatorio.HasValue && c.RecordatorioFecha.HasValue
            //        && c.RecordatorioFecha < ahora && c.RecordatorioFecha > horaInicio)
            //),
            //cc => cc.OrderBy(c => c.Categoria.AplicacionID)).ToList();
            //DateTime ahora = DateTime.Now;
            //DateTime horaInicio = ahora.AddHours(-1 * horas);
            // Comunicaciones pendientes de push ordenadas por aplicación:
            // Las comunicaciones a enviar son aquellas que no han sido ya notificadas por push y no son instantáneas
            // o que tienen recordatorios pendientes, cuya aplicación tiene todos los datos necesarios para utilizar
            // el servicio push (CloudKey, Usuario y Clave), que no han sido borradas, que están activas y cuya fecha
            // de publicación está dentro del intervalo acutal de envío de notificaciones.
            List <Comunicacion> comunicacionesPendientes = db.Set <Comunicacion>()
                                                           .Include(c => c.Categoria)
                                                           .Include(c => c.Categoria.Aplicacion)
                                                           .Where(c =>
                                                                  // Condiciones generales: comunicación no borrada, activa y cuya aplicación tiene cloudkey, usuario y clave.
                                                                  !c.Borrado && c.Activo &&
                                                                  !string.IsNullOrEmpty(c.Categoria.Aplicacion.CloudKey) &&
                                                                  !string.IsNullOrEmpty(c.Categoria.Aplicacion.Usuario) &&
                                                                  !string.IsNullOrEmpty(c.Categoria.Aplicacion.Clave) &&
                                                                  (
                                                                      // Condiciones para notificaciones: que no sea instantánea, que no esté ya enviada y que esté
                                                                      // dentro del intervalo acutal de notificación.
                                                                      (!c.Instantanea && !c.PushEnviada && c.FechaPublicacion <ahora && c.FechaPublicacion> horaInicio)
                                                                      ||
                                                                      // Condiciones para recordatorios: que tenga recordatorio configurado, que no esté ya enviado
                                                                      // y que la fecha de recordatorio esté dentro del intervalo actual de notificación.
                                                                      (!c.PushRecordatorio.HasValue && c.RecordatorioFecha.HasValue &&
                                                                       c.RecordatorioFecha <ahora && c.RecordatorioFecha> horaInicio)
                                                                  ))
                                                           .OrderBy(c => c.Categoria.AplicacionID)
                                                           .ToList();

            log.Info("Mensajes pendientes cargados: " + comunicacionesPendientes.Count());
            DateTime instanteComunicacionesCargadas = DateTime.Now;

            log.Debug($"Tiempo cargar comunicaciones pendientes: {(instanteComunicacionesCargadas - instanteParametrosProcesados).TotalSeconds}");

            if (comunicacionesPendientes.Any())
            {
                // Aplicación de la comunicación actual.
                Aplicacion aplicacionActual = null;
                // Cliente rest para enviar mensajes push.
                CloudPush cp           = null;
                bool      recordatorio = false;
                string    textoLog     = "Comunicación o recordatorio";

                // Enviar un push por cada comunicación
                foreach (Comunicacion c in comunicacionesPendientes)
                {
                    try
                    {
                        // Actualizar el cliente para push cuando cambia la aplicación
                        if (aplicacionActual == null || aplicacionActual.AplicacionID != c.Categoria.AplicacionID)
                        {
                            aplicacionActual = c.Categoria.Aplicacion;
                            cp = new CloudPush(aplicacionActual.CloudKey, aplicacionActual.Usuario, aplicacionActual.Clave);
                        }

                        if (cp != null)
                        {
                            // Si una comunicación de comunicacionesPendientes tiene ya marcado que se ha enviado el push
                            // de publicación, significa que tiene pendiente el envío de recordatorio.
                            recordatorio = c.PushEnviada;
                            textoLog     = recordatorio ? "Recordatorio" : "Comunicación";

                            string mensaje = c.Descripcion.Length > 50
                                ? c.Descripcion.Substring(0, 50) + "..."
                                : c.Descripcion;

                            Respuesta respuesta = cp.EnviarMensaje(
                                recordatorio ? c.RecordatorioTitulo : c.Titulo,
                                mensaje, true, canal, c.ComunicacionID.ToString());

                            if (respuesta.Meta.Code != 200)
                            {
                                // Loguear detalles en caso de error:
                                log.Info($"{textoLog}: {c.ComunicacionID} - El servidor devolvió un error al solicitar push: Código: {respuesta.Meta.Code} Estado: {respuesta.Meta.Status} Mensaje: {respuesta.Meta.Message} Método: {respuesta.Meta.Method_Name}.");
                                errores++;
                            }
                            else
                            {
                                // Actualizar comunicación y contadores en caso de que la notificación se haya enviado correctamente.
                                log.Info($"{textoLog}: {c.ComunicacionID} - Push OK");
                                if (recordatorio)
                                {
                                    c.PushRecordatorio = DateTime.Now;
                                    db.SaveChanges();
                                    pushRecordatorios++;
                                }
                                else
                                {
                                    c.PushEnviada = true;
                                    c.PushFecha   = DateTime.Now;
                                    db.SaveChanges();
                                    pushPublicaciones++;
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        errores++;
                        log.Error($"{textoLog}: {c.ComunicacionID} - Error al solicitar push", e);
                    }
                }
            }

            DateTime instanteComunicacionesEnviadas = DateTime.Now;

            log.Debug($"Tiempo enviar mensajes push: {(instanteComunicacionesEnviadas - instanteComunicacionesCargadas).TotalSeconds}");

            log.Info("Mensajes de publicación enviados: " + pushPublicaciones);
            log.Info("Recordatorios enviados: " + pushRecordatorios);
            log.Info("Errores de publicación: " + errores);
            log.Info($"Tiempo total: {(instanteComunicacionesEnviadas - inicio).TotalSeconds}");
            log.Info("FIN");
        }