!7 !include #1001372 // direct nohupJavax for fast program starting // useful stuff to avoid transpilation please include function rpcNoArgs. concept Suggestion { S globalID = aGlobalID(); long date; S text; S author; S actionCode; } static Suggestion showing; static ReliableSingleThread rstUpdate = new(f updateImpl); static PastValueKeeper past = new(3600.0); p-subst { defaultFrameTitle("Suggestion"); autoRestart(); db(); botWithInput("Suggestion Master.", [=[ me suggests hello with action [[infoBox("hello")]] ]=]); } answer { if "* suggests * with action *" { Suggestion sugg = cnew(Suggestion, date := now(), text := $2, author := $1, actionCode := $3); rstUpdate!; ret "OK, ID: " + sugg.globalID; } if "show last suggestion" { ret showLastSuggestion(); } } svoid updateImpl { final Suggestion s = highestByField(list(Suggestion), 'date); if (s != showing) { showing = s; print("Showing suggestion: " + s.text); logQuotedWithDate(javaxDataDir("suggestions.log"), "Showing: " + struct(s)); past.add(s); showSuggestion_master(s.text, r { printIndent(s.actionCode); logQuotedWithDate(javaxDataDir("suggestions.log"), "Running: " + struct(s)); optimizedJavaEval(s.actionCode); }); } } sS showLastSuggestion() { double lookback = 1.0; print('showLastSuggestion); Suggestion s = past.valueAt_orFirst(toMS(lookback)); if (s != null) { Suggestion sugg = cnew(Suggestion, date := now()); ccopyFields(s, sugg, 'text, 'author, 'actionCode); cset(sugg, copiedFrom := s.globalID); rstUpdate!; ret "OK, ID: " + sugg.globalID; } ret "Nothing there"; }