示例#1
0
        public static async Task EchoMessage(ConnectorClient connector, Activity activity)
        {
            if (activity is IMessageActivity)
            {
                if (activity.GetTextWithoutMentions() != "")
                {
                    string token = await GetToken();

                    GraphServiceClient   graph          = GetAuthenticatedClient(token);
                    TeamsConnectorClient teamsConnector = connector.GetTeamsConnectorClient();
                    string fakeTeamId = activity.GetChannelData <TeamsChannelData>().Team.Id;
                    string teamId     = (await teamsConnector.Teams.FetchTeamDetailsAsync(fakeTeamId)).AadGroupId;
                    string channelId  = activity.GetChannelData <TeamsChannelData>().Channel.Id;

                    string messages = await new HttpHelpers(token).HttpGetJson($"/teams/{teamId}/channels/{channelId}/messages");
                    string msgs     = await GetAllMessages(graph, teamId, channelId);

                    var response = activity.CreateReply("Here you go:\n" + messages);
                    //var response = activity.CreateReply("Bob Smith said:\n" + "See you in Dallas!");
                    //await connector.Conversations.ReplyToActivityWithRetriesAsync(response);
                }

                //var reply = activity.CreateReply("You said!: " + activity.GetTextWithoutMentions());
                //await connector.Conversations.ReplyToActivityWithRetriesAsync(reply);
            }
        }
        public async Task StartAsync(IDialogContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var team = context.Activity.GetChannelData <TeamsChannelData>().Team;

            if (team != null)
            {
                var connectorClient = new ConnectorClient(new Uri(context.Activity.ServiceUrl));

                // Handle for channel conversation, AAD GroupId only exists within channel
                TeamDetails teamDetails = await connectorClient.GetTeamsConnectorClient().Teams.FetchTeamDetailsAsync(team.Id);

                var message = context.MakeMessage();
                message.Text = GenerateTable(teamDetails);

                await context.PostAsync(message);
            }
            else
            {
                // Handle for 1 to 1 bot conversation
                await context.PostAsync(Strings.TeamInfo1To1ConversationError);
            }

            //Set the Last Dialog in Conversation Data
            context.UserData.SetValue(Strings.LastDialogKey, Strings.LastDialogFetchTeamInfoDialog);

            context.Done <object>(null);
        }
        public async Task TeamsAPI_FetchTeamDetailsAsyncTest()
        {
            Microsoft.Rest.ServiceClientTracing.IsEnabled = true;
            TeamDetails teamDetails = new TeamDetails("TeamId", "TeamName", "GroupId");

            TestDelegatingHandler testHandler = new TestDelegatingHandler((request) =>
            {
                StringContent stringContent = new StringContent(JsonConvert.SerializeObject(teamDetails));
                var response     = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = stringContent;
                return(Task.FromResult(response));
            });

            ConnectorClient connectorClient = new ConnectorClient(
                new Uri("https://smba.trafficmanager.net/amer-client-ss.msg/"),
                ConfigurationManager.AppSettings["MicrosoftAppId"],
                ConfigurationManager.AppSettings["MicrosoftAppPassword"],
                testHandler);

            TeamsConnectorClient teamsConnectorClient = connectorClient.GetTeamsConnectorClient();

            TeamDetails teamDetailsResult = await teamsConnectorClient.Teams.FetchTeamDetailsAsync("TestTeamId");

            Assert.IsNotNull(teamDetailsResult);
            Assert.IsNotNull(teamDetailsResult.Id);
            Assert.IsNotNull(teamDetailsResult.Name);
            Assert.IsNotNull(teamDetailsResult.AadGroupId);
            Assert.AreEqual(teamDetailsResult.Id, teamDetails.Id);
            Assert.AreEqual(teamDetailsResult.Name, teamDetails.Name);
            Assert.AreEqual(teamDetailsResult.AadGroupId, teamDetails.AadGroupId);
        }
        /// <summary>
        /// Get the name of a team.
        /// </summary>
        /// <param name="connectorClient">The connector client</param>
        /// <param name="teamId">The team id</param>
        /// <returns>The name of the team</returns>
        private async Task <string> GetTeamNameAsync(ConnectorClient connectorClient, string teamId)
        {
            var teamsConnectorClient = connectorClient.GetTeamsConnectorClient();
            var teamDetailsResult    = await teamsConnectorClient.Teams.FetchTeamDetailsAsync(teamId);

            return(teamDetailsResult.Name);
        }
        /// <summary>
        /// Handles text message input sent by user.
        /// </summary>
        /// <param name="activity">Incoming request from Bot Framework.</param>
        /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param>
        /// <returns>Task tracking operation.</returns>
        private static async Task HandleTextMessages(Activity activity, ConnectorClient connectorClient)
        {
            if (activity.Text.Contains("GetChannels"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

                ConversationList channels = connectorClient.GetTeamsConnectorClient().Teams.FetchChannelList(activity.GetChannelData <TeamsChannelData>().Team.Id);

                // Adding to existing text to ensure @Mention text is not replaced.
                replyActivity.Text = replyActivity.Text + " <p>" + string.Join("</p><p>", channels.Conversations.ToList().Select(info => info.Name + " --> " + info.Id));
                await connectorClient.Conversations.ReplyToActivityAsync(replyActivity);
            }
            else if (activity.Text.Contains("GetTenantId"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);
                replyActivity.Text += " Tenant ID - " + activity.GetTenantId();
                await connectorClient.Conversations.ReplyToActivityAsync(replyActivity);
            }
            else if (activity.Text.Contains("Create1on1"))
            {
                var      response    = connectorClient.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());
                Activity newActivity = new Activity()
                {
                    Text         = "Hello",
                    Type         = ActivityTypes.Message,
                    Conversation = new ConversationAccount
                    {
                        Id = response.Id
                    },
                };

                await connectorClient.Conversations.SendToConversationAsync(newActivity, response.Id);
            }
            else if (activity.Text.Contains("GetMembers"))
            {
                var response = await connectorClient.Conversations.GetTeamsConversationMembersAsync(activity.Conversation.Id, activity.GetTenantId());

                StringBuilder stringBuilder = new StringBuilder();
                Activity      replyActivity = activity.CreateReply();
                replyActivity.Text = string.Join("</p><p>", response.ToList().Select(info => info.GivenName + " " + info.Surname + " --> " + info.ObjectId));
                await connectorClient.Conversations.ReplyToActivityAsync(replyActivity);
            }
            else
            {
                var accountList = connectorClient.Conversations.GetConversationMembers(activity.Conversation.Id);

                Activity replyActivity = activity.CreateReply();
                replyActivity.Text = "Help " +
                                     "<p>Type GetChannels to get List of Channels. </p>" +
                                     "<p>Type GetTenantId to get Tenant Id </p>" +
                                     "<p>Type Create1on1 to create one on one conversation. </p>" +
                                     "<p>Type GetMembers to get list of members in a conversation (team or direct conversation). </p>";
                replyActivity.AddMentionToText(activity.From);
                await connectorClient.Conversations.ReplyToActivityAsync(replyActivity);
            }
        }
