ami/src/ami.js/txtrigs.js

131 lines
4 KiB
JavaScript

var AmiTextTrigger = function(info) {
var type = info.type,
match = info.match;
for(var i in match) {
match[i] = match[i].split(';');
for(var j in match[i])
match[i][j] = match[i][j].trim().split(':');
}
var pub = {
getType: function() { return type; },
isSoundType: function() { return type === 'sound'; },
isAliasType: function() { return type === 'alias'; },
isMatch: function(matchText) {
for(var i in match) {
var out = (function(filters, text) {
var result = false;
for(var j in filters) {
var filter = filters[j];
switch(filter[0]) {
case 'lc':
text = text.toLowerCase();
break;
case 'is':
if(text === filter.slice(1).join(':'))
result = true;
break;
case 'starts':
if(text.indexOf(filter.slice(1).join(':')) === 0)
result = true;
break;
case 'has':
if(text.indexOf(filter.slice(1).join(':')) >= 0)
result = true;
break;
case 'hasnot':
if(text.indexOf(filter.slice(1).join(':')) >= 0)
result = false;
break;
default:
console.log('Unknown filter encountered: ' + filter.join(':'));
break;
}
}
return result;
})(match[i], matchText);
if(out) return true;
}
return false;
},
};
if(type === 'sound') {
var volume = info.volume || 1.0,
rate = info.rate || 1.0,
names = info.sounds || [];
pub.getVolume = function() { return volume; };
pub.getRate = function() {
if(rate === 'rng')
return 1.8 - (Math.random() * 1.5);
return rate;
};
pub.getSoundNames = function() { return names; };
pub.getRandomSoundName = function() { return names[Math.floor(Math.random() * names.length)]; };
} else if(type === 'alias') {
var aliasFor = info.for || [];
pub.getFor = function() { return aliasFor; };
} else
throw 'Unsupported trigger type.';
return pub;
};
var AmiTextTriggers = function() {
var triggers = [];
var addTrigger = function(triggerInfo) {
if(triggerInfo === null || typeof triggerInfo.type !== 'string')
throw 'triggerInfo is not a valid trigger';
triggers.push(new AmiTextTrigger(triggerInfo));
};
var getTrigger = function(text, returnAlias) {
for(var i in triggers) {
var trigger = triggers[i];
if(trigger.isMatch(text)) {
if(trigger.isAliasType() && !returnAlias) {
var aliasFor = trigger.getFor();
trigger = getTrigger(aliasFor[Math.floor(Math.random() * aliasFor.length)]);
}
return trigger;
}
}
throw 'no trigger that matches this text';
};
return {
addTrigger: addTrigger,
addTriggers: function(triggerInfos) {
for(var i in triggerInfos)
try {
addTrigger(triggerInfos[i]);
} catch(ex) {
console.log(ex);
}
},
clearTriggers: function() {
triggers = [];
},
hasTriggers: function() {
return triggers.length > 0;
},
getTrigger: getTrigger,
};
};