使用 QnAMaker 的 Azure 聊天机器人 - 应该根据当前用户的时区问候用户

Azure chat bot using QnAMaker - Should Greet users with respect to current user's timezone

我正在使用 Azure Bot Framework (v4) 在 C# 中开发聊天机器人,目前我有一个设置来显示用于问候用户的欢迎文本。

当前问候/欢迎文字:- 嗨用户,我是机器人。 今天有什么可以帮到你的。

当前代码:

protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {

        foreach (var member in membersAdded)
        {
           if (member.Id != turnContext.Activity.Recipient.Id)
         {
                await turnContext.SendActivityAsync(MessageFactory.Text($"Hi  **{member.Name**. I am Bot." {welcomeText}), cancellationToken);

           }
        }

    }

现在我想让我的机器人检测当前登录用户的时区并根据时间向他问候。

预期的问候/欢迎文字:(当用户在早上聊天时) 您好用户,早上好!我是博特。 今天有什么可以帮到你的。

预期的问候/欢迎文字:(当用户在晚上聊天时) 嗨,用户,晚上好!我是博特。 今天有什么可以帮到你的。

我想使用 QnAmker 或机器人中使用的默认欢迎文本。

此信息是频道特定的。它在 Activity ChannelData 属性

中传递

似乎您正在尝试获取 user local time 并且基于此您希望 bot 向用户致意。您可以尝试以下代码片段:

protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            foreach (var member in membersAdded)
            {
                if (member.Id != turnContext.Activity.Recipient.Id)
                {
                    DateTime dateTime = DateTime.Now;

                    DateTime utcTime = dateTime.ToUniversalTime();

                    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");

                    DateTime yourLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, cstZone);


                    if (yourLocalTime.Hour <= 12)
                    {

                        await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name}, good morning"), cancellationToken);
                    }
                    else if (yourLocalTime.Hour > 12)
                    {

                        await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name}, good afternoon"), cancellationToken);
                    }
                    else if (yourLocalTime.Hour > 17)
                    {

                        await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name}, good evening"), cancellationToken);
                    }
                    else
                    {                      
                        await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name} " + yourLocalTime), cancellationToken);
                    }


                }
            }
        }

Note: As you know each zone has its own time frame so you could refer this official document for further customization. I have shown China Standard Time for example. You could customize as per your requirement.

如需进一步自定义,您可以按照下面 interface 的屏幕截图进行操作。只需在上述代码的 FindSystemTimeZoneById 上按 F12 即可探索它。

希望这会有所帮助。