Клиент c # Bot Framework и разница часовых поясов сервера - PullRequest
0 голосов
/ 17 мая 2018

Я создаю чат-бота, используя MS Bot Framework, где первоначально я отправлю приветственное сообщение, например «Доброе утро, имя пользователя», но мой бот размещен в Azure, и я использую DateTime. Теперь, чтобы найти время дня и предоставить приветственное сообщениесоответственно.Но если какой-то пользователь из другого часового пояса использует сообщения «Доброе утро» и «Добрый день», не подходит.

Как я могу преодолеть это?

if (DateTime.Now.Hour < 12)
{
    await context.PostAsync("Good Morning");
}
else if (DateTime.Now.Hour > 12 and DateTime.Now.Hour < 17)
{
    await context.PostAsync("Good Afternoon");
}
else
{
    await context.PostAsync("Good Evening");
}

1 Ответ

0 голосов
/ 18 мая 2018

Если вы встраиваете веб-чат в свой веб-сайт, как упомянул Мэтт в комментарии, вы можете использовать механизм обратного канала для передачи TimezoneOffset из клиента JavaScript в ваше приложение бота для достижения ваших требований.

В клиенте JavaScript:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="https://cdn.botframework.com/botframework-webchat/latest/botchat.css" rel="stylesheet" />
    <script src="https://cdn.botframework.com/botframework-webchat/latest/botchat.js"></script>
    <style>
        .wc-chatview-panel {
            width: 350px;
            height: 500px;
            position: relative;
        }
    </style>
</head>
<body>
    <div id="bot" />
</body>
</html>
<script>
    var botConnection = new BotChat.DirectLine({ secret: "{directline_secret}" }); 

    var d = new Date();
    var tzoffset = d.getTimezoneOffset();

    BotChat.App({
        botConnection: botConnection,
        user: { id: 'userid' },
        bot: { id: 'fehanbotdg' },
        resize: 'detect'
    }, document.getElementById("bot"));


    botConnection.postActivity({
        type: 'event',
        from: { id: 'userid'},
        name: 'ClientTimezoneOffsetEvent',
        value: tzoffset.toString()
    }).subscribe(function (id) { console.log('ClientTimezoneOffset: "' + tzoffset + '" sent'); });
</script>

В приложении бота MessagesController:

private Activity HandleSystemMessage(Activity message)
{
    if (message.Type == ActivityTypes.DeleteUserData)
    {
        // Implement user deletion here
        // If we handle user deletion, return a real message
    }
//......
//code logic for other messages types
    //......
    else if (message.Type == ActivityTypes.Event && message.Name == "ClientTimezoneOffsetEvent") {

        int timezoneOffset = Convert.ToInt32(message.Value);

        var client = new ConnectorClient(new Uri(message.ServiceUrl), new MicrosoftAppCredentials());

        timezoneOffset = Convert.ToInt32(message.Value);

        DateTime newDate = DateTime.UtcNow - new TimeSpan(timezoneOffset / 60, timezoneOffset % 60, 0);

        var greeting = "";

        if (newDate.Hour < 12)
        {
            greeting = "Good Morning";
        }
        else if (newDate.Hour > 12 & newDate.Hour <= 17)
        {
            greeting = "Good Afternoon";
        }
        else if (newDate.Hour > 17 & newDate.Hour <= 24)
        {
            greeting = "Good Evening";
        }

        var reply = message.CreateReply();

        reply.Text = $"{greeting}! UTC time: {DateTime.UtcNow}; Client time: {newDate}";

        client.Conversations.ReplyToActivityAsync(reply);
    }

    return null;
}

Результат теста:

enter image description here

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