diff --git a/Libraries/Microsoft.Teams.Api/Activities/Activity.cs b/Libraries/Microsoft.Teams.Api/Activities/Activity.cs index 62bc3197..8ba5de3c 100644 --- a/Libraries/Microsoft.Teams.Api/Activities/Activity.cs +++ b/Libraries/Microsoft.Teams.Api/Activities/Activity.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using System.Text.Json.Serialization; @@ -146,6 +147,7 @@ public partial class Activity : IActivity public ChannelData? ChannelData { get; set; } [JsonIgnore] + [Experimental("TEAMS0002")] public bool IsTargeted { get; set; } [JsonExtensionData] @@ -226,13 +228,18 @@ public virtual Activity WithRelatesTo(ConversationReference value) public virtual Activity WithRecipient(Account value) { + #pragma warning disable TEAMS0002 return WithRecipient(value, false); + #pragma warning restore TEAMS0002 } + [Experimental("TEAMS0002")] public virtual Activity WithRecipient(Account value, bool isTargeted) { Recipient = value; + #pragma warning disable TEAMS0002 IsTargeted = isTargeted; + #pragma warning restore TEAMS0002 return this; } @@ -423,10 +430,12 @@ public Activity Merge(Activity from) LocalTimestamp ??= from.LocalTimestamp; AddEntity(from.Entities?.ToArray() ?? []); + #pragma warning disable TEAMS0002 if (from.IsTargeted) { IsTargeted = true; } + #pragma warning restore TEAMS0002 if (from.ChannelData is not null) { diff --git a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageActivity.cs b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageActivity.cs index 1aa915ec..0a62fc05 100644 --- a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageActivity.cs +++ b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageActivity.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; using Microsoft.Teams.Api.Entities; @@ -63,7 +64,7 @@ public class MessageActivity : Activity [JsonPropertyName("value")] [JsonPropertyOrder(43)] public object? Value { get; set; } - + [JsonIgnore] public bool IsRecipientMentioned { @@ -151,10 +152,13 @@ public override MessageActivity WithRecipient(Account value) return (MessageActivity)base.WithRecipient(value); } + [Experimental("TEAMS0002")] + #pragma warning disable TEAMS0002 public override MessageActivity WithRecipient(Account value, bool isTargeted = false) { return (MessageActivity)base.WithRecipient(value, isTargeted); } + #pragma warning restore TEAMS0002 public MessageActivity AddAttachment(params Attachment[] value) { diff --git a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs index e1d40bc3..5ea4fd4e 100644 --- a/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs +++ b/Libraries/Microsoft.Teams.Api/Activities/Message/MessageReactionActivity.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +#pragma warning disable TEAMS0001 + using System.Text.Json.Serialization; using Microsoft.Teams.Common; @@ -80,4 +82,5 @@ public MessageReactionActivity RemoveReaction(Messages.ReactionType type) ReactionsRemoved.Add(new() { Type = type }); return this; } -} \ No newline at end of file +} +#pragma warning restore TEAMS0001 \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs index 4963f629..ba94b1e8 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ActivityClient.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; using System.Text.Json; using Microsoft.Teams.Api.Activities; @@ -94,6 +95,7 @@ public async Task DeleteAsync(string conversationId, string id) /// The ID of the conversation /// The activity to create /// The created activity resource + [Experimental("TEAMS0002")] public async Task CreateTargetedAsync(string conversationId, IActivity activity) { var req = HttpRequest.Post( @@ -116,6 +118,7 @@ public async Task DeleteAsync(string conversationId, string id) /// The ID of the activity to update /// The updated activity data /// The updated activity resource + [Experimental("TEAMS0002")] public async Task UpdateTargetedAsync(string conversationId, string id, IActivity activity) { var req = HttpRequest.Put( @@ -136,6 +139,7 @@ public async Task DeleteAsync(string conversationId, string id) /// /// The ID of the conversation /// The ID of the activity to delete + [Experimental("TEAMS0002")] public async Task DeleteTargetedAsync(string conversationId, string id) { var req = HttpRequest.Delete( diff --git a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs index 3ec316aa..ded2079e 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ConversationClient.cs @@ -13,14 +13,18 @@ public class ConversationClient : Client public readonly string ServiceUrl; public readonly ActivityClient Activities; public readonly MemberClient Members; + #pragma warning disable TEAMS0001 public readonly ReactionClient Reactions; + #pragma warning restore TEAMS0001 public ConversationClient(string serviceUrl, CancellationToken cancellationToken = default) : base(cancellationToken) { ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + #pragma warning disable TEAMS0001 Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); + #pragma warning restore TEAMS0001 } public ConversationClient(string serviceUrl, IHttpClient client, CancellationToken cancellationToken = default) : base(client, cancellationToken) @@ -28,7 +32,9 @@ public ConversationClient(string serviceUrl, IHttpClient client, CancellationTok ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + #pragma warning disable TEAMS0001 Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); + #pragma warning restore TEAMS0001 } public ConversationClient(string serviceUrl, IHttpClientOptions options, CancellationToken cancellationToken = default) : base(options, cancellationToken) @@ -36,7 +42,9 @@ public ConversationClient(string serviceUrl, IHttpClientOptions options, Cancell ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + #pragma warning disable TEAMS0001 Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); + #pragma warning restore TEAMS0001 } public ConversationClient(string serviceUrl, IHttpClientFactory factory, CancellationToken cancellationToken = default) : base(factory, cancellationToken) @@ -44,7 +52,9 @@ public ConversationClient(string serviceUrl, IHttpClientFactory factory, Cancell ServiceUrl = serviceUrl; Activities = new ActivityClient(serviceUrl, _http, cancellationToken); Members = new MemberClient(serviceUrl, _http, cancellationToken); + #pragma warning disable TEAMS0001 Reactions = new ReactionClient(serviceUrl, _http, cancellationToken); + #pragma warning restore TEAMS0001 } public async Task CreateAsync(CreateRequest request) diff --git a/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs index 85ae72a2..f5901b3c 100644 --- a/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs +++ b/Libraries/Microsoft.Teams.Api/Clients/ReactionClient.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; + using Microsoft.Teams.Api.Messages; using Microsoft.Teams.Common.Http; @@ -9,6 +11,7 @@ namespace Microsoft.Teams.Api.Clients; /// /// Client for working with app message reactions for a given conversation/activity. /// +[Experimental("TEAMS0001")] public class ReactionClient : Client { public readonly string ServiceUrl; @@ -91,4 +94,4 @@ public async Task DeleteAsync( await _http.SendAsync(req, cancellationToken != default ? cancellationToken : _cancellationToken); } -} +} \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Messages/Message.cs b/Libraries/Microsoft.Teams.Api/Messages/Message.cs index 6e42c693..37a93e4e 100644 --- a/Libraries/Microsoft.Teams.Api/Messages/Message.cs +++ b/Libraries/Microsoft.Teams.Api/Messages/Message.cs @@ -130,5 +130,7 @@ public class Message /// [JsonPropertyName("reactions")] [JsonPropertyOrder(16)] + #pragma warning disable TEAMS0001 public IList? Reactions { get; set; } + #pragma warning restore TEAMS0001 } \ No newline at end of file diff --git a/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs b/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs index 974f0fd4..49603205 100644 --- a/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs +++ b/Libraries/Microsoft.Teams.Api/Messages/Reaction.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; using Microsoft.Teams.Common; @@ -10,6 +11,7 @@ namespace Microsoft.Teams.Api.Messages; /// /// The type of reaction given to the message. /// +[Experimental("TEAMS0001")] [JsonConverter(typeof(JsonConverter))] public class ReactionType(string value) : StringEnum(value) { @@ -53,6 +55,7 @@ public class ReactionType(string value) : StringEnum(value) /// /// Message Reaction /// +[Experimental("TEAMS0001")] public class Reaction { /// diff --git a/Libraries/Microsoft.Teams.Apps/App.cs b/Libraries/Microsoft.Teams.Apps/App.cs index 37b27a85..fefefc81 100644 --- a/Libraries/Microsoft.Teams.Apps/App.cs +++ b/Libraries/Microsoft.Teams.Apps/App.cs @@ -178,10 +178,12 @@ public async Task Send(string conversationId, T activity, ConversationType } // Validate targeted messages in proactive context + #pragma warning disable TEAMS0002 if (activity is MessageActivity messageActivity && messageActivity.IsTargeted == true && messageActivity.Recipient is null) { throw new InvalidOperationException("Targeted messages sent proactively must specify an explicit recipient ID. Use WithRecipient(new Account { Id = recipientId }, true) with an explicit recipient."); } + #pragma warning restore TEAMS0002 var reference = new ConversationReference() { diff --git a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs index 169ec146..9b497111 100644 --- a/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs +++ b/Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore/AspNetCorePlugin.cs @@ -93,6 +93,7 @@ public async Task Send(TActivity activity, Api.Conversatio // For targeted messages with an explicit Recipient (proactive sends), preserve it. // Otherwise, use the reference User from the conversation context. + #pragma warning disable TEAMS0002 var isTargetedWithRecipient = activity is MessageActivity msg && msg.IsTargeted == true && msg.Recipient is not null; if (!isTargetedWithRecipient) { @@ -125,6 +126,7 @@ await client var res = isTargeted ? await client.Conversations.Activities.CreateTargetedAsync(reference.Conversation.Id, activity) : await client.Conversations.Activities.CreateAsync(reference.Conversation.Id, activity); + #pragma warning restore TEAMS0002 activity.Id = res?.Id; return activity; diff --git a/Samples/Samples.Reactions/Samples.Reactions.csproj b/Samples/Samples.Reactions/Samples.Reactions.csproj index 682a8f9d..53be137f 100644 --- a/Samples/Samples.Reactions/Samples.Reactions.csproj +++ b/Samples/Samples.Reactions/Samples.Reactions.csproj @@ -4,6 +4,7 @@ net10.0 enable enable + $(NoWarn);TEAMS0001 diff --git a/Samples/Samples.TargetedMessages/Samples.TargetedMessages.csproj b/Samples/Samples.TargetedMessages/Samples.TargetedMessages.csproj index 1c291694..780f5cbf 100644 --- a/Samples/Samples.TargetedMessages/Samples.TargetedMessages.csproj +++ b/Samples/Samples.TargetedMessages/Samples.TargetedMessages.csproj @@ -4,6 +4,7 @@ net10.0 enable enable + $(NoWarn);TEAMS0002 diff --git a/Tests/Microsoft.Teams.Api.Tests/Microsoft.Teams.Api.Tests.csproj b/Tests/Microsoft.Teams.Api.Tests/Microsoft.Teams.Api.Tests.csproj index 1e02c98f..7936f5df 100644 --- a/Tests/Microsoft.Teams.Api.Tests/Microsoft.Teams.Api.Tests.csproj +++ b/Tests/Microsoft.Teams.Api.Tests/Microsoft.Teams.Api.Tests.csproj @@ -6,6 +6,7 @@ enable false latest + $(NoWarn);TEAMS0001;TEAMS0002 diff --git a/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj b/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj index 2da9ef9e..9010f1ce 100644 --- a/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj +++ b/Tests/Microsoft.Teams.Apps.Tests/Microsoft.Teams.Apps.Tests.csproj @@ -5,7 +5,7 @@ enable enable false - $(NoWarn);CS0618 + $(NoWarn);CS0618;TEAMS0001;TEAMS0002