/// <summary> /// Methods mentions user in respective channel of which they are part after grouping. /// </summary> /// <param name="mentionToEmails">List of email ID whom to be mentioned.</param> /// <param name="userObjectId">Azure active directory object id of current login user.</param> /// <param name="teamId">Team id where bot is installed.</param> /// <param name="turnContext">Provides context for a turn of a bot.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <param name="logger">Instance to send logs to the application insights service.</param> /// <param name="mentionType">Mention activity type.</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> GetMentionActivityAsync(IEnumerable <string> mentionToEmails, string userObjectId, string teamId, ITurnContext turnContext, IStringLocalizer <Strings> localizer, ILogger logger, MentionActivityType mentionType, CancellationToken cancellationToken) { List <Entity> entities = new List <Entity>(); string text = string.Empty; string mentionToText = string.Empty; try { var channelMembers = await TeamsInfo.GetTeamMembersAsync(turnContext, teamId, cancellationToken); var mentionToMembers = channelMembers.Where(member => mentionToEmails.Contains(member.Email)); var mentionByMember = channelMembers.Where(member => member.AadObjectId == userObjectId).First(); foreach (ChannelAccount member in mentionToMembers) { Mention mention = new Mention { Mentioned = member, Text = $"<at>{member.Name}</at>", }; entities.Add(mention); } mentionToText = string.Join(", ", mentionToMembers.Select(member => $"<at>{member.Name}</at>")); Mention mentionBy = new Mention { Mentioned = mentionByMember, Text = $"<at>{mentionByMember.Name}</at>", }; switch (mentionType) { case MentionActivityType.SetAdmin: entities.Add(mentionBy); text = localizer.GetString("SetAdminMentionText", mentionToText, mentionBy.Text); break; case MentionActivityType.Nomination: entities.Add(mentionBy); text = localizer.GetString("NominationMentionText", mentionToText, mentionBy.Text); break; case MentionActivityType.Winner: text = $"{localizer.GetString("WinnerMentionText")} {mentionToText}."; break; default: break; } Activity notificationActivity = MessageFactory.Text(text); notificationActivity.Entities = entities; return(notificationActivity); } #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. { logger.LogError(ex, $"Error while mentioning channel member in respective channels."); return(null); } }
/// <summary> /// Methods mentions user in respective channel of which they are part after grouping. /// </summary> /// <param name="mentionToEmails">List of email ID whom to be mentioned.</param> /// <param name="userObjectId">Azure active directory object id of the user.</param> /// <param name="teamId">Team id where bot is installed.</param> /// <param name="turnContext">Provides context for a turn of a bot.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <param name="logger">Instance to send logs to the application insights service.</param> /// <param name="mentionType">Mention activity type.</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> GetMentionActivityAsync(IEnumerable <string> mentionToEmails, string userObjectId, string teamId, ITurnContext turnContext, IStringLocalizer <Strings> localizer, ILogger logger, MentionActivityType mentionType, CancellationToken cancellationToken) { try { StringBuilder mentionText = new StringBuilder(); List <Entity> entities = new List <Entity>(); List <Mention> mentions = new List <Mention>(); IEnumerable <TeamsChannelAccount> channelMembers = await TeamsInfo.GetTeamMembersAsync(turnContext, teamId, cancellationToken); IEnumerable <ChannelAccount> mentionToMemberDetails = channelMembers.Where(member => mentionToEmails.Contains(member.Email)).Select(member => new ChannelAccount { Id = member.Id, Name = member.Name }); ChannelAccount mentionByMemberDetails = channelMembers.Where(member => member.AadObjectId == userObjectId).Select(member => new ChannelAccount { Id = member.Id, Name = member.Name }).FirstOrDefault(); foreach (ChannelAccount member in mentionToMemberDetails) { Mention mention = new Mention { Mentioned = new ChannelAccount() { Id = member.Id, Name = member.Name, }, Text = $"<at>{XmlConvert.EncodeName(member.Name)}</at>", }; mentions.Add(mention); entities.Add(mention); mentionText.Append(mention.Text).Append(", "); } Mention mentionBy = new Mention { Mentioned = new ChannelAccount() { Id = mentionByMemberDetails.Id, Name = mentionByMemberDetails.Name, }, Text = $"<at>{XmlConvert.EncodeName(mentionByMemberDetails.Name)}</at>", }; string text = string.Empty; switch (mentionType) { case MentionActivityType.SetAdmin: entities.Add(mentionBy); text = localizer.GetString("SetAdminMentionText", mentionText.ToString().Trim().TrimEnd(','), mentionBy.Text); break; case MentionActivityType.Nomination: entities.Add(mentionBy); text = localizer.GetString("NominationMentionText", mentionText.ToString().Trim().TrimEnd(','), mentionBy.Text); break; case MentionActivityType.Winner: text = $"{localizer.GetString("WinnerMentionText")} {mentionText.ToString().Trim().TrimEnd(',')}"; break; default: break; } Activity notificationActivity = MessageFactory.Text(text); notificationActivity.Entities = entities; return(notificationActivity); } catch (Exception ex) { logger.LogError(ex, $"Error while mentioning channel member in respective channels."); return(null); } }