Как разрешить пользователю, только если он / она набирает «ivr» или «IVR», используя концепцию Form Flow

Я работаю над технологией фреймворка для ботов, в одном из моих текущих проектов я хочу разрешить пользователю, только если он/она введет «ivr» или «IVR», иначе он покажет некоторую обратную связь пользователю.

Для этого я написал ниже строки кода, но этот код показывает пользователю неверный вывод. Даже если пользователь вводит ivr или IVR, он показывает пользователю обратную связь в первый раз, но со второго раза он работает правильно.

    [Serializable]
class Customer
{
    //Create Account Template
    [Prompt("Please send any of these commands like **IVR** (or) **ivr**.")]
    public string StartingWord;
    public static IForm<Customer> BuildForm()
    {
        OnCompletionAsyncDelegate<Customer> accountStatus = async (context, state) =>
        {
            await Task.Delay(TimeSpan.FromSeconds(5));
            await context.PostAsync("We are currently processing your account details. We will message you the status.");

        };
        var builder = new FormBuilder<Customer>();


        return builder
                   //.Message("Welcome to the BankIVR bot! To start an conversation with this bot send **ivr** or **IVR** command.\r \n if you need help, send the **Help** command")
                   .Field(nameof(Customer.StartingWord), validate: async (state, response) =>
                   {
                       var result = new ValidateResult { IsValid = true, Value = response };
                       string str = (response as string);
                       if (str.ToLower() != "ivr")
                       {
                           result.Feedback = "I'm sorry. I didn't understand you.";
                           result.IsValid = false;
                           return result;
                       }
                       else if (str.ToLower() == "ivr")
                       {
                           result.IsValid = true;
                           return result;
                       }
                       else
                       {
                           return result;
                       }
                   })                      
                    .OnCompletion(accountStatus)
                    .Build();
    }
};

Подскажите, пожалуйста, как решить эту проблему с помощью концепции Form Flow.

-Прадип


person Pradeep    schedule 19.07.2016    source источник


Ответы (2)


Ваш код кажется мне правильным - я могу только предложить вам отладить ваш код с помощью пошагового отладчика и посмотреть, где логические тесты терпят неудачу.

Тем не менее, если это не работает для людей в Турции, это потому, что вы не должны использовать .ToLower() для нормализации текста, например, метод .ToLower() не работает для текста, который содержит турецкий символ 'I' без точек: http://archives.miloush.net/michkap/archive/2004/12/02/273619.html

Кроме того, ваш случай else никогда не сработает, потому что ваши две предыдущие проверки (!= и ==) охватывают все возможные случаи (компилятор C# в настоящее время недостаточно сложен, чтобы помечать случай else как недостижимый код).

Правильный способ сравнения без учета регистра — с String.Equals:

if( "ivr".Equals( str, StringComparison.InvariantCultureIgnoreCase ) ) {
    result.IsValid = true;
    return result;
}
else {
    result.Feedback = "I'm sorry. I didn't understand you.";
    result.IsValid = false;
}
person Dai    schedule 19.07.2016
comment
ваше выше выглядит для сравнения двух строк. но я хочу, чтобы когда-либо пользователь вводил ivr или IVR в эмуляторе канала фреймворка бота, я хочу разрешить пользователю доступ к следующим полям в потоке форм, иначе не позволяйте ему. - person Pradeep; 25.07.2016
comment
@pradeep Да, это то, что делает мой код. С какой проблемой вы столкнулись? - person Dai; 25.07.2016
comment
Моя проблема в том, что я использовал концепцию Form Flow в своем боте, но у меня возникли проблемы, когда когда-либо пользователь вводил ivr или IVR, тогда только я могу разрешить ему. В противном случае он отправляет сообщение обратной связи пользователю. - person Pradeep; 26.07.2016

Наконец, я получил результат без каких-либо проблем.

вот мой обновленный код, позволяющий только пользователю вводить слово «ivr или IVR», чтобы начать диалог с ботом.

 .Field(nameof(Customer.StartingWord), validate: async (state, response) =>
                   {
                       var result = new ValidateResult { IsValid = true, Value = response };
                       string str = (response as string);
                       if ("ivr".Equals(str, StringComparison.InvariantCultureIgnoreCase))
                       {
                           //result.IsValid = true;

                           //return result;

                       }
                       else
                       {
                           result.Feedback = "I'm sorry. I didn't understand you.";
                           result.IsValid = false;
                           //return result;
                       }
                       return result;
                   })

-Прадип

person Pradeep    schedule 18.11.2016