Just a short blogpost describing a solution that I needed for the bot that I'm currently developing. This bot has a typical requirement doing different things during office hours and after closing time. As such I need to know when the user is invoking the bot. Here's how I ended up doing this.
So in oBotML that looks like:
Unfortunately when I use 'now' to get access to the date-time, it will return the date-time of the server that hosts the actual Bot. This means I cannot use that date-time because it is not the correct date/time of the user's location.
After doing a bit of research, I found that the profile property enables your bot to recognise a user’s name, local, and local time.
You can now derive the actual time at the user's location.
Notice that I created two variables. One, to hold the initial derived value as a string, and another one that is actually of the entity-type DATE. So in setDefaultDate I set the variable with the actual user's local date-time. In matchEntity I check if the value is of the DATE type. If that is the case, I assign it to theDate, which I can now use throughout the entire flow of the chatbot.
What time is it?
The developer guide has a section on how to use Built-In FreeMarker Date Operations (see resources below). That is a very resource. I started with using the 'now' variable, combined with date time. That should return me exactly what I want.So in oBotML that looks like:
Unfortunately when I use 'now' to get access to the date-time, it will return the date-time of the server that hosts the actual Bot. This means I cannot use that date-time because it is not the correct date/time of the user's location.
After doing a bit of research, I found that the profile property enables your bot to recognise a user’s name, local, and local time.
Although the developer guide says that your bot can recognise a user's local time, actually it cannot, and it will only return the timezoneOffset in seconds. That means that you need to derive the user's local time yourself. You can do this by subtracting the offset from now. It takes some puzzling, but eventually I was able to make this work. Here is the code how to do that:
That solves the problem of not knowing what time it is. Your bot has exactly the right information.You can now derive the actual time at the user's location.
Making the user's time accessible from a variable
Printing the user's local time is one thing, but I actually need to have access to it throughout the bots entire flow. For that purpose, I want to put it in a context variable. Here is how to do that (the code is also in the developer guide):Notice that I created two variables. One, to hold the initial derived value as a string, and another one that is actually of the entity-type DATE. So in setDefaultDate I set the variable with the actual user's local date-time. In matchEntity I check if the value is of the DATE type. If that is the case, I assign it to theDate, which I can now use throughout the entire flow of the chatbot.
Summary
It is possible to get hold of the real date/time for the chatbot user.'s location It takes some effort and I think that Oracle should provide the value in the User Context. If I can derive it, the bot itself should be able to do that to. That way we could use something like ${profile.datetime}. So I might put an ER in place for this, or if anyone knows a better solution feel free to let me know.
Resources
Developer guide: Date Operations
Comments