예제 #1
0
        public override Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Alarm.Title == null)
            {
                this.SetActiveTopic(TITLE_PROMPT)
                .OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Alarm.Time == null)
            {
                this.SetActiveTopic(TIME_PROMPT)
                .OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            this.OnSuccess(context, this.State.Alarm);

            return(Task.CompletedTask);
        }
예제 #2
0
        public async override Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                await ActiveTopic.OnReceiveActivity(context);

                //return Task.CompletedTask;
            }

            var options = new QnAMakerOptions()
            {
                KnowledgeBaseId = "",
                SubscriptionKey = "",
                ScoreThreshold  = 0.7f
            };

            qnAMaker = new QnAMaker(options);
            var results = await qnAMaker.GetAnswers(context.Request.Text);

            this.State.answer = results.First().Answer;
            //context.Set(ChitChatKey, results.First().Answer);

            await this.SetActiveTopic(ANSWER_PROMPT)
            .OnReceiveActivity(context);

            this.OnSuccess(context, this.State.answer);

            //return Task.CompletedTask;
        }
예제 #3
0
        public override Task OnReceiveActivity(IBotContext context)
        {
            if ((context.Request.Type == ActivityTypes.Message) && (context.Request.AsMessageActivity().Text.Length > 0))
            {
                var message = context.Request.AsMessageActivity();

                // If the user wants to change the topic of conversation...
                if (message.Text.ToLowerInvariant() == "add alarm")
                {
                    // Set the active topic and let the active topic handle this turn.
                    this.SetActiveTopic(ADD_ALARM_TOPIC)
                    .OnReceiveActivity(context);
                    return(Task.CompletedTask);
                }

                if (message.Text.ToLowerInvariant() == "delete alarm")
                {
                    this.SetActiveTopic(DELETE_ALARM_TOPIC)
                    .OnReceiveActivity(context);
                    return(Task.CompletedTask);
                }

                if (message.Text.ToLowerInvariant() == "show alarms")
                {
                    this.ClearActiveTopic();

                    AlarmsView.ShowAlarms(context, context.State.UserProperties[USER_STATE_ALARMS]);
                    return(Task.CompletedTask);
                }

                if (message.Text.ToLowerInvariant() == "help")
                {
                    this.ClearActiveTopic();

                    this.ShowHelp(context);
                    return(Task.CompletedTask);
                }

                // If there is an active topic, let it handle this turn until it completes.
                if (HasActiveTopic)
                {
                    ActiveTopic.OnReceiveActivity(context);
                    return(Task.CompletedTask);
                }

                ShowDefaultMessage(context);
            }

            return(Task.CompletedTask);
        }
예제 #4
0
        public Task ok_OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            // next feed back prompt
            this.SetActiveTopic(FEEDBACK_PROMPT)
            .OnReceiveActivity(context);
            context.SendActivity($"{HasActiveTopic}");
            return(Task.CompletedTask);
        }
예제 #5
0
        public override Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            // If there are no alarms to delete...
            if (this.State.Alarms.Count == 0)
            {
                context.SendActivity("There are no alarms to delete.");
                return(Task.CompletedTask);
            }

            if (this.State.AlarmIndex == null)
            {
                // If there is only one alarm to delete, use that index. No need to prompt.
                if (this.State.Alarms.Count == 1)
                {
                    AlarmsView.ShowAlarms(context, this.State.Alarms);

                    this.State.AlarmIndex = 0;
                }
                else
                {
                    this.SetActiveTopic(WHICH_ALARM_PROMPT)
                    .OnReceiveActivity(context);
                    return(Task.CompletedTask);
                }
            }

            this.State.Alarm.Title = this.State.Alarms[(int)this.State.AlarmIndex].Title;

            if (this.State.DeleteConfirmed == null)
            {
                this.SetActiveTopic(CONFIRM_DELETE_PROMPT)
                .OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            this.OnSuccess(context, new DeleteAlarmTopicValue
            {
                Alarm           = this.State.Alarm,
                AlarmIndex      = (int)this.State.AlarmIndex,
                DeleteConfirmed = (bool)this.State.DeleteConfirmed
            });
            return(Task.CompletedTask);
        }
