Bot Framework v3.0부터 시작하는 BOT 개발: 커뮤니케이션의 기본 클래스 - Dialog(1)

이전 기사에서는 Microsoft Bot Framework(v3.0) 템플릿을 사용하여 채팅할 수 있는 BOT(웹 서비스)를 쉽게 만들었습니다.

Microsoft Bot Framework v3.0부터 시작하는 BOT 개발: 첫 번째 단계

다음은 커뮤니케이션 프로세스를 다루는 Dialog에 대해 자세히 설명합니다.

Dialog를 사용한 기본 BOT 동작 개발



BOT 로서의 기본 조작, 메세지를 수신하면 내용을 취득해 응답을 돌려주는 프로세스를 작성해 갑니다.

Visual Studio 템플릿에서 새 BOT 응용 프로그램 만들기 - 아래 준비



Bot Framework를 사용하기 위한 개발 환경 을 참고로 개발 환경을 작성해, Visual Studio 템플릿에서 Bot 응용 프로그램 만들기 와 같은 프로세스로 신규 어플리케이션을 작성합니다. 이번에는 EchoBot이라는 이름으로 작성하고 있습니다.
Visual Studio テンプレートから Bot アプリケーションの作成

템플릿에서 만든 MessageController.cs(Controller 폴더 아래에 있음)를 편집합니다.
MessageController の編集

먼저 Bot.Builder.Dialogs에 대한 참조를 추가합니다.

MessageController.cs
using Microsoft.Bot.Builder.Dialogs;

템플릿에서는 Post 클래스에서 수신 메시지를 바탕으로 응답을 돌려주는 코드가 작성되고 있습니다만, 일단 이 부분을 삭제 or 코멘트 아웃 합니다.

MessageController.cs
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;
     //}

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.cs
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);
        }

템플릿에서는 activity.Type == ActivityTypes.Message 로 직접 Activity 를 판정하고 있습니다만, 상기에서는 먼저 activity != null 로 Activity 의 유무를 판정하는 코드가 되어 있습니다.

그런 다음 Post 클래스 아래에 응답을 만드는 EcoDialog 클래스를 만듭니다. 사용자의 메시지는 Microsoft.Bot.Connector.IMessageActivity에서 검색할 수 있으며 아래 코드에서는 이를 단순히 반환하는 응답을 생성합니다.

MessageController.cs
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);
            }
        }

이 간단한 응답 작성으로는 별로 문제 없습니다만, 대화수를 카운트하는 경우 등 Serializable 를 잊지 않고.

Emulator에서 동작 확인



지금까지의 내용으로 동작을 확인합니다. Bot 애플리케이션의 로컬 실행 및 에뮬레이터 액세스 마찬가지로 Visual Studio에서 F5에서 빌드 및 디버그 실행을 시작하고 Bot Framework Channel Emulator에서 메시지를 보냅니다. 입력한 메시지와 같은 문장이 대답되면 OK입니다.
Bot Framework Channel Emulator からのメッセージ送信と返答

좋은 웹페이지 즐겨찾기