public static Activity MergeActivities(IList <Activity> activities)
 {
     return(ActivityMappingHelper.MergeActivities(activities));
 }
Example #2
0
 public virtual Task <Activity> ProcessOutgoingActivitiesAsync(List <Activity> activities, ITurnContext turnContext)
 {
     return(Task.FromResult(ActivityMappingHelper.MergeActivities(activities)));
 }
        /// <summary>
        /// Concatenates activities into a single activity. Uses the last activity in the list as the base activity.
        /// If any of the activities being process contain an outer SSML speak tag within the value of the Speak property,
        /// these are removed from the individual activities and a <speak> tag is wrapped around the resulting
        /// concatenated string.  An SSML strong break tag is added between activity content. For more infomation
        /// about the supported SSML for Alexa see
        /// https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html#break
        /// </summary>
        /// <param name="activities">The list of one or more outgoing activities</param>
        /// <returns>MergedActivityResult</returns>
        public MergedActivityResult MergeActivities(IList <Activity> activities)
        {
            if (activities == null || activities.Count == 0)
            {
                return(null);
            }

            var  mergedActivityResult         = new MergedActivityResult();
            bool mergedActivityEndsWithPeriod = false;

            bool hasSpeakField = false;
            var  speakFields   = new List <string>();
            var  textFields    = new List <string>();
            var  attachments   = new List <Attachment>();
            var  endWithPeriod = activities.LastOrDefault(a => !string.IsNullOrEmpty(a.Text))?.Text?.TrimEnd().EndsWith(".") ?? false;

            foreach (var activity in activities)
            {
                if (activity == null)
                {
                    continue;
                }

                switch (activity.Type)
                {
                case ActivityTypes.Message:
                    mergedActivityResult.MergedActivity = activity;

                    if (!string.IsNullOrEmpty(activity.Speak))
                    {
                        hasSpeakField = true;
                        speakFields.Add(ActivityMappingHelper.StripSpeakTag(activity.Speak));
                    }
                    else if (!string.IsNullOrEmpty(activity.Text))
                    {
                        speakFields.Add(NormalizeActivityText(activity.TextFormat, activity.Text, forSsml: true));
                    }

                    if (!string.IsNullOrEmpty(activity.Text))
                    {
                        var text = NormalizeActivityText(activity.TextFormat, activity.Text, forSsml: false);
                        if (!string.IsNullOrEmpty(text))
                        {
                            mergedActivityEndsWithPeriod = activity.Text?.TrimEnd().EndsWith(".") ?? false;

                            textFields.Add(text.Trim(new char[] { ' ' }));
                        }
                    }

                    if (activity.Attachments != null && activity.Attachments.Count > 0)
                    {
                        attachments.AddRange(activity.Attachments);
                    }
                    break;

                case ActivityTypes.EndOfConversation:
                    mergedActivityResult.EndOfConversationFlagged = true;
                    break;
                }
            }

            if (mergedActivityResult.MergedActivity != null)
            {
                if (hasSpeakField)
                {
                    mergedActivityResult.MergedActivity.Speak = $"<speak>{string.Join("<break strength=\"strong\"/>", speakFields)}</speak>";
                }

                mergedActivityResult.MergedActivity.Text        = string.Join(" ", textFields);
                mergedActivityResult.MergedActivity.Attachments = attachments;

                if (mergedActivityResult.MergedActivity.Text.EndsWith(".") && !mergedActivityEndsWithPeriod)
                {
                    mergedActivityResult.MergedActivity.Text = mergedActivityResult.MergedActivity.Text.TrimEnd('.');
                }
            }

            return(mergedActivityResult);
        }