diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3099d67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,53 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# .DS_Store files +.DS_Store + +#output.wav +output.wav + +#config +config.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b02c00 --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# Tell the Time + +> Build a robot that can tell the time in different cities with [Watson](https://www.ibm.com/watson/developercloud/conversation.html) + +### "Watson, what time is it in Berlin?" + +This module provides Node.js code to get your Raspberry Pi to tell the time in any city you choose to tell Watson about. It uses [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) to parse audio from the microphone, uses [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) to generate a response, and uses [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) to "read" out this response! + +**This will only run on the Raspberry Pi.** + + +## How It Works +- Listens for voice commands +- Sends audio from the microphone to the Watson Speech to Text Service - STT to transcribe [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html) +- Parses the text looking for the attention word +- Once the attention word is recognized, the text is sent to [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html) to generate the response. +- The response is sent to [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html) to generate the audio file. +- The robot speaks the response via the Alsa audio playback tools + +## Hardware +Check out [this instructable] (http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/) to prepare your system. You will need a Raspberry Pi 3, Microphone, Speaker, and [the TJBot cardboard](https://ibmtjbot.github.io/#gettj). + +## Build +> We recommend starting with our [step by step instructions] (http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/) to build this recipe. + +Get the sample code and go to the application folder. Please see this [instruction on how to clone](https://help.github.com/articles/cloning-a-repository/) a repository. + + +Install ALSA tools (required for recording audio on Raspberry Pi) + + sudo apt-get install alsa-base alsa-utils + +Install Dependencies + + npm install + +Set the audio output to your audio jack. For more audio channels, check the [config guide. ](https://www.raspberrypi.org/documentation/configuration/audio-config.md) + + amixer cset numid=3 1 + // This sets the audio output to option 1 which is your Pi's Audio Jack. Option 0 = Auto, Option 2 = HDMI. An alternative is to type sudo raspi-config and change the audio to 3.5mm audio jack. + +Update the Config file with your Bluemix credentials for all three Watson services. + + edit config.js + enter your watson usernames, passwords and versions. + +## Creating a Conversation Flow +You need to train your robot with what to say and when to say it. For that, we use [Watson Conversation] (https://www.ibm.com/watson/developercloud/conversation.html). Open a browser and go to [IBM Watson Conversation link](http://www.ibmwatsonconversation.com) +From the top right corner, select the name of your conversation service and click 'create' to create a new workspace for your robot. You can create intents and dialogs there. [Here](http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/#step6) is a step-by-step instructions to create a conversation flow. + +### Creating intents + +An intent for telling the time might look like this: + +![tellTheTime intent](https://github.com/DamianCummins/tell_the_time/blob/master/images/tellTheTimeIntent.PNG) + + +### Creating dialogs + +A Dialog node for telling the time for different timezones might look like this: + +![tellTheTime dialog](https://github.com/DamianCummins/tell_the_time/blob/master/images/tellTheTimeDialog.PNG) + +The response should contain a placeholder (`todays_date`) that the node application can replace with a javascript Date. When a specific city entity is found, the response for each city should return the timezone offset in the output context: + +![timezone in offset output](https://github.com/DamianCummins/tell_the_time/blob/master/images/tellTheTimeDialogDetails.PNG) + + +## Running + +Start the application + + node app.js + +Then you should be able to speak to the microphone. +The robot gets better with training. You can go to your [Watson conversation module](http://www.ibmwatsonconversation.com) to train the robot with more intents and responses. + +## Monitoring + +The app serves up a Monitoring web interface locally on port `3000`. You should be able to point to this from another device on the same network as your Rasberry Pi. The Monitoring UI allows you to stop and resume listening on TJBot's microphone. You can also tell whether the TJBot module has stopped due to an unexpected error. + +![tellTheTime monitor app](https://github.com/DamianCummins/tell_the_time/blob/master/images/monitorApp.gif) + +The logs show the REST calls made from the Monitoring UI to control TJBot: + +``` +TJBot is listening, you may speak now. +TJBot monitor app listening on port 3000! +Fri, 24 Mar 2017 22:38:53 GMT LOG Router request GET /tjbot +Fri, 24 Mar 2017 22:38:54 GMT LOG Router request GET /tjbot/status +Fri, 24 Mar 2017 22:39:00 GMT LOG Router request POST /tjbot/pause +Fri, 24 Mar 2017 22:39:19 GMT LOG Router request POST /tjbot/resume +TJBot is listening, you may speak now. +``` + +## Customization +The attention word is the word you say to get the attention of the robot. +The default attention word is set to 'Watson' but you can change it from config.js. Some words are easier for the robot to recognize. If decided to change the attention word, experiment with multiple words and pick the one that is easier for the robot to recognize. + +The default voice of TJBot is set to a male voice (`en-US_MichaelVoice`) but you can change it from config.js. Two female voices are available for TJBot (`en-US_AllisonVoice` and `en-US_LisaVoice`). + + // The attention word to wake up the robot. + exports.attentionWord ='watson'; + + // You can change the voice of the robot to your favorite voice. + exports.voice = 'en-US_MichaelVoice'; + // Some of the available options are: + // en-US_AllisonVoice + // en-US_LisaVoice + // en-US_MichaelVoice (the default) + +# Dependencies List + +- Watson Developer Cloud - [Watson Speech to Text](https://www.ibm.com/watson/developercloud/speech-to-text.html), [Watson Conversation](https://www.ibm.com/watson/developercloud/conversation.html), and [Watson Text to Speech](https://www.ibm.com/watson/developercloud/text-to-speech.html). +- mic npm package : for reading audio input + + +## Contributing +See [CONTRIBUTING.md](../../CONTRIBUTING.md). diff --git a/app.js b/app.js new file mode 100755 index 0000000..910f50f --- /dev/null +++ b/app.js @@ -0,0 +1,71 @@ +"use strict"; + +var express = require("express"); +var app = express(); +var bodyParser = require("body-parser"); +var path = require("path"); + +var tellTheTime = require("./tellTheTime.js")(); + +var port = process.env.VCAP_APP_PORT || process.env.PORT || 3000; + +var router = express.Router(); + +tellTheTime.start(); + +app.use(bodyParser.urlencoded({"extended": true})); +app.use(bodyParser.json()); + +router.use(function(req, res, next) { + console.log(new Date().toUTCString() + " LOG Router request " + req.method + " " + req.originalUrl); + next(); +}); + +router.get("/", function(req, res) { + res.sendFile(path.join(__dirname + "/index.html")); +}); + +router.route("/status") + .get(function(req, res) { + tellTheTime.isMicStopped(function(status) { + if (status) { + res.json({'message':'SNOOZING'}); + } else { + res.json({'message':'AWAKE'}); + } + }); + }); + + +router.route("/pause") + .post(function(req, res) { + tellTheTime.pause(function(err) { + if (!err) { + res.json({'message':'SNOOZING'}); + } + }); + }); + +router.route("/resume") + .post(function(req, res) { + tellTheTime.start(); + tellTheTime.isMicStopped(function(status) { + if (status) { + res.json({'message':'SNOOZING'}); + } else { + res.json({'message':'AWAKE'}); + } + }); + }); + +app.use("/tjbot", router); + +app.use(function(req, res, next) { + res.status(404); + console.error("ERROR: Page not found"); + res.json({"code": 404, "message": "Page not found."}); +}); + +app.listen(port, function() { + console.log("TJBot monitor app listening on port "+port+"!"); +}); diff --git a/audio/notUnderstood.wav b/audio/notUnderstood.wav new file mode 100644 index 0000000..65c78b3 Binary files /dev/null and b/audio/notUnderstood.wav differ diff --git a/audio/understood.wav b/audio/understood.wav new file mode 100644 index 0000000..9181565 Binary files /dev/null and b/audio/understood.wav differ diff --git a/csvToWorkspaceJson.js b/csvToWorkspaceJson.js new file mode 100755 index 0000000..1af1abf --- /dev/null +++ b/csvToWorkspaceJson.js @@ -0,0 +1,79 @@ +"use strict"; +var fs = require('fs'); +var csv = require('fast-csv'); + +var fs = require('fs'); +var workspace = JSON.parse(fs.readFileSync('tellTheTime_workspace.json', 'utf8')); + +var stream = fs.createReadStream("timezones.csv"); + +var entityValues = []; + +var dialogNodeCounter = 0; + +var dialogs = []; + + + +var csvStream = csv() + .on("data", function(data){ + var zone = data[0]; + var zoneTokens = zone.split("/"); + var city = zoneTokens[zoneTokens.length -1].replace("_", " "); + + var entityValue = { + value: city, + synonyms: [], + metadata: null + }; + + entityValues.push(entityValue); + + if (city.indexOf(" ") > -1) { + city = "(" + city + ")"; + } + var offset = parseFloat(data[1]); + var dst = data[2]; + var dialogResponse = { + "type":"response_condition", + "go_to":null, + "output":{ + "text":{ + "values":[ + "The time in @city is todays_date" + ], + "selection_policy":"sequential" + }, + "context":{ + "timezoneOffset": offset, + "dst": dst + } + }, + "parent":"Tell the Time", + "context":null, + "metadata":null, + "conditions":" @city:"+city, + "description":null, + "dialog_node":"dialog_node_" + dialogNodeCounter, + "previous_sibling":"dialog_node_" + (dialogNodeCounter - 1) + }; + if(dialogNodeCounter === 0) { + dialogResponse["previous_sibling"] = "node_3_1490294223086"; + } + dialogNodeCounter++; + dialogs.push(dialogResponse); + + console.log(data); + console.log(JSON.stringify(entityValue)); + console.log(JSON.stringify(dialogResponse)); + + }) + .on("end", function(){ + console.log("done"); + console.log(dialogs.length); + console.log(entityValues.length); + workspace.entities[0].values = workspace.entities[0].values.concat(entityValues); + workspace.dialog_nodes = workspace.dialog_nodes.concat(dialogs); + fs.writeFileSync('tellTheTime_workspace_new.json', JSON.stringify(workspace, null, 3)); + }); +stream.pipe(csvStream); diff --git a/images/monitorApp.gif b/images/monitorApp.gif new file mode 100644 index 0000000..cc13dd3 Binary files /dev/null and b/images/monitorApp.gif differ diff --git a/images/tellTheTimeDialog.PNG b/images/tellTheTimeDialog.PNG new file mode 100644 index 0000000..528eb43 Binary files /dev/null and b/images/tellTheTimeDialog.PNG differ diff --git a/images/tellTheTimeDialogDetails.PNG b/images/tellTheTimeDialogDetails.PNG new file mode 100644 index 0000000..88082da Binary files /dev/null and b/images/tellTheTimeDialogDetails.PNG differ diff --git a/images/tellTheTimeIntent.PNG b/images/tellTheTimeIntent.PNG new file mode 100644 index 0000000..4666647 Binary files /dev/null and b/images/tellTheTimeIntent.PNG differ diff --git a/index.html b/index.html new file mode 100755 index 0000000..eff6c34 --- /dev/null +++ b/index.html @@ -0,0 +1,55 @@ + + + + + TJBot Monitor + + + + + + + + + +
+
+

