/// <summary> /// Method to send goal reminder card to personal bot. /// </summary> /// <param name="personalGoalDetail">Holds personal goal detail entity data sent from background service.</param> /// <param name="isReminderBeforeThreeDays">Determines reminder to be sent prior 3 days to end date.</param> /// <returns>A Task represents goal reminder card is sent to the bot, installed in the personal scope.</returns> public async Task SendGoalReminderToPersonalBotAsync(PersonalGoalDetail personalGoalDetail, bool isReminderBeforeThreeDays = false) { personalGoalDetail = personalGoalDetail ?? throw new ArgumentNullException(nameof(personalGoalDetail)); var conversationReference = new ConversationReference() { ChannelId = Constants.TeamsBotFrameworkChannelId, Bot = new ChannelAccount() { Id = $"28:{this.microsoftAppCredentials.MicrosoftAppId}" }, ServiceUrl = personalGoalDetail.ServiceUrl, Conversation = new ConversationAccount() { ConversationType = Constants.PersonalConversationType, Id = personalGoalDetail.ConversationId, TenantId = this.options.Value.TenantId }, }; try { await this.retryPolicy.ExecuteAsync(async() => { await((BotFrameworkAdapter)this.adapter).ContinueConversationAsync( this.microsoftAppCredentials.MicrosoftAppId, conversationReference, async(turnContext, cancellationToken) => { string reminderType = string.Empty; AdaptiveTextColor reminderTypeColor = AdaptiveTextColor.Accent; if (isReminderBeforeThreeDays) { reminderType = this.localizer.GetString("PersonalGoalEndingAfterThreeDays"); reminderTypeColor = AdaptiveTextColor.Attention; } else { reminderType = this.GetReminderTypeString(personalGoalDetail.ReminderFrequency); } var goalReminderAttachment = MessageFactory.Attachment(GoalReminderCard.GetGoalReminderCard(this.localizer, this.options.Value.ManifestId, this.options.Value.GoalsTabEntityId, reminderType, reminderTypeColor)); this.logger.LogInformation($"Sending goal reminder card to Personal bot. Conversation id: {personalGoalDetail.ConversationId}"); await turnContext.SendActivityAsync(goalReminderAttachment, cancellationToken); }, CancellationToken.None); }); } catch (Exception ex) { this.logger.LogError(ex, $"Error while sending goal reminder card to personal bot: {ex.Message} at {nameof(this.SendGoalReminderToPersonalBotAsync)}"); throw; } }
/// <summary> /// Method to send goal reminder card to team and team members or update team goal, personal goal and note details in storage. /// </summary> /// <param name="teamGoalDetail">Holds team goal detail entity data sent from background service.</param> /// <param name="isReminderBeforeThreeDays">Determines reminder to be sent prior 3 days to end date.</param> /// <returns>A Task represents goal reminder card is sent to team and team members.</returns> public async Task SendGoalReminderToTeamAndTeamMembersAsync(TeamGoalDetail teamGoalDetail, bool isReminderBeforeThreeDays = false) { teamGoalDetail = teamGoalDetail ?? throw new ArgumentNullException(nameof(teamGoalDetail)); try { var teamId = teamGoalDetail.TeamId; string serviceUrl = teamGoalDetail.ServiceUrl; MicrosoftAppCredentials.TrustServiceUrl(serviceUrl); var conversationReference = new ConversationReference() { ChannelId = Constants.TeamsBotFrameworkChannelId, Bot = new ChannelAccount() { Id = $"28:{this.microsoftAppCredentials.MicrosoftAppId}" }, ServiceUrl = serviceUrl, Conversation = new ConversationAccount() { ConversationType = Constants.ChannelConversationType, IsGroup = true, Id = teamId, TenantId = this.options.Value.TenantId }, }; await this.retryPolicy.ExecuteAsync(async() => { try { await((BotFrameworkAdapter)this.adapter).ContinueConversationAsync( this.microsoftAppCredentials.MicrosoftAppId, conversationReference, async(turnContext, cancellationToken) => { string reminderType = string.Empty; AdaptiveTextColor reminderTypeColor = AdaptiveTextColor.Accent; if (isReminderBeforeThreeDays) { reminderType = this.localizer.GetString("TeamGoalEndingAfterThreeDays"); reminderTypeColor = AdaptiveTextColor.Warning; } else { reminderType = this.GetReminderTypeString(teamGoalDetail.ReminderFrequency); } var goalReminderAttachment = MessageFactory.Attachment(GoalReminderCard.GetGoalReminderCard(this.localizer, this.options.Value.ManifestId, this.options.Value.GoalsTabEntityId, reminderType, reminderTypeColor)); this.logger.LogInformation($"Sending goal reminder card to teamId: {teamId}"); await turnContext.SendActivityAsync(goalReminderAttachment, cancellationToken); await this.SendGoalReminderToTeamMembersAsync(turnContext, teamGoalDetail, goalReminderAttachment, cancellationToken); }, CancellationToken.None); } catch (Exception ex) { this.logger.LogError(ex, $"Error while performing retry logic to send goal reminder card for : {teamGoalDetail.TeamGoalId}."); throw; } }); } #pragma warning disable CA1031 // Catching general exceptions to log exception details in telemetry client. catch (Exception ex) #pragma warning restore CA1031 // Catching general exceptions to log exception details in telemetry client. { this.logger.LogError(ex, $"Error while sending goal reminder in team from background service for : {teamGoalDetail.TeamGoalId} at {nameof(this.SendGoalReminderToTeamAndTeamMembersAsync)}"); } }