Exemple #1
0
        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());
                }
            }
        }