// uses ctxContext() // returns true when rule "matched" static bool ctxProcessRule(S ruleName) { if (ruleName == null) false; ctxContext().rulesFired.add(ruleName); ++ctxContext().safetyCounter; WoodyRule rule = bot.getRule(ruleName); printObjectWithFields(rule, "fullName", "condition", "body", "properties"); // 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 (ctxContext().jumpaway) { ctxContext().setActiveRule(null); ctxContext().jumpaway = false; } else 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); if (isTrue(b)) { ctxContext().nextRule = mapGet(c.properties, "GOTO"); S a = mapGet(c.properties, "ANALYZER"); if (a != null) ctxContext().activeAnalyzer = a; ctxProcessAction(c.action); true; } } false; } print("Unknown rule type"); false; }