protected virtual async Task OnFacebookThreadControlRequest(ITurnContext turnContext, FacebookPayload facebookPayload, CancellationToken cancellationToken) { _logger.LogInformation("PrimaryBot - Thread Control Request message received."); string requestedOwnerAppId = facebookPayload.RequestThreadControl.RequestedOwnerAppId; if (facebookPayload.RequestThreadControl.Metadata == "please") { await turnContext.SendActivityAsync($"Primary Bot: {requestedOwnerAppId} requested thread control nicely. Passing thread control..."); var success = await FacebookThreadControlHelper.PassThreadControlAsync( _configuration["FacebookPageToken"], requestedOwnerAppId, facebookPayload.Sender.Id, "allowing thread control"); if (!success) { // Account for situations when the primary receiver doesn't have thread control await turnContext.SendActivityAsync("Primary Bot: Thread control could not be passed."); } } else { await turnContext.SendActivityAsync($"Primary Bot: {requestedOwnerAppId} requested thread control but did not ask nicely." + " Thread control will not be passed." + " Send any message to continue."); } }
protected virtual async Task OnFacebookStandby(ITurnContext turnContext, FacebookStandby facebookStandby, CancellationToken cancellationToken) { _logger.LogInformation("PrimaryBot - Standby message received."); var text = facebookStandby?.Message?.Text; if (text?.Equals(OPTION_TAKE_THREAD_CONTROL, StringComparison.InvariantCultureIgnoreCase) == true) { await FacebookThreadControlHelper.TakeThreadControlAsync(_configuration["FacebookPageToken"], facebookStandby.Sender.Id, text); } }
protected virtual async Task OnFacebookStandby(ITurnContext turnContext, FacebookStandby facebookStandby, CancellationToken cancellationToken) { _logger.LogInformation("SecondaryBot - Standby message received."); var text = facebookStandby?.Message?.Text; if (text?.Equals(OPTION_REQUEST_THREAD_CONTROL, StringComparison.InvariantCultureIgnoreCase) == true) { await FacebookThreadControlHelper.RequestThreadControlAsync(_configuration["FacebookPageToken"], facebookStandby.Sender.Id, "give me control"); } else if (text?.Equals(OPTION_REQUEST_THREAD_CONTROL_NICELY, StringComparison.InvariantCultureIgnoreCase) == true) { await FacebookThreadControlHelper.RequestThreadControlAsync(_configuration["FacebookPageToken"], facebookStandby.Sender.Id, "please"); } }
protected virtual async Task OnFacebookThreadControlRequest(ITurnContext turnContext, FacebookPayload facebookPayload, CancellationToken cancellationToken) { Logger.LogInformation("Thread Control Request message received."); // TODO: Your Thread Control Request event handling logic here... if (facebookPayload.RequestThreadControl.RequestOwnerAppId == _configuration["SecondaryFacebookAppId"]) { await FacebookThreadControlHelper.PassThreadControlToBot(turnContext, _configuration["PrimaryPageToken"], facebookPayload.RequestThreadControl.RequestOwnerAppId, facebookPayload.Sender.Id, "allowing thread control"); } else { Logger.LogInformation($"Thread Control Request denied. Only allowed for {_configuration["SecondaryFacebookAppId"]}"); } }
protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { var text = turnContext.Activity.Text; switch (text) { case OPTION_PASS_PAGE_INBOX: await turnContext.SendActivityAsync("Primary Bot: Passing thread control to the page inbox..."); await FacebookThreadControlHelper.PassThreadControlAsync(_configuration["FacebookPageToken"], PAGE_INBOX_ID, turnContext.Activity.From.Id, text); break; case OPTION_PASS_SECONDARY_BOT: var secondaryReceivers = await FacebookThreadControlHelper.GetSecondaryReceiversAsync(_configuration["FacebookPageToken"]); foreach (var receiver in secondaryReceivers) { if (receiver != PAGE_INBOX_ID) { await turnContext.SendActivityAsync($"Primary Bot: Passing thread control to {receiver}..."); await FacebookThreadControlHelper.PassThreadControlAsync(_configuration["FacebookPageToken"], receiver, turnContext.Activity.From.Id, text); break; } } break; case OPTION_REQUEST_THREAD_CONTROL: case OPTION_REQUEST_THREAD_CONTROL_NICELY: // Do nothing because the secondary receiver should react to these instead break; default: await ShowChoices(turnContext, cancellationToken); break; } }
protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { Logger.LogInformation("Processing a Message Activity."); if (turnContext.Activity.Text?.Equals(EscalateOption, StringComparison.InvariantCultureIgnoreCase) == true) { await FacebookThreadControlHelper.RequestThreadControlToBot(turnContext, _configuration["SecondaryPageToken"], turnContext.Activity.From.Id, EscalateOption); } else if (turnContext.Activity.Text?.Equals(PrimaryBotOption, StringComparison.InvariantCultureIgnoreCase) == true) { await FacebookThreadControlHelper.PassThreadControlToPrimaryBot(turnContext, _configuration["PrimaryPageToken"], turnContext.Activity.From.Id, PrimaryBotOption); } else { // Show choices if the Facebook Payload from ChannelData is not handled if (!await ProcessFacebookPayload(turnContext, turnContext.Activity.ChannelData, cancellationToken)) { await ShowChoices(turnContext, cancellationToken); } } }
protected override async Task OnMessageActivityAsync(ITurnContext <IMessageActivity> turnContext, CancellationToken cancellationToken) { var text = turnContext.Activity.Text; switch (text) { case OPTION_PASS_PRIMARY_BOT: await turnContext.SendActivityAsync("Secondary Bot: Passing thread control to the primary receiver..."); // A null target app ID will automatically pass control to the primary receiver await FacebookThreadControlHelper.PassThreadControlAsync(_configuration["FacebookPageToken"], null, turnContext.Activity.From.Id, text); break; case OPTION_TAKE_THREAD_CONTROL: // Do nothing because the primary receiver should react to this instead break; default: await ShowChoices(turnContext, cancellationToken); break; } }
protected virtual async Task OnFacebookQuickReply(ITurnContext turnContext, FacebookQuickReply quickReply, CancellationToken cancellationToken) { Logger.LogInformation("QuickReply message received."); // TODO: Your quick reply event handling logic here... // Process the message by checking the Activity.Text. The FacebookQuickReply could also contain a json payload. // Initially the bot offers to showcase 3 Facebook features: Quick replies, PostBack and getting the Facebook Page Name. switch (turnContext.Activity.Text) { // Here we showcase how to obtain the Facebook page id. // This can be useful for the Facebook multi-page support provided by the Bot Framework. // The Facebook page id from which the message comes from is in turnContext.Activity.Recipient.Id. case FacebookPageIdOption: { var reply = turnContext.Activity.CreateReply($"This message comes from the following Facebook Page: {turnContext.Activity.Recipient.Id} for the following Bot: {turnContext.Activity.Recipient.Name}"); await turnContext.SendActivityAsync(reply, cancellationToken); await ShowChoices(turnContext, cancellationToken); break; } // Here we send a HeroCard with 2 options that will trigger a Facebook PostBack. case PostBackOption: { var card = new HeroCard { Text = "Is 42 the answer to the ultimate question of Life, the Universe, and Everything?", Buttons = new List <CardAction> { new CardAction() { Title = "Yes", Type = ActionTypes.PostBack, Value = "Yes" }, new CardAction() { Title = "No", Type = ActionTypes.PostBack, Value = "No" }, }, }; var reply = turnContext.Activity.CreateReply(); reply.Attachments = new List <Attachment> { card.ToAttachment() }; await turnContext.SendActivityAsync(reply, cancellationToken); break; } case EscalateOption: { await turnContext.SendActivityAsync("Requesting thread control for Secondary bot"); await FacebookThreadControlHelper.RequestThreadControlToBot(turnContext, _configuration["SecondaryPageToken"], turnContext.Activity.From.Id, EscalateOption); break; } case PrimaryBotOption: { await turnContext.SendActivityAsync("Passing thread control to Primary bot"); await FacebookThreadControlHelper.PassThreadControlToPrimaryBot(turnContext, _configuration["PrimaryPageToken"], turnContext.Activity.From.Id, PrimaryBotOption); break; } // By default we offer the users different actions that the bot supports, through quick replies. case QuickRepliesOption: default: { await ShowChoices(turnContext, cancellationToken); break; } } }