示例#1
0
        /// <summary>
        /// Get luis result from user input or parent bot.
        /// </summary>
        /// <param name="context">The current turn context.</param>
        /// <param name="accessors">Email skill accessors.</param>
        /// <param name="services">Email skill services.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>The luis result.</returns>
        public static async Task <Email> GetLuisResult(ITurnContext context, EmailSkillAccessors accessors, EmailSkillServices services, CancellationToken cancellationToken)
        {
            var state = await accessors.EmailSkillState.GetAsync(context);

            Email luisResult = null;

            if (state.LuisResultPassedFromSkill != null)
            {
                luisResult = (Email)state.LuisResultPassedFromSkill;
            }
            else
            {
                luisResult = await services.LuisRecognizer.RecognizeAsync <Email>(context, cancellationToken);
            }

            await DigestEmailLuisResult(context, accessors, luisResult);

            return(luisResult);
        }
示例#2
0
        /// <summary>
        /// Set luis result to conversation state.
        /// </summary>
        /// <param name="context">Turn context.</param>
        /// <param name="accessors">Email skill accessors.</param>
        /// <param name="luisResult">The Luis result.</param>
        /// <returns>representing the asynchronous operation.</returns>
        public static async Task DigestEmailLuisResult(ITurnContext context, EmailSkillAccessors accessors, Email luisResult)
        {
            try
            {
                var state = await accessors.EmailSkillState.GetAsync(context);

                if (context.Activity.Text != null)
                {
                    var words = context.Activity.Text.Split(' ');
                    foreach (var word in words)
                    {
                        switch (word)
                        {
                        case "high":
                        case "important":
                            state.IsImportant = true;
                            break;

                        case "unread":
                            state.IsRead = true;
                            break;
                        }
                    }
                }

                var entity = luisResult.Entities;
                if (entity.ContactName != null)
                {
                    foreach (var name in entity.ContactName)
                    {
                        if (!state.NameList.Contains(name))
                        {
                            state.NameList.Add(name);
                        }
                    }
                }

                if (entity.EmailSubject != null)
                {
                    state.Subject = entity.EmailSubject[0];
                }

                if (entity.Message != null)
                {
                    state.Content = entity.Message[0];
                }

                if (entity.SenderName != null)
                {
                    state.SenderName = entity.SenderName[0];
                }

                if (entity.datetime != null)
                {
                    // todo: enable date time
                    // case "builtin.datetimeV2.date":
                    // case "builtin.datetimeV2.datetime":
                    // foreach (dynamic value in resolution["values"])
                    // {
                    //    var start = value["value"].ToString();
                    //    var dateTime = DateTime.Parse(start);
                    //    state.StartDateTime = dateTime;
                    //    state.EndDateTime = DateTime.UtcNow;
                    // }

                    // break;
                    // case "builtin.datetimeV2.datetimerange":
                    // foreach (dynamic value in resolution["values"])
                    // {
                    //    var start = value["start"].ToString();
                    //    var end = value["end"].ToString();
                    //    state.StartDateTime = DateTime.Parse(start);
                    //    state.EndDateTime = DateTime.Parse(end);
                    // }

                    // break;
                }

                if (entity.ordinal != null)
                {
                    try
                    {
                        var emailList = state.MessageList;
                        var value     = entity.ordinal[0];
                        if (Math.Abs(value - (int)value) < double.Epsilon)
                        {
                            var num = (int)value;
                            if (emailList != null && num > 0 && num <= emailList.Count)
                            {
                                state.Message.Clear();
                                state.Message.Add(emailList[num - 1]);
                            }
                        }
                    }
                    catch
                    {
                        // ignored
                    }
                }

                if (entity.number != null && entity.ordinal != null)
                {
                    try
                    {
                        var emailList = state.MessageList;
                        var value     = entity.ordinal[0];
                        if (Math.Abs(value - (int)value) < double.Epsilon)
                        {
                            var num = (int)value;
                            if (emailList != null && num > 0 && num <= emailList.Count)
                            {
                                state.Message.Clear();
                                state.Message.Add(emailList[num - 1]);
                            }
                        }
                    }
                    catch
                    {
                        // ignored
                    }
                }
            }
            catch
            {
                // put log here
            }
        }