Ejemplo n.º 1
0
        public ChatBotViewModel()
        {
            Messages = new ObservableRangeCollection <ChatBotMessage>();

            SendCommand = new Command(() => {
                var message = new ChatBotMessage
                {
                    Message   = OutGoingText,
                    Incoming  = false,
                    TimeStamp = DateTime.Now
                };

                Messages.Add(message);

                OutGoingText = string.Empty;
            });

            InitializeMockData();
        }
Ejemplo n.º 2
0
        // metodo che viene invocato per ogni messaggio che viene inviato dall'utente
        protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            // creo un accessor per accedere ai dati salvati della conversazione
            var conversationStateAccessors = _conversationState.CreateProperty <ConversationData>(nameof(ConversationData));
            var conversationData           = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData());

            // ottengo la stringa del messaggio inviato dall'utente
            string messageText = turnContext.Activity.Text;

            switch (conversationData.state)
            {
            case ConversationData.AsiBotState.Ready:
                AsiQuestion singleQuestion = new AsiQuestion()
                {
                    Question = messageText
                };
                var categoriesReponse = _mlManager.MakePrediction(singleQuestion);

                if (categoriesReponse.Count == 0)
                {
                    var noCategoryMessage = new ChatBotMessage(new string[] { "Non è stato possibile identificare la categoria del problema, si prega di contattare l'assistenza clienti alla mail [email protected]" });
                    typeAnswers(noCategoryMessage.GetActivities(), turnContext, cancellationToken);
                    conversationData.state            = ConversationData.AsiBotState.Ready;
                    conversationData.lastActivity     = MessageFactory.Text("");
                    conversationData.originalMessage  = "";
                    conversationData.possibleCategory = "";
                }
                else if (categoriesReponse.Count == 1)
                {
                    string firstMessage          = $"Categoria trovata: {categoriesReponse.First().getCategoryName()}";
                    string secondMessage         = $"Puoi provare a risolvere il problema al seguente link -url-{categoriesReponse.First().getDocumentationUrl()}-url-";
                    string thirdMessage          = "Questa risposta ti è stata utile?";
                    var    oneCategoryMessage    = new ChatBotMessage(new string[] { firstMessage, secondMessage, thirdMessage }, new string[] { "Si", "No" });
                    var    oneCategoryActivities = oneCategoryMessage.GetActivities();
                    typeAnswers(oneCategoryActivities, turnContext, cancellationToken);
                    conversationData.state            = ConversationData.AsiBotState.WaitingApproval;
                    conversationData.lastActivity     = oneCategoryActivities.Last();
                    conversationData.originalMessage  = messageText;
                    conversationData.possibleCategory = categoriesReponse.First().getCategoryName();
                }
                else
                {
                    var ambiguosMessage    = new ChatBotMessage(new string[] { "Di quali di queste categorie stai parlando?" }, categoriesReponse.Select(category => category.getCategoryName()).ToArray());
                    var ambiguosActivities = ambiguosMessage.GetActivities();
                    typeAnswers(ambiguosActivities, turnContext, cancellationToken);
                    conversationData.state            = ConversationData.AsiBotState.WaitingDisambiguation;
                    conversationData.lastActivity     = ambiguosActivities.Last();
                    conversationData.originalMessage  = messageText;
                    conversationData.possibleCategory = "";
                }

                break;

            case ConversationData.AsiBotState.WaitingDisambiguation:
                var inputCategory = new AsiCategoryHandler(messageText);

                // se l'utente non risponde correttamente alla domanda, gli viene riproposta rimanendo nello stesso stato
                if (inputCategory.category == AsiCategoryHandler.AsiCategory.Undefined)
                {
                    await turnContext.SendActivityAsync(conversationData.lastActivity);

                    return;
                }

                var disambiguationMessage = new ChatBotMessage()
                {
                    TextMessages = new string[] { $"Il manuale di riferimento è disponibile al link -url-{inputCategory.getDocumentationUrl()}-url-", "Ti è stato utile?" }, Options = new string[] { "Si", "No" }
                };
                var activities = disambiguationMessage.GetActivities();
                typeAnswers(activities, turnContext, cancellationToken);
                conversationData.lastActivity     = activities.Last();
                conversationData.state            = ConversationData.AsiBotState.WaitingApproval;
                conversationData.possibleCategory = inputCategory.getCategoryName();

                break;

            case ConversationData.AsiBotState.WaitingApproval:

                // se l'utente non risponde Si o No gli viene riproposta la domanda
                if (!messageText.Equals("Si") && !messageText.Equals("No"))
                {
                    await turnContext.SendActivityAsync(conversationData.lastActivity, cancellationToken);

                    return;
                }

                if (messageText.Equals("Si"))
                {
                    _datasetManager.insertNewQuestion(conversationData.originalMessage, conversationData.possibleCategory);
                    await turnContext.SendActivityAsync(MessageFactory.Text("Grazie per aver utilizzato il nostro servizio, arrivederci"));

                    conversationData.lastActivity     = MessageFactory.Text("");
                    conversationData.state            = ConversationData.AsiBotState.Ready;
                    conversationData.originalMessage  = "";
                    conversationData.possibleCategory = "";
                }
                else
                {
                    var quickResponsesMessage = generateWorkInProgressActivity();

                    await turnContext.SendActivityAsync(quickResponsesMessage, cancellationToken);

                    conversationData.state            = ConversationData.AsiBotState.EvaluatingQuickResponses;
                    conversationData.possibleCategory = "";
                }

                break;

            case ConversationData.AsiBotState.EvaluatingQuickResponses:

                var inCategory = new QuickResponseCategoryHandler(messageText);
                if (inCategory.category == QuickResponseCategoryHandler.QuickResponseCategory.Undefined && !(messageText.Equals("Nessuna delle precedenti")))
                {
                    await turnContext.SendActivityAsync(generateWorkInProgressActivity());

                    return;
                }

                if (inCategory.category == QuickResponseCategoryHandler.QuickResponseCategory.Undefined)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text("Ci dispiace non essere riusciti a risolvere il tuo problema, buona giornata"));
                }
                else
                {
                    _datasetManager.insertNewWorkInProgressQuestion(conversationData.originalMessage, inCategory.getCategoryName());
                    await turnContext.SendActivityAsync(MessageFactory.Text("Grazie per il tuo feedback e per aver utilizzato il nostro servizio, arrivederci"));
                }

                conversationData.lastActivity     = MessageFactory.Text("");
                conversationData.state            = ConversationData.AsiBotState.Ready;
                conversationData.originalMessage  = "";
                conversationData.possibleCategory = "";

                break;
            }
        }