// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; using Microsoft.Teams.Core.Schema; namespace Microsoft.Teams.Apps.Schema.Entities; /// /// Targeted message info entity extension methods. /// [Experimental("ExperimentalTeamsTargeted")] public static class TargetedMessageInfoEntityExtensions { /// /// Builds the inline placeholder element that pairs with a . /// private static readonly Regex QuotedPlaceholderRegex = new("", RegexOptions.Compiled); /// /// Gets the first targeted message info entity from the activity. /// public static TargetedMessageInfoEntity? GetTargetedMessageInfo(this TeamsActivity activity) { ArgumentNullException.ThrowIfNull(activity); if (activity.Entities == null) { return null; } return activity.Entities.FirstOrDefault(e => e is TargetedMessageInfoEntity) as TargetedMessageInfoEntity; } /// /// Adds targeted message info entity to a message and strips quote placeholders. /// Removes any existing quotedReply entities and their corresponding placeholder text. /// internal static void AddToActivity(TeamsActivity activity, string messageId) { ArgumentNullException.ThrowIfNull(activity); ArgumentException.ThrowIfNullOrWhiteSpace(messageId); // Remove any existing quotedReply entities to prevent conflicts with the new targeted message info entity. if (activity.Entities is not null) { for (int i = activity.Entities.Count - 1; i >= 0; i--) { if (activity.Entities[i].Type == "quotedReply") { activity.Entities.RemoveAt(i); } } } if (activity is MessageActivity message && message.Text is not null) { message.Text = QuotedPlaceholderRegex.Replace(message.Text, string.Empty).Trim(); } else if (activity.Properties.TryGetValue("text", out object? rawText) && rawText is string text) { activity.Properties["text"] = QuotedPlaceholderRegex.Replace(text, string.Empty).Trim(); } bool hasEntity = activity.Entities?.Any(e => e.Type == "targetedMessageInfo") ?? false; if (!hasEntity) { activity.Entities ??= []; activity.Entities.Add(new TargetedMessageInfoEntity { MessageId = messageId }); } } }