private async Task HandleQuestionWorkflow(IDialogContext context, Microsoft.Bot.Connector.Activity activity, Data.Course course, QuestionModel questionModel) { var predictiveQnAService = new PredictiveQnAService(course.Id); QnAAnswer response = await predictiveQnAService.GetAnswer(questionModel.QuestionText); // if result, check confidence level if (response != null && response.Score > Convert.ToDouble(course.PredictiveQnAConfidenceThreshold)) { await HandleBotAnswerWorkflow(context, activity, questionModel, response, questionModel.TeamId); } else { // a score of 0 or a score below threshold both result in regular workflow await HandleTagAdminWorkflow(activity, questionModel, questionModel.TeamId, course.Id); } }
private async Task HandleBotHelpful(Microsoft.Bot.Connector.Activity activity) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // Question has been answered // store answer in db. // get question details int questionId = Convert.ToInt32((activity.Value as dynamic)["questionId"]); string answer = (activity.Value as dynamic)["answer"]; int answerId = Convert.ToInt32((activity.Value as dynamic)["qnaId"]); 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); // store question in qna string teamId = channelData.Team.Id; 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)) // double check question to course? not sure { var answeredBy = SQLService.GetBotUser(courseID); // update question model question.QuestionStatus = Constants.QUESTION_STATUS_ANSWERED; question.QuestionAnswered = DateTime.Now; question.AnswerText = answer; question.AnswerPoster = answeredBy; SQLService.CreateOrUpdateQuestion(question); // update old activity Microsoft.Bot.Connector.Activity updatedReply = activity.CreateReply(); var card = new AdaptiveCard(); var answerBlock = new AdaptiveTextBlock("Answer: " + question.AnswerText.ReplaceLinksWithMarkdown()); answerBlock.Weight = AdaptiveTextWeight.Bolder; answerBlock.Size = AdaptiveTextSize.Medium; answerBlock.Wrap = true; var markedBlock = new AdaptiveTextBlock($"Marked as " + question.QuestionStatus + " by " + currentUser.Name); markedBlock.Wrap = true; var answeredBlock = new AdaptiveTextBlock("Answered by: " + question.AnswerPoster.FullName); answeredBlock.Weight = AdaptiveTextWeight.Bolder; answeredBlock.Wrap = true; card.Body.Add(answerBlock); card.Body.Add(answeredBlock); card.Body.Add(markedBlock); Attachment attachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card, }; updatedReply.Attachments.Add(attachment); await connector.Conversations.UpdateActivityAsync(activity.Conversation.Id, activity.ReplyToId, updatedReply); var predictiveQnAService = new PredictiveQnAService(courseID); var res = await predictiveQnAService.UpdateQnAPair(new List <string> { question.QuestionText }, null, answer, answerId); } }
private async Task HandleMarkedAnswerFromCard(Microsoft.Bot.Connector.Activity activity) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // Handle answer payload var adaptiveCardAnswerJson = activity.Value.ToString(); var adaptiveCardAnswer = JsonConvert.DeserializeObject <AdaptiveCardAnswerSubmit>(adaptiveCardAnswerJson); string selectedReplyJson = adaptiveCardAnswer.Answer; string questionId = adaptiveCardAnswer.QuestionId; if (string.IsNullOrEmpty(selectedReplyJson)) { Microsoft.Bot.Connector.Activity newReply = activity.CreateReply(); newReply.Text = "There seems to be an issue saving the answer."; await connector.Conversations.ReplyToActivityAsync(activity.Conversation.Id, activity.ReplyToId, newReply); } else { var selectedReply = JsonConvert.DeserializeObject <TeamsMessage>(selectedReplyJson); var question = SQLService.GetQuestion(Convert.ToInt32(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 = channelData.Team.Id; 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)) { var selectedReplyUser = teamsMembers.Where(x => x.ObjectId == selectedReply.From.User.Id).FirstOrDefault(); var answeredBy = SQLService.GetUser(selectedReplyUser.UserPrincipalName); // update question model question.QuestionStatus = Constants.QUESTION_STATUS_ANSWERED; question.QuestionAnswered = DateTime.Now; question.AnswerText = MicrosoftTeamsChannelHelper.StripMentionAndHtml(selectedReply.Body.Content); question.AnswerPoster = answeredBy; SQLService.CreateOrUpdateQuestion(question); // update old activity Microsoft.Bot.Connector.Activity updatedReply = activity.CreateReply(); var card = new AdaptiveCard(); var answer = new AdaptiveTextBlock("Answer: " + question.AnswerText.ReplaceLinksWithMarkdown()); answer.Weight = AdaptiveTextWeight.Bolder; answer.Size = AdaptiveTextSize.Medium; answer.Wrap = true; var marked = new AdaptiveTextBlock($"Marked as " + question.QuestionStatus + " by " + currentUser.Name); marked.Wrap = true; var answered = new AdaptiveTextBlock("Answered by: " + question.AnswerPoster.FullName); answered.Weight = AdaptiveTextWeight.Bolder; answered.Wrap = true; card.Body.Add(answer); card.Body.Add(answered); card.Body.Add(marked); Attachment attachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card, }; updatedReply.Attachments.Add(attachment); await connector.Conversations.UpdateActivityAsync(activity.Conversation.Id, activity.ReplyToId, updatedReply); var predictiveQnAService = new PredictiveQnAService(courseID); var res = await predictiveQnAService.AddQnAPair(question.QuestionText, question.AnswerText); } } }