/// <summary> /// Gets the email id's of the SME uses who are available for oncallSupport. /// </summary> /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param> /// <param name="onCallSupportDetailSearchService">Provider to search on call support details in Azure Table Storage.</param> /// <param name="teamId">Team id to which the message is being sent.</param> /// <param name="memoryCache">MemoryCache instance for caching oncallexpert details.</param> /// <param name="logger">Sends logs to the Application Insights service.</param> /// <returns>string with appended email id's.</returns> public static async Task <string> GetOnCallSMEUserListAsync(ITurnContext <IInvokeActivity> turnContext, IOnCallSupportDetailSearchService onCallSupportDetailSearchService, string teamId, IMemoryCache memoryCache, ILogger <RemoteSupportActivityHandler> logger) { try { string onCallSMEUsers = string.Empty; var onCallSupportDetails = await onCallSupportDetailSearchService?.SearchOnCallSupportTeamAsync(searchQuery : string.Empty, count : 1); if (onCallSupportDetails != null && onCallSupportDetails.Any()) { var onCallSMEDetails = JsonConvert.DeserializeObject <List <OnCallSMEDetail> >(onCallSupportDetails.First().OnCallSMEs); var expertEmailList = new List <string>(); foreach (var onCallSMEDetail in onCallSMEDetails) { var expertDetails = await TeamMemberCacheHelper.GetMemberInfoAsync(memoryCache, turnContext, onCallSMEDetail.ObjectId, teamId, CancellationToken.None); expertEmailList.Add(expertDetails.Email); } onCallSMEUsers = string.Join(", ", expertEmailList); } return(onCallSMEUsers); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) #pragma warning restore CA1031 // Do not catch general exception types { logger.LogError(ex, "Error in getting the oncallSMEUsers list."); } return(null); }
/// <summary> /// Method mentions user in respective channel of which they are part after modifying experts list. /// </summary> /// <param name="onCallExpertsObjectIds">Collection of on call expert objectIds.</param> /// <param name="turnContext">Provides context for a turn of a bot.</param> /// <param name="logger">Sends logs to the Application Insights service.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <param name="memoryCache">MemoryCache instance for caching oncallexpert details</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 sends notification in newly created channel and mention its members.</returns> internal static async Task <Activity> SendMentionActivityAsync( List <string> onCallExpertsObjectIds, ITurnContext <IInvokeActivity> turnContext, ILogger logger, IStringLocalizer <Strings> localizer, IMemoryCache memoryCache, CancellationToken cancellationToken) { try { var mentionText = new StringBuilder(); var entities = new List <Entity>(); var expertDetail = new OnCallSMEDetail(); foreach (var expertId in onCallExpertsObjectIds) { var onCallExpert = await TeamMemberCacheHelper.GetMemberInfoAsync(memoryCache, turnContext, expertId, null, cancellationToken); expertDetail = new OnCallSMEDetail { Id = onCallExpert.Id, Name = onCallExpert.Name, Email = onCallExpert.Email }; var mention = new Mention { Mentioned = new ChannelAccount() { Id = expertDetail.Id, Name = expertDetail.Name, }, Text = $"<at>{HttpUtility.HtmlEncode(expertDetail.Name)}</at>", }; entities.Add(mention); mentionText = string.IsNullOrEmpty(mentionText.ToString()) ? mentionText.Append(mention.Text) : mentionText.Append(", ").Append(mention.Text); } logger.LogInformation("Send message with names mentioned in team channel."); var replyActivity = string.IsNullOrEmpty(mentionText.ToString()) ? MessageFactory.Text(localizer.GetString("OnCallListUpdateMessage")) : MessageFactory.Text(localizer.GetString("OnCallExpertMentionText", mentionText.ToString())); replyActivity.Entities = entities; await turnContext.SendActivityAsync(replyActivity, cancellationToken); return(null); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) #pragma warning restore CA1031 // Do not catch general exception types { logger.LogError(ex, $"Error while mentioning channel member in respective channels."); return(null); } }