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); } }
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); } }
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); }
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); }
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()); } }
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); }
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); }
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); } } }
private async Task HandleBotHelpful(Microsoft.Bot.Connector.Activity activity) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // Question has been answered // store answer in db. // get question details int questionId = Convert.ToInt32((activity.Value as dynamic)["questionId"]); string answer = (activity.Value as dynamic)["answer"]; int answerId = Convert.ToInt32((activity.Value as dynamic)["qnaId"]); var question = SQLService.GetQuestion(questionId); // get user details var channelData = activity.GetChannelData <Microsoft.Bot.Connector.Teams.Models.TeamsChannelData>(); var members = await connector.Conversations.GetConversationMembersAsync(channelData.Team.Id); var teamsMembers = members.AsTeamsChannelAccounts(); var currentUser = teamsMembers.Where(x => x.ObjectId == activity.From.Properties["aadObjectId"].ToString()).FirstOrDefault(); var studentUPN = currentUser.UserPrincipalName; var isUserAdmin = SQLService.IsUserAdmin(studentUPN); // store question in qna string teamId = channelData.Team.Id; TeamDetails teamDetails; try { teamDetails = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(teamId); } catch (Exception e) { teamDetails = connector.GetTeamsConnectorClient().Teams.FetchTeamDetails(teamId); Trace.TraceError(e.ToString()); } var teamName = teamDetails.Name; var courseID = SQLService.GetCourseIDByName(teamName.Trim()); // check if user can set question status if (isUserAdmin || (studentUPN == question.OriginalPoster.Email) || (studentUPN == question.OriginalPoster.UserName)) // double check question to course? not sure { var answeredBy = SQLService.GetBotUser(courseID); // update question model question.QuestionStatus = Constants.QUESTION_STATUS_ANSWERED; question.QuestionAnswered = DateTime.Now; question.AnswerText = answer; question.AnswerPoster = answeredBy; SQLService.CreateOrUpdateQuestion(question); // update old activity Microsoft.Bot.Connector.Activity updatedReply = activity.CreateReply(); var card = new AdaptiveCard(); var answerBlock = new AdaptiveTextBlock("Answer: " + question.AnswerText.ReplaceLinksWithMarkdown()); answerBlock.Weight = AdaptiveTextWeight.Bolder; answerBlock.Size = AdaptiveTextSize.Medium; answerBlock.Wrap = true; var markedBlock = new AdaptiveTextBlock($"Marked as " + question.QuestionStatus + " by " + currentUser.Name); markedBlock.Wrap = true; var answeredBlock = new AdaptiveTextBlock("Answered by: " + question.AnswerPoster.FullName); answeredBlock.Weight = AdaptiveTextWeight.Bolder; answeredBlock.Wrap = true; card.Body.Add(answerBlock); card.Body.Add(answeredBlock); card.Body.Add(markedBlock); Attachment attachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card, }; updatedReply.Attachments.Add(attachment); await connector.Conversations.UpdateActivityAsync(activity.Conversation.Id, activity.ReplyToId, updatedReply); var predictiveQnAService = new PredictiveQnAService(courseID); var res = await predictiveQnAService.UpdateQnAPair(new List <string> { question.QuestionText }, null, answer, answerId); } }
private async Task 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()); } } }
/// <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()); } }
/// <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); } }
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); } }
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); } }
/// <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); } }
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; } }