示例#6
0
        private static async Task <string> GetTeamNameAsync(string serviceUrl, string teamId)
        {
            using (var client = new ConnectorClient(new Uri(serviceUrl)))
            {
                var teamsConnectorClient = client.GetTeamsConnectorClient();
                var teamDetailsResult    = await teamsConnectorClient.Teams.FetchTeamDetailsAsync(teamId);

                return(teamDetailsResult.Name);
            }
        }
示例#7
0
        private static ChannelInfo GetChannelId(ConnectorClient connectorClient, IDialogContext context, string channelName)
        {
            var teamInfo = context.Activity.GetChannelData <TeamsChannelData>().Team;
            ConversationList channels = connectorClient.GetTeamsConnectorClient().Teams.FetchChannelList(teamInfo.Id);
            var channelInfo           = channels.Conversations.FirstOrDefault(c => c.Name != null && c.Name.Equals(channelName));

            if (channelInfo == null)
            {
                throw new System.Exception($"{channelName} doesn't exist in {context.Activity.GetChannelData<TeamsChannelData>().Team.Name} Team");
            }
            return(channelInfo);
        }
示例#8
0
        public async Task TeamsAPI_FetchChannelListAsyncWithHttpMessagesTest()
        {
            Microsoft.Rest.ServiceClientTracing.IsEnabled = true;
            ConversationList conversationList = new ConversationList
            {
                Conversations = new List <ChannelInfo>
                {
                    new ChannelInfo
                    {
                        Id   = "ChannelId",
                        Name = "ChannelName"
                    }
                }
            };

            TestDelegatingHandler testHandler = new TestDelegatingHandler((request) =>
            {
                StringContent stringContent = new StringContent(JsonConvert.SerializeObject(conversationList));
                var response     = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = stringContent;
                Assert.IsNotNull(request.Headers.GetValues("Authorization"));
                Assert.AreEqual(request.Headers.GetValues("Authorization").Count(), 1);
                Assert.AreEqual(request.Headers.GetValues("Authorization").ToList()[0], "CustomValue");
                return(Task.FromResult(response));
            });

            ConnectorClient connectorClient = new ConnectorClient(
                new Uri("https://smba.trafficmanager.net/amer-client-ss.msg/"),
                ConfigurationManager.AppSettings["MicrosoftAppId"],
                ConfigurationManager.AppSettings["MicrosoftAppPassword"],
                testHandler);

            TeamsConnectorClient teamsConnectorClient = connectorClient.GetTeamsConnectorClient();

            ConversationList conversationListResponse = (await teamsConnectorClient.Teams.FetchChannelListWithHttpMessagesAsync(
                                                             "TestTeamId",
                                                             new Dictionary <string, List <string> >()
            {
                { "Authorization", new List <string>()
                  {
                      "CustomValue"
                  } }
            })).Body;

            Assert.IsNotNull(conversationListResponse);
            Assert.IsNotNull(conversationListResponse.Conversations);
            Assert.AreEqual(conversationListResponse.Conversations.Count, 1);
            Assert.AreEqual(conversationListResponse.Conversations[0].Id, conversationList.Conversations[0].Id);
            Assert.AreEqual(conversationListResponse.Conversations[0].Name, conversationList.Conversations[0].Name);
        }
示例#9
0
        private static async Task AddTeamDetails(Activity message, TeamsChannelData channelData, Tenant tenant)
        {
            if (channelData.Team != null)
            {
                ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));
                var             members   = await connector.Conversations.GetConversationMembersAsync(channelData.Team.Id);

                int  count = members.Count;
                Team team  = null;
                if (tenant.Teams.Contains(channelData.Team.Id))
                {
                    team = await Cache.Teams.GetItemAsync(channelData.Team.Id);
                }
                else
                {
                    var teamChannelData = message.GetChannelData <TeamsChannelDataExt>();
                    team = new Team
                    {
                        Id          = channelData.Team.Id,
                        AadObjectId = teamChannelData.Team.AADGroupId
                    };
                }

                // Update the members.
                team.Name    = channelData.Team.Name;
                team.Members = members.Select(m => m.AsTeamsChannelAccount().UserPrincipalName.ToLower()).ToList();

                // Add all teams and channels
                ConversationList channels = connector.GetTeamsConnectorClient().Teams.FetchChannelList(message.GetChannelData <TeamsChannelData>().Team.Id);
                foreach (var channel in channels.Conversations)
                {
                    team.Channels.Add(new Channel()
                    {
                        Id = channel.Id, Name = channel.Name ?? "General"
                    });
                }
                await Cache.Teams.AddOrUpdateItemAsync(team.Id, team);

                tenant.Teams.Add(channelData.Team.Id);

                await Cache.Tenants.AddOrUpdateItemAsync(tenant.Id, tenant);

                await SendWelcomeMessageToAllMembers(tenant, message, channelData, members.AsTeamsChannelAccounts());
            }
        }
示例#10
0
        public void TeamsAPI_FetchChannelListTestInvalidHttpCodeWithoutResponseContent()
        {
            Microsoft.Rest.ServiceClientTracing.IsEnabled = true;
            TestDelegatingHandler testHandler = new TestDelegatingHandler((request) =>
            {
                var response = new HttpResponseMessage(HttpStatusCode.NotFound);
                return(Task.FromResult(response));
            });

            ConnectorClient connectorClient = new ConnectorClient(
                new Uri("https://smba.trafficmanager.net/amer-client-ss.msg/"),
                ConfigurationManager.AppSettings["MicrosoftAppId"],
                ConfigurationManager.AppSettings["MicrosoftAppPassword"],
                testHandler);

            TeamsConnectorClient teamsConnectorClient     = connectorClient.GetTeamsConnectorClient();
            ConversationList     conversationListResponse = teamsConnectorClient.Teams.FetchChannelList("TestTeamId");
        }
        public void TeamsAPI_FetchTeamDetailsTestInvalidTeamId()
        {
            Microsoft.Rest.ServiceClientTracing.IsEnabled = true;
            TestDelegatingHandler testHandler = new TestDelegatingHandler((request) =>
            {
                StringContent stringContent = new StringContent("RandomRandomRandom");
                var response     = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = stringContent;
                return(Task.FromResult(response));
            });

            ConnectorClient connectorClient = new ConnectorClient(
                new Uri("https://smba.trafficmanager.net/amer-client-ss.msg/"),
                ConfigurationManager.AppSettings["MicrosoftAppId"],
                ConfigurationManager.AppSettings["MicrosoftAppPassword"],
                testHandler);

            TeamsConnectorClient teamsConnectorClient = connectorClient.GetTeamsConnectorClient();

            teamsConnectorClient.Teams.FetchTeamDetails(null);
        }
