-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathindex.js
240 lines (191 loc) · 7.71 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
'use strict';
// =================================================================================
// The below code is used to set up a server and a webhook at /webhook.
// Danger Zone: Editing might break your app.
// =================================================================================
const app = require('jovo-framework').Jovo;
const webhook = require('jovo-framework').Webhook;
const PushBullet = require('pushbullet');
const GoogleSearch = require('google-search');
// Listen for post requests
webhook.listen(3000, function () {
console.log('Local development server listening on port 3000.');
});
webhook.post('/webhook', function (req, res) {
app.handleRequest(req, res, handlers);
app.execute();
});
// API keys
const googleSearch = new GoogleSearch({
key: '',
cx: ''
});
const pusher = new PushBullet('');
//var JefNode = require('json-easy-filter').JefNode;
// =================================================================================
// Strings, variables & stuff
// =================================================================================
const askUrlText = [
"Where do you want to search?",
"On which website do you want to search?",
"On which domain do you want to search?",
"Tell me on which website you want to search.",
"On which website?"
];
//// Log the JSON request/response to ngrok console
// app.enableRequestLogging();
// app.enableResponseLogging();
// =================================================================================
// Below is where the logic of your voice app should be happening
// Get started by adding some intents and Jovo functions
// =================================================================================
let handlers = {
/* 'LAUNCH': function () {
app.toIntent('search-website');
},*/
'search-website': function (url, domain, anyQuery) {
if (url === "" && domain === "") {
let randomNumber = Math.floor(Math.random() * askUrlText.length);
app.ask(askUrlText[randomNumber]);
}
else {
app.setSessionAttribute('nextResult', 4);
let searchUrl = "";
if (url !== "") {
searchUrl = url;
}
else {
searchUrl = domain;
}
app.setSessionAttribute('anyQuery', anyQuery);
app.setSessionAttribute('searchUrl', searchUrl);
finalizeGoogleSearch(searchUrl, anyQuery, 1);
}
},// end of 'search-website'
'just-search': function (any) {
console.log('just-search');
app.setSessionAttribute('nextResult', 4);
app.setSessionAttribute('anyQuery', any);
let searchUrl = "google.com";
app.setSessionAttribute('searchUrl', searchUrl);
finalizeGoogleSearch(searchUrl, any, 1);
},// end of 'just-search'
//complete search
'url-domain': function (url, domain) {
let query = app.getSessionAttribute('anyQuery');
let searchUrl = "";
if (url !== "") {
searchUrl = url;
}
else {
searchUrl = domain;
}
app.setSessionAttribute('searchUrl', searchUrl);
app.setSessionAttribute('nextResult', 4);
finalizeGoogleSearch(searchUrl, query, 1);
},// end of url-domain
'go-on': function () {
let nextResult = app.getSessionAttribute('nextResult');
let searchUrl = app.getSessionAttribute('searchUrl');
let anyQuery = app.getSessionAttribute('anyQuery');
finalizeGoogleSearch(searchUrl, anyQuery, nextResult);
app.setSessionAttribute('nextResult', nextResult + 3);
},
//This intent gets the link title and snippet of the requested search result
'result-detail': function (ordinal) {
console.log("Ordinal: " + ordinal);
let searchUrl = app.getSessionAttribute('searchUrl');
let anyQuery = app.getSessionAttribute('anyQuery');
let searchResponse = null;
let httpUrl = '';
if (searchUrl.indexOf('.') !== -1) {
httpUrl = "http://www." + searchUrl;
}
else {
httpUrl = "http://www." + searchUrl + '.com';
}
//if user wants to search on google: search whole web
if (httpUrl === 'http://www.google.com') {
httpUrl = ''
}
googleSearch.build({
q: anyQuery,
start: ordinal,
fileType: "",
gl: "", //location
lr: "lang_en",
num: 1, // Number of search results to return between 1 and 10, inclusive
siteSearch: httpUrl // Restricts results to URLs from a specified site
}, function (error, response) {
searchResponse = response.items;
let speech;
speech = app.speechBuilder()
.addText(searchResponse[0].snippet).addBreak('300ms')
.addText('About which other result do you want more information?').addBreak('200ms')
.addText('Or are you done?')
.build();
app.ask(speech);
// console.log(JSON.stringify(searchResponse, null, 2));
pushNotification(searchResponse[0].title, searchResponse[0].link)
});
}
};//end of intent handlers
function finalizeGoogleSearch(searchUrl, query, resultNr) {
let searchResponse = null;
let httpUrl = '';
if (searchUrl.indexOf('.') !== -1) {
httpUrl = "http://www." + searchUrl;
}
else {
httpUrl = "http://www." + searchUrl + '.com';
}
//if user wants to search on google: search whole web
if (httpUrl === 'http://www.google.com') {
httpUrl = ''
}
googleSearch.build({
q: query,
start: resultNr,
fileType: "",
gl: "", //location
lr: "lang_en",
num: 3, // Number of search results to return between 1 and 10, inclusive
siteSearch: httpUrl // Restricts results to URLs from a specified site
}, function (error, response) {
searchResponse = response.items;
console.log(JSON.stringify(response, null, 2));
//TODO: Add response if google does not reply
let speech = app.speechBuilder();
if (searchResponse !== undefined) {
if (resultNr < 3) {
speech.addText('Your search results on').addText(searchUrl).addText(' are: ');
} else {
speech.addText('Your next results are:');
}
speech.addBreak('300ms').addSayAsOrdinal(resultNr).addText('Result: ').addText(filter(searchResponse[0].title, searchUrl)).addBreak('800ms')
.addSayAsOrdinal(resultNr + 1).addText('Result: ').addText(filter(searchResponse[1].title, searchUrl)).addBreak('800ms')
.addSayAsOrdinal(resultNr + 2).addText('Result: ').addText(filter(searchResponse[2].title, searchUrl)).addBreak('1000ms')
.addText('About which result would you want to know details?').addText('Or do you want to search further?', 0.3)
.build();
} else {
speech.addText('Sorry, ').addText(query).addBreak('500ms').addText('on').addText(searchUrl).addText('did not return any results')
.build();
}
app.ask(speech);
});
}
function pushNotification(title, url) {
pusher.link("", title, url, function (error, response) {
});
}
function filter(data, replace) {
let str = data;//+ ' ' + node.value.link;
str = str.replaceAll(replace, ' ');
return str
}
String.prototype.replaceAll = function (strReplace, strWith) {
// See http://stackoverflow.com/a/3561711/556609
let esc = strReplace.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
let reg = new RegExp(esc, 'ig');
return this.replace(reg, strWith);
};