Отправить сообщение чат-боту, когда выполняется цикл - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь отправить сообщение в середине цикла while , используя моего бота.Это возможно до взлома?Из приведенного ниже кода я зацикливаюсь и автоматически отправляю сообщение боту в зависимости от состояния ответа, которое я получаю от службы .... то есть когда значение изменяется.До тех пор, пока я не достигну 5 уровня, я не ломаюсь.Есть ли способ продолжить разговор до того, как цикл действительно будет завершен?

int prev = 2;

do
{
    StatusOption(reply);
    context.Wait(StatusSelected);

    {
        int ride_status = prev;
        context.UserData.TryGetValue<int>("ride_status", out ride_status);
        string trip_status = CheckTripStatus(res[3].ToString());
        prev = ride_status;
        int current = Convert.ToInt32(trip_status);

        if (prev != current)
        {
            if (current == 2)
            {
                reply.Text = "Your driver is coming to pick you.";

                await context.PostAsync(reply);
                context.UserData.SetValue<int>("ride_status", current);
            }
            else if (current == 3)
            {

                reply.Text = "Your driver has arrived.";
                await context.PostAsync(reply);
                context.UserData.SetValue<int>("ride_status", current);
            }
            else if (current == 4)
            {
                reply.Text = "Your trip has started.";
                await context.PostAsync(reply);
                context.UserData.SetValue<int>("ride_status", current);
            }
            else if (current == 5)
            {
                reply.Text = "Your trip has ended.";
                await context.PostAsync(reply);
                context.UserData.SetValue<int>("ride_status", current);
                break;
            }
            else
            {
                StatusOption(reply);
                context.Wait(StatusSelected);
            }
        }
        Thread.Sleep(5000);
    }

}

while (prev <= 5) ;

1 Ответ

0 голосов
/ 08 июня 2018

Концептуально не рекомендуется использовать контекстный поток в длительном цикле.Ознакомьтесь с Проактивным шаблоном бот-функций Azure .Он добавляет сообщение, содержащее ConversationReference в Microsoft.WindowsAzure.Storage.Queue. Отдельная функция запускается при добавлении чего-либо в очередь и вызывает бота для отправки сообщения.Это более масштабируемый и управляемый дизайн.

Когда кто-то запрашивает поездку, вы можете добавить его ConversationReference в очередь.Вместо автоматического запуска ответа сделайте так, чтобы функция была вызвана изменениями в статусе поездки.


Другой вариант, не использующий функции, состоял бы в том, чтобы где-то хранить ConversationReference , ивыставить другую конечную точку WebApi в проекте вашего бота.Когда состояние меняется, позвоните на эту конечную точку и используйте ConversationReference , чтобы предварительно отправить гонщику сообщение о состоянии.Некоторую документацию по проактивному обмену сообщениями можно найти здесь: https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-proactive-messages?view=azure-bot-service-3.0 (примеры кода: https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/core-proactiveMessages) Примечание: это всего лишь примеры и используются статические переменные.Тем не менее, они являются хорошей отправной точкой, показывающей, как делать проактивные сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...