// uses ctxContext() // returns true when rule "matched" static bool ctxProcessRule(S ruleName) { if (ruleName == null) false; ctxContext().rulesFired.add(ruleName); ++ctxContext().safetyCounter; WoodyRule rule = woodyBot().getRule(ruleName); if (rule == null) { print("Rule not found: " + ruleName); false; } printObjectWithFields(rule, "fullName", "condition", "body", "properties"); print("Processing rule " + rule.fullName); S a = rule.properties.get("ANALYZER"); if (a != null) ctxContext().activeAnalyzer = a; // evaluate condition again to set MATCH1 rule.parsedCondition.get(); // fake if (eqic(ruleName, "Agent#EVENT.NEWUSER")) { S theGoto = ctxFindFirstGoto(rule.body); print("NEWUSER -> Goto: " + theGoto); ctxContext().nextRule = theGoto; true; } if (neq(rule.properties.get("ACTIONSELECTOR"), "SWITCH")) // multi-action rules (RANDOMLOOP/TILLEND) if (ctxDoNextActionInRule(rule)) { if (!ctxPostRule()) // continue with this rule ctxContext().setActiveRule(rule.fullName); true; } // SWITCH L cases = ctxCases(rule.body); if (nempty(cases)) { for (CtxCase c : cases) { Bool b = c.condition == null /* default */ || ctxEvalCondition(c.condition); print("case " + c.condition + " -> " + b + (b ? " (input: " + quote(ctxContext().input) + ")" : "")); if (isTrue(b)) { ctxContext().nextRule = mapGet(c.properties, "GOTO"); a = mapGet(c.properties, "ANALYZER"); if (a != null) { print("Setting analyzer to " + a + " by case in rule " + rule.fullName); ctxContext().activeAnalyzer = a; } ctxProcessAction(c.action); ctxPostRule(); true; } } false; } print("Unknown rule type: " + ruleName); false; }