public static Activity MergeActivities(IList <Activity> activities) { return(ActivityMappingHelper.MergeActivities(activities)); }
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); }