ContinueConversationAsync () требует, чтобы пользователи сначала общались после публикации бота - PullRequest
0 голосов
/ 10 октября 2019

После публикации бота, пользователю необходимо сначала пообщаться с ним, чтобы отправить проактивное сообщение. Я следовал этому примеру , но вместо того, чтобы хранить ссылку на разговор в переменной, я сохранил ее в cosmosDB. Однако я все еще не могу отправить проактивное сообщение, если пользователь не общался с ботом после публикации. Есть ли способ отправить проактивное сообщение, даже если пользователь не общался с ботом после публикации?

DialogBot

    private async void AddConversationReference(ITurnContext turnContext)
    {
        var userstate = await _userProfileAccessor.GetAsync(turnContext, () => new BasicUserState());
        userstate.SavedConversationReference = turnContext.Activity.GetConversationReference();

        _conversationReferences.AddOrUpdate(userstate.SavedConversationReference.User.Id, userstate.SavedConversationReference, (key, newValue) => userstate.SavedConversationReference);
    }

    protected override Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        AddConversationReference(turnContext);

        return base.OnConversationUpdateActivityAsync(turnContext, cancellationToken);
    }


    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        Logger.LogInformation("Running dialog with Message Activity.");

        AddConversationReference(turnContext);

        await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
    }

api / notify

    namespace SabikoBotV2.Controllers
{
    [Route("api/notify")]

    public class NotifyController : ControllerBase
    {
        private readonly IBotFrameworkHttpAdapter _adapter;
        private readonly string _appId;
        private readonly ConcurrentDictionary<string, ConversationReference> _conversationReferences;
        private readonly IStatePropertyAccessor<BasicUserState> _userProfileAccessor;

        public NotifyController(UserState userState, IBotFrameworkHttpAdapter adapter, ICredentialProvider credentials, ConcurrentDictionary<string, ConversationReference> conversationReferences)
        {
            _userProfileAccessor = userState.CreateProperty<BasicUserState>("UserProfile");

            _adapter = adapter;
            _conversationReferences = conversationReferences;
            _appId = ((SimpleCredentialProvider)credentials).AppId;

            if (string.IsNullOrEmpty(_appId))
            {
                _appId = Guid.NewGuid().ToString(); //if no AppId, use a random Guid
            }
        }

        public async Task<IActionResult> Get()
        {
            try
            {
                foreach (var conversationReference in _conversationReferences.Values)
                {
                    await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, BotCallback, default(CancellationToken));
                }

                return new ContentResult()
                {
                    Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
                    ContentType = "text/html",
                    StatusCode = (int)HttpStatusCode.OK,
                };
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
        {
            var userstate = await _userProfileAccessor.GetAsync(turnContext, () => new BasicUserState(), cancellationToken);

            if (userstate.SavedConversationReference.ServiceUrl != null && userstate.SavedConversationReference.ServiceUrl != string.Empty)
            {
        MicrosoftAppCredentials.TrustServiceUrl(userstate.SavedConversationReference.ServiceUrl);
            }
            else if (turnContext.Activity.ServiceUrl != null && turnContext.Activity.ServiceUrl != string.Empty)
            {
                MicrosoftAppCredentials.TrustServiceUrl(turnContext.Activity.ServiceUrl);            
            }
            else
            {
                MicrosoftAppCredentials.TrustServiceUrl("https://facebook.botframework.com/");
            }

            if(userstate.Reminders != null)
            {
                foreach (var reminder in userstate.Reminders)
                {            
                    if (reminder.DateAndTime.TrimMilliseconds() == DateTimeNowInGmt().TrimMilliseconds())
                    {                     
                        var timeProperty = new TimexProperty(reminder.DateAndTimeTimex);
                        var naturalDate = timeProperty.ToNaturalLanguage(DateTimeNowInGmt().TrimMilliseconds());
                        await turnContext.SendActivityAsync($"It's {DateTimeNowInGmt().ToLongDateString()}. \n\nReminding you to {reminder.Subject}.");
                    }
                }
            }
        }

        public static DateTime DateTimeNowInGmt()
        {
            TimeZoneInfo phTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Taipei Standard Time");
            var t = DateTime.Now;
            DateTime phTime = TimeZoneInfo.ConvertTime(t, phTimeZone);

            return phTime;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...