示例#12
0
        public void TeamsAPI_FetchChannelListTest()
        {
            Microsoft.Rest.ServiceClientTracing.IsEnabled = true;
            ConversationList conversationList = new ConversationList
            {
                Conversations = new List <ChannelInfo>
                {
                    new ChannelInfo
                    {
                        Id   = "ChannelId",
                        Name = "ChannelName"
                    }
                }
            };

            TestDelegatingHandler testHandler = new TestDelegatingHandler((request) =>
            {
                StringContent stringContent = new StringContent(JsonConvert.SerializeObject(conversationList));
                var response     = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = stringContent;
                return(Task.FromResult(response));
            });

            ConnectorClient connectorClient = new ConnectorClient(
                new Uri("https://smba.trafficmanager.net/amer-client-ss.msg/"),
                ConfigurationManager.AppSettings["MicrosoftAppId"],
                ConfigurationManager.AppSettings["MicrosoftAppPassword"],
                testHandler);

            TeamsConnectorClient teamsConnectorClient = connectorClient.GetTeamsConnectorClient();

            ConversationList conversationListResponse = teamsConnectorClient.Teams.FetchChannelList("TestTeamId");

            Assert.IsNotNull(conversationListResponse);
            Assert.IsNotNull(conversationListResponse.Conversations);
            Assert.AreEqual(conversationListResponse.Conversations.Count, 1);
            Assert.AreEqual(conversationListResponse.Conversations[0].Id, conversationList.Conversations[0].Id);
            Assert.AreEqual(conversationListResponse.Conversations[0].Name, conversationList.Conversations[0].Name);
        }
示例#13
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);
                }
            }
        }
示例#14
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);
            }
        }
示例#15
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());
                }
            }
        }
