131 lines
4 KiB
JavaScript
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,
|
|
};
|
|
};
|