3

I have a method collecting user data from MS Teams, while this code works as intended, with this method added it makes a previously working method crash.

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);
    }

}

I believe that the Line:

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

While receiving the user information, makes the bot think that a user is inputing, causing my later methods to trigger without user input, and crashing because there is no input or because the input if the chunk of data that is the user data.

This is just my theory and I may be incorrect. The following is the method that crashes:

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);
        }
    }
}

And the code that calls it:

 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."));
            }
        }

Does anyone know a way I can fix this? As I have spent 2 full days on this without success.

4

1 回答 1

2

I'm not sure what error you are seeing. But, the method being used to retrieve conversation members has been deprecated: https://msdn.microsoft.com/en-us/microsoft-teams/botapis#net-example The note on that page should state:

you should migrate your code to use GetConversationMembersAsync(conversationId)

var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var members = await connector.Conversations.GetConversationMembersAsync(activity.Conversation.Id);
于 2017-09-06T22:44:57.213 回答