예제 #6
0
        public async override Task OnReceiveActivity(IBotContext context)
        {
            // IMAGE
            var image = context.Get <ImageRecognizeResult>(ImageMiddleware.ImageRecognizerResultKey);

            if (image != null)
            {
                await context.SendActivity("Thaks for sending me a photo!\nLet's see...");

                var keyword = image.PrimaryKeyword();
                var finder  = new Finder();
                var result  = await finder.SearchWithKeywordAsync(keyword);

                if (result != null)
                {
                    SearcherFeedbackState = true;
                    var activity = createReply(context, result);
                    await context.SendActivity(activity);

                    await context.SendActivity("Did you find what you ware looking for?");

                    return;
                }
            }

            if ((context.Request.Type == ActivityTypes.Message) && (context.Request.AsMessageActivity().Text.Length > 0))
            {
                var message  = context.Request.AsMessageActivity();
                var qnamaker = new QnaMaker();
                // If there is an active topic, let it handle this turn until it completes.
                if (HasActiveTopic)
                {
                    await ActiveTopic.OnReceiveActivity(context);

                    return;
                }
                if (!SearcherFeedbackState)
                {
                    await context.SendActivity("Got it!");
                }

                // CHIT
                var chitchater = new ChitChater();
                var answer     = await chitchater.SearchChitChat(message.Text);

                if (answer != null)
                {
                    await context.SendActivity(answer);

                    return;
                }

                // Feedback
                if (SearcherFeedbackState)
                {
                    SearcherFeedbackState = false;
                    var feedbacker = new Feedbacker();
                    var feedback   = await feedbacker.SearchAsync(message.Text);

                    if (feedback == Feedbacker.INTENT.FEEDBACK_NEGATIVE)
                    {
                        await context.SendActivity("Sorry, but could you try agein using another term?");

                        return;
                    }
                    else if (feedback == Feedbacker.INTENT.FEEDBACK_POSITIVE)
                    {
                        await context.SendActivity("No problem!");

                        return;
                    }
                    // Not reterun and continue next line when you get NOEN intent.
                }

                // SelectQuestion
                if (SelectQuestionState)
                {
                    if (int.TryParse(message.Text, out i) && (i < 4))
                    {
                        var selectquestion = questionlist[i];
                        var selectanswer   = await qnamaker.SearchQnaMaker(selectquestion);

                        await context.SendActivity(selectanswer.First().Answer);

                        SelectQuestionState   = false;
                        SearcherFeedbackState = true;
                        return;
                    }
                    else if (turn < maxturn)
                    {
                        await context.SendActivity("Sorry,but please input number(1 - 4)");

                        turn += 1;
                        return;
                    }
                    else
                    {
                        SelectQuestionState = false;
                        await context.SendActivity("too many attempts");

                        await context.SendActivity("OK! You may change your mind.");

                        return;
                    }
                }


                // QnA
                qnamaker = new QnaMaker();
                var queryresults = await qnamaker.SearchQnaMaker(message.Text);

                if (queryresults != null)
                {
                    if (queryresults.First().Questions.Count() == 1)
                    {
                        SearcherFeedbackState = true;
                        await context.SendActivity(queryresults.First().Answer);

                        return;
                    }
                    else
                    {
                        SelectQuestionState   = true;
                        SearcherFeedbackState = true;
                        var messages = "Did you mean? Please input number(1 - 4)";
                        foreach (var q in queryresults.First().Questions.Select((value, index) => new { value, index }))
                        {
                            if (q.index > 2)
                            {
                                messages += "\n\n" + "\n\n" + (q.index + 1) + ".None of adove";
                                questionlist.Add(queryresults.First().Questions[q.index]);
                                break;
                            }
                            messages += "\n\n" + "\n\n" + (q.index + 1) + "." + queryresults.First().Questions[q.index].ToString();
                            questionlist.Add(queryresults.First().Questions[q.index]);
                        }
                        await context.SendActivity(messages);

                        return;
                    }
                }

                // Search
                var finder = new Finder();
                var result = await finder.SearchAsync(message.Text);

                if (result != null)
                {
                    SearcherFeedbackState = true;
                    var activity = createReply(context, result);
                    await context.SendActivity(activity);

                    await context.SendActivity("Did you find what you ware looking for?");

                    return;
                }
                await context.SendActivity("Sorry, but I didn't understand that. Could you try saying that another way?");
            }
        }
