jam/js/ui/cordova/www/js/chat.js

156 lines
4.5 KiB
JavaScript

// Chat bot moderator agent
function chat(options) {
this.delay = options.delay||2000;
this.rememberCount= options.rememberCount||1000;
this.action = null;
this.count = 0;
this.busy = false;
this.state = 0;
this.retry = 0;
this.verbose = options.verbose||1;
this.timeout = options.timeout||40000;
this.dialogs = [];
this.version = "1.1.7C";
this.act = {
// Initialize the moderator agent
init : function () {
var t;
log('Chat moderator agent V. '+this.version+' is starting..');
this.retry = 0;
this.state = 0;
this.busy = false;
negotiate('CPU',10000000);
out(['CHAT']);
// Some sensor API tests
t=rd.try(0,['SENSOR','CLOCK',_]);
if (t) log('Got SENSOR CLOCK='+t[2]); else log('NO SENSOR CLOCK');
t=rd.try(0,['SENSOR','GPS',_]);
if (t) log('Got SENSOR GPS='+t[2]); else log('NO SENSOR GPS');
},
// Get feedback from user: qilling to chat?
talk: function () {
var quest;
if (this.verbose) log('Chat moderator agent is talking..')
if (this.state==0) message('Moderator','Hello, I am '+me()+', your moderator :-)');
// Blocking operation (with timeout)
this.action=null;
this.busy=true;
switch (this.state) {
case 0:
case 1: quest='What would you like to do?'; break;
case 2: quest='May I ask again?'; break;
case 3:
case 4: quest='Do you want to change your decision?'; break;
}
question('Moderator',quest,[
{text:'Chilling',value:'nothing'},
{text:'Answer questions', value:'questions'}
],function (res) {
this.action=res;
if (this.verbose) log('Got answer '+res)
},this.timeout);
},
process: function () {
alt.try(500,[
['MESSAGE',_,_],
['QUESTION',_,_,_]
], function (t) {
if (t) switch (t[0]) {
case 'MESSAGE': this.dialogs.push({
message: t[2],
from: t[1]
}); break;
case 'QUESTION': this.dialogs.push({
question: t[2],
from: t[1],
options: t[3]
}); break;
}
if (this.verbose>1) log('process: have '+this.dialogs.length+' dialogs');
});
},
dodialog: function () {
var action;
if (this.busy) return;
var d=this.dialogs.shift();
// q= ['QUESTION',id,question, {}]
// q= ['QUESTION',id,question, {type:'text'|'number',default?, value?:number|string}]
// q= ['QUESTION',id,question, {choices:(string|number|{text,value}) []}]
if (d.message) {
this.busy=true;
message(d.from,d.message);
this.busy=false;
} else if (d.question) {
this.busy=true;
if (d.options.choices)
action = d.options.choices;
else
action = {
// TODO
size: 14,
value: d.options.value||'',
sub_type: d.options.type || 'text',
placeholder: d.options.default||''
};
question(d.from,d.question,action,function (res) {
log('Got answer '+res+' for '+d.from+' and Q '+d.question)
if (res) out(['ANSWER',d.from,d.question,res]);
this.busy=false;
},this.timeout);
}
},
wait : function () {
this.busy=false;
if (this.state<4) {
notify('Now I will mediate questions from agents!');
message('Moderator','Now I will mediate questions from agents!');
message('Moderator','Hope you will answer their questions!');
}
this.state=4;
if (this.count==0) log('Chat moderator agent is waiting for '+this.action)
this.count++;
// maybe pause some time?
// maybe remembering?
},
remember: function () {
if (this.verbose) log('Chat moderator agent is remembering ..')
this.busy=false;
this.count=0;
if (this.action) this.state=3; else this.state=1;
sleep(this.delay*5)
},
end: function () {
log('Chat moderator agent is terminating.')
kill()
}
}
this.trans = {
init:talk,
talk:function () {
return this.action=='questions'?process:remember
},
process: function () {
if (this.dialogs.length) return dodialog;
else return wait
},
remember: talk,
dodialog: process,
wait:function () {
return this.count==this.rememberCount?remember:process;
}
}
this.next=init
}