!7 cmodule GThingsLister > DynPrintLog { GModuleInfo gInfo; S ruleID = 'invcwuqfdjvuloyv; // take fulfillments from there S varName = "toes"; LS thingsSaid = syncList(); LS thingsNotYetSaid; start { if (thingsNotYetSaid == null) { thingsNotYetSaid = syncList(); //addAll(thingsNotYetSaid, "frogs", "shoes"); addNotNulls(thingsNotYetSaid, uniquifyList(map(dm_gazelle_fulfillmentsForRule_imported(ruleID), fulfillment -> getOrKeep(fulfillment.varMap(), varName)))); } } S giveMeOne() { if (empty(thingsNotYetSaid)) { dm_gazelle_stopThisModule(); ret "I don't know any more body parts..."; } S s = removeRandom(thingsNotYetSaid); thingsSaid.add(s); ret s + "!"; } S answer(S s) { if "done|stop|gazelle stop|stop gazelle|thanks|thanks gazelle" { dm_gazelle_stopThisModule(); ret "OK"; } if "ok|cool|yes|good|next one please|yo|ack" ret giveMeOne(); null; } S initialAnswer(O... _) { S s = "I'll list body parts for you. Say \"done\" or \"stop\" to quit.\n"; if (empty(thingsNotYetSaid)) { s += "Sadly, I don't know any body parts"; dm_gazelle_stopThisModule(); } else s += "Here is one: " + giveMeOne(); ret s; } }