// 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 });
}
}
}