/// <summary>
        /// Send the nomination reminder notification to specified team.
        /// </summary>
        /// <param name="rewardCycleEntity">Reward cycle model object.</param>
        /// <returns>A task that sends notification card in channel.</returns>
        private async Task SendCardToTeamAsync(RewardCycleEntity rewardCycleEntity)
        {
            rewardCycleEntity = rewardCycleEntity ?? throw new ArgumentNullException(nameof(rewardCycleEntity));

            var awardsList = await this.awardsStorageProvider.GetAwardsAsync(rewardCycleEntity.TeamId);

            var valuesFromTaskModule = new TaskModuleResponseDetails()
            {
                RewardCycleStartDate = rewardCycleEntity.RewardCycleStartDate,
                RewardCycleEndDate   = rewardCycleEntity.RewardCycleEndDate,
                RewardCycleId        = rewardCycleEntity.CycleId,
            };

            var teamDetails = await this.teamStorageProvider.GetTeamDetailAsync(rewardCycleEntity.TeamId);

            string serviceUrl = teamDetails.ServiceUrl;

            MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);
            string teamGeneralChannelId = rewardCycleEntity.TeamId;

            this.logger.LogInformation($"sending notification to channel id - {teamGeneralChannelId}");

            await retryPolicy.ExecuteAsync(async() =>
            {
                try
                {
                    var conversationParameters = new ConversationParameters()
                    {
                        ChannelData = new TeamsChannelData()
                        {
                            Channel = new ChannelInfo()
                            {
                                Id = rewardCycleEntity.TeamId
                            }
                        },
                        Activity = (Activity)MessageFactory.Carousel(NominateCarouselCard.GetAwardNominationCards(this.options.Value.AppBaseUri, awardsList, this.localizer, valuesFromTaskModule)),
                    };

                    Activity mentionActivity = MessageFactory.Text(this.localizer.GetString("NominationReminderNotificationText"));

                    await((BotFrameworkAdapter)this.adapter).CreateConversationAsync(
                        Constants.TeamsBotFrameworkChannelId,
                        serviceUrl,
                        this.microsoftAppCredentials,
                        conversationParameters,
                        async(conversationTurnContext, conversationCancellationToken) =>
                    {
                        await conversationTurnContext.SendActivityAsync(mentionActivity, conversationCancellationToken);
                    },
                        default);
                }
                catch (Exception ex)
                {
                    this.logger.LogError(ex, "Error while sending mention card notification to channel.");
                    throw;
                }
            });
        }
