public async Task FxRate(IDialogContext context, LuisResult result) { string currencyPair = null; foreach (EntityRecommendation entity in result.Entities) { System.Console.WriteLine(entity.Type); if (entity.Type == "CurrencyPair") { // APIより返却されるJSON上の表現に変換 currencyPair = FxAPI.GetCurrencyPairFromEntity(entity.Entity.Replace(" ", "")); } } string message; if (currencyPair != null) { var rate = FxAPI.GetFxRate(currencyPair); message = (rate != null) ? string.Format("現在{0}です。", rate) : "レート情報を取得できませんでした。"; } else { // 通貨ペアがわからなかったら、ユーザーに聞いてBotの状態をRequestCurrencyCodeに遷移する message = "どの通貨ペアについて知りたいですか?"; context.ConversationData.SetValue <BotState>("state", BotState.RequestCurrencyCode); } await context.PostAsync(message); context.Wait(MessageReceived); }
/*internal static IDialog<ElectricityUsageQuery> MakeUsageDialog() * { * return Chain.From(() => FormDialog.FromForm(ElectricityUsageQuery.BuildForm)); * }*/ /// <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) { // Botの現在の状態を取得 StateClient stateClient = activity.GetStateClient(); BotData conversationData = stateClient.BotState.GetConversationData(activity.ChannelId, activity.Conversation.Id); var state = conversationData.GetProperty <BotState>("state"); if (state == BotState.Default) { if (activity.Text.Contains("日銀") && activity.Text.Contains("会合")) { string message; message = "直近の金融政策決定会合の日程です。 \n\n 4月26日(水)・27日(木)\n\n 6月15日(木)・16日(金)\n\n http://www.boj.or.jp/mopo/mpmsche_minu/index.htm/"; // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(reply); } else { // Default状態の場合はLuisDialogを呼ぶ await Conversation.SendAsync(activity, () => new FxDialog()); } } else if (state == BotState.RequestPositionVisual) { // 棒グラフ if (activity.Text.Contains("棒グラフ")) { string message; string keyword = "bar"; var uri = PhotoSearchAPI.GetPhotoByKeyword(keyword); if (uri == null) { message = "申し訳ありません。取得できませんでした。"; // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(reply); } else if (uri != null) { // 画像はIMessageActivity.Attachmentsに情報を追加 var photoMessage = activity.CreateReply(); photoMessage.Text = "どうぞ"; photoMessage.Attachments.Add(new Attachment() { ContentType = "image/png", ContentUrl = uri, Name = "photo.png" }); // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); //Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(photoMessage); } } else { // Default状態の場合はLuisDialogを呼ぶ await Conversation.SendAsync(activity, () => new FxDialog()); } // 処理が終わったら、BotをDefault状態に戻す conversationData.SetProperty <BotState>("state", BotState.Default); await stateClient.BotState.SetConversationDataAsync(activity.ChannelId, activity.Conversation.Id, conversationData); } else if (state == BotState.RequestContract) { string message; if (activity.Text == "はい" || activity.Text == "ok" || activity.Text.StartsWith("y")) { message = "約定を受け付けました。"; // 処理が終わったら、BotをDefault状態に戻す conversationData.SetProperty <BotState>("state", BotState.Default); await stateClient.BotState.SetConversationDataAsync(activity.ChannelId, activity.Conversation.Id, conversationData); } else if (activity.Text == "いいえ" || activity.Text.StartsWith("n")) { message = "処理を中断しました。"; // 処理が終わったら、BotをDefault状態に戻す conversationData.SetProperty <BotState>("state", BotState.Default); await stateClient.BotState.SetConversationDataAsync(activity.ChannelId, activity.Conversation.Id, conversationData); } else { message = "申し訳ありません。うまく理解できませんでした。yesかnoでお答えいただけますか。"; } // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(reply); // await Conversation.SendAsync(activity, () => new ContractDialog()); } else if (state == BotState.RequestCurrencyCode) { // RequestCurrencyCodeの場合は通貨ペアが入力されているので、 // activity.Textの内容を元にレートを取得する string message; if (activity.Text != null) { var rate = FxAPI.GetFxRate(activity.Text.Replace("/", "")); message = (rate != null) ? string.Format("現在{0}です。", rate) : "取得できませんでした。"; } else { message = "通貨ペアが見つかりませんでした。"; } // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(reply); // 処理が終わったら、BotをDefault状態に戻す conversationData.SetProperty <BotState>("state", BotState.Default); await stateClient.BotState.SetConversationDataAsync(activity.ChannelId, activity.Conversation.Id, conversationData); } else if (state == BotState.RequestClientName) { // RequestClientNameの場合は顧客名が入力されているので、 // activity.Textの内容を元にポジションを取得する var client = activity.Text; string message; if (client != null) { var position = FxAPI.GetPosition(client); message = (position != null) ? string.Format("{0}様に関わる取引は{1}です。", client, position) : "ポジション情報を取得できませんでした。"; } else { message = "該当するお客様が見つかりませんでした。"; } // 結果をユーザに送信 ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); Activity reply = activity.CreateReply(message); await connector.Conversations.ReplyToActivityAsync(reply); // 処理が終わったら、BotをDefault状態に戻す conversationData.SetProperty <BotState>("state", BotState.Default); await stateClient.BotState.SetConversationDataAsync(activity.ChannelId, activity.Conversation.Id, conversationData); } //else if (state == BotState.RequestContractStepByStep) //{ // await Conversation.SendAsync(activity, () => new ContractDialog()); //} } else { HandleSystemMessage(activity); } var response = Request.CreateResponse(HttpStatusCode.OK); return(response); }