/// <summary>
        /// Called when the add alarm topic is started
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <bool> StartTopic(IBotContext context)
        {
            var recognizedIntents = context.Get <IRecognizedIntents>();
            var times             = recognizedIntents.TopIntent?.Entities.Where(entity => entity.GroupName == "AlarmTime")
                                    .Select(entity => DateTimeOffset.Parse(entity.ValueAs <string>()));

            this.Alarm = new Alarm()
            {
                // initialize from intent entities
                Title = recognizedIntents.TopIntent?.Entities.Where(entity => entity.GroupName == "AlarmTitle")
                        .Select(entity => entity.ValueAs <string>()).FirstOrDefault(),

                // initialize from intent entities
                Time = times.Where(t => t > DateTime.Now).FirstOrDefault()
            };
            if (Alarm.Time == default(DateTimeOffset))
            {
                // use today 1 HOUR as default
                var defaultTime = DateTimeOffset.Now + TimeSpan.FromHours(1);
                Alarm.Time = new DateTimeOffset(defaultTime.Year, defaultTime.Month, defaultTime.Day, defaultTime.Hour, 0, 0, DateTimeOffset.Now.Offset);
            }
            this.TopicState = TopicStates.AddingCard;
            AddAlarmTopicResponses.ReplyWithStartTopic(context, this.Alarm);
            return(true);
        }
        /// <summary>
        /// we call for every turn while the topic is still active
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <bool> ContinueTopic(IBotContext context)
        {
            var recognizedIntents = context.Get <IRecognizedIntents>();

            // for messages
            if (context.Request.Type == ActivityTypes.Message)
            {
                switch (recognizedIntents.TopIntent?.Name)
                {
                case "showAlarms":
                    // allow show alarm to interrupt, but it's one turn, so we show the data without changing the topic
                    await new ShowAlarmsTopic().StartTopic(context);
                    return(true);

                case "help":
                    // show contextual help
                    AddAlarmTopicResponses.ReplyWithHelp(context, this.Alarm);
                    return(true);

                case "cancel":
                    // prompt to cancel
                    AddAlarmTopicResponses.ReplyWithCancelPrompt(context, this.Alarm);
                    this.TopicState = TopicStates.CancelConfirmation;
                    return(true);

                default:
                    return(await ProcessTopicState(context));
                }
            }
            return(true);
        }
        protected virtual async Task Write(IBotContext context)
        {
            StoreItems changes = new StoreItems();

            var state = context.Get <StateT>(this._propertyName);

            if (state == null)
            {
                state = new StateT();
            }
            var key = _keyDelegate(context);

            changes[key] = state;

            if (this._settings.LastWriterWins)
            {
                foreach (var item in changes)
                {
                    if (item.Value is IStoreItem valueStoreItem)
                    {
                        valueStoreItem.eTag = "*";
                    }
                }
            }

            await _storage.Write(changes).ConfigureAwait(false);
        }
 /// <summary>
 /// Get a value of a specific type from a context object.
 /// </summary>
 /// <typeparam name="ObjectT">The value's type.</typeparam>
 /// <param name="context">The context object.</param>
 /// <param name="key">An optional lookup key. The default is the value type's name.</param>
 /// <returns>The value.</returns>
 public static ObjectT Get <ObjectT>(this IBotContext context, string key = null)
 {
     if (key == null)
     {
         key = $"{typeof(ObjectT).Namespace}.{typeof(ObjectT).Name}";
     }
     return((ObjectT)context.Get(key));
 }
示例#5
0
 public static ObjectT Get <ObjectT>(this IBotContext context, string objectId = null)
 {
     if (objectId == null)
     {
         objectId = $"{typeof(ObjectT).Namespace}.{typeof(ObjectT).Name}";
     }
     return((ObjectT)context.Get(objectId));
 }
        /// <summary>
        /// Called when the topic is started
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task <bool> StartTopic(IBotContext context)
        {
            var recognizedIntents = context.Get <IRecognizedIntents>();

            this.AlarmTitle = recognizedIntents.TopIntent?.Entities.Where(entity => entity.GroupName == "AlarmTitle")
                              .Select(entity => entity.ValueAs <string>()).FirstOrDefault();

            return(FindAlarm(context));
        }
示例#7
0
 /// <summary>
 /// outgoing activities
 /// </summary>
 /// <param name="context"></param>
 /// <param name="activities"></param>
 /// <param name="token"></param>
 /// <returns></returns>
 public async Task SendActivity(IBotContext context, IList <Activity> activities, MiddlewareSet.NextDelegate next)
 {
     foreach (var activity in activities)
     {
         IMessageActivity message = context.Request.AsMessageActivity();
         if (!String.IsNullOrWhiteSpace(message?.Text))
         {
             // translate to userslanguage
             var translationContext = context.Get <TranslationContext>();
             if (translationContext.SourceLanguage != translationContext.TargetLanguage)
             {
                 await TranslateMessageAsync(context, message, translationContext.TargetLanguage, translationContext.SourceLanguage).ConfigureAwait(false);
             }
         }
     }
     await next().ConfigureAwait(false);
 }
示例#8
0
        /// <summary>
        /// Continue the topic, method which is routed to while this topic is active
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task <bool> ContinueTopic(IBotContext context)
        {
            var conversation = ConversationState <ConversationData> .Get(context);

            // var conversation = context.GetConversationState<ConversationData>();
            var recognizedIntents = context.Get <IRecognizedIntents>();

            switch (context.Request.Type)
            {
            case ActivityTypes.Message:
                switch (recognizedIntents.TopIntent.Name)
                {
                case "addAlarm":
                    // switch to addAlarm topic
                    conversation.ActiveTopic = new AddAlarmTopic();
                    return(conversation.ActiveTopic.StartTopic(context));

                case "showAlarms":
                    // switch to show alarms topic
                    conversation.ActiveTopic = new ShowAlarmsTopic();
                    return(conversation.ActiveTopic.StartTopic(context));

                case "deleteAlarm":
                    // switch to delete alarm topic
                    conversation.ActiveTopic = new DeleteAlarmTopic();
                    return(conversation.ActiveTopic.StartTopic(context));

                case "help":
                    // show help
                    DefaultTopicResponses.ReplyWithHelp(context);
                    return(Task.FromResult(true));

                default:
                    // show our confusion
                    DefaultTopicResponses.ReplyWithConfused(context);
                    return(Task.FromResult(true));
                }

            default:
                break;
            }
            return(Task.FromResult(true));
        }
示例#9
0
 public static CustomState Get(IBotContext context)
 {
     return(context.Get <CustomState>(PropertyName));
 }
示例#10
0
 /// <summary>
 /// get the value of the ConversationState from the context
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 public static StateT Get(IBotContext context)
 {
     return(context.Get <StateT>(PropertyName));
 }
示例#11
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?");
            }
        }
 /// <summary>
 /// method for accessing recognized intents added by middleware to context
 /// </summary>
 /// <param name="context"></param>
 /// <returns></returns>
 public static IRecognizedIntents Get(IBotContext context)
 {
     return(context.Get <IRecognizedIntents>());
 }