Exemplo n.º 1
0
        private static async Task <CEKResponse> HandleRequestAsync(CEKRequest request)
        {
            var response = new CEKResponse();

            switch (request.Request.Type)
            {
            case RequestType.LaunchRequest:
                await HandleLaunchRequestAsync(request, response);

                break;

            case RequestType.IntentRequest:
                await HandleIntentRequestAsync(request, response);

                break;

            case RequestType.SessionEndedRequest:
                await HandleSessionEndedRequestAsync(request, response);

                break;

            default:
                break;
            }
            return(response);
        }
Exemplo n.º 2
0
        private static async Task <IActionResult> ExecuteLaunchRequestAsync(CEKRequest request, CloudTable locationLogs, AppConfiguration config)
        {
            var response = new CEKResponse();

            response.AddText("こんにちは。私の持ち主のいる場所を確認するね。");

            var tableResult = await locationLogs.ExecuteAsync(TableOperation.Retrieve <LocationLog>(nameof(LocationLog), request.Session.User.UserId));

            if (tableResult == null || tableResult.HttpStatusCode != 200)
            {
                response.AddText($"ごめんなさい。場所がわかりませんでした。持ち主にLINEで聞いてみるから、また後で聞いてね。");
                await AskCurrentLocationAsync(request, config);

                return(new OkObjectResult(response));
            }

            var locationLog = (LocationLog)tableResult.Result;
            var isOldLog    = locationLog.Timestamp <= DateTimeOffset.UtcNow - TimeSpan.FromHours(2);

            if (isOldLog)
            {
                await AskCurrentLocationAsync(request, config);
            }
            response.AddText($"{locationLog.Name ?? locationLog.Address}にいます。{(isOldLog ? "でも少し前の場所みたいだね。もう一度聞いてみるから、また後で聞いてね。。" : "")}");
            return(new OkObjectResult(response));
        }
Exemplo n.º 3
0
        public void TypeSafeWriteSessionAttributeNullCaseTest()
        {
            var target = new CEKRequest();

            target.SetSessionAttributeFrom(default(SessionType));
            Assert.Null(target.Session.SessionAttributes);
        }
Exemplo n.º 4
0
        private static async Task <IActionResult> ExecuteLaunchRequestAsync(CEKRequest request, CloudTable locationLogs, AppConfiguration config)
        {
            var response           = new CEKResponse();
            var taskForSettings    = MessagingChatSettings.GetSettingsByUserIdAsync(locationLogs, request.Session.User.UserId);
            var taskForLocationLog = LocationLog.GetLocationLogByUserIdAsync(locationLogs, request.Session.User.UserId);
            await Task.WhenAll(taskForSettings, taskForLocationLog);

            var settings = taskForSettings.Result ?? new MessagingChatSettings {
                RowKey = request.Session.User.UserId
            };
            var locationLog = taskForLocationLog.Result;

            try
            {
                if (!settings.IsLineFrend)
                {
                    response.AddText(ClovaMessages.GetAddingLineFrendMessage());
                    return(new OkObjectResult(response));
                }

                AddHistory(settings);
                response.AddText(ClovaMessages.GetGuideMessage(settings.YourName));
                if (locationLog == null || !DateTimeOffsetUtils.IsToday(locationLog.Timestamp))
                {
                    // データが無い
                    response.AddText(ClovaMessages.GetNoLogMessage(settings.YourName));
                    await AskCurrentLocationAsync(request, config, settings);

                    return(new OkObjectResult(response));
                }

                if (DateTimeOffsetUtils.IsBefore(locationLog.Timestamp, TimeSpan.Parse(config.Cek.IsBeforeThreshold ?? Clova.IsBeforeThresholdDefaultValue)))
                {
                    // 古いデータ
                    response.AddText(ClovaMessages.GetOldLocationMessage(settings.YourName, locationLog));
                    await AskCurrentLocationAsync(request, config, settings);

                    return(new OkObjectResult(response));
                }

                // データがある
                response.AddText(ClovaMessages.GetLocationMessage(settings.YourName, locationLog));
                if (!string.IsNullOrEmpty(locationLog.Comment))
                {
                    response.AddText(ClovaMessages.GetCommentMessage(settings.YourName, locationLog));
                }
                else if (!string.IsNullOrEmpty(locationLog.AudioCommentUrl))
                {
                    response.AddText(ClovaMessages.GetVoiceMessagePrefixMessage(settings.YourName));
                    response.AddUrl(locationLog.AudioCommentUrl);
                }

                return(new OkObjectResult(response));
            }
            finally
            {
                await locationLogs.ExecuteAsync(TableOperation.InsertOrReplace(settings));
            }
        }
