/// <summary> /// Handle an invoke activity. /// </summary> private async Task <HttpResponseMessage> HandleInvokeActivity(Activity activity) { var activityValue = activity.Value.ToString(); switch (activity.Name) { case "signin/verifyState": await Conversation.SendAsync(activity, () => new RootDialog()); break; case "composeExtension/query": // Handle fetching task module content using (var connector = new ConnectorClient(new Uri(activity.ServiceUrl))) { var channelData = activity.GetChannelData <TeamsChannelData>(); var tid = channelData.Tenant.Id; string currentUser = await RootDialog.GetCurrentUserEmailId(activity); if (currentUser == null) { return(new HttpResponseMessage(HttpStatusCode.OK)); } var response = await MessageExtension.HandleMessageExtensionQuery(connector, activity, tid, currentUser); return(response != null ? Request.CreateResponse(response) : new HttpResponseMessage(HttpStatusCode.OK)); } case "task/fetch": // Handle fetching task module content return(await HandleTaskModuleFetchRequest(activity, activityValue)); case "task/submit": // Handle submission of task module info // Run this on a task so that new Task(async() => { var action = JsonConvert.DeserializeObject <TaskModule.BotFrameworkCardValue <ActionDetails> >(activityValue); activity.Name = action.Data.ActionType; await Conversation.SendAsync(activity, () => new RootDialog()); }).Start(); await Task.Delay(TimeSpan.FromSeconds(2)); // Give it some time to start showing output. break; } return(new HttpResponseMessage(HttpStatusCode.Accepted)); }
/// <summary> /// Handle messageReaction events, which indicate user liked/unliked a message sent by the bot. /// </summary> private static async Task HandleReactions(Activity message) { if (message.ReactionsAdded != null || message.ReactionsRemoved != null) { // Determine if likes were net added or removed var reactionToAdd = message.ReactionsAdded != null ? 1 : -1; var channelData = message.GetChannelData <TeamsChannelData>(); var replyToId = message.ReplyToId; if (channelData.Team != null) { replyToId = message.Conversation.Id; } // Look for the announcement that was liked/unliked, and update the reaction count on that announcement var tenant = await Cache.Tenants.GetItemAsync(channelData.Tenant.Id); bool messageFound = false; foreach (var announcementId in tenant.Announcements) { var announcement = await Cache.Announcements.GetItemAsync(announcementId); if (announcement?.Recipients == null) { continue; } if (channelData.Team == null) { foreach (var group in announcement.Recipients.Groups) { var user = group.Users.FirstOrDefault(u => u.MessageId == replyToId); if (user != null) { messageFound = true; user.LikeCount = reactionToAdd == 1 ? 1 : 0; } } } if (!messageFound && channelData.Team != null) { foreach (var channel in announcement.Recipients.Channels) { if (channel.Channel.MessageId == replyToId) { var EmailId = await RootDialog.GetCurrentUserEmailId(message); if (message.ReactionsAdded != null && message.ReactionsAdded.Count != 0) { if (!channel.LikedUsers.Contains(EmailId)) { channel.LikedUsers.Add(EmailId); } } else if (message.ReactionsRemoved != null) { if (channel.LikedUsers.Contains(EmailId)) { channel.LikedUsers.Remove(EmailId); } } messageFound = true; break; } } } if (messageFound) { await Cache.Announcements.AddOrUpdateItemAsync(announcement.Id, announcement); break; } } } }
private static async Task HandleConversationUpdate(Activity message) { ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl)); var channelData = message.GetChannelData <TeamsChannelData>(); // Ensure that we have an entry for this tenant in the database var tenant = await Common.CheckAndAddTenantDetails(channelData.Tenant.Id); // Treat 1:1 add/remove events as if they were add/remove of a team member if (channelData.EventType == null) { if (message.MembersAdded != null) { channelData.EventType = "teamMemberAdded"; } if (message.MembersRemoved != null) { channelData.EventType = "teamMemberRemoved"; } } switch (channelData.EventType) { case "teamMemberAdded": // Team member was added (user or bot) if (message.MembersAdded.Any(m => m.Id.Contains(message.Recipient.Id))) { if (channelData.Team == null) { if (message.From.Id == message.Recipient.Id) { return; } var userEmailId = await RootDialog.GetCurrentUserEmailId(message); var userFromDB = await Cache.Users.GetItemAsync(userEmailId); if (userFromDB != null) { return; } } // Bot was added to a team: send welcome message message.Text = Constants.ShowWelcomeScreen; await Conversation.SendAsync(message, () => new RootDialog()); await AddTeamDetails(message, channelData, tenant); } else { // Member was added to a team: update the team member count await UpdateTeamCount(message, channelData, tenant); } break; case "teamMemberRemoved": // Add team & channel details if (message.MembersRemoved.Any(m => m.Id.Contains(message.Recipient.Id))) { // Bot was removed from a team: remove entry for the team in the database await RemoveTeamDetails(channelData, tenant); } else { // Member was removed from a team: update the team member count await UpdateTeamCount(message, channelData, tenant); } break; // Update the team and channel info in the database when the team is rename or when channel are added/removed/renamed case "teamRenamed": // Rename team & channel details await RenameTeam(channelData, tenant); break; case "channelCreated": await AddNewChannelDetails(channelData, tenant); break; case "channelRenamed": await RenameChannel(channelData, tenant); break; case "channelDeleted": await DeleteChannel(channelData, tenant); break; default: break; } }