【问题标题】:Azure chat bot using QnAMaker - Should Greet users with respect to current user's timezone使用 QnAMaker 的 Azure 聊天机器人 - 应该根据当前用户的时区问候用户
【发布时间】:2020-02-10 07:00:43
【问题描述】:

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

当前问候/欢迎文字:- 嗨,用户,我是 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)
         {
                await turnContext.SendActivityAsync(MessageFactory.Text($"Hi  **{member.Name**. I am Bot." {welcomeText}), cancellationToken);

           }
        }

    }

现在我希望我的机器人检测当前登录用户的时区并按照时间向他打招呼。

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

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

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

【问题讨论】:

    标签: c# botframework chatbot qnamaker


    【解决方案1】:

    似乎您正在尝试获取 user local time 并基于此您希望您的 bot 向用户打招呼。你可以试试下面的代码 sn-p:

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

    注意:如您所知,每个区域都有自己的时间范围,因此您可以参考此official document 进行进一步定制。我有 例如显示China Standard Time。您可以根据需要自定义 你的要求。

    如需进一步定制,您可以在屏幕截图上关注interface。只需在上述代码上按F12FindSystemTimeZoneById 即可探索它。

    希望这会有所帮助。

    【讨论】:

    • @Kiron,感谢您的解决方案,它对我有用,我进行了必要的定制并使其按照我的要求工作。
    • 很好的解决方案,不知道nodejs中是否有相同的TimeZoneInfo和convertTime?
    • 另外,我可能会建议您在这里使用 Switch/Case 而不是 if/else,尽管在功能上我认为这并不重要。
    • @billoverton switch (yourLocalTime.Hour) { case int time when time &lt;= 12: await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name}, good morning"), cancellationToken); break; case int time when time &gt; 12: await turnContext.SendActivityAsync(MessageFactory.Text($"Hello {member.Name}, good afternoon"), cancellationToken); break; }
    • 另外,我不确定 node.js 库。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多