Warning: session_start(): open(/var/lib/php/sessions/sess_4s34uv8a0d91jjq6g5vl795dik, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass NewWoody {
transient Map rulesByName;
transient new L badRules;
Map ruleData = ciMap();
S lastOutput;
BBRule lastRule, activeRule;
sclass RuleData {
int answerIndex;
}
RuleData ruleData(BBRule rule) {
ret getOrCreate(ruleData, rule.listName, RuleData.class);
}
*() {
if (!DynamicObject_isLoading())
rulesByName = indexFieldAsCIMap('listName, bb_allRules());
}
*(NewWoody w) { initFrom(w); }
void initFrom(NewWoody w) {
copyFields(w, this, 'rulesByName, 'badRules);
}
void processInput(S input) {
lastRule = null;
lastOutput = null;
temp tempSetTL(ctxContext_var(), nu(CtxContext, +input));
new L matching;
for (BBRule r : valuesList(rulesByName))
if (ruleExpressionMatches(r))
matching.add(r);
activeRule = lastRule = or(first(matching), activeRule);
doRule();
}
void doRule {
if (activeRule != null)
if (cic(activeRule.answerMode, 'random)) // TODO: mark seen
lastOutput = random(activeRule.answers);
else if (cic(activeRule.answerMode, 'switch)) {
for (S s : activeRule.answers) {
LS l = splitAtDoubleArrow(s);
if (l(l) == 2 && print(first(l), ctxEvalCondition(first(l)))) {
lastOutput = second(l);
break;
}
}
} else {
// loop
RuleData rd = ruleData(activeRule);
lastOutput = get(activeRule.answers,
rd.answerIndex %= max(1, l(activeRule.answers)));
++rd.answerIndex;
}
}
bool ruleExpressionMatches(BBRule r) {
if (empty(r.expression)) false;
try {
ret ctxEvalCondition(r.expression);
} catch print e {
badRules.add(r);
rulesByName.remove(r.listName);
false;
}
}
L listsMatchingInput(S input) {
temp tempSetTL(ctxContext_var(), nu(CtxContext, +input));
ret [BBRule r : valuesList(rulesByName) | ruleExpressionMatches(r)];
}
}