コード例 #1
0
        /*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);
        }
コード例 #2
0
        public async Task Position(IDialogContext context, LuisResult result)
        {
            string client = null;

            foreach (EntityRecommendation entity in result.Entities)
            {
                if (entity.Type == "Client")
                {
                    // ENtityから顧客情報を取得
                    client = entity.Entity.Replace(" ", "");
                }
            }

            string message;

            if (client != null)
            {
                // ポジション情報取得
                var position = FxAPI.GetPosition(client);

                // 画像uri取得
                var keyword = "circle";
                var uri     = PhotoSearchAPI.GetPhotoByKeyword(keyword);

                if (uri == null)
                {
                    message = (position != null) ? string.Format("{0}様に関わる取引は{1}です。\n\n (システム画面URL : http://example.com)", client, position) : "ポジション情報を取得できませんでした。";
                    await context.PostAsync(message);
                }
                else if (uri != null)
                {
                    if (position != null)
                    {
                        // 画像はIMessageActivity.Attachmentsに情報を追加
                        var photoMessage = context.MakeMessage();
                        photoMessage.Text = string.Format("{0}様に関わる取引は{1}です。\n\n (システム画面URL : http://example.com)", client, position);
                        photoMessage.Attachments.Add(new Attachment()
                        {
                            ContentType = "image/png",
                            ContentUrl  = uri,
                            Name        = "photo.png"
                        });
                        await context.PostAsync(photoMessage);
                    }
                    else
                    {
                        message = "ポジション情報を取得できませんでした。";
                        await context.PostAsync(message);
                    }
                }

                // 顧客がわからなかったら、ユーザーに聞いてBotの状態をRequestPositionVisualに遷移する
                context.ConversationData.SetValue <BotState>("state", BotState.RequestPositionVisual);
            }
            else
            {
                // 顧客がわからなかったら、ユーザーに聞いてBotの状態をRequestClientNameに遷移する
                message = "どのお客様について知りたいですか?";
                context.ConversationData.SetValue <BotState>("state", BotState.RequestClientName);
                await context.PostAsync(message);
            }

            context.Wait(MessageReceived);
        }