Exemplo n.º 5
0
 private static async Task AskCurrentLocationAsync(CEKRequest request, AppConfiguration config, MessagingChatSettings settings)
 {
     await LineMessagingClientFactory.GetLineMessagingClient(config.MessagingApi.AccessToken).PushMessageAsync(
         request.Session.User.UserId, new List <ISendMessage>
     {
         new TextMessage(ClovaMessages.GetAskLocationMessage(settings.YourName)),
     });
 }
        public async Task <IActionResult> Post()
        {
            CEKRequest request = await client.GetRequest(
                Request.Headers["SignatureCEK"],
                Request.Body
                );

            var response = new CEKResponse();

            switch (request.Request.Type)
            {
            case RequestType.LaunchRequest:
            {
                response.AddText("こんにちは!これ食べれるニャンボットです。人間の食べ物を入力すると、これは猫が食べて大丈夫かどうかを答えるよ");
                response.ShouldEndSession = false;
                break;
            }

            case RequestType.SessionEndedRequest:
            {
                response.AddText("またね~");
                break;
            }

            case RequestType.IntentRequest:
            {
                switch (request.Request.Intent.Name)
                {
                case "CatIntent":             // "パン"
                {
                    // 食べれるものが渡ってくるので何か処理をする TODO!
                    response.ShouldEndSession = false;
                    break;
                }

                case "ChomadoIntent":             // "ちょまど"
                {
                    response.AddText("ちょまどさん、さすがオトナです!素敵!すばらしい!松屋!");
                    response.ShouldEndSession = false;
                    break;
                }

                case "Clova.GuideIntent":
                {
                    response.AddText("パン、と言ってみてください。");
                    response.ShouldEndSession = false;
                    break;
                }
                }
                break;
            }
            }
            return(new OkObjectResult(true));
        }
Exemplo n.º 7
0
 private static async Task AskCurrentLocationAsync(CEKRequest request, AppConfiguration config)
 {
     await LineMessagingClientFactory.GetLineMessagingClient(config.MessagingApi.AccessToken).PushMessageAsync(
         request.Session.User.UserId, new List <ISendMessage>
     {
         new TextMessage("Clovaから場所が尋ねられたよ。よかったら場所を教えてね。", new QuickReply(
                             new List <QuickReplyButtonObject>
         {
             new QuickReplyButtonObject(new LocationTemplateAction("現在地を送る")),
         })),
     });
 }
Exemplo n.º 8
0
        public void TypeSafeWriteSessionAttributeTest()
        {
            var target = new CEKRequest
            {
                Session = new Session(),
            };
            var sessionValue = new SessionType
            {
                A = "a value",
                B = "b value",
            };

            target.SetSessionAttributeFrom(sessionValue);
            Assert.Equal("a value", (string)target.GetSessionAttribute("A"));
            Assert.Equal("b value", (string)target.GetSessionAttribute("B"));
        }
        public void TypeSafeReadSessionAttributeTest()
        {
            var target = new CEKRequest
            {
                Session = new Session
                {
                    SessionAttributes = new Dictionary <string, object>
                    {
                        ["A"] = "a value",
                        ["B"] = "b value",
                    },
                },
            };

            var typeSafeSession = target.GetSessionAttributeAs <SessionType>();

            Assert.Equal("a value", typeSafeSession.A);
            Assert.Equal("b value", typeSafeSession.B);
        }