예제 #7
0
        public override Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (context.TopIntent != null)
            {
                foreach (LuisEntity item in context.TopIntent.Entities)
                {
                    // CUSTOMER
                    if (item.Type == "entity.customer")
                    {
                        this.State.Workitem.Customer = item.Value;
                    }

                    //DATE
                    if (item.Type == "builtin.datetimeV2.date")
                    {
                        FlexObject resolution = item.Resolution;

                        var    instance = JsonConvert.SerializeObject(resolution["values"][0]);
                        TimeEx time     = JsonConvert.DeserializeObject <TimeEx>(instance);

                        this.State.Workitem.Date = DateTime.Parse(time.value);
                    }
                }
            }

            if (this.State.Workitem.Object == null)
            {
                this.SetActiveTopic(Constants.OBJECT_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Workitem.Customer == null)
            {
                this.SetActiveTopic(Constants.CUSTOMER_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Workitem.Date == null)
            {
                this.SetActiveTopic(Constants.DATE_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Workitem.Hours == null)
            {
                this.SetActiveTopic(Constants.HOURS_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Workitem.Description == null)
            {
                this.SetActiveTopic(Constants.DESCRIPTION_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            if (this.State.Workitem.Attachment == null)
            {
                this.SetActiveTopic(Constants.ATTACHMENT_PROMPT);
                this.ActiveTopic.OnReceiveActivity(context);
                return(Task.CompletedTask);
            }

            this.OnSuccess(context, this.State.Workitem);

            return(Task.CompletedTask);
        }
예제 #8
0
        public override Task OnReceiveActivity(IBotContext context)
        {
            if ((context.Request.Type == ActivityTypes.Message) &&
                (!string.IsNullOrEmpty(context.Request.AsMessageActivity().Text) || context.Request.AsMessageActivity().Attachments != null))
            {
                var message = context.Request.AsMessageActivity();

                // If the user wants to change the topic of conversation...
                if (context.TopIntent != null && context.TopIntent.Score > 0.7)
                {
                    if (context.TopIntent.Name == "intent.image")
                    {
                        context.Reply(((LuisEntity)context.TopIntent.Entities[0]).Value);
                    }

                    if (context.TopIntent.Name == "intent.currentuser")
                    {
                        if (context.State.UserProperties["owner"] != null)
                        {
                            context.Reply($"Current user: {context.State.UserProperties["owner"]}");
                        }
                        else
                        {
                            context.Reply($"I've not recognized yet. What's your name?");
                        }
                        return(Task.CompletedTask);
                    }

                    if (context.TopIntent.Name == "intent.workitem.add")
                    {
                        // Set the active topic and let the active topic handle this turn.
                        this.SetActiveTopic(Constants.ADD_WORKITEM_TOPIC)
                        .OnReceiveActivity(context);
                        return(Task.CompletedTask);
                    }

                    if (context.TopIntent.Name == "intent.workitem.list")
                    {
                        this.ClearActiveTopic();

                        SqlUtils sql   = new SqlUtils(Startup.ConnectionString);
                        var      owner = context.State.UserProperties["owner"];

                        //WorkItemsView.ShowWorkItems(context, context.State.UserProperties[Constants.USER_STATE_WORKITEMS], Accessor);
                        WorkItemsView.ShowWorkItems(context, sql.GetWorkItems(owner), Accessor);

                        return(Task.CompletedTask);
                    }

                    if (context.TopIntent.Name == "intent.help")
                    {
                        this.ClearActiveTopic();

                        this.ShowHelp(context);
                        return(Task.CompletedTask);
                    }

                    if (context.TopIntent.Name == "intent.restart")
                    {
                        this.ClearActiveTopic();
                        context.State.ConversationProperties.Clear();
                        context.State.UserProperties.Clear();
                        //return Task.CompletedTask;
                    }
                }

                // If there is an active topic, let it handle this turn until it completes.
                if (HasActiveTopic)
                {
                    ActiveTopic.OnReceiveActivity(context);
                    return(Task.CompletedTask);
                }

                ShowDefaultMessage(context);
            }

            return(Task.CompletedTask);
        }
예제 #9
0
        public override async Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                await ActiveTopic.OnReceiveActivity(context);

                return;
            }

            var utterance = context.Request.AsMessageActivity().Text;


            if (this.State.Alarm.Title == null)
            {
                // LUIS実行
                await context.SendActivity("got it!");

                var luisResult = await playLuis(context, utterance);


                // TODO: LUISの戻り値に応じて呼び出すAPIを変更する
                var intent         = luisResult.Intents.GetValue("Places.FindPlace");
                var entity         = luisResult.Entities.GetValue("Places_AbsoluteLocation");
                var entity_keyword = entity.First().ToString();
                await context.SendActivity(entity_keyword.ToString());

                /*
                 * if (this.State.Alarm.Title == "Searched") {
                 *  this.SetActiveTopic(SEARCH_PROMPT)
                 *      .OnReceiveActivity(context);
                 *  return Task.CompletedTask;
                 *
                 * }
                 *
                 */
                // LUISの結果でスポット検索
                var service = new Services.SpotSearchService();
                var req     = new SpotsRequest();
                req.keyword = entity_keyword;
                var result = await service.Search(req) as SpotsResult;

                await context.SendActivity(result.spots.First().name);

                // Replyを作成し表示
                var reply = context.Request.CreateReply();
                reply.Attachments = result.Attachments;
                await context.SendActivity(reply);

                // next feed back prompt
                await this.SetActiveTopic(FEEDBACK_PROMPT)
                .OnReceiveActivity(context);

                await context.SendActivity($"{HasActiveTopic}");


                return;
            }

            /*
             * if (this.State.Alarm.Title == null) {// spotの場合
             *  await context.SendActivity("スポット表示");
             *  this.State.Alarm.Title = "Searched";
             *
             *  // APIの戻り値表示
             *
             *  // next feed back prompt
             *  await this.SetActiveTopic(FEEDBACK_PROMPT)
             *      .OnReceiveActivity(context);
             * }
             * else {
             *  await context.SendActivity("スポット表示失敗");
             * }
             * await context.SendActivity("すみません、お役に立てなくて");
             * this.OnSuccess(context, null);
             *
             */
            await context.SendActivity("ここまでくれば終了で抜けます");

            //this.OnSuccess(context, this.State.Alarm);
        }