microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
spike/sso-state-otel

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Libraries/Microsoft.Teams.Apps/Contexts/Context.Send.cs

168lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4using System.Diagnostics.CodeAnalysis;
5
6using Microsoft.Teams.Api.Activities;
7
8namespace Microsoft.Teams.Apps;
9
10public partial interface IContext<TActivity>
11{
12 /// <summary>
13 /// send an activity in the current conversation without quoting.
14 /// In channels, sends to the current thread. In scopes that do not
15 /// support threading (group chat, meetings), sends as a normal message.
16 /// To send with a visual quote of the inbound message, use <see cref="Reply{T}(T, CancellationToken)"/>.
17 /// </summary>
18 /// <param name="activity">activity activity to send</param>
19 /// <param name="cancellationToken">optional cancellation token</param>
20 public Task<T> Send<T>(T activity, CancellationToken cancellationToken = default) where T : IActivity;
21
22 /// <summary>
23 /// send a message activity to the conversation
24 /// </summary>
25 /// <param name="text">the text to send</param>
26 /// <param name="cancellationToken">optional cancellation token</param>
27 public Task<MessageActivity> Send(string text, CancellationToken cancellationToken = default);
28
29 /// <summary>
30 /// send a message activity with a card attachment
31 /// </summary>
32 /// <param name="card">the card to send as an attachment</param>
33 /// <param name="cancellationToken">optional cancellation token</param>
34 public Task<MessageActivity> Send(Cards.AdaptiveCard card, CancellationToken cancellationToken = default);
35
36 /// <summary>
37 /// send an activity in the current conversation with a visual quote
38 /// of the inbound message. In channels, sends to the current thread
39 /// with a quoted reply. In other scopes, sends with a quoted reply.
40 /// To send without quoting, use <see cref="Send{T}(T, CancellationToken)"/>.
41 /// </summary>
42 /// <param name="activity">activity to send</param>
43 /// <param name="cancellationToken">optional cancellation token</param>
44 public Task<T> Reply<T>(T activity, CancellationToken cancellationToken = default) where T : IActivity;
45
46 /// <summary>
47 /// send a message activity to the conversation as a reply, automatically quoting the inbound message
48 /// </summary>
49 /// <param name="text">the text to send</param>
50 /// <param name="cancellationToken">optional cancellation token</param>
51 public Task<MessageActivity> Reply(string text, CancellationToken cancellationToken = default);
52
53 /// <summary>
54 /// send a message activity with a card attachment as a reply, automatically quoting the inbound message
55 /// </summary>
56 /// <param name="card">the card to send as an attachment</param>
57 /// <param name="cancellationToken">optional cancellation token</param>
58 public Task<MessageActivity> Reply(Cards.AdaptiveCard card, CancellationToken cancellationToken = default);
59
60 /// <summary>
61 /// Send a message to the conversation with a quoted message reference prepended to the text.
62 /// Teams renders the quoted message as a preview bubble above the response text.
63 /// </summary>
64 /// <param name="messageId">the ID of the message to quote</param>
65 /// <param name="activity">the activity to send — a quote placeholder for messageId will be prepended to its text</param>
66 /// <param name="cancellationToken">optional cancellation token</param>
67 [Experimental("ExperimentalTeamsQuotedReplies")]
68 public Task<T> Quote<T>(string messageId, T activity, CancellationToken cancellationToken = default) where T : IActivity;
69
70 /// <summary>
71 /// Send a message to the conversation with a quoted message reference prepended to the text.
72 /// Teams renders the quoted message as a preview bubble above the response text.
73 /// </summary>
74 /// <param name="messageId">the ID of the message to quote</param>
75 /// <param name="text">the response text, appended to the quoted message placeholder</param>
76 /// <param name="cancellationToken">optional cancellation token</param>
77 [Experimental("ExperimentalTeamsQuotedReplies")]
78 public Task<MessageActivity> Quote(string messageId, string text, CancellationToken cancellationToken = default);
79
80 /// <summary>
81 /// send a typing activity
82 /// </summary>
83 /// <param name="text">optional text to include</param>
84 /// <param name="cancellationToken">optional cancellation token</param>
85 public Task<TypingActivity> Typing(string? text = null, CancellationToken cancellationToken = default);
86}
87
88public partial class Context<TActivity> : IContext<TActivity>
89{
90 public async Task<T> Send<T>(T activity, CancellationToken cancellationToken = default) where T : IActivity
91 {
92 // Auto-populate targetedMessageInfo entity for prompt preview
93 // when the incoming activity was a targeted message (reactive flow).
94 #pragma warning disable ExperimentalTeamsTargeted
95 if (activity is MessageActivity messageActivity && Activity.Recipient?.IsTargeted == true && Activity.Id is not null)
96 {
97 messageActivity.AddTargetedMessageInfo(Activity.Id);
98 }
99 #pragma warning restore ExperimentalTeamsTargeted
100
101 var res = await Sender.Send(activity, Ref, cancellationToken);
102 await OnActivitySent(res, ToActivityType<IActivity>());
103 return res;
104 }
105
106 public Task<MessageActivity> Send(string text, CancellationToken cancellationToken = default)
107 {
108 return Send(new MessageActivity(text), cancellationToken);
109 }
110
111 public Task<MessageActivity> Send(Cards.AdaptiveCard card, CancellationToken cancellationToken = default)
112 {
113 return Send(new MessageActivity().AddAttachment(card), cancellationToken);
114 }
115
116#pragma warning disable ExperimentalTeamsQuotedReplies
117 public Task<T> Reply<T>(T activity, CancellationToken cancellationToken = default) where T : IActivity
118 {
119 if (Activity.Id != null)
120 {
121 return Quote(Activity.Id, activity, cancellationToken);
122 }
123
124 return Send(activity, cancellationToken);
125 }
126#pragma warning restore ExperimentalTeamsQuotedReplies
127
128 public Task<MessageActivity> Reply(string text, CancellationToken cancellationToken = default)
129 {
130 return Reply(new MessageActivity(text), cancellationToken);
131 }
132
133 public Task<MessageActivity> Reply(Cards.AdaptiveCard card, CancellationToken cancellationToken = default)
134 {
135 return Reply(new MessageActivity().AddAttachment(card), cancellationToken);
136 }
137
138 [Experimental("ExperimentalTeamsQuotedReplies")]
139#pragma warning disable ExperimentalTeamsQuotedReplies
140 public Task<T> Quote<T>(string messageId, T activity, CancellationToken cancellationToken = default) where T : IActivity
141 {
142 if (activity is MessageActivity message)
143 {
144 message.PrependQuote(messageId);
145 }
146
147 return Send(activity, cancellationToken);
148 }
149#pragma warning restore ExperimentalTeamsQuotedReplies
150
151 [Experimental("ExperimentalTeamsQuotedReplies")]
152 public Task<MessageActivity> Quote(string messageId, string text, CancellationToken cancellationToken = default)
153 {
154 return Quote(messageId, new MessageActivity(text), cancellationToken);
155 }
156
157 public Task<TypingActivity> Typing(string? text = null, CancellationToken cancellationToken = default)
158 {
159 var activity = new TypingActivity();
160
161 if (text is not null)
162 {
163 activity.Text = text;
164 }
165
166 return Send(activity, cancellationToken);
167 }
168}