Пример #2
0
        /// <summary>
        /// When OnTurn method receives a submit invoke activity on bot turn, it calls this method.
        /// </summary>
        /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param>
        /// <param name="taskModuleRequest">Task module invoke request value payload.</param>
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        /// <returns>A task that represents a task module response.</returns>
        protected override async Task <TaskModuleResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext <IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
        {
            try
            {
                turnContext = turnContext ?? throw new ArgumentNullException(nameof(turnContext));

                var activity = (Activity)turnContext.Activity;
                this.RecordEvent(nameof(this.OnTeamsTaskModuleFetchAsync), turnContext);
                IMessageActivity notificationCard;
                Activity         mentionActivity;
                var valuesfromTaskModule = JsonConvert.DeserializeObject <TaskModuleResponseDetails>(((JObject)activity.Value).GetValue("data", StringComparison.OrdinalIgnoreCase)?.ToString());
                switch (valuesfromTaskModule.Command.ToUpperInvariant())
                {
                case Constants.SaveAdminDetailsAction:
                    mentionActivity = await CardHelper.GetMentionActivityAsync(valuesfromTaskModule.AdminPrincipalName.Split(",").ToList(), turnContext.Activity.From.AadObjectId, valuesfromTaskModule.TeamId, turnContext, this.localizer, this.logger, MentionActivityType.SetAdmin, cancellationToken);

                    var cardDetail = (Activity)MessageFactory.Attachment(AdminCard.GetAdminCard(this.localizer, valuesfromTaskModule, this.options.Value.ManifestId));
                    await this.SendMentionedCardAsync(turnContext, cardDetail, mentionActivity);

                    this.logger.LogInformation("R&R admin has been configured");
                    break;

                case Constants.CancelCommand:
                    break;

                case Constants.UpdateAdminDetailCommand:
                    mentionActivity = await CardHelper.GetMentionActivityAsync(valuesfromTaskModule.AdminPrincipalName.Split(",").ToList(), turnContext.Activity.From.AadObjectId, valuesfromTaskModule.TeamId, turnContext, this.localizer, this.logger, MentionActivityType.SetAdmin, cancellationToken);

                    notificationCard              = MessageFactory.Attachment(AdminCard.GetAdminCard(this.localizer, valuesfromTaskModule, this.options.Value.ManifestId));
                    notificationCard.Id           = turnContext.Activity.Conversation.Id.Split(';')[1].Split("=")[1];
                    notificationCard.Conversation = turnContext.Activity.Conversation;
                    await turnContext.UpdateActivityAsync(notificationCard);

                    await turnContext.SendActivityAsync(mentionActivity);

                    this.logger.LogInformation("Card is updated.");
                    break;

                case Constants.NominateAction:
                    var awardsList = await this.awardsStorageProvider.GetAwardsAsync(valuesfromTaskModule.TeamId);

                    await turnContext.SendActivityAsync(MessageFactory.Carousel(NominateCarouselCard.GetAwardsCard(this.appBaseUrl, awardsList, this.localizer, valuesfromTaskModule)));

                    break;

                case Constants.SaveNominatedDetailsAction:
                    turnContext.Activity.Conversation.Id = valuesfromTaskModule.TeamId;
                    var result = (Activity)MessageFactory.Attachment(EndorseCard.GetEndorseCard(this.appBaseUrl, this.localizer, valuesfromTaskModule));
                    mentionActivity = await CardHelper.GetMentionActivityAsync(valuesfromTaskModule.NominatedToPrincipalName.Split(",").Select(row => row.Trim()).ToList(), turnContext.Activity.From.AadObjectId, valuesfromTaskModule.TeamId, turnContext, this.localizer, this.logger, MentionActivityType.Nomination, cancellationToken);

                    await this.SendMentionedCardAsync(turnContext, result, mentionActivity);

                    this.logger.LogInformation("Nominated an award");
                    break;

                case Constants.OkCommand:
                    return(null);

                default:
                    this.logger.LogInformation($"Invalid command for task module submit activity.Command is : {valuesfromTaskModule.Command} ");
                    await turnContext.SendActivityAsync(this.localizer.GetString("ErrorMessage"));

                    break;
                }

                return(null);
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, $"Error at OnTeamsTaskModuleSubmitAsync(): {ex.Message}", SeverityLevel.Error);
                await turnContext.SendActivityAsync(this.localizer.GetString("ErrorMessage"));

                throw;
            }
        }
        /// <summary>
        /// Send the given attachment to the specified team.
        /// </summary>
        /// <param name="rewardCycleEntity">Reward cycle model object.</param>
        /// <returns>A task that sends notification card in channel.</returns>
        private async Task SendCardToTeamAsync(RewardCycleEntity rewardCycleEntity)
        {
            try
            {
                var awardsList = await this.awardsStorageProvider.GetAwardsAsync(rewardCycleEntity.TeamId);

                var valuesfromTaskModule = new TaskModuleResponseDetails()
                {
                    RewardCycleStartDate = rewardCycleEntity.RewardCycleStartDate,
                    RewardCycleEndDate   = rewardCycleEntity.RewardCycleEndDate,
                    RewardCycleId        = rewardCycleEntity.CycleId,
                };

                var teamDetails = await this.teamStorageProvider.GetTeamDetailAsync(rewardCycleEntity.TeamId);

                string serviceUrl = teamDetails.ServiceUrl;

                MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);
                string teamsChannelId = rewardCycleEntity.TeamId;

                var conversationReference = new ConversationReference()
                {
                    ChannelId = Channel,
                    Bot       = new ChannelAccount()
                    {
                        Id = this.microsoftAppCredentials.MicrosoftAppId
                    },
                    ServiceUrl   = serviceUrl,
                    Conversation = new ConversationAccount()
                    {
                        ConversationType = ChannelConversationType, IsGroup = true, Id = teamsChannelId, TenantId = teamsChannelId
                    },
                };

                this.logger.LogInformation($"sending notification to channelId- {teamsChannelId}");

                await retryPolicy.ExecuteAsync(async() =>
                {
                    try
                    {
                        var conversationParameters = new ConversationParameters()
                        {
                            ChannelData = new TeamsChannelData()
                            {
                                Team = new TeamInfo()
                                {
                                    Id = rewardCycleEntity.TeamId
                                }, Channel = new ChannelInfo()
                                {
                                    Id = rewardCycleEntity.TeamId
                                }
                            },
                            Activity = (Activity)MessageFactory.Carousel(NominateCarouselCard.GetAwardsCard(this.options.Value.AppBaseUri, awardsList, this.localizer, valuesfromTaskModule)),
                            Bot      = new ChannelAccount()
                            {
                                Id = this.microsoftAppCredentials.MicrosoftAppId
                            },
                            IsGroup  = true,
                            TenantId = this.options.Value.TenantId,
                        };

                        await((BotFrameworkAdapter)this.adapter).CreateConversationAsync(
                            Channel,
                            serviceUrl,
                            this.microsoftAppCredentials,
                            conversationParameters,
                            async(conversationTurnContext, conversationCancellationToken) =>
                        {
                            Activity mentionActivity = MessageFactory.Text(this.localizer.GetString("NominationReminderNotificationText"));
                            await((BotFrameworkAdapter)this.adapter).ContinueConversationAsync(
                                this.microsoftAppCredentials.MicrosoftAppId,
                                conversationTurnContext.Activity.GetConversationReference(),
                                async(continueConversationTurnContext, continueConversationCancellationToken) =>
                            {
                                mentionActivity.ApplyConversationReference(conversationTurnContext.Activity.GetConversationReference());
                                await continueConversationTurnContext.SendActivityAsync(mentionActivity, continueConversationCancellationToken);
                            }, conversationCancellationToken);
                        },
                            default);
                    }
                    catch (Exception ex)
                    {
                        this.logger.LogError(ex, "Error while performing retry logic to send notification to channel.");
                        throw;
                    }
                });
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, "Error while sending notification to channel from background service.");
            }
        }