Exemplo n.º 10
0
        public async Task <IActionResult> Post()
        {
            CEKRequest request = await _client.GetRequest(
                Request.Headers["SignatureCEK"],
                Request.Body
                );

            var response = new CEKResponse();

            try
            {
                switch (request.Request.Type)
                {
                case RequestType.LaunchRequest:
                {
                    response.AddText("こんにちは!これ食べれるニャンボットです。人間の食べ物を入力すると、これは猫が食べて大丈夫かどうかを答えるよ");
                    response.ShouldEndSession = false;
                    break;
                }

                case RequestType.SessionEndedRequest:
                {
                    response.AddText("またね~");
                    break;
                }

                case RequestType.IntentRequest:
                {
                    switch (request.Request.Intent.Name)
                    {
                    case "HelloIntent":
                    {
                        response.AddText("こんにちは!これ食べれるニャンボットだよ!");
                        response.ShouldEndSession = false;
                        break;
                    }

                    case "ChomadoIntent":             // "ちょまど"
                    {
                        response.AddText("ちょまどさん、さすがオトナです!素敵!すばらしい!松屋!");
                        response.ShouldEndSession = false;
                        break;
                    }

                    case "Clova.GuideIntent":
                    {
                        response.AddText("パン、と言ってみてください。");
                        response.ShouldEndSession = false;
                        break;
                    }

                    case "CatIntent":             // "パン"
                    {
                        var food = request.Request.Intent.Slots.FirstOrDefault().Value.Value;
                        // 食べれるものが渡ってくるので何か処理をする TODO!
                        response.AddText(text: $"{food}の話ですね?");

                        // QnA から答えを取り出す
                        var client = _httpClientFactory.CreateClient();
                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("EndpointKey", _configuration.GetValue <string>("EndpointKey"));
                        var content          = new StringContent(JsonConvert.SerializeObject(new { question = food }), Encoding.UTF8, "application/json");
                        var qnaMakerResponse = await client.PostAsync(
                            $"{_configuration.GetValue<string>("Hostname")}/knowledgebases/{_configuration.GetValue<string>("KbId")}/generateAnswer",
                            content);

                        qnaMakerResponse.EnsureSuccessStatusCode();
                        var answers = await qnaMakerResponse.Content.ReadAsAsync <QnAMakerResponse>();

                        // LINE messaging に push
                        string accessToken = _configuration.GetValue <string>("LINEMessaginAPIKey");
                        string myUserId    = _configuration.GetValue <string>("myUserID");

                        var answer = answers.Answers?.FirstOrDefault()?.AnswerText;
                        if (!string.IsNullOrEmpty(answer))
                        {
                            response.AddText(answer.Contains("OK") ? $"{food}は食べられます。詳細を LINE に送ります。" : $"{food}は食べられません。");
                            var messagingClient = new LineMessagingClient(channelAccessToken: accessToken);
                            await messagingClient.PushMessageAsync(
                                // to: request.Session.User.UserId,
                                to : myUserId,
                                messages : new List <ISendMessage>
                                    {
                                        new TextMessage($"{food}"),
                                        new TextMessage($"解説はこれだよ"),
                                        new TextMessage(answer),
                                    }
                                );
                        }
                        else
                        {
                            response.AddText($"{food}が見つかりませんでした。");
                        }
                        break;
                    }
                    }
                    break;
                }
                }
            }
            catch (Exception ex)
            {
                response.AddText(ex.ToString());
            }

            return(new OkObjectResult(response));
        }
