-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
256 lines (220 loc) · 10.4 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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
var Alexa = require('alexa-sdk');
var FB = require('fb');
const APP_ID = process.env.APP_ID;
// Messages used for Alexa to tell the user
var repeatWelcomeMessage = "you can say read my feed, or write a post using this skill.";
var welcomeMessage = "Welcome to connect to facebook, " + repeatWelcomeMessage;
var stopSkillMessage = "Bye! See you next time!";
var helpText = "You can say things like read my feed, or make a post, what would you like to do?";
var tryLaterText = "Please try again later."
var noAccessToken = "There was a problem getting the correct token for this skill, " + tryLaterText;
var anythingElse = "Is there anything else I can help with? You can read the feed, or make a post. Say stop to stop this skill."
var askPost = "What would you like to post?"
var cannotRecognize = "I don't know what you say. " + askPost
var accessToken = "";
var ua = require('universal-analytics');
var intentTrackingID = ua(process.env.UA_KEY);
const STATES = {
STARTMODE: '_STARTMODE', //The mode can read or write the post
FETCHMODE: '_FETCHMODE', //Try to fetch user's input
};
// Create a new session handler
const newSessionHandlers = {
'NewSession': function () {
this.handler.state = STATES.STARTMODE;
// Access token is pass through from the session information
accessToken = this.event.session.user.accessToken;
// If we have an access token we can continue.
if (accessToken) {
FB.setAccessToken(accessToken);
this.emit(':ask', welcomeMessage, repeatWelcomeMessage);
var log = ("NewSession: Got the access token successfully").toString();
intentTrackingID.event("success", log).send();
}
else {
// If we dont have an access token, we close down the skill. This should be handled better for a real skill.
this.emit(':tell', noAccessToken, tryLaterText);
intentTrackingID.event("invalid request","NewSession: no access token").send();
}
},
'AMAZON.CancelIntent': function () {
// Triggered wheen user asks Alexa top cancel interaction
this.emit(':tell', stopSkillMessage);
var log = ("Cancel successfully").toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.StopIntent': function () {
// Triggered wheen user asks Alexa top stop interaction
this.emit(':tell', stopSkillMessage);
var log = ("Stop successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered wheen user asks Alexa for help
'AMAZON.HelpIntent': function () {
this.emit(':ask', helpText, helpText);
var log = ("Got help successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered when no intent matches Alexa request
'Unhandled': function () {
this.emit(':ask', helpText, helpText);
intentTrackingID.event("invalid request","cannot handle this request").send();
}
};
const startConnectHandlers = Alexa.CreateStateHandler(STATES.STARTMODE, {
// Read fb feed handler
'readFeedIntent': function () {
var self = this;
// Again check if we have an access token
if (accessToken) {
// Call FB module and get my feed with status_type, description, sotry, and message, limit to 5 posts
FB.api("/me/feed?fields=status_type,message,story,description&limit=5", function (response) {
if (response && !response.error) {
// If we have data
if (response.data) {
var output = "";
// Take the top 5 posts and parse them to be read out by Alexa.
for (var i = 0; i < response.data.length; i++) {
if (response.data[i].status_type == "mobile_status_update") {
output += "<break time=\"1s\"/><p>Post " + (i+1) + " is " + response.data[i].message + ". </p>";
} else if (response.data[i].status_type == "shared_story") {
output += "<break time=\"1s\"/><p>Post " + (i+1) + " is " + response.data[i].description + ". " + "My message is " + response.data[i].message + ". </p>";
} else if (response.data[i].status_type == "added_photos") {
if (response.data[i].message == null) {
output += "<break time=\"1s\"/><p>Post " + (i+1) + " is a photo. </p>"
} else {
output += "<break time=\"1s\"/><p>Post " + (i+1) + " is a photo. My message is " + response.data[i].message + ". </p>";
}
}
if (response.data[i].story != null) {
output += response.data[i].story
}
}
self.response.speak(output).listen(anythingElse);
self.emit(":responseReady");
var log = ("readFeedIntent: Got the response data successfully").toString();
intentTrackingID.event("success", log).send();
} else {
// report problem with parsing data
self.emit(':tell', "There was an issue getting data.");
intentTrackingID.event("invalid request","readFeedIntent: no response data").send();
}
} else {
// Handle errors here.
console.log(response.error);
intentTrackingID.event("error", response.error.toString()).send();
}
});
} else {
self.emit(':tell', noAccessToken, tryLaterText);
intentTrackingID.event("invalid request","readFeedIntent: no access token").send();
}
},
// Write a post to Facebook feed handler.
'startPostIntent': function () {
var self = this;
self.handler.state = STATES.FETCHMODE;
self.response.speak(askPost).listen(askPost);
self.emit(':responseReady');
// report a success
var log = ("startPostIntent: success").toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.CancelIntent': function () {
// Triggered wheen user asks Alexa top cancel interaction
this.emit(':tell', stopSkillMessage);
var log = ("Cancel successfully").toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.StopIntent': function () {
// Triggered wheen user asks Alexa top stop interaction
this.emit(':tell', stopSkillMessage);
var log = ("Stop successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered wheen user asks Alexa for help
'AMAZON.HelpIntent': function () {
this.emit(':ask', helpText, helpText);
var log = ("Got help successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered when no intent matches Alexa request
'Unhandled': function () {
this.emit(':ask', helpText, helpText);
intentTrackingID.event("invalid request","cannot handle this request").send();
}
});
const writePostHandlers = Alexa.CreateStateHandler(STATES.FETCHMODE, {
'writePostIntent': function () {
var self = this;
var message = this.event.request.intent.slots.Message.value;
self.attributes['message'] = message;
self.emit(':ask', "Are you say " + message + " ?");
var log = ("writePostIntent: " + message).toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.YesIntent': function(message) {
var self = this;
if (accessToken) {
FB.api("/me/feed", "POST",
{
// Message to be posted
"message": this.attributes['message']
}, function (response) {
if (response && !response.error) {
// Alexa output for successful post
self.response.speak("Post successful!").listen(anythingElse, anythingElse);
self.emit(":responseReady");
var log = ("AMAZON.YesIntent: Post to facebook successfully").toString();
intentTrackingID.event("success", log).send();
} else {
console.log(response.error);
// Output for Alexa, when there is an error.
self.emit(':ask', "There was an error posting to your feed, please try again");
intentTrackingID.event("error", response.error.toString()).send();
}
});
} else{
self.emit(':tell', noAccessToken, tryLaterText);
intentTrackingID.event("invalid request", "AMAZON.YesIntent: no access token").send();
}
self.handler.state = STATES.STARTMODE;
},
'AMAZON.NoIntent': function(intent, session, response) {
var self = this;
self.response.speak(askPost).listen(askPost);
self.emit(':responseReady');
var log = ("AMAZON.NoIntent: ask for input again").toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.CancelIntent': function () {
// Triggered wheen user asks Alexa top cancel interaction
this.emit(':tell', stopSkillMessage);
var log = ("Cancel successfully").toString();
intentTrackingID.event("success", log).send();
},
'AMAZON.StopIntent': function () {
// Triggered wheen user asks Alexa top stop interaction
this.emit(':tell', stopSkillMessage);
var log = ("Stop successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered wheen user asks Alexa for help
'AMAZON.HelpIntent': function () {
this.emit(':ask', helpText, helpText);
var log = ("Got help successfully").toString();
intentTrackingID.event("success", log).send();
},
// Triggered when no intent matches Alexa request
'Unhandled': function () {
this.emit(':ask', helpText, helpText);
intentTrackingID.event("invalid request","cannot handle this request").send();
}
});
// Add handlers.
exports.handler = function (event, context, callback) {
const alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(newSessionHandlers, startConnectHandlers, writePostHandlers);
alexa.execute();
};