2017-09-06 48 views
3

我有一個方法從MS團隊收集用戶數據,而此代碼按預期工作,添加此方法會使先前的方法崩潰。方法接收來自團隊的信息導致後來的方法崩潰

public async void GetUsers() 
{ 
    string teamId = "TeamsID"; 
    string tenantId = "TenantID"; 
    var connector = new ConnectorClient(new Uri(Instance.Activity.ServiceUrl)); 
    members = await connector.Conversations.GetTeamsConversationMembersAsync(teamId, tenantId); 
    Instance.EmailList.Clear(); 
    foreach (var member in members) 
    { 
     Instance.EmailList.Add(member.Email); 
    } 

} 

我相信行:

members = await connector.Conversations.GetTeamsConversationMembersAsync(teamId, tenantId); 

當接收的用戶信息,使機器人認爲一個用戶輸入查詢,導致我後來的方法,而無需用戶輸入觸發,和崩潰,因爲有是沒有輸入或因爲輸入的數據塊是用戶數據。

這只是我的理論,我可能不正確。 下面是崩潰的方法:

async Task ReplyToQuestions(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{ 
    var AnswerHolder = await argument; 
    Answers.Add(AnswerHolder.Text); 
    Answers[AnswerCounter] = Answers[AnswerCounter].First().ToString().ToUpper() + Answers[AnswerCounter].Substring(1); 

    var isQuit = AnswerHolder.Text; 
    var isQuit2 = Regex.Match(isQuit, @"\b(Quit|quit|QUIT)\b").Value; 
    Regex rgx = new Regex(@"\b(Quit|quit|QUIT)\b"); 

    if (rgx.IsMatch(isQuit2)) // checks for the user trying to quit/restart bot 
    { 
     await context.PostAsync(string.Format("Exiting current process. Restarting.")); 
     context.Done(isQuit); // returns to the start of dialog (StartAsync) 
    } 
    else 
    { 
     if (QuestionCounter < 5) 
     { 
      await context.PostAsync(string.Format($"Question {QuestionCounter + 1}: {Question[QuestionCounter]}")); 
     } 
     AnswerCounter += 1; 
     QuestionCounter += 1; 
     if (AnswerCounter < 5) 
     { 
      context.Wait(ReplyToQuestions); 
     } 
     else if (AnswerCounter == 5) 
     { 
      PostToChannel($"{Name}'s answers to the questions are as follows: \n\nQuestion1 Answer: {Answers[0]} \n\nQuestion2 Answer: {Answers[1]} \n\n" + 
      $"Question3 Answer: {Answers[2]} \n\nQuestion4 Answer: {Answers[3]} \n\nQuestion5 Answer: {Answers[4]} \n\n", context); 

      await context.PostAsync(string.Format("Your answers have been posted to the 'What's Up' channel.")); 
      AnswerCounter = 0; 
      QuestionCounter = 1; 
      context.Done(Answers[4]); 
     } 
     else 
     { 
      await context.PostAsync($"{AnswerCounter}"); 
      await context.PostAsync(string.Format("Oh no! it appears something has gone wrong. please try re-entering your answers")); 
      AnswerCounter = 0; 
      QuestionCounter = 1; 
      context.Wait(ReplyToQuestions); 
     } 
    } 
} 

調用它,代碼:

async Task Choice(IDialogContext context, IAwaitable<IMessageActivity> argument) // this method recives and validates a question 
     { 
      var Choice = await argument; 

      var isQuit = Choice.Text; 
      var isQuit2 = Regex.Match(isQuit, @"\b(Quit|quit|QUIT)\b").Value; 
      Regex rgx = new Regex(@"\b(Quit|quit|QUIT)\b"); 
      var isEnter = Regex.Match(isQuit, @"\b(Enter|ENTER|enter)\b").Value; 
      Regex rgx2 = new Regex(@"\b(Enter|ENTER|enter)\b"); 
      var isReply = Regex.Match(isQuit, @"\b(Reply|REPLY|reply)\b").Value; 
      Regex rgx3 = new Regex(@"\b(Reply|REPLY|reply)\b"); 

      GetUsers(); 

      if (rgx.IsMatch(isQuit2)) // if the user choses to quit 
      { 
       await context.PostAsync(string.Format("Exiting current process. Restarting.")); 
       context.Done(isQuit); // restarts the program, calls the first method 
      } 
      else if (rgx2.IsMatch(isEnter)) // if the user choses to quit 
      { 
       await context.PostAsync(string.Format("Please enter your custom question.")); 
       context.Wait(EnterQuestion); 
      } 
      else if (rgx3.IsMatch(isReply)) // if the user choses to quit 
      { 
       Answers.Clear(); 
       await context.PostAsync(string.Format("Please answer the following questions:")); 
       await context.PostAsync(string.Format($"Question 1: {Question[0]}")); 
       context.Wait(ReplyToQuestions); 
      } 
      else 
      { 
       await context.PostAsync(string.Format("sorry this was not a choice, try again.")); 
      } 
     } 

有誰知道一種方法可以解決這個問題?因爲我已經花了整整兩天沒有成功。

+0

郵政錯誤和日誌跟蹤 –

+0

由於bot在Azure上進行託管並且測試是通過團隊進行的(因爲代碼是與團隊進行交互的),所以我無法接收這些內容。 – Zigy

+0

@Zigy您可以在Azure上使用AppInsights發現錯誤並記錄日誌。 此外,您應該添加更多的代碼,因爲我們目前不知道如何調用您的'GetUsers'方法,這可能是您說的問題的原因 –

回答

3

我不確定你看到了什麼錯誤。但是,所使用的方法來檢索會話成員已被棄用:https://msdn.microsoft.com/en-us/microsoft-teams/botapis#net-example該網頁上的說明應註明:

您應該遷移代碼以使用GetConversationMembersAsync(的conversationId)

var connector = new ConnectorClient(new Uri(activity.ServiceUrl)); 
var members = await connector.Conversations.GetConversationMembersAsync(activity.Conversation.Id); 
+0

謝謝埃裏克,我已經看到了這個,但我似乎無法得到這個用戶的電子郵件,這就是我需要的。除非有辦法得到我不知道的郵件,並且找不到我的(缺乏)使用Google的技能? – Zigy

+0

member.AsTeamsChannelAccount()具有擴展屬性。 –

+0

謝謝埃裏克,這已經幫助我通過了崩潰,但是現在我的程序正在接受用戶的最後輸入,並用於回答第一個問題....不同的問題,但我相信它仍然涉及到團隊的計劃info作爲用戶輸入 – Zigy

相關問題