Exemplo n.º 11
0
        public async Task <IActionResult> Post()
        {
            CEKRequest request = await _client.GetRequest(
                Request.Headers["SignatureCEK"],
                Request.Body
                );

            var response = new CEKResponse();

            switch (request.Request.Type)
            {
            case RequestType.LaunchRequest:
            {
                response.AddText("こんにちは!これ食べれるニャンボットです。人間の食べ物を入力すると、これは猫が食べて大丈夫かどうかを答えるよ");
                response.ShouldEndSession = false;
                break;
            }

            case RequestType.SessionEndedRequest:
            {
                response.AddText("またね~");
                break;
            }

            case RequestType.IntentRequest:
            {
                switch (request.Request.Intent.Name)
                {
                case "CatIntent":             // "パン"
                {
                    var food = request.Request.Intent.Slots.FirstOrDefault().Value.Value;
                    // 食べれるものが渡ってくるので何か処理をする TODO!
                    response.AddText(text: $"{food}の話ですか?");

                    // LINE messaging に push
                    string accessToken = _configuration.GetValue <string>("LINEMessaginAPIKey");

                    var messagingClient = new LineMessagingClient(channelAccessToken: accessToken);
                    await messagingClient.PushMessageAsync(
                        to : request.Session.User.UserId,
                        messages : new List <ISendMessage>
                            {
                                new TextMessage($"{food}"),
                            }
                        );

                    response.ShouldEndSession = false;
                    break;
                }

                case "ChomadoIntent":             // "ちょまど"
                {
                    response.AddText("ちょまどさん、さすがオトナです!素敵!すばらしい!松屋!");
                    response.ShouldEndSession = false;
                    break;
                }

                case "Clova.GuideIntent":
                {
                    response.AddText("パン、と言ってみてください。");
                    response.ShouldEndSession = false;
                    break;
                }
                }
                break;
            }
            }
            return(new OkObjectResult(response));
        }
Exemplo n.º 12
0
        public void TypeSafeReadSessionAttributeNullCaseTest()
        {
            var target = new CEKRequest();

            Assert.Null(target.GetSessionAttributeAs <SessionType>());
        }
Exemplo n.º 13
0
        private static async Task <Task> HandleIntentRequestAsync(CEKRequest request, CEKResponse response)
        {
            void fillSlotIfExist(string slotName, ref string word)
            {
                if (request.Request.Intent.Slots?.ContainsKey(slotName) ?? false)
                {
                    word = request.Request.Intent.Slots[slotName].Value;
                }
            }

            switch (request.Request.Intent.Name)
            {
            case IntentNames.DefaultIntent:
            {
                string word = null;
                fillSlotIfExist(SlotNames.NamamugiNamagomeNamatamago, ref word);
                fillSlotIfExist(SlotNames.SyusyaSentaku, ref word);

                // 滑舌オーケー
                if (!string.IsNullOrEmpty(word))
                {
                    // LINE messaging に投げる
                    var messagingClient = new LineMessagingClient(channelAccessToken: Keys.token);
                    await messagingClient.PushMessageAsync(
                        to : Keys.userId,
                        messages : new List <ISendMessage>
                        {
                            new TextMessage(string.Format(Messages.LineCongratsMessage, word)),
                        }
                        );

                    // Clova に喋らせる
                    response.ShouldEndSession = true;
                    response.AddText(Messages.GenerateCongratsMessage(word));
                }
                // 滑舌ダメです
                else
                {
                    var messagingClient = new LineMessagingClient(channelAccessToken: Keys.token);
                    await messagingClient.PushMessageAsync(
                        to : Keys.userId,
                        messages : new List <ISendMessage>
                        {
                            new TextMessage(Messages.LineWrongMessage),
                        }
                        );

                    response.ShouldEndSession = false;
                    response.AddText(Messages.WrongPronunciationMessage);
                }

                break;
            }

            default:
                // noop
                break;
            }

            return(Task.CompletedTask);
        }
Exemplo n.º 14
0
 private static Task HandleLaunchRequestAsync(CEKRequest request, CEKResponse response)
 {
     response.ShouldEndSession = false;
     response.AddText(Messages.WelcomeMessage);
     return(Task.CompletedTask);
 }
Exemplo n.º 15
0
 private static Task HandleSessionEndedRequestAsync(CEKRequest request, CEKResponse response)
 {
     response.AddText(Messages.GoodbayMessage);
     return(Task.CompletedTask);
 }