Skip to content

Commit

Permalink
Refactor.
Browse files Browse the repository at this point in the history
  • Loading branch information
primaryobjects committed Mar 17, 2016
1 parent 295bb8f commit 820162b
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 73 deletions.
4 changes: 2 additions & 2 deletions funny.js
Expand Up @@ -27,14 +27,14 @@ funny.intent('banana', {
function(req, res) {
var state = req.get('state');
if (state < 2) {
req.set('state', state + 1);
res.say('Banana.');
}
else if (state == 3) {
req.set('state', state + 1);
res.say('Orange.');
}

req.set('state', state + 1);

return true;
}
);
Expand Down
151 changes: 80 additions & 71 deletions lib/chatskills.js
Expand Up @@ -30,27 +30,20 @@ var ChatSkillsManager = {
return this.apps[namespace];
},

respond: function(input, sessionId, callback) {
if (typeof sessionId == 'function') {
// No sessionId provided, default to 1 (localhost).
callback = sessionId;
sessionId = 1;
}

var session = this.sessions[sessionId];
var app = null;

session: function(input, sessionId) {
var regEx = new RegExp(this.id + '[,\\-\\!\\? ]+ask ([a-zA-Z0-9]+)[,\\. ](.*)', 'i');
var matches = input.match(regEx);

// Determine a skill to start: "[bot], ask [namespace] [input]".
if (matches && matches.length == 3) {
// It's a request for our bot.
var namespace = matches[1];
input = matches[2];

// It's a request for our bot.
app = this.apps[namespace];
// See if a skill exists with this namespace.
var app = this.apps[namespace];
if (!app) {
// Skill not found.
if (this.verbose) {
console.log("Error: The skill '" + namespace + "' doesn't exist. Add one using: chatskills.add('" + namespace + "')");
}
Expand All @@ -61,91 +54,107 @@ var ChatSkillsManager = {
this.sessions[sessionId] = {
id: sessionId,
app: app,
input: input,
slots: {}
};

session = this.sessions[sessionId];

if (this.verbose) {
console.log('Session ' + sessionId + ' started.');
}
}
}
else if (!session) {
// Not a request for our bot.
else if (!this.sessions[sessionId]) {
// Not a request for our bot and no existing session.
if (this.verbose) {
console.log("Info: Ignoring. Example request: '" + this.id + ", ask SKILL_NAME text'.");
}
return;
}
else {
// Continue existing session.
app = session.app;
this.sessions[sessionId].input = input;
}

// Go through each intent in the skill to find a valid response.
for (var i in Object.keys(app.intents)) {
var key = Object.keys(app.intents)[i];

// Get utterances for this intent.
var utterances = [];
app.utterances().split('\n').forEach(function(template) {
// Get the intent name from this template line.
var matches = template.match(/([a-zA-Z0-9]+)\t/);
if (matches && matches[1] == key) {
// The intent matches ours, let's use it. First, strip out intent name.
var start = template.indexOf('\t');
template = template.substring(start + 1);

// Add this utterance for processing.
utterances.push(template);
}
});
return this.sessions[sessionId];
},

var result = ChatSkillsManager.parse(input, utterances);
if (result.isValid) {
// This intent is valid for the input. Set slots.
for (var j in result.pairs) {
var pair = result.pairs[j];
session.slots[pair.name] = pair.value;
};
respond: function(input, sessionId, callback) {
if (typeof sessionId == 'function') {
// No sessionId provided, default to 1 (localhost).
callback = sessionId;
sessionId = 1;
}

// Call intent.
var continueSession = app.intents[key]['function'](
{
// Request
input: input,
slots: session.slots,
variables: result.pairs,
// Get a new or existing session.
var session = this.session(input, sessionId);
if (session) {
var app = session.app;
input = session.input;

// Go through each intent in the skill to find a valid response.
for (var i in Object.keys(app.intents)) {
var key = Object.keys(app.intents)[i];

// Get utterances for this intent.
var utterances = [];
app.utterances().split('\n').forEach(function(template) {
// Get the intent name from this template line.
var matches = template.match(/([a-zA-Z0-9]+)\t/);
if (matches && matches[1] == key) {
// The intent matches ours, let's use it. First, strip out intent name.
var start = template.indexOf('\t');
template = template.substring(start + 1);

// Add this utterance for processing.
utterances.push(template);
}
});

get: function(key) {
return session.slots[key];
var result = ChatSkillsManager.parse(input, utterances);
if (result.isValid) {
// This intent is valid for the input. Set slots.
for (var j in result.pairs) {
var pair = result.pairs[j];
session.slots[pair.name] = pair.value;
};

// Call intent.
var continueSession = app.intents[key]['function'](
{
// Request
input: input,
slots: session.slots,
variables: result.pairs,

get: function(key) {
return session.slots[key];
},

set: function(key, value) {
session.slots[key] = value;
}
},

set: function(key, value) {
session.slots[key] = value;
}
},
{
// Response
say: function(text) {
if (callback) {
callback(text);
{
// Response
say: function(text) {
if (callback) {
callback(text);
}
}
}
});
});

if (!continueSession) {
// Intent returned false, so end the session.
delete this.sessions[sessionId];
if (!continueSession) {
// Intent returned false, so end the session.
delete this.sessions[sessionId];

if (this.verbose) {
console.log('Session ' + sessionId + ' ended.');
if (this.verbose) {
console.log('Session ' + sessionId + ' ended.');
}
}
}

// We've already found a valid intent, skip processing the rest. This prevents multiple responses from the same text.
break;
// We've already found a valid intent, skip processing the rest. This prevents multiple responses from the same text.
break;
}
}
}
},
Expand Down

0 comments on commit 820162b

Please sign in to comment.