Пример #4
0
        /// <summary>
        /// When OnTurn method receives a submit invoke activity on bot turn, it calls this method.
        /// </summary>
        /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param>
        /// <param name="taskModuleRequest">Task module invoke request value payload.</param>
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
        /// <returns>A task that represents a task module response.</returns>
        protected override async Task <TaskModuleResponse> OnTeamsTaskModuleSubmitAsync(ITurnContext <IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
        {
            try
            {
                turnContext = turnContext ?? throw new ArgumentNullException(nameof(turnContext));

                var activity = (Activity)turnContext.Activity;
                this.RecordEvent(nameof(this.OnTeamsTaskModuleFetchAsync), turnContext);
                Activity mentionActivity;
                var      valuesFromTaskModule = JsonConvert.DeserializeObject <TaskModuleResponseDetails>(((JObject)activity.Value).GetValue("data", StringComparison.OrdinalIgnoreCase)?.ToString());
                switch (valuesFromTaskModule.Command.ToUpperInvariant())
                {
                // Command to send award admin card on save admin action.
                case Constants.SaveAdminDetailsAction:
                    mentionActivity = await CardHelper.GetMentionActivityAsync(
                        valuesFromTaskModule.AdminUserPrincipalName.Split(",").ToList(),
                        turnContext.Activity.From.AadObjectId,
                        valuesFromTaskModule.TeamId,
                        turnContext,
                        this.localizer,
                        this.logger,
                        MentionActivityType.SetAdmin,
                        cancellationToken);

                    var cardDetail = AdminCard.GetAdminCard(this.localizer, valuesFromTaskModule);
                    await this.SendCardAndMentionsAsync(turnContext, cardDetail, mentionActivity);

                    this.logger.LogInformation("Admin has been configured successfully.");

                    break;

                // Command to update award admin card
                case Constants.UpdateAdminDetailCommand:
                    mentionActivity = await CardHelper.GetMentionActivityAsync(
                        valuesFromTaskModule.AdminUserPrincipalName.Split(",").ToList(),
                        turnContext.Activity.From.AadObjectId,
                        valuesFromTaskModule.TeamId,
                        turnContext,
                        this.localizer,
                        this.logger,
                        MentionActivityType.SetAdmin,
                        cancellationToken);

                    var notificationCard = (Activity)MessageFactory.Attachment(AdminCard.GetAdminCard(this.localizer, valuesFromTaskModule));

                    // Split here extracts the activity id from turn context conversation
                    notificationCard.Id           = turnContext.Activity.Conversation.Id.Split(';')[1].Split("=")[1];
                    notificationCard.Conversation = turnContext.Activity.Conversation;
                    await turnContext.UpdateActivityAsync(notificationCard);

                    await turnContext.SendActivityAsync(mentionActivity);

                    this.logger.LogInformation("Admin card is updated successfully.");
                    break;

                // Command to show list of awards ready for nomination
                case Constants.NominateAction:
                    var awardsList = await this.awardsStorageProvider.GetAwardsAsync(valuesFromTaskModule.TeamId);

                    await turnContext.SendActivityAsync(MessageFactory.Carousel(NominateCarouselCard.GetAwardNominationCards(this.options.Value.AppBaseUri, awardsList, this.localizer, valuesFromTaskModule)));

                    this.logger.LogInformation("Nomination carousel card is sent successfully.");
                    break;

                // Command to save nominated user details
                case Constants.SaveNominatedDetailsAction:
                    turnContext.Activity.Conversation.Id = valuesFromTaskModule.TeamId;
                    var endorsementCard = EndorseCard.GetEndorseCard(this.options.Value.AppBaseUri, this.localizer, valuesFromTaskModule);
                    mentionActivity = await CardHelper.GetMentionActivityAsync(
                        valuesFromTaskModule.NomineeUserPrincipalNames.Split(",").Select(row => row.Trim()).ToList(),
                        turnContext.Activity.From.AadObjectId,
                        valuesFromTaskModule.TeamId,
                        turnContext,
                        this.localizer,
                        this.logger,
                        MentionActivityType.Nomination,
                        cancellationToken);

                    await this.SendCardAndMentionsAsync(turnContext, endorsementCard, mentionActivity);

                    this.logger.LogInformation("Award nomination for user sent successfully");
                    break;

                // Commands to close task modules
                case Constants.OkCommand:
                case Constants.CancelCommand:
                    this.logger.LogInformation($"{valuesFromTaskModule.Command.ToUpperInvariant()} is called. [note] - no actions are performed.");
                    break;

                default:
                    this.logger.LogInformation($"Invalid command for task module submit activity.Command is : {valuesFromTaskModule.Command} ");
                    await turnContext.SendActivityAsync(this.localizer.GetString("ErrorMessage"));

                    break;
                }

                return(null);
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, $"Error at OnTeamsTaskModuleSubmitAsync(): {ex.Message}");
                throw;
            }
        }