Bot Framework v3.0부터 시작하는 BOT 개발: 커뮤니케이션의 기본 클래스 - Dialog(1)
Microsoft Bot Framework v3.0부터 시작하는 BOT 개발: 첫 번째 단계
다음은 커뮤니케이션 프로세스를 다루는 Dialog에 대해 자세히 설명합니다.
Dialog를 사용한 기본 BOT 동작 개발
BOT 로서의 기본 조작, 메세지를 수신하면 내용을 취득해 응답을 돌려주는 프로세스를 작성해 갑니다.
Visual Studio 템플릿에서 새 BOT 응용 프로그램 만들기 - 아래 준비
Bot Framework를 사용하기 위한 개발 환경 을 참고로 개발 환경을 작성해, Visual Studio 템플릿에서 Bot 응용 프로그램 만들기 와 같은 프로세스로 신규 어플리케이션을 작성합니다. 이번에는 EchoBot이라는 이름으로 작성하고 있습니다.
템플릿에서 만든 MessageController.cs(Controller 폴더 아래에 있음)를 편집합니다.
먼저 Bot.Builder.Dialogs에 대한 참조를 추가합니다.
MessageController.csusing Microsoft.Bot.Builder.Dialogs;
템플릿에서는 Post 클래스에서 수신 메시지를 바탕으로 응답을 돌려주는 코드가 작성되고 있습니다만, 일단 이 부분을 삭제 or 코멘트 아웃 합니다.
MessageController.cspublic class MessagesController : ApiController
{
:
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
//public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
// {
// if (activity.Type == ActivityTypes.Message)
:
// }
// var response = Request.CreateResponse(HttpStatusCode.OK);
// return response;
//}
Dialog를 사용하여 간단한 메시지 수신 및 회신
사용자로부터 메시지를 받았는지 여부는 Microsoft.Bot.Connector.Activity.GetActivityType으로 진단합니다.
ActivityType.Message 에서는 응답을 작성해 송신하는 Post 클래스를 MessagesController 클래스내에 아래와 같이 작성합니다. Microsoft.Bot.Builder.Dialogs.Conversations.SendAsync에서 받은 메시지에 응답할 수 있습니다. 응답을 작성하는 클래스는 EchoDialog입니다 (→ 다음 항목으로 작성합니다).
ActivityType.Message 이외의 Activity 의 경우는, 템플릿의 HandleSystemMessage 를 그대로 이용합니다.
두 경우 모두 HttpStatusCode.Accepted(=202)를 반환합니다.
MessageController.cspublic class MessagesController : ApiController
{
:
[ResponseType(typeof(void))]
public virtual async Task<HttpResponseMessage> Post ([FromBody] Activity activity)
{
if (activity != null)
{
if (activity.GetActivityType()==ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new EchoDialog());
}
else
{
HandleSystemMessage(activity);
}
}
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}
템플릿에서는 activity.Type == ActivityTypes.Message 로 직접 Activity 를 판정하고 있습니다만, 상기에서는 먼저 activity != null 로 Activity 의 유무를 판정하는 코드가 되어 있습니다.
그런 다음 Post 클래스 아래에 응답을 만드는 EcoDialog 클래스를 만듭니다. 사용자의 메시지는 Microsoft.Bot.Connector.IMessageActivity에서 검색할 수 있으며 아래 코드에서는 이를 단순히 반환하는 응답을 생성합니다.
MessageController.cspublic class MessagesController : ApiController
{
:
[Serializable]
public class EchoDialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context,
IAwaitable<IMessageActivity> argument)
{
var message = await argument;
await context.PostAsync($"「{message.Text}」って言ったよね。");
context.Wait(MessageReceivedAsync);
}
}
이 간단한 응답 작성으로는 별로 문제 없습니다만, 대화수를 카운트하는 경우 등 Serializable 를 잊지 않고.
Emulator에서 동작 확인
지금까지의 내용으로 동작을 확인합니다. Bot 애플리케이션의 로컬 실행 및 에뮬레이터 액세스 마찬가지로 Visual Studio에서 F5에서 빌드 및 디버그 실행을 시작하고 Bot Framework Channel Emulator에서 메시지를 보냅니다. 입력한 메시지와 같은 문장이 대답되면 OK입니다.
Reference
이 문제에 관하여(Bot Framework v3.0부터 시작하는 BOT 개발: 커뮤니케이션의 기본 클래스 - Dialog(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/annie/items/bd4248bb07eafcf83a3a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using Microsoft.Bot.Builder.Dialogs;
public class MessagesController : ApiController
{
:
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
//public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
// {
// if (activity.Type == ActivityTypes.Message)
:
// }
// var response = Request.CreateResponse(HttpStatusCode.OK);
// return response;
//}
public class MessagesController : ApiController
{
:
[ResponseType(typeof(void))]
public virtual async Task<HttpResponseMessage> Post ([FromBody] Activity activity)
{
if (activity != null)
{
if (activity.GetActivityType()==ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new EchoDialog());
}
else
{
HandleSystemMessage(activity);
}
}
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}
public class MessagesController : ApiController
{
:
[Serializable]
public class EchoDialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context,
IAwaitable<IMessageActivity> argument)
{
var message = await argument;
await context.PostAsync($"「{message.Text}」って言ったよね。");
context.Wait(MessageReceivedAsync);
}
}
Reference
이 문제에 관하여(Bot Framework v3.0부터 시작하는 BOT 개발: 커뮤니케이션의 기본 클래스 - Dialog(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/annie/items/bd4248bb07eafcf83a3a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)