示例#16
0
        /// <summary>
        /// Every Conversation turn for our EchoBot will call this method. In here
        /// the bot checks the Activty type to verify it's a message, bumps the
        /// turn conversation 'Turn' count, and then echoes the users typing
        /// back to them.
        /// </summary>
        /// <param name="context">Turn scoped context containing all the data needed
        /// for processing this conversation turn. </param>
        public async Task OnTurn(ITurnContext context)
        {
            try {
                // This bot is only handling Messages
                if (context.Activity.Type == ActivityTypes.Message)
                {
                    // Get the conversation state from the turn context
                    var state = context.GetConversationState <OneMeetBotState>();

                    // Bump the turn count.
                    state.TurnCount++;

                    var messageText = context.Activity.Text;

                    // Remove bot name mention
                    messageText = GetMessageWithoutMention(context, messageText);
                    messageText = messageText.Replace("<at>", "");
                    messageText = messageText.Replace("</at>", "");
                    messageText = messageText.Trim();

                    int idx = 0;
                    while (!char.IsLetterOrDigit(messageText[idx]))
                    {
                        ++idx;
                    }
                    messageText = messageText.Substring(idx);

                    // Check user intention
                    var lowerCaseMessage = messageText.ToLower();

                    // Initialize bot in channel case
                    if (lowerCaseMessage.StartsWith("here"))
                    {
                        if (context.Activity.ChannelId == "msteams")
                        {
                            Configuration.TeamsConversationId = context.Activity.Conversation.Id;
                            Configuration.TeamsConversationId = Configuration.TeamsConversationId.Split(';')[0];
                        }
                        else if (context.Activity.ChannelId == "skype")
                        {
                            Configuration.SkypeConversationId = context.Activity.Conversation.Id;
                        }
                        await context.SendActivity("Success! You have registered the bot in this channel!");
                    }
                    // Join/leave the event button clicked case
                    else if (lowerCaseMessage.StartsWith("joinleave"))
                    {
                        try
                        {
                            var           cardData    = JsonConvert.DeserializeObject <EventCardData>(context.Activity.Value.ToString());
                            EventCardData newCardData = null;

                            var eventDateTime = DateTimeOffset.Parse(cardData.EventData.Time);
                            var userDateTime  = context.Activity.LocalTimestamp;

                            if (DateTimeOffset.Compare(eventDateTime, userDateTime.Value) < 0)
                            {
                                await SendPrivateMessage(context, $"You cannot join the evnet, because it has already ended. \U0001F613");

                                return;
                            }

                            try
                            {
                                newCardData = database.UpdateAtendees(cardData.ResourceResponseId, new Atendee(context.Activity.From.Name));
                            } catch (Exception)  {
                                await SendPrivateMessage(context, "An error occured when updating Attendees. \U0001F613");
                            }

                            if (newCardData != null)
                            {
                                await context.UpdateActivity(CreateActivityForEvent(context, newCardData));
                            }
                            else
                            {
                                await SendPrivateMessage(context, "An error occured when updating Attendees. \U0001F613");
                            }
                        } catch (Exception) {
                            await SendPrivateMessage(context, "An error occured when reading event data. \U0001F613");
                        }
                    }
                    // Cancel the event button clicked case
                    else if (lowerCaseMessage.StartsWith("cancelevent"))
                    {
                        try
                        {
                            var cardData = JsonConvert.DeserializeObject <EventCardData>(context.Activity.Value.ToString());

                            // Check if user is eligible to cancel the event
                            if (context.Activity.From.Name == cardData.CreatorName)
                            {
                                await context.UpdateActivity(CancelEvent(context, cardData));
                            }
                            else
                            {
                                await SendPrivateMessage(context, "You cannot cancel the event, because you are not its creator.");
                            }
                        }
                        catch (Exception)
                        {
                            await SendPrivateMessage(context, "An error occured when reading event data. \U0001F613");
                        }
                    }
                    // GroupMeet direct command call case
                    else if (lowerCaseMessage.StartsWith("groupmeet"))
                    {
                        try
                        {
                            var newEvent = await ParseNewEvent(context, messageText, luisConnector);

                            if (newEvent == null)
                            {
                                await SendPrivateMessage(context, "Sorry, I did not understand correctly. \U0001F613");
                            }
                            else
                            {
                                await SendEventToTeams(context, newEvent);
                            }
                        } catch (Exception) {
                            await SendPrivateMessage(context, "Sorry, error occured during parsing command. \U0001F613");
                        }
                    }
                    // PairMeet command call case
                    else if (lowerCaseMessage.StartsWith("pairmeet"))
                    {
                        try {
                            var serviceUri = new Uri(context.Activity.ServiceUrl, UriKind.Absolute);
                            using (var client = new ConnectorClient(serviceUri, credentials))
                            {
                                var membersResponse = await client.Conversations.GetConversationMembersWithHttpMessagesAsync(context.Activity.Conversation.Id);

                                var members = membersResponse.Body.ToList();
                                var pairs   = new Dictionary <ChannelAccount, ChannelAccount>();

                                Random rnd = new Random();
                                while (members.Count > 1)
                                {
                                    int otherIndex = rnd.Next(1, members.Count);
                                    pairs.Add(members[0], members[otherIndex]);
                                    members.RemoveAt(otherIndex);
                                    members.RemoveAt(0);
                                }
                                if (members.Count == 1)
                                {
                                    pairs.Add(members[0], members[0]);
                                    members.Clear();
                                }

                                Microsoft.Bot.Connector.Authentication.MicrosoftAppCredentials.TrustServiceUrl(context.Activity.ServiceUrl, System.DateTime.MaxValue);
                                var teamsClient      = client.GetTeamsConnectorClient();
                                var teamsChannelData = context.Activity.GetChannelData <Microsoft.Bot.Connector.Teams.Models.TeamsChannelData>();

                                foreach (var pair in pairs)
                                {
                                    var conversationResponse = await client.Conversations.CreateOrGetDirectConversation(
                                        context.Activity.Recipient,
                                        pair.Key,
                                        teamsChannelData.Tenant.Id);

                                    await client.Conversations.SendToConversationWithHttpMessagesAsync(conversationResponse.Id, GetPairMeetActivity(pair.Key, pair.Value));

                                    if (pair.Key != pair.Value)
                                    {
                                        conversationResponse = await client.Conversations.CreateOrGetDirectConversation(
                                            context.Activity.Recipient,
                                            pair.Value,
                                            teamsChannelData.Tenant.Id);

                                        await client.Conversations.SendToConversationWithHttpMessagesAsync(conversationResponse.Id, GetPairMeetActivity(pair.Value, pair.Key));
                                    }
                                }

                                await context.SendActivity("I have notified the users in private messages!");
                            }
                        } catch (ErrorResponseException ex) {
                            await context.SendActivity(ex.Response.Content.ToString());
                        } catch (Exception ex) {
                            await context.SendActivity(ex.ToString());
                        }
                    }
                    else if (lowerCaseMessage.StartsWith("time"))
                    {
                        await context.SendActivity("Your time is: " + context.Activity.LocalTimestamp.ToString());
                    }
                    // Default case
                    else
                    {
                        // Try to analyse user message with Natural Language Processing
                        LUIS.Response response = await luisConnector.MakeRequest(messageText);

                        // Check if with high probability user want to cancel the request
                        if (response.topScoringIntent.intent == LUIS.Connector.CANCEL && response.topScoringIntent.score > 0.40)
                        {
                            state.luisConversationState = LUIS.ConversationState.ANALYZE_REQUEST;
                            await context.SendActivity(GetCancelMessage());

                            return;
                        }

                        string message;

                        // Check the conversation state
                        switch (state.luisConversationState)
                        {
                        case LUIS.ConversationState.ANALYZE_REQUEST:
                            if (response.topScoringIntent.intent == LUIS.Connector.CREATE_GROUP_MEET ||
                                response.intents.Find(i => i.intent == LUIS.Connector.CREATE_GROUP_MEET).score > response.intents.Find(i => i.intent == LUIS.Connector.HELP).score)
                            {
                                string first_reply = luisConnector.GetFirstAnswer(context, response, out state.detectedInformation);
                                state.luisConversationState = LUIS.ConversationState.ASK_NEXT;
                                await SendPrivateMessage(context, $"{first_reply}");
                            }
                            else if (response.topScoringIntent.intent == LUIS.Connector.HELP || response.topScoringIntent.intent == LUIS.Connector.GREET)
                            {
                                await SendPrivateMessage(context, GetHelpMessage(context));
                            }
                            else
                            {
                                await SendPrivateMessage(context, $"I did not understand... \U0001F613 If you want to create group meet, please send me a message with activity, place and time.");
                            }
                            break;

                        case LUIS.ConversationState.ASK_ACTIVITY:
                            message = luisConnector.GetActivity(response, ref state.detectedInformation, ref state.luisConversationState);
                            await context.SendActivity($"{message}");

                            break;

                        case LUIS.ConversationState.GET_ACTIVITY_AS_MESSAGE:
                            state.detectedInformation.Activity = messageText;
                            state.luisConversationState        = LUIS.ConversationState.ASK_NEXT;
                            await context.SendActivity($"I set activity to {messageText}.");

                            break;

                        case LUIS.ConversationState.ASK_PLACE:
                            message = luisConnector.GetPlace(response, ref state.detectedInformation, ref state.luisConversationState);
                            await context.SendActivity($"{message}");

                            break;

                        case LUIS.ConversationState.GET_PLACE_AS_MESSAGE:
                            state.detectedInformation.EventPlace = messageText;
                            state.luisConversationState          = LUIS.ConversationState.ASK_NEXT;
                            await context.SendActivity($"I set place to {messageText}.");

                            break;

                        case LUIS.ConversationState.ASK_TIME:
                            message = luisConnector.GetTime(context, response, ref state.detectedInformation, ref state.luisConversationState);
                            await context.SendActivity($"{message}");

                            break;

                        case LUIS.ConversationState.GET_TIME_AS_MESSAGE:
                            state.detectedInformation.Time = messageText;
                            state.luisConversationState    = LUIS.ConversationState.ASK_NEXT;
                            await context.SendActivity($"I set time to {messageText}.");

                            break;

                        case LUIS.ConversationState.ASK_PEOPLE:
                            message = luisConnector.GetPeople(response, ref state.detectedInformation, ref state.luisConversationState);
                            await context.SendActivity($"{message}");

                            break;

                        case LUIS.ConversationState.ASK_MEETING_PLACE:
                            message = luisConnector.GetMeetingPlace(response, ref state.detectedInformation, ref state.luisConversationState);
                            await context.SendActivity($"{message}");

                            break;

                        case LUIS.ConversationState.GET_MEETING_PLACE_AS_MESSAGE:
                            state.detectedInformation.MeetingPlace = messageText;
                            state.luisConversationState            = LUIS.ConversationState.CONFIRM_REQUEST;
                            await context.SendActivity($"I set place to {messageText}.");

                            break;

                        case LUIS.ConversationState.CONFIRM_REQUEST:
                            if (response.intents.Find(i => i.intent == LUIS.Connector.CONFIRM).score > response.intents.Find(i => i.intent == LUIS.Connector.CANCEL).score)
                            {
                                state.luisConversationState = LUIS.ConversationState.ANALYZE_REQUEST;
                                await SendEventToTeams(context, state.detectedInformation);
                            }
                            else
                            {
                                state.luisConversationState = LUIS.ConversationState.ANALYZE_REQUEST;
                                await context.SendActivity(GetCancelMessage());
                            }
                            break;

                        default:
                            // Check cancel again
                            state.luisConversationState = LUIS.ConversationState.ANALYZE_REQUEST;
                            if (response.topScoringIntent.intent == LUIS.Connector.CANCEL)
                            {
                                await SendPrivateMessage(context, GetCancelMessage());
                            }
                            else
                            {
                                await SendPrivateMessage(context, $"Sorry, I did not understand... Please try to create the event again");
                            }

                            break;
                        }
                        if (state.luisConversationState == LUIS.ConversationState.ASK_NEXT)
                        {
                            var checkStateResp = luisConnector.CheckState(state.detectedInformation);
                            state.luisConversationState = checkStateResp.Item1;
                            await context.SendActivity($"{checkStateResp.Item2}");
                        }
                        if (state.luisConversationState == LUIS.ConversationState.CONFIRM_REQUEST)
                        {
                            await context.SendActivity(GetFinalInformation(state.detectedInformation));
                        }
                    }
                }
                else if (context.Activity.Type == ActivityTypes.ConversationUpdate)
                {
                }
            } catch (Exception e) {
                Console.WriteLine(e.ToString());
            }
        }
