Пример #1
0
        public override void Send(Dictionary <string, string> mediumData, List <string> recipients, string appRoot, string themeRoot)
        {
            var message = new RockPushMessage();

            message.Title   = mediumData.GetValueOrNull("Title") ?? string.Empty;
            message.Message = mediumData.GetValueOrNull("Message") ?? string.Empty;
            message.Sound   = mediumData.GetValueOrNull("Sound") ?? string.Empty;
            message.SetRecipients(recipients);
            message.SendSeperatelyToEachRecipient = false;
            message.ThemeRoot = themeRoot;
            message.AppRoot   = appRoot;

            var errorMessages  = new List <string>();
            int mediumEntityId = EntityTypeCache.Get(Rock.SystemGuid.EntityType.COMMUNICATION_MEDIUM_PUSH_NOTIFICATION.AsGuid())?.Id ?? 0;

            Send(message, mediumEntityId, null, out errorMessages);
        }
Пример #2
0
        /// <summary>
        /// Pushes the message.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="to">To.</param>
        /// <param name="emailMessage">The email message.</param>
        /// <param name="mergeFields">The merge fields.</param>
        private void PushMessage(Sender sender, List <string> to, RockPushMessage emailMessage, Dictionary <string, object> mergeFields)
        {
            string title   = ResolveText(emailMessage.Title, emailMessage.CurrentPerson, emailMessage.EnabledLavaCommands, mergeFields, emailMessage.AppRoot, emailMessage.ThemeRoot);
            string sound   = ResolveText(emailMessage.Sound, emailMessage.CurrentPerson, emailMessage.EnabledLavaCommands, mergeFields, emailMessage.AppRoot, emailMessage.ThemeRoot);
            string message = ResolveText(emailMessage.Message, emailMessage.CurrentPerson, emailMessage.EnabledLavaCommands, mergeFields, emailMessage.AppRoot, emailMessage.ThemeRoot);

            var notification = new Message
            {
                RegistrationIds = to,
                Notification    = new FCM.Net.Notification
                {
                    Title = title,
                    Body  = message,
                    Sound = sound,
                }
            };

            Utility.AsyncHelpers.RunSync(() => sender.SendAsync(notification));
        }
Пример #3
0
        /// <summary>
        /// Pushes the message.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="to">To.</param>
        /// <param name="emailMessage">The email message.</param>
        /// <param name="mergeFields">The merge fields.</param>
        //private void PushMessage( Sender sender, List<string> to, RockPushMessage pushMessage, Dictionary<string, object> mergeFields )
        private void PushMessage(List <string> to, RockPushMessage pushMessage, Dictionary <string, object> mergeFields)
        {
            string          title      = ResolveText(pushMessage.Title, pushMessage.CurrentPerson, pushMessage.EnabledLavaCommands, mergeFields, pushMessage.AppRoot, pushMessage.ThemeRoot);
            string          sound      = ResolveText(pushMessage.Sound, pushMessage.CurrentPerson, pushMessage.EnabledLavaCommands, mergeFields, pushMessage.AppRoot, pushMessage.ThemeRoot);
            string          message    = ResolveText(pushMessage.Message, pushMessage.CurrentPerson, pushMessage.EnabledLavaCommands, mergeFields, pushMessage.AppRoot, pushMessage.ThemeRoot);
            string          appId      = GetAttributeValue("AppId");
            string          restApiKey = GetAttributeValue("RestAPIKey");
            OneSignalClient client     = new OneSignalClient(restApiKey);

            var options = new NotificationCreateOptions
            {
                AppId = new Guid(appId),
                IncludeExternalUserIds = to
            };

            options.Headings.Add(LanguageCodes.English, title);
            options.Contents.Add(LanguageCodes.English, message);
            client.Notifications.Create(options);
        }
