private async Task HandleBotNotHelpful(Microsoft.Bot.Connector.Activity activity) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // tag demonstrators, regular workflow // get question details int questionId = Convert.ToInt32((activity.Value as dynamic)["questionId"]); var question = SQLService.GetQuestion(questionId); // get user details var channelData = activity.GetChannelData <Microsoft.Bot.Connector.Teams.Models.TeamsChannelData>(); var members = await connector.Conversations.GetConversationMembersAsync(channelData.Team.Id); var teamsMembers = members.AsTeamsChannelAccounts(); var currentUser = teamsMembers.Where(x => x.ObjectId == activity.From.Properties["aadObjectId"].ToString()).FirstOrDefault(); var studentUPN = currentUser.UserPrincipalName; var isUserAdmin = SQLService.IsUserAdmin(studentUPN); string teamId = (activity.ChannelData as dynamic)["team"]["id"].ToString(); TeamDetails teamDetails; try { teamDetails = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(teamId); } catch (Exception e) { teamDetails = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(teamId); Trace.TraceError(e.ToString()); } var teamName = teamDetails.Name; var courseID = SQLService.GetCourseIDByName(teamName.Trim()); // check if user can set question status if (isUserAdmin || (studentUPN == question.OriginalPoster.Email) || (studentUPN == question.OriginalPoster.UserName)) { // find replies string channelId = (activity.ChannelData as dynamic)["channel"]["id"].ToString(); var conversationId = activity.Conversation.Id; string messageId = conversationId.Split('=')[1]; string originalStudentUpn = (activity.Value as dynamic)["userUpn"]; var student = SQLService.GetUser(originalStudentUpn); var adminsOnTeams = new List <ChannelAccount>(); if (student != null) { if (student.Role != null && student.Role.Name != Constants.STUDENT_ROLE) { // Not a student - notify lecturer var lecturers = SQLService.GetUsersByRole(Constants.LECTURER_ROLE, courseID); foreach (var admin in lecturers) { var adminOnTeams = teamsMembers.Where(x => (x.Email == admin.Email || x.Email == admin.UserName || x.UserPrincipalName == admin.UserName || x.UserPrincipalName == admin.Email) && (x.Email != student.Email && x.Email != student.UserName && x.UserPrincipalName != student.UserName && x.UserPrincipalName != student.Email) ).FirstOrDefault(); if (adminOnTeams != null) { adminsOnTeams.Add(adminOnTeams); } } } else { // Is a student if (student.TutorialGroups != null && student.TutorialGroups.Count > 0) { // Notify demonstrator var tutorialAdmins = new List <UserCourseRoleMappingModel>(); foreach (var tutorialGroup in student.TutorialGroups) { tutorialAdmins.AddRange(SQLService.GetDemonstrators(courseID)); } if (tutorialAdmins != null) { foreach (var admin in tutorialAdmins) { var adminOnTeams = teamsMembers.Where(x => (x.Email == admin.Email || x.Email == admin.UserName || x.UserPrincipalName == admin.UserName || x.UserPrincipalName == admin.Email) && (x.Email != student.Email && x.Email != student.UserName && x.UserPrincipalName != student.UserName && x.UserPrincipalName != student.Email) ).FirstOrDefault(); if (adminOnTeams != null) { adminsOnTeams.Add(adminOnTeams); } } } } else { // student without tutorial class? var allAdmins = SQLService.GetAllAdmins(student.CourseId).Distinct(); if (allAdmins != null) { foreach (var admin in allAdmins) { var adminOnTeams = teamsMembers.Where(x => (x.Email == admin.Email || x.Email == admin.UserName || x.UserPrincipalName == admin.UserName || x.UserPrincipalName == admin.Email) && (x.Email != student.Email && x.Email != student.UserName && x.UserPrincipalName != student.UserName && x.UserPrincipalName != student.Email) ).FirstOrDefault(); if (adminOnTeams != null) { adminsOnTeams.Add(adminOnTeams); } } } } } } else { // User not in database // Notify lecturer var lecturers = SQLService.GetUsersByRole(Constants.LECTURER_ROLE, courseID); foreach (var admin in lecturers) { var adminOnTeams = teamsMembers.Where(x => (x.Email == admin.Email || x.Email == admin.UserName || x.UserPrincipalName == admin.UserName || x.UserPrincipalName == admin.Email) && (x.Email != student.Email && x.Email != student.UserName && x.UserPrincipalName != student.UserName && x.UserPrincipalName != student.Email) ).FirstOrDefault(); if (adminOnTeams != null) { adminsOnTeams.Add(adminOnTeams); } } } // update old activity Microsoft.Bot.Connector.Activity updatedReply = activity.CreateReply(); var actionJson = "{\"Type\":\"" + Constants.ACTIVITY_SELECT_ANSWER + "\",\"QuestionId\": \"" + questionId + "\"}"; var card = new HeroCard() { Text = "Sorry I couldn't answer your question, I've tagged your demonstrators.", }; updatedReply.Attachments.Add(card.ToAttachment()); try { await connector.Conversations.UpdateActivityAsync(activity.Conversation.Id, activity.ReplyToId, updatedReply); } catch (Exception e) { Trace.TraceError(e.ToString()); } // create new tagging reply Microsoft.Bot.Connector.Activity newReply = activity.CreateReply(); // Tag Admins var distinct = adminsOnTeams .GroupBy(p => p.Id) .Select(g => g.First()) .ToList(); foreach (var admin in distinct) { newReply.AddMentionToText(admin, MentionTextLocation.AppendText); } var newActionJson = "{\"type\":\"" + Constants.ACTIVITY_SELECT_ANSWER + "\",\"questionId\": \"" + questionId + "\"}"; var newCard = new HeroCard() { Buttons = new List <CardAction>() { new CardAction(ActivityTypes.Invoke, "Select an answer", value: newActionJson), }, }; newReply.Attachments.Add(newCard.ToAttachment()); try { var response = await connector.Conversations.ReplyToActivityAsync(activity.Conversation.Id, activity.ReplyToId, newReply); } catch (Exception e) { Trace.TraceError(e.ToString()); } } }