示例#17
0
        /// <summary>
        /// Handles text message input sent by user.
        /// </summary>
        /// <param name="activity">Incoming request from Bot Framework.</param>
        /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param>
        /// <returns>Task tracking operation.</returns>
        private static async Task HandleTextMessagesAsync(Activity activity, ConnectorClient connectorClient)
        {
            if (activity.Text.Contains("GetChannels"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

                ConversationList channels = connectorClient.GetTeamsConnectorClient().Teams.FetchChannelList(activity.GetChannelData <TeamsChannelData>().Team.Id);

                // Adding to existing text to ensure @Mention text is not replaced.
                replyActivity.Text = replyActivity.Text + " <p>" + string.Join("</p><p>", channels.Conversations.ToList().Select(info => info.Name + " --> " + info.Id));
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("GetTenantId"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity = replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

                if (!activity.Conversation.IsGroup.GetValueOrDefault())
                {
                    replyActivity = replyActivity.NotifyUser();
                }

                replyActivity.Text += " Tenant ID - " + activity.GetTenantId();
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("Create1on1"))
            {
                var      response    = connectorClient.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());
                Activity newActivity = new Activity()
                {
                    Text         = "Hello",
                    Type         = ActivityTypes.Message,
                    Conversation = new ConversationAccount
                    {
                        Id = response.Id
                    },
                };

                await connectorClient.Conversations.SendToConversationAsync(response.Id, newActivity);
            }
            else if (activity.Text.Contains("GetMembers"))
            {
                var           response      = (await connectorClient.Conversations.GetConversationMembersAsync(activity.Conversation.Id)).AsTeamsChannelAccounts();
                StringBuilder stringBuilder = new StringBuilder();
                Activity      replyActivity = activity.CreateReply();
                replyActivity.Text = string.Join("</p><p>", response.ToList().Select(info => info.GivenName + " " + info.Surname + " --> " + info.ObjectId));
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("TestRetry"))
            {
                for (int i = 0; i < 15; i++)
                {
                    Activity replyActivity = activity.CreateReply();
                    replyActivity.Text = "Message Count " + i;
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
                }
            }
            else if (activity.Text.Contains("O365Card"))
            {
                O365ConnectorCard card          = CreateSampleO365ConnectorCard();
                Activity          replyActivity = activity.CreateReply();
                replyActivity.Attachments = new List <Attachment>();
                Attachment plAttachment = card.ToAttachment();
                replyActivity.Attachments.Add(plAttachment);
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("Signin"))
            {
                var userId = activity.From.Id;
                //if (userIdFacebookTokenCache.ContainsKey(userId))
                //{
                //    // Use cached token
                //    var token = userIdFacebookTokenCache[userId];
                //    try
                //    {
                //        // Send a thumbnail card with user's FB profile
                //        var card = await CreateFBProfileCard(token);
                //        Activity replyActivity = activity.CreateReply();
                //        replyActivity.Text = "Cached credential is found. Use cached token to fetch info.";
                //        replyActivity.Attachments.Add(card);
                //        await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
                //    }
                //    catch (Exception)
                //    {
                //        await SendSigninCardAsync(activity, connectorClient);
                //    }
                //}
                //else
                //{
                //    // No token cached: issue a new Signin card
                //    await SendSigninCardAsync(activity, connectorClient);
                //}
            }
            else if (activity.Text.Contains("Signout"))
            {
                var userId = activity.From.Id;
                //userIdFacebookTokenCache.Remove(userId);
                Activity replyActivity = activity.CreateReply();
                replyActivity.Text = "Your credential has been removed.";
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("GetTeamDetails"))
            {
                if (string.IsNullOrEmpty(activity.GetChannelData <TeamsChannelData>()?.Team?.Id))
                {
                    Activity replyActivity = activity.CreateReply();
                    replyActivity.Text = "This call can only be made from a Team.";
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
                }
                else
                {
                    var teamDetails = await connectorClient.GetTeamsConnectorClient().Teams.FetchTeamDetailsAsync(activity.GetChannelData <TeamsChannelData>().Team.Id);

                    Activity replyActivity = activity.CreateReply();
                    replyActivity.Text = "<p>Team Id " + teamDetails.Id + " </p>" +
                                         "<p>Team Name " + teamDetails.Name + " </p>" +
                                         "<p>Team AAD Group Id " + teamDetails.AadGroupId + " </p>";
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
                }
            }
            else
            {
                var accountList = connectorClient.Conversations.GetConversationMembers(activity.Conversation.Id);

                Activity replyActivity = activity.CreateReply();
                replyActivity.Text = "Help " +
                                     "<p>Type GetChannels to get List of Channels. </p>" +
                                     "<p>Type GetTenantId to get Tenant Id </p>" +
                                     "<p>Type Create1on1 to create one on one conversation. </p>" +
                                     "<p>Type GetMembers to get list of members in a conversation (team or direct conversation). </p>" +
                                     "<p>Type TestRetry to get multiple messages from Bot in throttled and retried mechanism. </p>" +
                                     "<p>Type O365Card to get a O365 actionable connector card. </p>" +
                                     "<p>Type Signin to issue a Signin card to sign in a Facebook app. </p>" +
                                     "<p>Type Signout to logout Facebook app and clear cached credentials. </p>" +
                                     "<p>Type GetTeamDetails to get details for the current team. </p>";
                replyActivity = replyActivity.AddMentionToText(activity.From);
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
        }
示例#18
0
        public static async Task EchoMessage(ConnectorClient connector, Activity activity)
        {
            if (activity.Type.Equals("message"))
            {
                var channelThing = activity.GetChannelData <TeamsChannelData>();

                string   messagyBoi = activity.GetTextWithoutMentions();
                Activity reply      = null;

                //If you get the super secret channel save data command
                if (messagyBoi.Equals("Yo save channel data"))
                {
                    //Check to see whether we've already got it
                    DbChannel existingChannel = ShuffleSQLHelper.SqlGetSingleChannel(channelThing.Channel.Id, channelThing.Team.Id);
                    if (existingChannel != null)
                    {
                        reply = activity.CreateReply($"Nah fam, you already got data for Channel: {existingChannel.ChannelName}");
                    }
                    else
                    {
                        //If you channel id matches the team id, you're in the autogenerate General
                        if (channelThing.Channel.Id.Equals(channelThing.Team.Id))
                        {
                            var addChannel = new DbChannel()
                            {
                                ChannelId   = channelThing.Channel.Id,
                                TeamId      = channelThing.Team.Id,
                                ChannelName = "General"
                            };

                            ShuffleSQLHelper.SqlInsertChannel(addChannel);
                            reply = activity.CreateReply($"Added data for Channel: {addChannel.ChannelName}");
                        }
                        else
                        {
                            //We gotta get the channels and figure out which one we're in
                            var convoList      = connector.GetTeamsConnectorClient().Teams.FetchChannelList(channelThing.Team.Id);
                            var currentChannel = convoList.Conversations.First(x => x.Id.Equals(channelThing.Channel.Id));

                            var addChannel = new DbChannel()
                            {
                                ChannelId   = currentChannel.Id,
                                TeamId      = channelThing.Team.Id,
                                ChannelName = currentChannel.Name
                            };

                            ShuffleSQLHelper.SqlInsertChannel(addChannel);
                            reply = activity.CreateReply($"Added data for Channel: {addChannel.ChannelName}");
                        }
                    }
                }
                else if (messagyBoi.Equals("Yo save team data"))
                {
                    DbTeam existingTeam = ShuffleSQLHelper.SqlGetSingleTeam(channelThing.Team.Id);
                    if (existingTeam != null)
                    {
                        reply = activity.CreateReply($"Nah fam, you already got data for Team: {existingTeam.TeamName}");
                    }
                    else
                    {
                        var teamInfo = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(channelThing.Team.Id);

                        var addTeam = new DbTeam()
                        {
                            TeamId   = teamInfo.Id,
                            TeamName = teamInfo.Name
                        };

                        ShuffleSQLHelper.SqlInsertTeam(addTeam);
                        reply = activity.CreateReply($"Added data for Team: {addTeam.TeamName}");
                    }
                }
                else
                {
                    var members = await connector.Conversations.GetConversationMembersAsync(activity.Conversation.Id);

                    //var reply = activity.CreateReply($"The members are {string.Join("\n\n", members.Select(x => x.Name))}");

                    reply = activity.CreateReply($"Shuffles Deck... Pulls Card\n\n");

                    Random rnd      = new Random();
                    int    poorSoul = rnd.Next(members.Count);

                    reply.AddMentionToText(members[poorSoul], MentionTextLocation.AppendText);

                    var newPull = new DbPull()
                    {
                        CallerName  = activity.From.Name,
                        PulledName  = members[poorSoul].Name,
                        TeamId      = channelThing.Team.Id,
                        ChannelId   = channelThing.Channel.Id,
                        PullMessage = messagyBoi,
                        PullDate    = DateTime.UtcNow
                    };

                    ShuffleSQLHelper.SqlInsertPull(newPull);
                }

                await connector.Conversations.ReplyToActivityWithRetriesAsync(reply);
            }
        }
示例#19
0
        private async Task HandleChannelConversation(IDialogContext context, Microsoft.Bot.Connector.Activity activity)
        {
            var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

            // Channel conversation

            // Get the question text, and team and channel details
            var    question       = activity.Text;
            var    messageId      = activity.Id;
            var    conversationId = activity.Conversation.Id;
            var    channelData    = activity.GetChannelData <TeamsChannelData>();
            string tenantId       = channelData.Tenant.Id;
            string teamId         = channelData.Team.Id;
            string channelId      = channelData.Channel.Id;

            TeamDetails teamDetails = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(teamId);
            var         teamName    = teamDetails.Name;
            var         groupId     = teamDetails.AadGroupId;

            ConversationList channelList = connector.GetTeamsConnectorClient().Teams.FetchChannelList(teamId);
            var channel     = channelList.Conversations.Where(x => x.Id == channelId).FirstOrDefault();
            var channelName = channel?.Name;
            var topic       = channelName ?? "General";

            IList <ChannelAccount> members = await connector.Conversations.GetConversationMembersAsync(teamId);

            var teamsMembers = members.AsTeamsChannelAccounts();

            // Get original poster
            var originalPosterAsTeamsChannelAccount = teamsMembers.Where(x => x.ObjectId == activity.From.Properties["aadObjectId"].ToString()).FirstOrDefault();
            var userUpn = originalPosterAsTeamsChannelAccount.UserPrincipalName;
            var user    = SQLService.GetUser(userUpn);

            // strip @bot mention for teams
            if (activity.ChannelId == "msteams")
            {
                activity = MicrosoftTeamsChannelHelper.StripAtMentionText(activity);
            }
            else
            {
                activity.Text = activity.Text.Trim();
            }

            // strip the html tags
            question = MicrosoftTeamsChannelHelper.StripHtmlTags(activity.Text);

            var questionModel = new QuestionModel()
            {
                ID                = 0,
                TenantId          = tenantId,
                GroupId           = groupId,
                TeamId            = teamId,
                TeamName          = teamName,
                ConversationId    = conversationId,
                MessageId         = messageId,
                Topic             = topic,
                QuestionText      = question,
                QuestionSubmitted = DateTime.Now,
                OriginalPoster    = user,
                Link              = CreateLink(conversationId, tenantId, groupId, messageId, teamName, topic),
            };

            if (string.IsNullOrEmpty(question))
            {
                await HandleNoQuestion(context, activity, questionModel, channelId);
            }
            else
            {
                // get courseID
                var courseID = SQLService.GetCourseIDByName(teamName.Trim());
                var course   = SQLService.GetCourse(courseID);
                questionModel.CourseID = courseID;
                await HandleQuestionWorkflow(context, activity, course, questionModel);
            }
        }
示例#20
0
        /// <summary>
        /// Handles text message input sent by user.
        /// </summary>
        /// <param name="activity">Incoming request from Bot Framework.</param>
        /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param>
        /// <returns>Task tracking operation.</returns>
        private static async Task HandleTextMessages(Activity activity, ConnectorClient connectorClient)
        {
            if (activity.Text.Contains("GetChannels"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

                ConversationList channels = connectorClient.GetTeamsConnectorClient().Teams.FetchChannelList(activity.GetChannelData <TeamsChannelData>().Team.Id);

                // Adding to existing text to ensure @Mention text is not replaced.
                replyActivity.Text = replyActivity.Text + " <p>" + string.Join("</p><p>", channels.Conversations.ToList().Select(info => info.Name + " --> " + info.Id));
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("GetTenantId"))
            {
                Activity replyActivity = activity.CreateReply();
                replyActivity = replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

                if (!activity.Conversation.IsGroup.GetValueOrDefault())
                {
                    replyActivity = replyActivity.NotifyUser();
                }

                replyActivity.Text += " Tenant ID - " + activity.GetTenantId();
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("Create1on1"))
            {
                var      response    = connectorClient.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());
                Activity newActivity = new Activity()
                {
                    Text         = "Hello",
                    Type         = ActivityTypes.Message,
                    Conversation = new ConversationAccount
                    {
                        Id = response.Id
                    },
                };

                await connectorClient.Conversations.SendToConversationAsync(newActivity, response.Id);
            }
            else if (activity.Text.Contains("GetMembers"))
            {
                var           response      = (await connectorClient.Conversations.GetConversationMembersAsync(activity.Conversation.Id)).AsTeamsChannelAccounts();
                StringBuilder stringBuilder = new StringBuilder();
                Activity      replyActivity = activity.CreateReply();
                replyActivity.Text = string.Join("</p><p>", response.ToList().Select(info => info.GivenName + " " + info.Surname + " --> " + info.ObjectId));
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else if (activity.Text.Contains("TestRetry"))
            {
                for (int i = 0; i < 15; i++)
                {
                    Activity replyActivity = activity.CreateReply();
                    replyActivity.Text = "Message Count " + i;
                    await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
                }
            }
            else if (activity.Text.Contains("O365Card"))
            {
                O365ConnectorCard card          = CreateSampleO365ConnectorCard();
                Activity          replyActivity = activity.CreateReply();
                replyActivity.Attachments = new List <Attachment>();
                Attachment plAttachment = card.ToAttachment();
                replyActivity.Attachments.Add(plAttachment);
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
            else
            {
                var accountList = connectorClient.Conversations.GetConversationMembers(activity.Conversation.Id);

                Activity replyActivity = activity.CreateReply();
                replyActivity.Text = "Help " +
                                     "<p>Type GetChannels to get List of Channels. </p>" +
                                     "<p>Type GetTenantId to get Tenant Id </p>" +
                                     "<p>Type Create1on1 to create one on one conversation. </p>" +
                                     "<p>Type GetMembers to get list of members in a conversation (team or direct conversation). </p>" +
                                     "<p>Type TestRetry to get multiple messages from Bot in throttled and retried mechanism. </p>" +
                                     "<p>Type O365Card to get a O365 actionable connector card. </p>";
                replyActivity = replyActivity.AddMentionToText(activity.From);
                await connectorClient.Conversations.ReplyToActivityWithRetriesAsync(replyActivity);
            }
        }
示例#21
0
        private async Task MakeResponce(IDialogContext context, Activity activity)
        {
            bool bIknow;

            String res = "";

            var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));

            //var members = await connector.Conversations.GetConversationMembersAsync(context.Activity.Conversation.Id);



            // calculate something for us to return
            //int length = (activity.Text ?? string.Empty).Length;
            bIknow = false;
            TimeZoneInfo jpTimezoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");

            DateTime oDateTime = TimeZoneInfo.ConvertTimeFromUtc(System.DateTime.UtcNow, jpTimezoneInfo);

            activity.Text = Microsoft.Bot.Connector.Teams.ActivityExtensions.GetTextWithoutMentions(activity);

            //Commands check
            switch (activity.Text.ToLower())
            {
            case "/members":
            {
                // Fetch the members in the current conversation
                //var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));
                //members = await connector.Conversations.GetTeamsConversationMembersAsync(context.Activity.Conversation.Id);
                var members = await connector.Conversations.GetConversationMembersAsync(context.Activity.Conversation.Id);

                // Concatenate information about all members into a string
                var sbm = new StringBuilder();

                sbm.AppendLine("こっちゃあるチームのメンバーは、こごだっす");

                foreach (var member in members.AsTeamsChannelAccounts())
                {
                    sbm.AppendLine(Environment.NewLine);
                    sbm.AppendFormat(
                        "Name = {0} {1} , upn {2}",
                        member.GivenName, member.Surname, member.UserPrincipalName);

                    // sb.AppendLine();
                }

                // Post the member info back into the conversation
                await context.PostAsync(sbm.ToString());

                return;
            }


            case "/channels":
                ConversationList channels = connector.GetTeamsConnectorClient().Teams.FetchChannelList(activity.GetChannelData <TeamsChannelData>().Team.Id);
                var sbc = new StringBuilder();


                sbc.AppendLine("こっちゃあるチームにあるチャンネルは以下だっす");
                foreach (var channel in channels.Conversations.ToList())
                {
                    sbc.AppendLine(Environment.NewLine);
                    string name = channel.Name;
                    if (name == null)
                    {
                        name = "Generic";
                    }
                    sbc.AppendFormat("Name = {0}", name);
                }

                await context.PostAsync(sbc.ToString());

                return;

            case "/help":
            {
                Activity replyToConversation = activity.CreateReply("Should go to conversation, in carousel format");
                replyToConversation.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                replyToConversation.Attachments      = new List <Attachment>();

                Dictionary <string, string> cardContentList = new Dictionary <string, string>();
                cardContentList.Add("PigLatin", "http://www.51sports.net/photos/client_herocard_designs/HC_Goess_front.jpg");
                cardContentList.Add("Pork Shoulder", "http://www.51sports.net/photos/client_herocard_designs/HC_Goess_front.jpg");
                cardContentList.Add("Bacon", "http://www.51sports.net/photos/client_herocard_designs/HC_Goess_front.jpg");

                foreach (KeyValuePair <string, string> cardContent in cardContentList)
                {
                    List <CardImage> cardImages = new List <CardImage>();

                    cardImages.Add(new CardImage(url: cardContent.Value));

                    List <CardAction> cardButtons = new List <CardAction>();

                    CardAction plButton = new CardAction()
                    {
                        Value = $"https://en.wikipedia.org/wiki/{cardContent.Key}",
                        Type  = "openUrl",
                        Title = "WikiPedia Page"
                    };

                    cardButtons.Add(plButton);

                    HeroCard plCard = new HeroCard()
                    {
                        Title    = $"I'm a hero card about {cardContent.Key}",
                        Subtitle = $"{cardContent.Key} Wikipedia Page",
                        Images   = cardImages,
                        Buttons  = cardButtons
                    };

                    Attachment plAttachment = plCard.ToAttachment();
                    replyToConversation.Attachments.Add(plAttachment);
                }

                // var reply =
                await connector.Conversations.SendToConversationAsync(replyToConversation);
            }
                return;


            default:
                break;
            }

            for (int Index = 0; Index < KnownWords.Length; Index++)
            {
                //activity.Text = Microsoft.Bot.Connector.Teams.ActivityExtensions.GetTextWithoutMentions(activity);
                if (activity.Text.Contains(KnownWords[Index]))
                {
                    if (KnownResps[Index] == (int)RespType.GREETING)
                    {
                        if (oDateTime.TimeOfDay.Hours >= 23)
                        {
                            res = "もうこんな時間!早くお休みください。おやすみなさい";
                        }
                        else if (oDateTime.TimeOfDay.Hours >= 18)
                        {
                            res = "こんばんは!";
                        }
                        else if (oDateTime.TimeOfDay.Hours >= 12)
                        {
                            res = "こんにちは!";
                        }
                        else if (oDateTime.TimeOfDay.Hours >= 6)
                        {
                            res = "おはようございます!今日も頑張りましょう!";
                        }
                        else if (oDateTime.TimeOfDay.Hours >= 4)
                        {
                            res = "おはようございます!ずいぶん早起きですね!まさか、徹夜ですか?";
                        }
                        else
                        {
                            res = "もうこんな時間!早くお休みください。おやすみなさい";
                        }
                    }
                    if (KnownResps[Index] == (int)RespType.TIME)
                    {
                        res = "今の時刻は " + oDateTime.TimeOfDay.ToString() + " だとおもう...";
                    }
                    if (KnownResps[Index] == (int)RespType.TENKI)
                    {
                        res = "なんだって? " + activity.Text + "だって?  ほんたらこと、神様にでも聞いてけれ";
                    }
                    bIknow = true;
                }
            }
            if (bIknow == false)
            {
                res = ResponceWords[oDateTime.TimeOfDay.Seconds % ResponceWords.Length];
            }



            // return our reply to the user
            // var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));
            Activity replyActivity = activity.CreateReply();

            replyActivity.Text = "さん! " + res;
            replyActivity.AddMentionToText(activity.From, MentionTextLocation.PrependText);

            //return context.PostAsync(res);
            await connector.Conversations.ReplyToActivityAsync(replyActivity);
        }
        public async Task HandleMessage(ConnectorClient connector, Activity activity)
        {
            bool rejected = true;

            ChallongeSQLHelper.ChallongeSQLHelperConnectionString = ConfigurationManager.AppSettings["dbConnection"];
            var channelThing = activity.GetChannelData <TeamsChannelData>();

            FrayDbTeamsTeam existingTeam = ChallongeSQLHelper.SqlGetSingleTeam(channelThing.Team.Id);

            if (existingTeam == null)
            {
                var teamInfo = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(channelThing.Team.Id);

                var addTeam = new FrayDbTeamsTeam()
                {
                    TeamId   = teamInfo.Id,
                    TeamName = teamInfo.Name
                };

                ChallongeSQLHelper.SqlSaveTeam(addTeam);
                rejected = false;
            }

            //Check to see whether we've already got the channel
            FrayDbTeamsChannel existingChannel = ChallongeSQLHelper.SqlGetSingleChannel(channelThing.Channel.Id, channelThing.Team.Id);

            if (existingChannel == null)
            {
                //If your channel id matches the team id, you're in the autogenerate General
                if (channelThing.Channel.Id.Equals(channelThing.Team.Id))
                {
                    var addChannel = new FrayDbTeamsChannel()
                    {
                        ChannelId   = channelThing.Channel.Id,
                        TeamId      = channelThing.Team.Id,
                        ChannelName = "General",
                        IsPost      = true
                    };

                    ChallongeSQLHelper.SqlSaveChannel(addChannel);
                    rejected = false;
                }
                else
                {
                    //We gotta get the channels and figure out which one we're in
                    var convoList      = connector.GetTeamsConnectorClient().Teams.FetchChannelList(channelThing.Team.Id);
                    var currentChannel = convoList.Conversations.First(x => x.Id.Equals(channelThing.Channel.Id));

                    var addChannel = new FrayDbTeamsChannel()
                    {
                        ChannelId   = currentChannel.Id,
                        TeamId      = channelThing.Team.Id,
                        ChannelName = currentChannel.Name,
                        IsPost      = true
                    };

                    ChallongeSQLHelper.SqlSaveChannel(addChannel);
                    rejected = false;
                }
            }

            Activity reply = null;

            if (rejected)
            {
                reply = activity.CreateReply("That's going to be a hard pass");
            }
            else
            {
                reply = activity.CreateReply("Saved the data");
            }

            await connector.Conversations.ReplyToActivityWithRetriesAsync(reply);
        }
        private async Task HandleSystemActivity(ConnectorClient connectorClient, Activity message)
        {
            this.telemetryClient.TrackTrace("Processing system message");

            try
            {
                var teamsChannelData = message.GetChannelData <TeamsChannelData>();
                var tenantId         = teamsChannelData.Tenant.Id;

                var teamsTeamId   = teamsChannelData.Team?.Id;
                var teamsTeamName = teamsChannelData.Team?.Name;

                var channelId   = teamsChannelData.Channel?.Id;
                var channelName = teamsChannelData.Channel?.Name;

                channelId = "19:[email protected]"; // Temporary fallback

                var channelsResponse = await connectorClient.GetTeamsConnectorClient().Teams.FetchChannelListWithHttpMessagesAsync(teamsTeamId);

                ConversationList channels = channelsResponse.Body;
                var channelsString        = "";

                foreach (var channel in channels.Conversations)
                {
                    channelsString += channel.Id + ":" + channel.Name + "|";
                }

                if (message.Type == ActivityTypes.ConversationUpdate)
                {
                    // conversation-update fires whenever a new 1:1 gets created between us and someone else as well
                    // only process the Teams ones.
                    if (string.IsNullOrEmpty(teamsChannelData?.Team?.Id))
                    {
                        // conversation-update is for 1:1 chat. Just ignore.
                        return;
                    }

                    string myBotId = message.Recipient.Id;
                    string teamId  = message.Conversation.Id;

                    if (message.MembersAdded?.Count() > 0)
                    {
                        foreach (var member in message.MembersAdded)
                        {
                            if (member.Id == myBotId)
                            {
                                this.telemetryClient.TrackTrace($"Bot installed to team {teamId}");

                                var properties = new Dictionary <string, string>
                                {
                                    { "Scope", message.Conversation?.ConversationType },
                                    { "TeamId", teamId },
                                    { "InstallerId", message.From.Id },
                                    { "TeamsTeamId", teamsTeamId },
                                    { "TeamsTeamName", teamsTeamName },
                                    { "ChannelId", channelId },
                                    { "ChannelName", channelName },
                                    { "Channels", channelsString },
                                };
                                this.telemetryClient.TrackEvent("AppInstalled", properties);

                                // Try to determine the name of the person that installed the app, which is usually the sender of the message (From.Id)
                                // Note that in some cases we cannot resolve it to a team member, because the app was installed to the team programmatically via Graph
                                var teamMembers = await connectorClient.Conversations.GetConversationMembersAsync(teamId);

                                var personThatAddedBot = teamMembers.FirstOrDefault(x => x.Id == message.From.Id)?.Name;

                                await this.bot.SaveAddedToTeam(message.ServiceUrl, teamId, tenantId, personThatAddedBot);

                                await this.bot.WelcomeTeam(connectorClient, teamId, channelId, personThatAddedBot);
                            }
                            else
                            {
                                this.telemetryClient.TrackTrace($"New member {member.Id} added to team {teamsChannelData.Team.Id}");

                                var installedTeam = await this.bot.GetInstalledTeam(teamsChannelData.Team.Id);

                                await this.bot.WelcomeUser(connectorClient, member.Id, tenantId, teamsChannelData.Team.Id, installedTeam.InstallerName);
                            }
                        }
                    }

                    if (message.MembersRemoved?.Any(x => x.Id == myBotId) == true)
                    {
                        this.telemetryClient.TrackTrace($"Bot removed from team {teamId}");

                        var properties = new Dictionary <string, string>
                        {
                            { "Scope", message.Conversation?.ConversationType },
                            { "TeamId", teamId },
                            { "UninstallerId", message.From.Id },
                        };
                        this.telemetryClient.TrackEvent("AppUninstalled", properties);

                        // we were just removed from a team
                        await this.bot.SaveRemoveFromTeam(message.ServiceUrl, teamId, tenantId);
                    }
                }
            }
            catch (Exception ex)
            {
                this.telemetryClient.TrackTrace($"Error while handling system activity: {ex.Message}", SeverityLevel.Warning);
                this.telemetryClient.TrackException(ex);
                throw;
            }
        }