コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
                }
            }
        }