2017-01-06 3 views
2

Я разрабатываю чатбот с использованием Microsoftt Bot Framework и когнитивных сервисов LUIS. Я хочу, чтобы начальное приветственное сообщение было похоже на «Привет, пользователь, как вы!» как только начнет мой бот.Можем ли мы сделать чат-приветствие первым, а не только как реакцию

все, что может быть сделано здесь, в MessageController

public async Task<HttpResponseMessage> Post([FromBody]Activity activity) 
     { 
      Trace.TraceInformation($"Type={activity.Type} Text={activity.Text}"); 

      if (activity.Type == ActivityTypes.Message) 
      { 
       //await Microsoft.Bot.Builder.Dialogs.Conversation.SendAsync(activity,() => new ContactOneDialog()); 

       await Microsoft.Bot.Builder.Dialogs.Conversation.SendAsync(activity,() => 
       new ExceptionHandlerDialog<object>(new ShuttleBusDialog(), displayException: true)); 

       //await Microsoft.Bot.Builder.Dialogs.Conversation.SendAsync(activity,() => new ShuttleBusDialog()); 
      } 
      else 
      { 
       HandleSystemMessage(activity); 
      } 
      var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
      return response; 
     } 

ответ

3

Вы можете исследовать отправку сообщения в рамках ConversationUpdate мероприятия. Обновите метод HandleSystemMessage так выглядит следующее:

private async Task HandleSystemMessage(Activity message) 
    { 
     if (message.Type == ActivityTypes.DeleteUserData) 
     { 
      // Implement user deletion here 
      // If we handle user deletion, return a real message 
     } 
     else if (message.Type == ActivityTypes.ConversationUpdate) 
     { 
      ConnectorClient client = new ConnectorClient(new Uri(message.ServiceUrl)); 

      var reply = message.CreateReply(); 

      reply.Text = "Hello user how are you?" 

      await client.Conversations.ReplyToActivityAsync(reply); 
     } 
     else if (message.Type == ActivityTypes.ContactRelationUpdate) 
     { 
      // Handle add/remove from contact lists 
      // Activity.From + Activity.Action represent what happened 
     } 
     else if (message.Type == ActivityTypes.Typing) 
     { 
      // Handle knowing tha the user is typing 
     } 
     else if (message.Type == ActivityTypes.Ping) 
     { 
     } 
    } 
+0

смотрите мой комментарий в последовавшей ответ .. спасибо – Sandy

+0

я получаю ответ несколько раз в два раза. Любая идея о том, где не так? –

+1

@MohanvelV проверить https://stackoverflow.com/questions/41823446/when-user-sends-message-to-my-bot-he-receives-welcome-message-but-when-user-re –

0

В новой версии HandleSystemMessage не более асинхронный и возвращает активность, так это то, что работает для меня:

private Activity HandleSystemMessage(Activity message) 
    { 
     if (message.Type == ActivityTypes.DeleteUserData) 
     { 
      // Implement user deletion here 
      // If we handle user deletion, return a real message 
     } 
     else if (message.Type == ActivityTypes.ConversationUpdate) 
     { 
      if (message.MembersAdded.Any(o => o.Id == message.Recipient.Id)) 
      { 
       ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl)); 
       Activity reply = message.CreateReply("I am your service provider virtual assistant, How can I help you today? "); 
       connector.Conversations.ReplyToActivityAsync(reply); 
      } 

     } 
     else if (message.Type == ActivityTypes.ContactRelationUpdate) 
     { 
      // Handle add/remove from contact lists 
      // Activity.From + Activity.Action represent what happened 
     } 
     else if (message.Type == ActivityTypes.Typing) 
     { 
      // Handle knowing tha the user is typing 
     } 
     else if (message.Type == ActivityTypes.Ping) 
     { 
     } 

     return null; 
    } 

Примечания к следующие вещи:

  1. Поскольку HandleSystemMessage не является асинхронным, вы не можете «ждать», чтобы ответить.
  2. Используйте проверку ID получателя, чтобы избежать дублированных приветственных сообщений
0

Почему изменить метод HandleSystemMessage, когда вы могли бы просто справиться с этим прямо в методе Post?

Таким образом, вам не нужно возиться с созданием нового connector и использованием незнакомого метода connector.Conversations.ReplyToActivityAsync(reply).

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

public async Task<HttpResponseMessage> Post([FromBody]Activity activity) 
    { 
     // ... some code ... 

     // this will also handle the beginning of the conversation - 
     // that is when activity.Type equals to ConversationUpdate 
     if (activity.Type == ActivityTypes.Message 
      || activity.Type == ActivityTypes.ConversationUpdate) 
     { 
      // Because ConversationUpdate activity is received twice 
      // (once for the Bot being added to the conversation, and the 2nd time - 
      // for the user), we have to filter one out, if we don't want the dialog 
      // to get started twice. Otherwise the user will receive a duplicate message. 
      if (activity.Type == ActivityTypes.ConversationUpdate && 
       !activity.MembersAdded.Any(r => r.Name == "Bot")) 
       return response; 

      // start your root dialog here 
      await Microsoft.Bot.Builder.Dialogs.Conversation.SendAsync(activity,() => 
      new ExceptionHandlerDialog<object>(new ShuttleBusDialog(), displayException: true)); 
     } 
     // handle other types of activity here (other than Message and ConversationUpdate 
     // activity types) 
     else 
     { 
      HandleSystemMessage(activity); 
     } 
     var response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
     return response; 
    }