TJBot Monitor

+

Current status of TJBot:

+
+
+
Refresh

+
Let TJBot snooze

+
Wake TJBot up
+
+
+ + + diff --git a/package.json b/package.json new file mode 100755 index 0000000..73eee75 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "tell_the_time", + "version": "1.0.0", + "description": "TJ Bot Tell the Time recipe", + "main": "tellTheTime.js", + "scripts": { + "start": "node tell thE time.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@github.com:DamianCummins/tell_the_time.git" + }, + "author": "Damian Cummins", + "dependencies": { + "tjbot": "latest", + "fast-csv": "latest", + "express": "^4.13.3", + "body-parser": "~1.0.1" + } +} + + diff --git a/tellTheTime.js b/tellTheTime.js new file mode 100755 index 0000000..5b4362d --- /dev/null +++ b/tellTheTime.js @@ -0,0 +1,158 @@ +/** + * Copyright 2016 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var TJBot = require('tjbot'); +var config = require('./config'); +var exec = require('child_process').exec; +var audioDir = __dirname + "/audio/"; +var tellTheTime = function() { + + // obtain our credentials from config.js + var credentials = config.credentials; + + // obtain user-specific config + var WORKSPACEID = config.conversationWorkspaceId; + + // these are the hardware capabilities that TJ needs for this recipe + var hardware = ['microphone', 'speaker']; + + // set up TJBot's configuration + var tjConfig = { + verboseLogging: true, + robot: { + name: 'Buddy', + homophones: ['Buddy', 'Body', 'but they', 'but he', 'but the'], + gender: 'male' + } + }; + + // instantiate our TJBot! + var tj = new TJBot(hardware, tjConfig, credentials); + + // current listening state + var stopped = true; + + // Methods to communicate state change through speech + var sayHello = function() { + tj.speak("Hi everyone, I'm awake!"); + }; + + var internalError = function(callback) { + tj.speak("I'm not feeling too good, I'm going to shut down for a while."); + return callback(); + }; + + var stop = function(callback) { + tj.speak("If you don't mind, I think I'll shut down for a while."); + return callback(); + }; + + var understood = function() { + var create_audio = exec('aplay '+audioDir+'understood.wav', function (error, stdout, stderr) { + if (error !== null) { + console.log('exec error: ' + error); + } + }); + }; + + return { + "start": function() { + + micStopped = false; + console.log(tj.configuration.robot.name +" is listening, you may speak now."); + console.log("Try saying, \"" + tj.configuration.robot.name + ", what time is it in Tokyo?\""); + + sayHello(); + + // listen for utterances with our attentionWord and send the result to + // the Conversation service + tj.listen(function(msg) { + // check to see if they are talking to TJBot + if (tj.configuration.robot.homophones.some(function(v) { return msg.toLowerCase().indexOf(v.toLowerCase()) >= 0; })) { + understood(); + // remove our name from the message + var turn = msg.toLowerCase(); + + tj.configuration.robot.homophones.forEach(function(homophone) { + turn = turn.replace(homophone.toLowerCase(), ""); + }); + + // send to the conversation service + tj.converse(WORKSPACEID, turn, function(response) { + console.log(response); + intent = null; + // If an intent was detected, log it out to the console. + if (response.object.intents.length > 0) { + console.log('Detected intent: #' + response.object.intents[0].intent); + intent = response.object.intents[0].intent; + } + + if (intent === "tellTheTime") { + responseString = ""; + + // create Date object for current location + d = new Date(); + + // convert to msec + // add local time zone offset + // get UTC time in msec + utc = d.getTime(); + nd = d; + console.log(response.object.output.text[0]); + if (response.object.output.context != undefined) { + dstHourSecs = 0; + if (response.object.output.context.dst === "1") { + dstHourSecs = 3600; + } + offsetSecs = dstHourSecs + response.object.output.context.timezoneOffset; + offset = offsetSecs * 1000; + console.log(offset); + // create new Date object for different city + // using supplied offset + nd = new Date(utc + offset); + isoString = nd.toISOString(); + time = isoString.substring(isoString.indexOf("T")+1, isoString.indexOf(".")); + console.log(time); + responseString = response.object.output.text[0].replace("todays_date", time); + } else { + responseString = response.object.output.text[0].replace("todays_date", nd.toLocaleTimeString()); + } + + //Replace date token with Time string + response.object.output.text[0] = responseString; + } + // speak the result + tj.speak(response.object.output.text[0]); + }); + } + }); + }, + "stop": function(callback) { + if (!stopped) { + stop(function() { + tj.stopListening(); + stopped = true; + return callback(); + }); + } + }, + "isStopped": function(callback) { + return callback(stopped); + } + } +}; + +module.exports = tellTheTime; diff --git a/tellTheTime_workspace.json b/tellTheTime_workspace.json new file mode 100644 index 0000000..79bd563 --- /dev/null +++ b/tellTheTime_workspace.json @@ -0,0 +1,242 @@ +{ + "name":"Tell The Time", + "created":"2017-01-07T11:47:02.296Z", + "intents":[ + { + "intent":"help", + "created":"2017-03-21T22:22:59.011Z", + "updated":"2017-03-21T22:26:30.488Z", + "examples":[ + { + "text":"Are you able to help me?", + "created":"2017-03-21T22:26:30.488Z", + "updated":"2017-03-21T22:26:30.488Z" + }, + { + "text":"I'm not sure what to ask", + "created":"2017-03-21T22:25:17.688Z", + "updated":"2017-03-21T22:25:17.688Z" + }, + { + "text":"I need some help", + "created":"2017-03-21T22:24:57.072Z", + "updated":"2017-03-21T22:24:57.072Z" + }, + { + "text":"What can you do?", + "created":"2017-03-21T22:24:47.868Z", + "updated":"2017-03-21T22:24:47.868Z" + }, + { + "text":"What service do you offer?", + "created":"2017-03-21T22:25:47.830Z", + "updated":"2017-03-21T22:25:47.830Z" + } + ], + "description":null + }, + { + "intent":"tellTheTime", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-23T18:42:21.539Z", + "examples":[ + { + "text":"Do you have the time?", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-17T22:18:20.102Z" + }, + { + "text":"Do you know what the time is?", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-17T22:18:20.102Z" + }, + { + "text":"Tell me the time", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-17T22:18:20.102Z" + }, + { + "text":"What hour is it?", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-17T22:18:20.102Z" + }, + { + "text":"What time is it?", + "created":"2017-03-17T22:18:20.102Z", + "updated":"2017-03-17T22:18:20.102Z" + }, + { + "text":"What time is it in Berlin?", + "created":"2017-03-23T18:42:21.539Z", + "updated":"2017-03-23T18:42:21.539Z" + } + ], + "description":null + }, + { + "intent":"thanks", + "created":"2017-03-19T20:00:51.229Z", + "updated":"2017-03-19T20:03:00.466Z", + "examples":[ + { + "text":"Cheers", + "created":"2017-03-19T20:01:56.008Z", + "updated":"2017-03-19T20:01:56.008Z" + }, + { + "text":"Cheers watson", + "created":"2017-03-19T20:03:00.466Z", + "updated":"2017-03-19T20:03:00.466Z" + }, + { + "text":"Nice one", + "created":"2017-03-19T20:02:11.134Z", + "updated":"2017-03-19T20:02:11.134Z" + }, + { + "text":"Ta", + "created":"2017-03-19T20:02:01.108Z", + "updated":"2017-03-19T20:02:01.108Z" + }, + { + "text":"Thanks", + "created":"2017-03-19T20:01:44.437Z", + "updated":"2017-03-19T20:01:44.437Z" + }, + { + "text":"Thanks watson", + "created":"2017-03-19T20:02:37.442Z", + "updated":"2017-03-19T20:02:37.442Z" + }, + { + "text":"Thank you", + "created":"2017-03-19T20:01:51.477Z", + "updated":"2017-03-19T20:01:51.477Z" + } + ], + "description":null + } + ], + "updated":"2017-03-28T10:46:05.578Z", + "entities":[ + { + "type":null, + "entity":"city", + "source":null, + "values":[ + ], + "created":"2017-03-21T22:42:39.902Z", + "updated":"2017-03-21T22:42:39.902Z", + "open_list":false, + "description":null + } + ], + "language":"en", + "metadata":{ + "runtime_version":null + }, + "description":null, + "dialog_nodes":[ + { + "go_to":null, + "output":{ + + }, + "parent":null, + "context":null, + "created":"2017-03-21T22:22:38.303Z", + "updated":"2017-03-23T22:55:13.717Z", + "metadata":null, + "conditions":"#help", + "description":null, + "dialog_node":"Help", + "previous_sibling":"Tell the Time" + }, + { + "go_to":null, + "output":{ + + }, + "parent":null, + "context":null, + "created":"2017-03-23T18:35:13.991Z", + "updated":"2017-03-23T18:48:17.183Z", + "metadata":null, + "conditions":"#tellTheTime", + "description":null, + "dialog_node":"Tell the Time", + "previous_sibling":null + }, + { + "go_to":null, + "output":{ + "text":{ + "values":[ + "Sorry I didn't quite get that", + "would you repeat that for me please" + ], + "selection_policy":"random" + } + }, + "parent":null, + "context":null, + "created":"2017-03-17T23:13:52.310Z", + "updated":"2017-03-23T22:56:19.118Z", + "metadata":null, + "conditions":"anything_else", + "description":null, + "dialog_node":"Anything else", + "previous_sibling":"Thanks" + }, + { + "go_to":null, + "output":{ + "text":{ + "values":[ + "No problem!", + "No worries!", + "You're welcome!", + "That's perfectly alright!", + "Any time" + ], + "selection_policy":"random" + } + }, + "parent":null, + "context":null, + "created":"2017-03-19T20:00:26.405Z", + "updated":"2017-03-23T22:56:56.990Z", + "metadata":null, + "conditions":"#thanks", + "description":null, + "dialog_node":"Thanks", + "previous_sibling":"Help" + }, + { + "type":"response_condition", + "go_to":null, + "output":{ + "text":{ + "values":[ + "It is currently todays_date" + ], + "selection_policy":"sequential" + } + }, + "parent":"Tell the Time", + "context":null, + "created":"2017-03-23T18:36:42.967Z", + "updated":"2017-03-23T18:38:56.908Z", + "metadata":null, + "conditions":" !@city", + "description":null, + "dialog_node":"node_3_1490294223086", + "previous_sibling":null + } + ], + "workspace_id":"24936c3c-d834-4006-83db-679b16ab754b", + "counterexamples":[ + + ] +} + diff --git a/tellTheTime_workspace_new.json b/tellTheTime_workspace_new.json new file mode 100644 index 0000000..92f5c95 --- /dev/null +++ b/tellTheTime_workspace_new.json @@ -0,0 +1,1355 @@ +{ + "name": "Tell The Time", + "created": "2017-01-07T11:47:02.296Z", + "intents": [ + { + "intent": "help", + "created": "2017-03-21T22:22:59.011Z", + "updated": "2017-03-21T22:26:30.488Z", + "examples": [ + { + "text": "Are you able to help me?", + "created": "2017-03-21T22:26:30.488Z", + "updated": "2017-03-21T22:26:30.488Z" + }, + { + "text": "I'm not sure what to ask", + "created": "2017-03-21T22:25:17.688Z", + "updated": "2017-03-21T22:25:17.688Z" + }, + { + "text": "I need some help", + "created": "2017-03-21T22:24:57.072Z", + "updated": "2017-03-21T22:24:57.072Z" + }, + { + "text": "What can you do?", + "created": "2017-03-21T22:24:47.868Z", + "updated": "2017-03-21T22:24:47.868Z" + }, + { + "text": "What service do you offer?", + "created": "2017-03-21T22:25:47.830Z", + "updated": "2017-03-21T22:25:47.830Z" + } + ], + "description": null + }, + { + "intent": "tellTheTime", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-23T18:42:21.539Z", + "examples": [ + { + "text": "Do you have the time?", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-17T22:18:20.102Z" + }, + { + "text": "Do you know what the time is?", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-17T22:18:20.102Z" + }, + { + "text": "Tell me the time", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-17T22:18:20.102Z" + }, + { + "text": "What hour is it?", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-17T22:18:20.102Z" + }, + { + "text": "What time is it?", + "created": "2017-03-17T22:18:20.102Z", + "updated": "2017-03-17T22:18:20.102Z" + }, + { + "text": "What time is it in Berlin?", + "created": "2017-03-23T18:42:21.539Z", + "updated": "2017-03-23T18:42:21.539Z" + } + ], + "description": null + }, + { + "intent": "thanks", + "created": "2017-03-19T20:00:51.229Z", + "updated": "2017-03-19T20:03:00.466Z", + "examples": [ + { + "text": "Cheers", + "created": "2017-03-19T20:01:56.008Z", + "updated": "2017-03-19T20:01:56.008Z" + }, + { + "text": "Cheers watson", + "created": "2017-03-19T20:03:00.466Z", + "updated": "2017-03-19T20:03:00.466Z" + }, + { + "text": "Nice one", + "created": "2017-03-19T20:02:11.134Z", + "updated": "2017-03-19T20:02:11.134Z" + }, + { + "text": "Ta", + "created": "2017-03-19T20:02:01.108Z", + "updated": "2017-03-19T20:02:01.108Z" + }, + { + "text": "Thanks", + "created": "2017-03-19T20:01:44.437Z", + "updated": "2017-03-19T20:01:44.437Z" + }, + { + "text": "Thanks watson", + "created": "2017-03-19T20:02:37.442Z", + "updated": "2017-03-19T20:02:37.442Z" + }, + { + "text": "Thank you", + "created": "2017-03-19T20:01:51.477Z", + "updated": "2017-03-19T20:01:51.477Z" + } + ], + "description": null + } + ], + "updated": "2017-03-28T10:46:05.578Z", + "entities": [ + { + "type": null, + "entity": "city", + "source": null, + "values": [ + { + "value": "Dubai", + "synonyms": [], + "metadata": null + }, + { + "value": "Detroit", + "synonyms": [], + "metadata": null + }, + { + "value": "Hong Kong", + "synonyms": [], + "metadata": null + }, + { + "value": "Luxembourg", + "synonyms": [], + "metadata": null + }, + { + "value": "Madrid", + "synonyms": [], + "metadata": null + }, + { + "value": "Singapore", + "synonyms": [], + "metadata": null + }, + { + "value": "Shanghai", + "synonyms": [], + "metadata": null + }, + { + "value": "Cairo", + "synonyms": [], + "metadata": null + }, + { + "value": "Athens", + "synonyms": [], + "metadata": null + }, + { + "value": "Sydney", + "synonyms": [], + "metadata": null + }, + { + "value": "Toronto", + "synonyms": [], + "metadata": null + }, + { + "value": "Buenos Aires", + "synonyms": [], + "metadata": null + }, + { + "value": "Berlin", + "synonyms": [], + "metadata": null + }, + { + "value": "Vienna", + "synonyms": [], + "metadata": null + }, + { + "value": "Johannesburg", + "synonyms": [], + "metadata": null + }, + { + "value": "Bucharest", + "synonyms": [], + "metadata": null + }, + { + "value": "Paris", + "synonyms": [], + "metadata": null + }, + { + "value": "Monaco", + "synonyms": [], + "metadata": null + }, + { + "value": "Budapest", + "synonyms": [], + "metadata": null + }, + { + "value": "Havana", + "synonyms": [], + "metadata": null + }, + { + "value": "Tokyo", + "synonyms": [], + "metadata": null + }, + { + "value": "Los Angeles", + "synonyms": [], + "metadata": null + }, + { + "value": "Chicago", + "synonyms": [], + "metadata": null + }, + { + "value": "New York", + "synonyms": [], + "metadata": null + }, + { + "value": "Brussels", + "synonyms": [], + "metadata": null + }, + { + "value": "Warsaw", + "synonyms": [], + "metadata": null + }, + { + "value": "Minsk", + "synonyms": [], + "metadata": null + }, + { + "value": "Istanbul", + "synonyms": [], + "metadata": null + }, + { + "value": "Jerusalem", + "synonyms": [], + "metadata": null + }, + { + "value": "Moscow", + "synonyms": [], + "metadata": null + }, + { + "value": "Tbilisi", + "synonyms": [], + "metadata": null + }, + { + "value": "Maldives", + "synonyms": [], + "metadata": null + }, + { + "value": "Bangkok", + "synonyms": [], + "metadata": null + }, + { + "value": "Auckland", + "synonyms": [], + "metadata": null + }, + { + "value": "Rome", + "synonyms": [], + "metadata": null + }, + { + "value": "Zurich", + "synonyms": [], + "metadata": null + }, + { + "value": "Prague", + "synonyms": [], + "metadata": null + }, + { + "value": "London", + "synonyms": [], + "metadata": null + }, + { + "value": "Guam", + "synonyms": [], + "metadata": null + }, + { + "value": "Amsterdam", + "synonyms": [], + "metadata": null + } + ], + "created": "2017-03-21T22:42:39.902Z", + "updated": "2017-03-21T22:42:39.902Z", + "open_list": false, + "description": null + } + ], + "language": "en", + "metadata": { + "runtime_version": null + }, + "description": null, + "dialog_nodes": [ + { + "go_to": null, + "output": {}, + "parent": null, + "context": null, + "created": "2017-03-21T22:22:38.303Z", + "updated": "2017-03-23T22:55:13.717Z", + "metadata": null, + "conditions": "#help", + "description": null, + "dialog_node": "Help", + "previous_sibling": "Tell the Time" + }, + { + "go_to": null, + "output": {}, + "parent": null, + "context": null, + "created": "2017-03-23T18:35:13.991Z", + "updated": "2017-03-23T18:48:17.183Z", + "metadata": null, + "conditions": "#tellTheTime", + "description": null, + "dialog_node": "Tell the Time", + "previous_sibling": null + }, + { + "go_to": null, + "output": { + "text": { + "values": [ + "Sorry I didn't quite get that", + "would you repeat that for me please" + ], + "selection_policy": "random" + } + }, + "parent": null, + "context": null, + "created": "2017-03-17T23:13:52.310Z", + "updated": "2017-03-23T22:56:19.118Z", + "metadata": null, + "conditions": "anything_else", + "description": null, + "dialog_node": "Anything else", + "previous_sibling": "Thanks" + }, + { + "go_to": null, + "output": { + "text": { + "values": [ + "No problem!", + "No worries!", + "You're welcome!", + "That's perfectly alright!", + "Any time" + ], + "selection_policy": "random" + } + }, + "parent": null, + "context": null, + "created": "2017-03-19T20:00:26.405Z", + "updated": "2017-03-23T22:56:56.990Z", + "metadata": null, + "conditions": "#thanks", + "description": null, + "dialog_node": "Thanks", + "previous_sibling": "Help" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "It is currently todays_date" + ], + "selection_policy": "sequential" + } + }, + "parent": "Tell the Time", + "context": null, + "created": "2017-03-23T18:36:42.967Z", + "updated": "2017-03-23T18:38:56.908Z", + "metadata": null, + "conditions": " !@city", + "description": null, + "dialog_node": "node_3_1490294223086", + "previous_sibling": null + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 14400, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Dubai", + "description": null, + "dialog_node": "dialog_node_0", + "previous_sibling": "node_3_1490294223086" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -18000, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Detroit", + "description": null, + "dialog_node": "dialog_node_1", + "previous_sibling": "dialog_node_0" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 28800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:(Hong Kong)", + "description": null, + "dialog_node": "dialog_node_2", + "previous_sibling": "dialog_node_1" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 10800, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Luxembourg", + "description": null, + "dialog_node": "dialog_node_3", + "previous_sibling": "dialog_node_2" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 10800, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Madrid", + "description": null, + "dialog_node": "dialog_node_4", + "previous_sibling": "dialog_node_3" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 28800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Singapore", + "description": null, + "dialog_node": "dialog_node_5", + "previous_sibling": "dialog_node_4" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 28800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Shanghai", + "description": null, + "dialog_node": "dialog_node_6", + "previous_sibling": "dialog_node_5" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 7200, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Cairo", + "description": null, + "dialog_node": "dialog_node_7", + "previous_sibling": "dialog_node_6" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 7200, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Athens", + "description": null, + "dialog_node": "dialog_node_8", + "previous_sibling": "dialog_node_7" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 36000, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Sydney", + "description": null, + "dialog_node": "dialog_node_9", + "previous_sibling": "dialog_node_8" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -18000, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Toronto", + "description": null, + "dialog_node": "dialog_node_10", + "previous_sibling": "dialog_node_9" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -10800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:(Buenos Aires)", + "description": null, + "dialog_node": "dialog_node_11", + "previous_sibling": "dialog_node_10" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Berlin", + "description": null, + "dialog_node": "dialog_node_12", + "previous_sibling": "dialog_node_11" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Vienna", + "description": null, + "dialog_node": "dialog_node_13", + "previous_sibling": "dialog_node_12" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 7200, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Johannesburg", + "description": null, + "dialog_node": "dialog_node_14", + "previous_sibling": "dialog_node_13" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 7200, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Bucharest", + "description": null, + "dialog_node": "dialog_node_15", + "previous_sibling": "dialog_node_14" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Paris", + "description": null, + "dialog_node": "dialog_node_16", + "previous_sibling": "dialog_node_15" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Monaco", + "description": null, + "dialog_node": "dialog_node_17", + "previous_sibling": "dialog_node_16" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Budapest", + "description": null, + "dialog_node": "dialog_node_18", + "previous_sibling": "dialog_node_17" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -18000, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Havana", + "description": null, + "dialog_node": "dialog_node_19", + "previous_sibling": "dialog_node_18" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 32400, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Tokyo", + "description": null, + "dialog_node": "dialog_node_20", + "previous_sibling": "dialog_node_19" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -28800, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:(Los Angeles)", + "description": null, + "dialog_node": "dialog_node_21", + "previous_sibling": "dialog_node_20" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -21600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Chicago", + "description": null, + "dialog_node": "dialog_node_22", + "previous_sibling": "dialog_node_21" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": -18000, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:(New York)", + "description": null, + "dialog_node": "dialog_node_23", + "previous_sibling": "dialog_node_22" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Brussels", + "description": null, + "dialog_node": "dialog_node_24", + "previous_sibling": "dialog_node_23" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Warsaw", + "description": null, + "dialog_node": "dialog_node_25", + "previous_sibling": "dialog_node_24" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 10800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Minsk", + "description": null, + "dialog_node": "dialog_node_26", + "previous_sibling": "dialog_node_25" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 10800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Istanbul", + "description": null, + "dialog_node": "dialog_node_27", + "previous_sibling": "dialog_node_26" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 7200, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Jerusalem", + "description": null, + "dialog_node": "dialog_node_28", + "previous_sibling": "dialog_node_27" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 10800, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Moscow", + "description": null, + "dialog_node": "dialog_node_29", + "previous_sibling": "dialog_node_28" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 14400, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Tbilisi", + "description": null, + "dialog_node": "dialog_node_30", + "previous_sibling": "dialog_node_29" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 18000, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Maldives", + "description": null, + "dialog_node": "dialog_node_31", + "previous_sibling": "dialog_node_30" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 25200, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Bangkok", + "description": null, + "dialog_node": "dialog_node_32", + "previous_sibling": "dialog_node_31" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 43200, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Auckland", + "description": null, + "dialog_node": "dialog_node_33", + "previous_sibling": "dialog_node_32" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Rome", + "description": null, + "dialog_node": "dialog_node_34", + "previous_sibling": "dialog_node_33" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Zurich", + "description": null, + "dialog_node": "dialog_node_35", + "previous_sibling": "dialog_node_34" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Prague", + "description": null, + "dialog_node": "dialog_node_36", + "previous_sibling": "dialog_node_35" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 0, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:London", + "description": null, + "dialog_node": "dialog_node_37", + "previous_sibling": "dialog_node_36" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 36000, + "dst": "0" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Guam", + "description": null, + "dialog_node": "dialog_node_38", + "previous_sibling": "dialog_node_37" + }, + { + "type": "response_condition", + "go_to": null, + "output": { + "text": { + "values": [ + "The time in @city is todays_date" + ], + "selection_policy": "sequential" + }, + "context": { + "timezoneOffset": 3600, + "dst": "1" + } + }, + "parent": "Tell the Time", + "context": null, + "metadata": null, + "conditions": " @city:Amsterdam", + "description": null, + "dialog_node": "dialog_node_39", + "previous_sibling": "dialog_node_38" + } + ], + "workspace_id": "24936c3c-d834-4006-83db-679b16ab754b", + "counterexamples": [] +} \ No newline at end of file diff --git a/timezones.csv b/timezones.csv new file mode 100644 index 0000000..5ff67a4 --- /dev/null +++ b/timezones.csv @@ -0,0 +1,40 @@ +"Asia/Dubai","14400","0" +"America/Detroit","-18000","1" +"Asia/Hong_Kong","28800","0" +"Europe/Luxembourg","10800","1" +"Europe/Madrid","10800","1" +"Asia/Singapore","28800","0" +"Asia/Shanghai","28800","0" +"Africa/Cairo","7200","0" +"Europe/Athens","7200","1" +"Australia/Sydney","36000","0" +"America/Toronto","-18000","1" +"America/Argentina/Buenos_Aires","-10800","0" +"Europe/Berlin","3600","1" +"Europe/Vienna","3600","1" +"Africa/Johannesburg","7200","0" +"Europe/Bucharest","7200","1" +"Europe/Paris","3600","1" +"Europe/Monaco","3600","1" +"Europe/Budapest","3600","1" +"America/Havana","-18000","1" +"Asia/Tokyo","32400","0" +"America/Los_Angeles","-28800","1" +"America/Chicago","-21600","1" +"America/New_York","-18000","1" +"Europe/Brussels","3600","1" +"Europe/Warsaw","3600","1" +"Europe/Minsk","10800","0" +"Europe/Istanbul","10800","0" +"Asia/Jerusalem","7200","1" +"Europe/Moscow","10800","0" +"Asia/Tbilisi","14400","0" +"Indian/Maldives","18000","0" +"Asia/Bangkok","25200","0" +"Pacific/Auckland","43200","0" +"Europe/Rome","3600","1" +"Europe/Zurich","3600","1" +"Europe/Prague","3600","1" +"Europe/London","0","1" +"Pacific/Guam","36000","0" +"Europe/Amsterdam","3600","1"