2017-02-07 3 views
0

Есть ли способ использовать разговор, чтобы сообщение IMessageActivity, которое было отправлено пользователю, возвращается вызывающему абоненту вместо отправки обратно пользователю uri?
Что я хочу сделать, это обработать входящие и исходящие сообщения, и пока я могу создать действие, которое будет передано объекту «Разговор», я не могу прочитать и использовать ответ IMessageActivity.Bot Framework: прочитайте исходящее сообщение в разговоре

Чтобы быть более точным, я задаюсь вопросом, могу ли я заменить

Conversation.SendAsync(IMessageActivity, Func<IDialog<object>>); 

С чем-то, что позволит мне обрабатывать ответ.

спасибо.

+0

Я не уверен, если я буду следовать за вами ... ответ должен обрабатываться диалогом, переданным методу SendAsync ... –

+0

Не помешало бы мне использовать FormFlow, PromptDialog и т. Д., Так как они внутренне PostAsync в контексте? –

+0

Совсем нет ... вы можете использовать диалоговые окна и внутри этих диалоговых окон вызывать FormFlow или любой тип подсказки. Дайте мне знать, если вам нужны примеры. –

ответ

0

Ответ должен обрабатываться диалогом, переданным методу SendAsync.

В диалоговом окне вы обычно будете иметь метод, который получает контекст и сообщение, отправленное пользователем. Например:

public async virtual Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
{ 
    var message = await result; 
} 

В StartAsync методе диалога вы должны установить этот метод, как тот, который будет вызываться один раз пользователь посылает сообщение боту

public async Task StartAsync(IDialogContext context) 
{ 
    context.Wait(this.MessageReceivedAsync); 
} 

Тогда это вам решать, что делать после получения сообщения.

Вы хотите использовать PromptDialog, например. Подтвердить? Вы можете просто создать диалоговое окно, вызвать его и получить результат в методе ResumeAfter<bool>.

PromptDialog.Confirm(context, ResumeAfterPrompt, "prompt dialogue", "retry dialog", 3); 

private async Task ResumeAfterPrompt(IDialogContext context, IAwaitable<bool> result) 
{ 
    try 
    { 
     // try get user response 
     bool response = await result; 

     await context.PostAsync($"You said: {result}"); 
    } 
    catch (TooManyAttemptsException) 
    { 
     // handle error 
    } 

    // wait for another message from the user. Could be the same method or a new one following the same signature. 
    context.Wait(this.MessageReceivedAsync); 
} 

Вы хотите использовать FormFlow? Вы также просто создаете экземпляр FormDialog и получите результат в методе ResumeAfter<T>, который вы определяете.

Это всегда один и тот же шаблон при работе с несколькими диалогами (приглашения и формы - это диалоги!): Вызовите диалог, получите результат в методе ResumeAfter и дождитесь появления нового сообщения пользователя.

Все эти понятия хорошо объяснены и также продемонстрированы в Multi-Dialogs sample. Пройдите через readme и кодовую базу, и вы поймете, что я объяснил. В этом примере отображаются подсказки, FormFlow, настраиваемые диалоги и т. Д. Here есть еще несколько деталей.

+0

Я, вероятно, не объяснил точно, что я хотел получить. Я знаю, что легко получить результат от пользователя, то, что я хочу перехватить, - это содержимое, которое Dialog посылает пользователю так, что-то вроде '{ « type »:« message », « channelId »:« эмулятор " "от": { "ID": "56800324", "имя": "Bot1" }, "получатель": { "ID": "2c1c7fa3", "имя":" User1 " }, „текст“:„ответ от бота“, „replyToId“:„ba2f5b31398f48348b0f99427bed2e57“ }' Потому что я хочу, чтобы отправить свой ответ клиенту и не позволять соединитель отправки самостоятельно. –

+0

OK, используйте IActivityLogger для перехвата сообщения. Это не помешает Разговору отправить его, хотя –

+0

Незначительный вопрос, какой у вас клиент? Объясните немного больше своего сценария; вы бот и пользовательский клиент? –

Смежные вопросы