Пример #4
0
        /// <summary>
        /// Executes the specified workflow.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();

            var mergeFields = GetMergeFields(action);
            var recipients  = new List <RockPushMessageRecipient>();

            string toValue = GetAttributeValue(action, "To");
            Guid   guid    = toValue.AsGuid();

            if (!guid.IsEmpty())
            {
                var attribute = AttributeCache.Get(guid, rockContext);
                if (attribute != null)
                {
                    string toAttributeValue = action.GetWorkflowAttributeValue(guid);
                    if (!string.IsNullOrWhiteSpace(toAttributeValue))
                    {
                        switch (attribute.FieldType.Class)
                        {
                        case "Rock.Field.Types.PersonFieldType":
                        {
                            Guid personAliasGuid = toAttributeValue.AsGuid();
                            if (!personAliasGuid.IsEmpty())
                            {
                                var           personAlias = new PersonAliasService(rockContext).Get(personAliasGuid);
                                List <string> devices     = new PersonalDeviceService(rockContext).Queryable()
                                                            .Where(a => a.PersonAliasId.HasValue && a.PersonAliasId == personAlias.Id && a.NotificationsEnabled)
                                                            .Select(a => a.DeviceRegistrationId)
                                                            .ToList();

                                string deviceIds = String.Join(",", devices);

                                if (devices.Count == 0)
                                {
                                    action.AddLogEntry("Invalid Recipient: Person does not have devices that support notifications", true);
                                }
                                else
                                {
                                    var person    = new PersonAliasService(rockContext).GetPerson(personAliasGuid);
                                    var recipient = new RockPushMessageRecipient(person, deviceIds, mergeFields);
                                    recipients.Add(recipient);
                                    if (person != null)
                                    {
                                        recipient.MergeFields.Add(recipient.PersonMergeFieldKey, person);
                                    }
                                }
                            }
                            break;
                        }

                        case "Rock.Field.Types.GroupFieldType":
                        case "Rock.Field.Types.SecurityRoleFieldType":
                        {
                            int? groupId   = toAttributeValue.AsIntegerOrNull();
                            Guid?groupGuid = toAttributeValue.AsGuidOrNull();
                            IQueryable <GroupMember> qry = null;

                            // Handle situations where the attribute value is the ID
                            if (groupId.HasValue)
                            {
                                qry = new GroupMemberService(rockContext).GetByGroupId(groupId.Value);
                            }

                            // Handle situations where the attribute value stored is the Guid
                            else if (groupGuid.HasValue)
                            {
                                qry = new GroupMemberService(rockContext).GetByGroupGuid(groupGuid.Value);
                            }
                            else
                            {
                                action.AddLogEntry("Invalid Recipient: No valid group id or Guid", true);
                            }

                            if (qry != null)
                            {
                                foreach (var person in qry
                                         .Where(m => m.GroupMemberStatus == GroupMemberStatus.Active)
                                         .Select(m => m.Person))
                                {
                                    List <string> devices = new PersonalDeviceService(rockContext).Queryable()
                                                            .Where(p => p.PersonAliasId.HasValue && p.PersonAliasId == person.PrimaryAliasId && p.NotificationsEnabled && !string.IsNullOrEmpty(p.DeviceRegistrationId))
                                                            .Select(p => p.DeviceRegistrationId)
                                                            .ToList();

                                    string deviceIds = String.Join(",", devices);

                                    if (deviceIds.AsBoolean())
                                    {
                                        var recipient = new RockPushMessageRecipient(person, deviceIds, mergeFields);
                                        recipients.Add(recipient);
                                        recipient.MergeFields.Add(recipient.PersonMergeFieldKey, person);
                                    }
                                }
                            }
                            break;
                        }
                        }
                    }
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(toValue))
                {
                    recipients.Add(RockPushMessageRecipient.CreateAnonymous(toValue.ResolveMergeFields(mergeFields), mergeFields));
                }
            }

            string message     = GetAttributeValue(action, "Message");
            Guid   messageGuid = message.AsGuid();

            if (!messageGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(messageGuid, rockContext);
                if (attribute != null)
                {
                    string messageAttributeValue = action.GetWorkflowAttributeValue(messageGuid);
                    if (!string.IsNullOrWhiteSpace(messageAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.TextFieldType")
                        {
                            message = messageAttributeValue;
                        }
                    }
                }
            }

            string title     = GetAttributeValue(action, "Title");
            Guid   titleGuid = title.AsGuid();

            if (!titleGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(titleGuid, rockContext);
                if (attribute != null)
                {
                    string titleAttributeValue = action.GetWorkflowAttributeValue(titleGuid);
                    if (!string.IsNullOrWhiteSpace(titleAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.TextFieldType")
                        {
                            title = titleAttributeValue;
                        }
                    }
                }
            }

            string sound     = GetAttributeValue(action, "Sound");
            Guid   soundGuid = sound.AsGuid();

            if (!soundGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(soundGuid, rockContext);
                if (attribute != null)
                {
                    string soundAttributeValue = action.GetWorkflowAttributeValue(soundGuid);
                    if (!string.IsNullOrWhiteSpace(soundAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.BooleanFieldType")
                        {
                            sound = soundAttributeValue;
                        }
                    }
                }
            }
            sound = sound.AsBoolean() ? "default" : "";

            if (recipients.Any() && !string.IsNullOrWhiteSpace(message))
            {
                var pushMessage = new RockPushMessage();
                pushMessage.SetRecipients(recipients);
                pushMessage.Title   = title;
                pushMessage.Message = message;
                pushMessage.Sound   = sound;
                pushMessage.Send();
            }

            return(true);
        }
        /// <summary>
        /// Sends the meeting reminders.
        /// </summary>
        /// <param name="context">The overall job context.</param>
        /// <param name="rockContext">The rockContext.</param>
        /// <param name="occurrenceData">The occurrenceData to process.</param>
        /// <param name="systemCommunication">The system communication.</param>
        /// <param name="jobPreferredCommunicationType">Type of the job preferred communication.</param>
        /// <returns></returns>
        private SendMessageResult SendMeetingReminders(IJobExecutionContext context,
                                                       RockContext rockContext,
                                                       Dictionary <RoomOccurrence, Group> occurrenceData,
                                                       SystemCommunication systemCommunication,
                                                       CommunicationType jobPreferredCommunicationType,
                                                       bool isSmsEnabled,
                                                       bool isPushEnabled)
        {
            var result      = new SendMessageResult();
            var errorsEmail = new List <string>();
            var errorsSms   = new List <string>();
            var errorsPush  = new List <string>();

            // Loop through the room occurrence data
            foreach (var occurrence in occurrenceData)
            {
                var             emailMessage = new RockEmailMessage(systemCommunication);
                RockSMSMessage  smsMessage   = isSmsEnabled ? new RockSMSMessage(systemCommunication) : null;
                RockPushMessage pushMessage  = isPushEnabled ? new RockPushMessage(systemCommunication) : null;
                var             group        = occurrence.Value;
                foreach (var groupMember in group.ActiveMembers().ToList())
                {
                    groupMember.Person.LoadAttributes();
                    var           smsNumber   = groupMember.Person.PhoneNumbers.GetFirstSmsNumber();
                    var           personAlias = new PersonAliasService(rockContext).Get(groupMember.Person.PrimaryAliasId.Value);
                    List <string> pushDevices = new PersonalDeviceService(rockContext).Queryable()
                                                .Where(a => a.PersonAliasId.HasValue && a.PersonAliasId == personAlias.Id && a.NotificationsEnabled)
                                                .Select(a => a.DeviceRegistrationId)
                                                .ToList();
                    if (!groupMember.Person.CanReceiveEmail(false) && smsNumber.IsNullOrWhiteSpace() && pushDevices.Count == 0)
                    {
                        continue;
                    }
                    var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(null, groupMember.Person);
                    mergeFields.Add("Group", group);
                    mergeFields.Add("Occurrence", occurrence.Key);
                    mergeFields.Add("Person", groupMember.Person);

                    var notificationType = ( CommunicationType )Communication.DetermineMediumEntityTypeId(
                        ( int )CommunicationType.Email,
                        ( int )CommunicationType.SMS,
                        ( int )CommunicationType.PushNotification,
                        jobPreferredCommunicationType,
                        groupMember.CommunicationPreference,
                        groupMember.Person.CommunicationPreference);

                    switch (notificationType)
                    {
                    case CommunicationType.Email:
                        if (!groupMember.Person.CanReceiveEmail(false))
                        {
                            errorCount += 1;
                            errorMessages.Add(string.Format("{0} does not have a valid email address.", groupMember.Person.FullName));
                        }
                        else
                        {
                            emailMessage.AddRecipient(new RockEmailMessageRecipient(groupMember.Person, mergeFields));
                        }
                        break;

                    case CommunicationType.SMS:
                        if (string.IsNullOrWhiteSpace(smsNumber) || smsMessage == null)
                        {
                            errorCount += 1;
                            errorMessages.Add(string.Format("No SMS number could be found for {0}.", groupMember.Person.FullName));
                            goto case CommunicationType.Email;
                        }
                        else
                        {
                            smsMessage.AddRecipient(new RockSMSMessageRecipient(groupMember.Person, smsNumber, mergeFields));
                        }
                        break;

                    case CommunicationType.PushNotification:
                        if (pushDevices.Count == 0 || pushMessage == null)
                        {
                            errorCount += 1;
                            errorMessages.Add(string.Format("No devices that support notifications could be found for {0}.", groupMember.Person.FullName));
                            goto case CommunicationType.Email;
                        }
                        else
                        {
                            string deviceIds = String.Join(",", pushDevices);
                            pushMessage.AddRecipient(new RockPushMessageRecipient(groupMember.Person, deviceIds, mergeFields));
                        }
                        break;

                    default:
                        break;
                    }
                }

                if (emailMessage.GetRecipients().Count > 0)
                {
                    emailMessage.Send(out errorsEmail);
                    if (errorsEmail.Any())
                    {
                        result.Errors.AddRange(errorsEmail);
                    }
                    else
                    {
                        notificationEmails++;
                    }
                }
                if (smsMessage != null && smsMessage.GetRecipients().Count > 0)
                {
                    smsMessage.Send(out errorsSms);
                    if (errorsSms.Any())
                    {
                        result.Errors.AddRange(errorsSms);
                    }
                    else
                    {
                        notificationSms++;
                    }
                }
                if (pushMessage != null && pushMessage.GetRecipients().Count > 0)
                {
                    pushMessage.Send(out errorsPush);
                    if (errorsPush.Any())
                    {
                        result.Errors.AddRange(errorsPush);
                    }
                    else
                    {
                        notificationPush++;
                    }
                }
            }
            if (errorMessages.Any())
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine();
                sb.Append(string.Format("{0} Errors: ", errorCount));
                errorMessages.ForEach(e => { sb.AppendLine(); sb.Append(e); });
                string errors = sb.ToString();
                context.Result += errors;
                var         exception = new Exception(errors);
                HttpContext context2  = HttpContext.Current;
                ExceptionLogService.LogException(exception, context2);
                throw exception;
            }

            return(result);
        }
Пример #6
0
        /// <summary>
        /// Executes the specified workflow.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();

            var mergeFields = GetMergeFields(action);
            var recipients  = new List <RockPushMessageRecipient>();

            string toValue = GetAttributeValue(action, "To");
            Guid   guid    = toValue.AsGuid();

            if (!guid.IsEmpty())
            {
                var attribute = AttributeCache.Get(guid, rockContext);
                if (attribute != null)
                {
                    string toAttributeValue = action.GetWorkflowAttributeValue(guid);
                    if (!string.IsNullOrWhiteSpace(toAttributeValue))
                    {
                        switch (attribute.FieldType.Class)
                        {
                        case "Rock.Field.Types.PersonFieldType":
                        {
                            Guid personAliasGuid = toAttributeValue.AsGuid();
                            if (!personAliasGuid.IsEmpty())
                            {
                                var           personAlias = new PersonAliasService(rockContext).Get(personAliasGuid);
                                List <string> devices     = new PersonalDeviceService(rockContext).Queryable()
                                                            .Where(a => a.PersonAliasId.HasValue && a.PersonAliasId == personAlias.Id && a.IsActive && a.NotificationsEnabled)
                                                            .Select(a => a.DeviceRegistrationId)
                                                            .ToList();

                                string deviceIds = String.Join(",", devices);

                                if (devices.Count == 0)
                                {
                                    action.AddLogEntry("Invalid Recipient: Person does not have devices that support notifications", true);
                                }
                                else
                                {
                                    var person    = new PersonAliasService(rockContext).GetPerson(personAliasGuid);
                                    var recipient = new RockPushMessageRecipient(person, deviceIds, mergeFields);
                                    recipients.Add(recipient);
                                    if (person != null)
                                    {
                                        recipient.MergeFields.Add(recipient.PersonMergeFieldKey, person);
                                    }
                                }
                            }
                            break;
                        }

                        case "Rock.Field.Types.GroupFieldType":
                        case "Rock.Field.Types.SecurityRoleFieldType":
                        {
                            int? groupId   = toAttributeValue.AsIntegerOrNull();
                            Guid?groupGuid = toAttributeValue.AsGuidOrNull();
                            IQueryable <GroupMember> qry = null;

                            // Handle situations where the attribute value is the ID
                            if (groupId.HasValue)
                            {
                                qry = new GroupMemberService(rockContext).GetByGroupId(groupId.Value);
                            }

                            // Handle situations where the attribute value stored is the Guid
                            else if (groupGuid.HasValue)
                            {
                                qry = new GroupMemberService(rockContext).GetByGroupGuid(groupGuid.Value);
                            }
                            else
                            {
                                action.AddLogEntry("Invalid Recipient: No valid group id or Guid", true);
                            }

                            if (qry != null)
                            {
                                foreach (var person in qry
                                         .Where(m => m.GroupMemberStatus == GroupMemberStatus.Active)
                                         .Select(m => m.Person))
                                {
                                    List <string> devices = new PersonalDeviceService(rockContext).Queryable()
                                                            .Where(p => p.PersonAliasId.HasValue && p.PersonAliasId == person.PrimaryAliasId && p.IsActive && p.NotificationsEnabled && !string.IsNullOrEmpty(p.DeviceRegistrationId))
                                                            .Select(p => p.DeviceRegistrationId)
                                                            .ToList();

                                    string deviceIds = String.Join(",", devices);

                                    if (deviceIds.IsNotNullOrWhiteSpace())
                                    {
                                        var recipient = new RockPushMessageRecipient(person, deviceIds, mergeFields);
                                        recipients.Add(recipient);
                                        recipient.MergeFields.Add(recipient.PersonMergeFieldKey, person);
                                    }
                                }
                            }
                            break;
                        }
                        }
                    }
                }
            }
            else
            {
                if (!string.IsNullOrWhiteSpace(toValue))
                {
                    recipients.Add(RockPushMessageRecipient.CreateAnonymous(toValue.ResolveMergeFields(mergeFields), mergeFields));
                }
            }

            string message     = GetAttributeValue(action, "Message");
            Guid   messageGuid = message.AsGuid();

            if (!messageGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(messageGuid, rockContext);
                if (attribute != null)
                {
                    string messageAttributeValue = action.GetWorkflowAttributeValue(messageGuid);
                    if (!string.IsNullOrWhiteSpace(messageAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.TextFieldType")
                        {
                            message = messageAttributeValue;
                        }
                    }
                }
            }

            string title     = GetAttributeValue(action, "Title");
            Guid   titleGuid = title.AsGuid();

            if (!titleGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(titleGuid, rockContext);
                if (attribute != null)
                {
                    string titleAttributeValue = action.GetWorkflowAttributeValue(titleGuid);
                    if (!string.IsNullOrWhiteSpace(titleAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.TextFieldType")
                        {
                            title = titleAttributeValue;
                        }
                    }
                }
            }

            string sound     = GetAttributeValue(action, "Sound");
            Guid   soundGuid = sound.AsGuid();

            if (!soundGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(soundGuid, rockContext);
                if (attribute != null)
                {
                    string soundAttributeValue = action.GetWorkflowAttributeValue(soundGuid);
                    if (!string.IsNullOrWhiteSpace(soundAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.BooleanFieldType")
                        {
                            sound = soundAttributeValue;
                        }
                    }
                }
            }
            sound = sound.AsBoolean() ? "default" : "";

            string url     = GetAttributeValue(action, "Url");
            Guid   urlGuid = url.AsGuid();

            if (!urlGuid.IsEmpty())
            {
                var attribute = AttributeCache.Get(urlGuid, rockContext);
                if (attribute != null)
                {
                    string urlAttributeValue = action.GetWorkflowAttributeValue(urlGuid);
                    if (!string.IsNullOrWhiteSpace(urlAttributeValue))
                    {
                        if (attribute.FieldType.Class == "Rock.Field.Types.TextFieldType")
                        {
                            url = urlAttributeValue;
                        }
                    }
                }
            }

            if (recipients.Any() && !string.IsNullOrWhiteSpace(message))
            {
                var pushMessage = new RockPushMessage();
                pushMessage.SetRecipients(recipients);
                pushMessage.Title      = title;
                pushMessage.Message    = message;
                pushMessage.Sound      = sound;
                pushMessage.OpenAction = url.IsNotNullOrWhiteSpace() ? Utility.PushOpenAction.LinkToUrl : Utility.PushOpenAction.NoAction;
                pushMessage.Data       = new PushData
                {
                    Url = url
                };

                // Check if the URL is a mobile app style URL, which is "<guid>[?key=value]".
                if (url.Length >= 36 && Guid.TryParse(url.Substring(0, 36), out var pageGuid))
                {
                    var pageId = PageCache.Get(pageGuid)?.Id;

                    if (pageId.HasValue)
                    {
                        pushMessage.Data.MobilePageId = pageId.Value;

                        // Check if there are any query string values.
                        if (url.Length >= 38 && url[36] == '?')
                        {
                            var queryString = url.Substring(37).ParseQueryString();

                            pushMessage.Data.MobilePageQueryString = new Dictionary <string, string>();

                            foreach (string key in queryString.Keys)
                            {
                                pushMessage.Data.MobilePageQueryString.AddOrReplace(key, queryString[key].ToString());
                            }
                        }

                        pushMessage.OpenAction = Utility.PushOpenAction.LinkToMobilePage;
                    }
                }

                pushMessage.Send(out errorMessages);
            }

            return(true);
        }