Пример #1
0
        // Handles conversation cleanup.
        private async Task <DialogTurnResult> FinalStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var state = await _stateAccessor.GetAsync(stepContext.Context, () => new ToDoSkillState(), cancellationToken);

            if (stepContext.Context.IsSkill())
            {
                var result = stepContext.Result;

                if (state.IsAction && result == null)
                {
                    result = new TodoListInfo()
                    {
                        ActionSuccess = false
                    };
                }

                state.Clear();
                return(await stepContext.EndDialogAsync(result, cancellationToken));
            }
            else
            {
                state.Clear();
                return(await stepContext.ReplaceDialogAsync(InitialDialogId, _templateManager.GenerateActivityForLocale(ToDoMainResponses.CompletedMessage), cancellationToken));
            }
        }
Пример #2
0
 public void InitCell(TodoListInfo todoListInfo)
 {
     description.text = todoListInfo.description;
     if (AchievementManager.Instance.achievementDictionary[todoListInfo.finishAchievement].state == AchievementState.complete)
     {
         if (todoListInfo.parentList.Length != 0)
         {
             checkIcon.SetActive(true);
         }
         description.color = new Color(0, 1, 0);
     }
     else
     {
         checkIcon.SetActive(false);
         description.color = new Color(1, 1, 0);
     }
     if (todoListInfo.parentList.Length != 0)
     {
         //todo: does not support multi level nesting
         description.rectTransform.offsetMin = new Vector2(40, 0);
     }
 }
        protected async Task <DialogTurnResult> MarkTaskCompletedAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await ToDoStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                state.LastListType = state.ListType;
                var service = await InitListTypeIdsAsync(sc, cancellationToken);

                string taskTopicToBeMarked = null;
                if (state.MarkOrDeleteAllTasksFlag)
                {
                    await service.MarkTasksCompletedAsync(state.ListType, state.AllTasks);

                    state.AllTasks.ForEach(task => task.IsCompleted = true);
                    state.ShowTaskPageIndex = 0;
                }
                else
                {
                    taskTopicToBeMarked = state.AllTasks[state.TaskIndexes[0]].Topic;
                    var tasksToBeMarked = new List <TaskItem>();
                    state.TaskIndexes.ForEach(i => tasksToBeMarked.Add(state.AllTasks[i]));
                    await service.MarkTasksCompletedAsync(state.ListType, tasksToBeMarked);

                    state.TaskIndexes.ForEach(i => state.AllTasks[i].IsCompleted = true);
                    state.ShowTaskPageIndex = state.TaskIndexes[0] / state.PageSize;
                }

                if (state.MarkOrDeleteAllTasksFlag)
                {
                    if (state.IsAction)
                    {
                        var actionResult = new TodoListInfo()
                        {
                            ActionSuccess = true
                        };
                        return(await sc.EndDialogAsync(actionResult, cancellationToken));
                    }

                    var markToDoCard = ToAdaptiveCardForTaskCompletedFlowByLG(
                        sc.Context,
                        state.Tasks,
                        state.AllTasks.Count,
                        taskTopicToBeMarked,
                        state.ListType,
                        state.MarkOrDeleteAllTasksFlag);
                    await sc.Context.SendActivityAsync(markToDoCard.Speak, speak : markToDoCard.Speak, cancellationToken : cancellationToken);
                }
                else
                {
                    if (state.IsAction)
                    {
                        var todoList         = new List <string>();
                        var uncompletedTasks = state.AllTasks.Where(t => t.IsCompleted == false).ToList();
                        if (uncompletedTasks != null && uncompletedTasks.Any())
                        {
                            uncompletedTasks.ForEach(x => todoList.Add(x.Topic));
                        }

                        return(await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList }, cancellationToken));
                    }

                    var completedTaskIndex = state.AllTasks.FindIndex(t => t.IsCompleted == true);
                    var taskContent        = state.AllTasks[completedTaskIndex].Topic;
                    var markToDoCard       = ToAdaptiveCardForTaskCompletedFlowByLG(
                        sc.Context,
                        state.Tasks,
                        state.AllTasks.Count,
                        taskContent,
                        state.ListType,
                        state.MarkOrDeleteAllTasksFlag);
                    await sc.Context.SendActivityAsync(markToDoCard.Speak, speak : markToDoCard.Speak, cancellationToken : cancellationToken);

                    int uncompletedTaskCount = state.AllTasks.Where(t => t.IsCompleted == false).Count();
                    if (uncompletedTaskCount == 1)
                    {
                        var activity = TemplateManager.GenerateActivityForLocale(MarkToDoResponses.AfterCompleteCardSummaryMessageForSingleTask, new { ListType = state.ListType });
                        await sc.Context.SendActivityAsync(activity, cancellationToken);
                    }
                    else
                    {
                        var activity = TemplateManager.GenerateActivityForLocale(MarkToDoResponses.AfterCompleteCardSummaryMessageForMultipleTasks, new { AllTasksCount = uncompletedTaskCount.ToString(), ListType = state.ListType });
                        await sc.Context.SendActivityAsync(activity, cancellationToken);
                    }
                }

                return(await sc.EndDialogAsync(true, cancellationToken));
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptionsAsync(sc, ex, cancellationToken);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptionsAsync(sc, ex, cancellationToken);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }
        protected async Task <DialogTurnResult> DeleteTaskAsync(WaterfallStepContext sc, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var state = await ToDoStateAccessor.GetAsync(sc.Context, cancellationToken : cancellationToken);

                state.LastListType = state.ListType;

                bool canDeleteAnotherTask = false;
                var  cardReply            = sc.Context.Activity.CreateReply();
                if (!state.MarkOrDeleteAllTasksFlag)
                {
                    var service = await InitListTypeIdsAsync(sc, cancellationToken);

                    var taskTopicToBeDeleted = state.AllTasks[state.TaskIndexes[0]].Topic;
                    var tasksToBeDeleted     = new List <TaskItem>();
                    state.TaskIndexes.ForEach(i => tasksToBeDeleted.Add(state.AllTasks[i]));
                    await service.DeleteTasksAsync(state.ListType, tasksToBeDeleted);

                    state.AllTasks = await service.GetTasksAsync(state.ListType);

                    var allTasksCount    = state.AllTasks.Count;
                    var currentTaskIndex = state.ShowTaskPageIndex * state.PageSize;
                    while (currentTaskIndex >= allTasksCount && currentTaskIndex >= state.PageSize)
                    {
                        currentTaskIndex -= state.PageSize;
                        state.ShowTaskPageIndex--;
                    }

                    state.Tasks = state.AllTasks.GetRange(currentTaskIndex, Math.Min(state.PageSize, allTasksCount - currentTaskIndex));

                    cardReply = ToAdaptiveCardForTaskDeletedFlowByLG(
                        sc.Context,
                        state.Tasks,
                        state.AllTasks.Count,
                        taskTopicToBeDeleted,
                        state.ListType,
                        false);

                    canDeleteAnotherTask = state.AllTasks.Count > 0 ? true : false;

                    if (state.IsAction)
                    {
                        var todoList = new List <string>();
                        if (state.AllTasks != null && state.AllTasks.Any())
                        {
                            state.AllTasks.ForEach(x => todoList.Add(x.Topic));
                        }

                        return(await sc.EndDialogAsync(new TodoListInfo { ActionSuccess = true, ToDoList = todoList }));
                    }
                }
                else
                {
                    if (state.DeleteTaskConfirmation)
                    {
                        var service = await InitListTypeIdsAsync(sc, cancellationToken);

                        await service.DeleteTasksAsync(state.ListType, state.AllTasks);

                        state.AllTasks          = new List <TaskItem>();
                        state.Tasks             = new List <TaskItem>();
                        state.ShowTaskPageIndex = 0;
                        state.TaskIndexes       = new List <int>();

                        cardReply = ToAdaptiveCardForTaskDeletedFlowByLG(
                            sc.Context,
                            state.Tasks,
                            state.AllTasks.Count,
                            string.Empty,
                            state.ListType,
                            true);

                        if (state.IsAction)
                        {
                            var actionResult = new TodoListInfo()
                            {
                                ActionSuccess = true
                            };
                            return(await sc.EndDialogAsync(actionResult, cancellationToken));
                        }
                    }
                    else
                    {
                        cardReply = ToAdaptiveCardForDeletionRefusedFlowByLG(
                            sc.Context,
                            state.Tasks,
                            state.AllTasks.Count,
                            state.ListType);
                    }
                }

                if (canDeleteAnotherTask)
                {
                    cardReply.InputHint = InputHints.IgnoringInput;
                    await sc.Context.SendActivityAsync(cardReply, cancellationToken);

                    return(await sc.NextAsync(cancellationToken : cancellationToken));
                }
                else
                {
                    cardReply.InputHint = InputHints.AcceptingInput;
                    await sc.Context.SendActivityAsync(cardReply, cancellationToken);

                    return(await sc.EndDialogAsync(true, cancellationToken));
                }
            }
            catch (SkillException ex)
            {
                await HandleDialogExceptionsAsync(sc, ex, cancellationToken);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
            catch (Exception ex)
            {
                await HandleDialogExceptionsAsync(sc, ex, cancellationToken);

                return(new DialogTurnResult(DialogTurnStatus.Cancelled, CommonUtil.DialogTurnResultCancelAllDialogs));
            }
        }