// Handle message activity in channel private async Task OnMessageActivityInChannelAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in channel"); await this.OnAdaptiveCardSubmitInChannelAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); switch (text) { case TeamTour: this.telemetryClient.TrackTrace("Sending team tour card"); var teamTourCards = TourCarousel.GetTeamTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(teamTourCards)); break; default: this.telemetryClient.TrackTrace("Unrecognized input in channel"); var unrecognizedInputCard = UnrecognizedTeamInputCard.GetCard(); await turnContext.SendActivityAsync(MessageFactory.Attachment(unrecognizedInputCard)); break; } }
// Handle message activity in 1:1 chat private async Task OnMessageActivityInPersonalChatAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in 1:1 chat"); await this.OnAdaptiveCardSubmitInPersonalChatAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); switch (text) { case AskAnExpert: this.telemetryClient.TrackTrace("Sending user ask an expert card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())); break; case ShareFeedback: this.telemetryClient.TrackTrace("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())); break; case TakeATour: this.telemetryClient.TrackTrace("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)); break; default: this.telemetryClient.TrackTrace("Sending input to QnAMaker"); var queryResult = await this.GetAnswerFromQnAMakerAsync(text, turnContext, cancellationToken); if (queryResult != null) { string answer = this.ReplaceWildCard(message, turnContext, queryResult.Answer); await turnContext.SendActivityAsync(MessageFactory.Attachment(ResponseCard.GetCard(queryResult.Questions[0], answer, queryResult.Source, text))); } else { await turnContext.SendActivityAsync(MessageFactory.Attachment(UnrecognizedInputCard.GetCard(text))); } // Save conversation var saveConversations = await this.configurationProvider.GetSavedEntityDetailAsync(ConfigurationEntityTypes.SaveConversations); if (bool.Parse(saveConversations)) { var userDetails = await this.GetUserDetailsInPersonalChatAsync(turnContext, cancellationToken); ConversationEntity newConversation = await this.CreateConversationAsync(message, queryResult, userDetails); } break; } }
// Handle message activity in channel private async Task OnMessageActivityInChannelAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in channel"); await this.OnAdaptiveCardSubmitInChannelAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); if (text.Equals(Resource.ResourceManager.GetString("TakeATeamTourButtonText", CultureInfo.CurrentCulture), StringComparison.InvariantCultureIgnoreCase)) { this.telemetryClient.TrackTrace("Sending team tour card"); var teamTourCards = TourCarousel.GetTeamTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(teamTourCards)); } else { this.telemetryClient.TrackTrace("Unrecognized input in channel"); var unrecognizedInputCard = UnrecognizedTeamInputCard.GetCard(); await turnContext.SendActivityAsync(MessageFactory.Attachment(unrecognizedInputCard)); } }
// Handle message activity in 1:1 chat private async Task OnMessageActivityInPersonalChatAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in 1:1 chat"); await this.OnAdaptiveCardSubmitInPersonalChatAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); if (text.Equals(Resource.ResourceManager.GetString("AskAnExpertDisplayText", CultureInfo.CurrentCulture), StringComparison.InvariantCultureIgnoreCase)) { this.telemetryClient.TrackTrace("Sending user ask an expert card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())); } else if (text.Equals(Resource.ResourceManager.GetString("ShareFeedbackDisplayText", CultureInfo.CurrentCulture), StringComparison.InvariantCultureIgnoreCase)) { this.telemetryClient.TrackTrace("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())); } else if (text.Equals(Resource.ResourceManager.GetString("TakeATourButtonText", CultureInfo.CurrentCulture), StringComparison.InvariantCultureIgnoreCase)) { this.telemetryClient.TrackTrace("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)); } else { this.telemetryClient.TrackTrace("Sending input to QnAMaker"); var queryResult = await this.GetAnswerFromQnAMakerAsync(text, turnContext, cancellationToken); if (queryResult != null) { this.telemetryClient.TrackTrace("Sending user QnAMaker card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ResponseCard.GetCard(queryResult.Questions[0], queryResult.Answer, text))); } else { var tileList = await this.MatchTagsWithMessageAsync(text); if (tileList != null) { this.telemetryClient.TrackTrace("Sending user tags card"); await turnContext.SendActivityAsync(SuggestedLinkCard.GetTagsCarouselCards(text, tileList, Resource.CustomMessage)); } else { this.telemetryClient.TrackTrace("Sending user with no matched tags result"); await turnContext.SendActivityAsync(MessageFactory.Attachment(UnrecognizedInputCard.GetCard(text, Resource.NoMatchedTagsMessage))); } } } }
private async Task <DialogTurnResult> StartDialogAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { string text = stepContext.Context.Activity.Text?.ToLower()?.Trim() ?? string.Empty; switch (text) { case Constants.ChangeLanguage: case "language changes": case "changes language": case "changes the language": this._telemetryClient.TrackEvent("User wants to change language"); return(await stepContext.BeginDialogAsync(nameof(ChangeLanguageDialog))); case Constants.AskAnExpert: this._telemetryClient.TrackEvent("Sending user ask an expert card"); await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())).ConfigureAwait(false); break; case Constants.ShareFeedback: this._telemetryClient.TrackEvent("Sending user feedback card"); await stepContext.Context.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())).ConfigureAwait(false); break; case Constants.TakeATour: this._telemetryClient.TrackEvent("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this._appBaseUri); await stepContext.Context.SendActivityAsync(MessageFactory.Carousel(userTourCards)).ConfigureAwait(false); break; default: this._telemetryClient.TrackEvent("Sending input to QnAMaker"); var message = stepContext.Context.Activity.AsMessageActivity(); await this.GetQuestionAnswerReplyAsync(stepContext.Context, message).ConfigureAwait(false); break; } return(await stepContext.EndDialogAsync(null, cancellationToken)); }
/// <summary> /// Handle message activity in 1:1 chat. /// </summary> /// <param name="message">A message in a conversation.</param> /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param> /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param> /// <returns>A task that represents the work queued to execute.</returns> private async Task OnMessageActivityInPersonalChatAsync( IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.logger.LogInformation("Card submit in 1:1 chat"); await this.OnAdaptiveCardSubmitInPersonalChatAsync(message, turnContext, cancellationToken).ConfigureAwait(false); return; } string text = message.Text?.ToLower()?.Trim() ?? string.Empty; switch (text) { case Constants.AskAnExpert: this.logger.LogInformation("Sending user ask an expert card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())).ConfigureAwait(false); break; case Constants.ShareFeedback: this.logger.LogInformation("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())).ConfigureAwait(false); break; case Constants.TakeATour: this.logger.LogInformation("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)).ConfigureAwait(false); break; default: this.logger.LogInformation("Sending input to QnAMaker"); await this.GetQuestionAnswerReplyAsync(turnContext, message).ConfigureAwait(false); break; } }
/// <summary> /// Resolve bot command in 1:1 chat. /// </summary> /// <param name="message">A message in a conversation.</param> /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param> /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param> /// <returns>A task that represents the work queued to execute.</returns> public async Task ResolveBotCommandInPersonalChatAsync( IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.logger.LogInformation("Card submit in 1:1 chat"); await this.conversationService.SendAdaptiveCardInPersonalChatAsync(message, turnContext, cancellationToken).ConfigureAwait(false); return; } string text = (message.Text ?? string.Empty).Trim(); if (text.Equals(Strings.BotCommandAskExpert, StringComparison.CurrentCultureIgnoreCase) || text.Equals(Constants.AskAnExpert, StringComparison.InvariantCultureIgnoreCase)) { this.logger.LogInformation("Sending user ask an expert card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())).ConfigureAwait(false); } else if (text.Equals(Strings.BotCommandFeedback, StringComparison.CurrentCultureIgnoreCase) || text.Equals(Constants.ShareFeedback, StringComparison.InvariantCultureIgnoreCase)) { this.logger.LogInformation("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())).ConfigureAwait(false); } else if (text.Equals(Strings.BotCommandTour, StringComparison.CurrentCultureIgnoreCase) || text.Equals(Constants.TakeATour, StringComparison.InvariantCultureIgnoreCase)) { this.logger.LogInformation("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)).ConfigureAwait(false); } else { this.logger.LogInformation("Sending input to QnAMaker"); await this.qnaPairService.GetReplyToQnAAsync(turnContext, message).ConfigureAwait(false); } }
// Handle message activity in 1:1 chat private async Task OnMessageActivityInPersonalChatAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in 1:1 chat"); await this.OnAdaptiveCardSubmitInPersonalChatAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); this.telemetryClient.TrackTrace($"Se ha enviado esta solicitud: {text}"); switch (text) { case AskAnExpert: this.telemetryClient.TrackTrace("Sending user ask an expert card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())); break; case ShareFeedback: this.telemetryClient.TrackTrace("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())); break; case TakeATour: this.telemetryClient.TrackTrace("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)); break; case WelcomeMsg: this.telemetryClient.TrackTrace("The user as required the Welcome screen"); var welcomeText = await this.configurationProvider.GetSavedEntityDetailAsync(ConfigurationEntityTypes.WelcomeMessageText); var userWelcomeCardAttachment = WelcomeCard.GetCard(welcomeText); var userWelcomeCardAttachment2 = WelcomeCardPreguntas.GetCard(Resource.WelcomeTeamCardContent); await turnContext.SendActivityAsync(MessageFactory.Attachment(userWelcomeCardAttachment)); await turnContext.SendActivityAsync(MessageFactory.Attachment(userWelcomeCardAttachment2)); break; default: this.telemetryClient.TrackTrace("Sending input to QnAMaker"); var queryResult = await this.GetAnswerFromQnAMakerAsync(text, turnContext, cancellationToken); if (queryResult != null) { this.telemetryClient.TrackTrace("Sending user QnAMaker card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ResponseCard.GetCard(queryResult.Questions[0], queryResult.Answer, text))); } else { var tileList = await this.MatchTagsWithMessageAsync(text); if (tileList != null) { this.telemetryClient.TrackTrace("Sending user tags card"); await turnContext.SendActivityAsync(SuggestedLinkCard.GetTagsCarouselCards(text, tileList, Resource.CustomMessage)); } else { this.telemetryClient.TrackTrace("Sending user with no matched tags result"); await turnContext.SendActivityAsync(MessageFactory.Attachment(UnrecognizedInputCard.GetCard(text, Resource.NoMatchedTagsMessage))); } } break; } }
/// <summary> /// Resolves bot commands in channel. /// </summary> /// <param name="message">A message in a conversation.</param> /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param> /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param> /// <returns>A task that represents the work queued to execute.</returns> public async Task ResolveBotCommandInTeamChatAsync( IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { string text; // Check if the incoming request is from SME for updating the ticket status. if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues && !string.IsNullOrEmpty(((JObject)message.Value)["ticketId"]?.ToString())) { text = ChangeStatus ?? throw new ArgumentNullException(nameof(ChangeStatus)); } else { text = message.Text?.ToLower()?.Trim() ?? string.Empty; } try { switch (text) { case Constants.TeamTour: this.logger.LogInformation("Sending team tour card"); var teamTourCards = TourCarousel.GetTeamTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(teamTourCards)).ConfigureAwait(false); break; case ChangeStatus: this.logger.LogInformation($"Card submit in channel {message.Value?.ToString()}"); await this.conversationService.SendAdaptiveCardInTeamChatAsync(message, turnContext, cancellationToken).ConfigureAwait(false); return; case Constants.DeleteCommand: this.logger.LogInformation($"Delete card submit in channel {message.Value?.ToString()}"); await QnaHelper.DeleteQnaPair(turnContext, this.qnaServiceProvider, this.activityStorageProvider, this.logger, cancellationToken).ConfigureAwait(false); break; case Constants.NoCommand: return; default: this.logger.LogInformation("Unrecognized input in channel"); await turnContext.SendActivityAsync(MessageFactory.Attachment(UnrecognizedTeamInputCard.GetCard())).ConfigureAwait(false); break; } } catch (Exception ex) { // Check if expert user is trying to delete the question and knowledge base has not published yet. if (((ErrorResponseException)ex).Response.StatusCode == HttpStatusCode.BadRequest) { var knowledgeBaseId = await this.configurationProvider.GetSavedEntityDetailAsync(Constants.KnowledgeBaseEntityId).ConfigureAwait(false); var hasPublished = await this.qnaServiceProvider.GetInitialPublishedStatusAsync(knowledgeBaseId).ConfigureAwait(false); // Check if knowledge base has not published yet. if (!hasPublished) { var activity = (Activity)turnContext.Activity; var activityValue = ((JObject)activity.Value).ToObject <AdaptiveSubmitActionData>(); await turnContext.SendActivityAsync(MessageFactory.Text(string.Format(CultureInfo.InvariantCulture, Strings.WaitMessage, activityValue?.OriginalQuestion))).ConfigureAwait(false); this.logger.LogError(ex, $"Error processing message: {ex.Message}", SeverityLevel.Error); return; } } // Throw the error at calling place, if there is any generic exception which is not caught by above conditon. throw; } }
// Handle message activity in 1:1 chat private async Task OnMessageActivityInPersonalChatAsync(IMessageActivity message, ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(message.ReplyToId) && (message.Value != null) && ((JObject)message.Value).HasValues) { this.telemetryClient.TrackTrace("Card submit in 1:1 chat"); await this.OnAdaptiveCardSubmitInPersonalChatAsync(message, turnContext, cancellationToken); return; } string text = (message.Text ?? string.Empty).Trim().ToLower(); switch (text) { case AskAnExpert: this.telemetryClient.TrackTrace("Mandando tarjeta pregunta a un experto al usuario"); await turnContext.SendActivityAsync(MessageFactory.Attachment(AskAnExpertCard.GetCard())); break; case ShareFeedback: this.telemetryClient.TrackTrace("Sending user feedback card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ShareFeedbackCard.GetCard())); break; case TakeATour: this.telemetryClient.TrackTrace("Sending user tour card"); var userTourCards = TourCarousel.GetUserTourCards(this.appBaseUri); await turnContext.SendActivityAsync(MessageFactory.Carousel(userTourCards)); break; default: this.telemetryClient.TrackTrace("Sending input to QnAMaker"); var queryResult = await this.GetAnswerFromQnAMakerAsync(text, turnContext, cancellationToken); if (queryResult != null) { this.telemetryClient.TrackTrace("Sending user QnAMaker card"); await turnContext.SendActivityAsync(MessageFactory.Attachment(ResponseCard.GetCard(queryResult.Questions[0], queryResult.Answer, text))); } else { var tileList = await this.MatchTagsWithMessageAsync(text); if (tileList != null) { this.telemetryClient.TrackTrace("Sending user tags card"); await turnContext.SendActivityAsync(SuggestedLinkCard.GetTagsCarouselCards(text, tileList, Resource.CustomMessage)); } else { this.telemetryClient.TrackTrace("Sending user with no matched tags result"); await turnContext.SendActivityAsync(MessageFactory.Attachment(UnrecognizedInputCard.GetCard(text, Resource.NoMatchedTagsMessage))); } } break; } }