microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
next/core-claude-agents

Branches

Tags

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

Clone

HTTPS

Download ZIP

core/samples/CompatBot/EchoBot.cs

226lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using Microsoft.Bot.Builder;
5using Microsoft.Bot.Builder.Teams;
6using Microsoft.Bot.Schema;
7using Microsoft.Bot.Schema.Teams;
8using Microsoft.Teams.Bot.Compat;
9using Microsoft.Teams.Bot.Core;
10using Microsoft.Teams.Bot.Core.Schema;
11using Newtonsoft.Json;
12using Newtonsoft.Json.Linq;
13
14namespace CompatBot;
15
16public class ConversationData
17{
18 public int MessageCount { get; set; } = 0;
19
20}
21
22internal class EchoBot(BotApplication teamsBotApp, ConversationState conversationState, ILogger<EchoBot> logger)
23 : TeamsActivityHandler
24{
25 public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
26 {
27 await base.OnTurnAsync(turnContext, cancellationToken);
28
29 await conversationState.SaveChangesAsync(turnContext, false, cancellationToken);
30 }
31 protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
32 {
33 logger.LogInformation("OnMessage");
34 IStatePropertyAccessor<ConversationData> conversationStateAccessors = conversationState.CreateProperty<ConversationData>(nameof(ConversationData));
35 ConversationData conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData(), cancellationToken);
36
37 var mm = await CompatTeamsInfo.GetMemberAsync(turnContext, turnContext.Activity.From.Id);
38 string replyText = $"Echo {mm.Name} from BF Compat [{conversationData.MessageCount++}]: {turnContext.Activity.Text}";
39
40 var act = MessageFactory.Text(replyText, replyText);
41 act.Recipient = new ChannelAccount();
42 act.Recipient.Properties.Add("isTargeted", true);
43 await turnContext.SendActivityAsync(act, cancellationToken);
44
45
46 if (turnContext.Activity.Conversation.IsGroup == true)
47 {
48 var teamDetails = await CompatTeamsInfo.GetTeamDetailsAsync(turnContext, null, cancellationToken);
49 await turnContext.SendActivityAsync(JsonConvert.SerializeObject(teamDetails, Formatting.Indented));
50
51 TeamsPagedMembersResult pagedMembersResult;
52 List<TeamsChannelAccount> members = new List<TeamsChannelAccount>();
53 string continuationToken = null!;
54 do
55 {
56 pagedMembersResult = await CompatTeamsInfo.GetPagedMembersAsync(
57 turnContext,
58 5,
59 continuationToken,
60 cancellationToken
61 );
62
63
64 continuationToken = pagedMembersResult.ContinuationToken;
65 members.AddRange(pagedMembersResult.Members);
66 } while (continuationToken != null);
67
68 await turnContext.SendActivityAsync(JsonConvert.SerializeObject(members.Select(m => m.Name).ToList(), Formatting.Indented));
69 }
70
71
72
73
74 // await turnContext.SendActivityAsync(MessageFactory.Text($"Send a proactive message `/api/notify/{turnContext.Activity.Conversation.Id}`"), cancellationToken);
75
76 var incomingCoreActivity = ((Activity)turnContext.Activity).FromCompatActivity();
77 CoreActivity tm = CoreActivity.CreateBuilder()
78 .WithConversation(new Conversation { Id = incomingCoreActivity.Conversation?.Id! })
79 .WithProperty("text", "Hello TM !")
80 .WithRecipient(incomingCoreActivity.From, true)
81 .WithFrom(incomingCoreActivity.Recipient)
82 //.WithServiceUrl(activity.ServiceUrl!)
83 .WithServiceUrl("https://pilot1.botapi.skype.com/amer/9a9b49fd-1dc5-4217-88b3-ecf855e91b0e/")
84 .Build();
85
86 await teamsBotApp.ConversationClient.SendActivityAsync(tm, cancellationToken: cancellationToken);
87
88 var res = await turnContext.SendActivityAsync(
89 MessageFactory.Text("I'm going to add and remove reactions to this message."), cancellationToken);
90
91 await Task.Delay(500, cancellationToken);
92
93 await teamsBotApp.ConversationClient.AddReactionAsync(
94 turnContext.Activity.Conversation.Id,
95 res.Id,
96 "laugh",
97 new Uri("https://pilot1.botapi.skype.com/amer/9a9b49fd-1dc5-4217-88b3-ecf855e91b0e/"),
98 //incomingCoreActivity.ServiceUrl!,
99 AgenticIdentity.FromProperties(incomingCoreActivity.Recipient?.Properties),
100 null,
101 cancellationToken);
102
103 await Task.Delay(500, cancellationToken);
104 await teamsBotApp.ConversationClient.AddReactionAsync(
105 turnContext.Activity.Conversation.Id,
106 res.Id,
107 "sad",
108 incomingCoreActivity.ServiceUrl!,
109 AgenticIdentity.FromProperties(incomingCoreActivity.Recipient?.Properties),
110 null,
111 cancellationToken);
112
113 await Task.Delay(500, cancellationToken);
114
115 await teamsBotApp.ConversationClient.DeleteReactionAsync(
116 turnContext.Activity.Conversation.Id,
117 res.Id,
118 "laugh",
119 //new Uri("https://pilot1.botapi.skype.com/amer/9a9b49fd-1dc5-4217-88b3-ecf855e91b0e/"),
120 incomingCoreActivity.ServiceUrl!,
121 AgenticIdentity.FromProperties(incomingCoreActivity.Recipient?.Properties),
122 null,
123 cancellationToken);
124
125 Attachment attachment = new()
126 {
127 ContentType = "application/vnd.microsoft.card.adaptive",
128 Content = Cards.FeedbackCardObj
129 };
130 IMessageActivity attachmentReply = MessageFactory.Attachment(attachment);
131 await turnContext.SendActivityAsync(attachmentReply, cancellationToken);
132
133 }
134
135
136 protected override async Task OnMessageReactionActivityAsync(ITurnContext<IMessageReactionActivity> turnContext, CancellationToken cancellationToken)
137 {
138 await turnContext.SendActivityAsync(MessageFactory.Text("Message reaction received."), cancellationToken);
139 }
140
141 protected override async Task OnInstallationUpdateActivityAsync(ITurnContext<IInstallationUpdateActivity> turnContext, CancellationToken cancellationToken)
142 {
143 await turnContext.SendActivityAsync(MessageFactory.Text("Installation update received."), cancellationToken);
144 await turnContext.SendActivityAsync(MessageFactory.Text($"Send a proactive messages to `/api/notify/{turnContext.Activity.Conversation.Id}`"), cancellationToken);
145 }
146
147 protected override async Task OnInstallationUpdateAddAsync(ITurnContext<IInstallationUpdateActivity> turnContext, CancellationToken cancellationToken)
148 {
149 await turnContext.SendActivityAsync(MessageFactory.Text("Installation update Add received."), cancellationToken);
150 await turnContext.SendActivityAsync(MessageFactory.Text($"Send a proactive messages to `/api/notify/{turnContext.Activity.Conversation.Id}`"), cancellationToken);
151 }
152
153 protected override async Task<Microsoft.Bot.Builder.InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
154 {
155 logger.LogInformation("Invoke Activity received: {Name}", turnContext.Activity.Name);
156 JObject actionValue = JObject.FromObject(turnContext.Activity.Value);
157 JObject? action = actionValue["action"] as JObject;
158 JObject? actionData = action?["data"] as JObject;
159 string? userInput = actionData?["feedback"]?.ToString();
160 //var userInput = actionValue["userInput"]?.ToString();
161
162 logger.LogInformation("Action: {Action}, User Input: {UserInput}", action, userInput);
163
164
165
166 Attachment attachment = new()
167 {
168 ContentType = "application/vnd.microsoft.card.adaptive",
169 Content = Cards.ResponseCard(userInput)
170 };
171
172 IMessageActivity card = MessageFactory.Attachment(attachment);
173 await turnContext.SendActivityAsync(card, cancellationToken);
174
175 return new Microsoft.Bot.Builder.InvokeResponse
176 {
177 Status = 200,
178 Body = new { value = "invokes from compat bot" }
179 };
180 }
181
182 protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
183 {
184 await turnContext.SendActivityAsync(MessageFactory.Text("Welcome."), cancellationToken);
185 await turnContext.SendActivityAsync(MessageFactory.Text($"Send a proactive messages to `/api/notify/{turnContext.Activity.Conversation.Id}`"), cancellationToken);
186 }
187
188 protected override Task OnMembersRemovedAsync(IList<ChannelAccount> membersRemoved, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
189 {
190 return turnContext.SendActivityAsync(MessageFactory.Text("Bye."), cancellationToken);
191 }
192
193 protected override async Task OnTeamsMeetingStartAsync(MeetingStartEventDetails meeting, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
194 {
195 await turnContext.SendActivityAsync(MessageFactory.Text("Welcome to meeting: "), cancellationToken);
196 await turnContext.SendActivityAsync(MessageFactory.Text($"{meeting.Title} {meeting.MeetingType}"), cancellationToken);
197 }
198
199 private static async Task SendUpdateDeleteActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
200 {
201 ConversationReference cr = turnContext.Activity.GetConversationReference();
202 Activity reply = (Activity)Activity.CreateMessageActivity();
203 reply.ApplyConversationReference(cr, isIncoming: false);
204 reply.Text = "This is a proactive message sent using the Conversations API.";
205
206 ResourceResponse[] res = await turnContext.Adapter.SendActivitiesAsync(turnContext, [reply], cancellationToken);
207
208 await Task.Delay(2000, cancellationToken);
209
210 Activity updatedActivity = (Activity)Activity.CreateMessageActivity();
211 updatedActivity.ApplyConversationReference(cr, isIncoming: false);
212 updatedActivity.Id = res[0].Id;
213 updatedActivity.Text = "This message has been updated.";
214
215 await turnContext.Adapter.UpdateActivityAsync(turnContext, updatedActivity, cancellationToken);
216
217 await Task.Delay(2000, cancellationToken);
218
219 ConversationReference deleteReference = cr;
220 deleteReference.ActivityId = res[0].Id;
221 await turnContext.Adapter.DeleteActivityAsync(turnContext, deleteReference, cancellationToken);
222
223 await turnContext.SendActivityAsync(MessageFactory.Text("Proactive message sent and deleted."), cancellationToken);
224 }
225
226}
227