Exemple #1
0
        /// <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));
        }
Exemple #2
0
        /// <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;
                    }
                }
            }
        }
Exemple #3
0
        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;
            }
        }