【问题标题】:c# Bot Framework client and Server timezone differencec# Bot Framework客户端和服务器时区的区别
【发布时间】:2018-10-28 01:01:26
【问题描述】:

我使用 MS bot 框架创建了一个聊天机器人,最初我将发送一条欢迎消息,例如“早上好用户名”,但我的 bot 托管在 azure 中,我使用 DateTime.Now 来查找一天中的时间并提供问候消息因此。但是如果一些来自不同时区的用户使用“早上好”和“下午好”的消息是不合适的。

我该如何克服这个问题?

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");
}

【问题讨论】:

  • 您可能需要使用 javascript 在客户端获取本地时间并将其传回您的服务器。
  • 您能否提供一个示例来说明您如何处理消息和日期/时间逻辑?
  • @Matt webchat 只向我发送消息到我的机器人 API,而不是发送客户端时间
  • @AussieJoe If(DateTime.Now.Hour 12 and DateTime.Now.Hour
  • 根据github.com/Microsoft/BotFramework-WebChat/blob/master/README.md,您必须创建一个BackChannel。这允许您将客户端信息传送到您的服务器并在您的网络聊天机器人中使用它

标签: c# .net botframework


【解决方案1】:

如果您在网站中嵌入网络聊天,正如 Matt 在评论中提到的,您可以使用 backchannel mechanismTimezoneOffset 从 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;
}

测试结果:

【讨论】:

  • 您好@LM1015,如果回复可以帮助您解决问题,您可以将其标记为已接受的答案,这也有助于其他社区成员快速找到解决方案并解决类似问题。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2017-09-28
相关资源
最近更新 更多