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); }
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)); }
public void TypeSafeWriteSessionAttributeNullCaseTest() { var target = new CEKRequest(); target.SetSessionAttributeFrom(default(SessionType)); Assert.Null(target.Session.SessionAttributes); }
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)); } }
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)); }
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("現在地を送る")), })), }); }
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); }
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)); }
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)); }
public void TypeSafeReadSessionAttributeNullCaseTest() { var target = new CEKRequest(); Assert.Null(target.GetSessionAttributeAs <SessionType>()); }
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); }
private static Task HandleLaunchRequestAsync(CEKRequest request, CEKResponse response) { response.ShouldEndSession = false; response.AddText(Messages.WelcomeMessage); return(Task.CompletedTask); }
private static Task HandleSessionEndedRequestAsync(CEKRequest request, CEKResponse response) { response.AddText(Messages.GoodbayMessage); return(Task.CompletedTask); }