Exemplo n.º 1
0
        // genera l'activity contenente la card per l'acquisizione dati del nuovo servizio
        public Activity generateWorkInProgressActivity()
        {
            Activity quickResponsesMessage = MessageFactory.Text("New feature: Work in progress");

            quickResponsesMessage.Attachments = new List <Attachment>();

            string cardTitle      = "Aiutaci a migliorare il servizio";
            string cardSubtitle   = "Sfortunatamente non siamo riusciti a risolvere il problema da lei richiesto ma stiamo lavorando allo sviluppo di un nuovo servizio di risoluzione dei problemi più comuni. Troverà di seguito una lista di soluzioni comuni per problemi di dominio generale, se eventualmente una delle soluzioni risolvesse il suo problema sarebe gradito un suo feedback per aiutare lo sviluppo del nuovo servizio, grazie";
            var    quickResponses = QuickResponseCategoryHandler.GetQuickResponsesList();
            string cardJSON       = generateAdaptiveCardWithOptions(cardTitle, cardSubtitle, quickResponses);

            var results = AdaptiveCard.FromJson(cardJSON);
            var card    = results.Card;

            quickResponsesMessage.Attachments.Add(new Attachment()
            {
                Content     = card,
                ContentType = AdaptiveCard.ContentType,
                Name        = "Card"
            });

            return(quickResponsesMessage);
        }
Exemplo 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;
            }
        }