!7 set flag DynModule. // central transpileRaw sclass RemoteControlled > DynPrintLog { S controllingComputers; bool enabled; transient Q q; visualize { ret centerAndSouthWithMargins(super.visualize(), vstackWithSpacing(jrightalignedline(dm_fieldCheckBox('enabled)), withLabel("Computers that can control me:", dm_fieldTextField('controllingComputers)))); } start { dm_osChat(); q = dm_startQ(); ownResource(vmBus_onMessage('gotFromChat, voidfunc(fS msg) { q.add(r { processMsg(null, msg) }) })); ownResource(vmBus_onMessage('gotFromPrivateChat, voidfunc(fS sender, fS msg) { q.add(r { processMsg(sender, msg) }) })); } void processMsg(S sender, S msg) { LS computers = words2(controllingComputers); S author = getAuthorOfSignedText(msg); print("Author: " + author + ", controlling computers: " + computers); if (computers.contains(author)) { msg = trim(unsign(msg)); print("Got signed message from " + author + ": " + msg); new Matches m; if (jMatchStart(" eval fresh:", msg, m)) { dm_refreshTranspiler(); msg = $1 + " eval: " + m.rest(); } if (jMatchStart(" eval fresh :", msg, m)) { dm_refreshTranspiler(); msg = $1 + " eval " + $2 + ": " + m.rest(); } if (jMatchStart(" eval:", msg, m)) { if (neqOneOf($1, "all", computerID())) print("Not for me."); else if (!enabled) print("Will not eval (module disabled)."); else { print("EVAL!"); printIndent(m.rest()); print(">> " + dm_javaEvalOrInterpret(m.rest())); } } if (jMatchStart(" eval :", msg, m)) { if (neqOneOf($1, "all", computerID())) print("Not for me."); else if (!enabled) print("Will not eval (module disabled)."); else { print("EVAL!"); printIndent(m.rest()); O result = dm_javaEvalOrInterpret(m.rest()); print(">> " + result); S out = evalResult_str(result); S mode = "direct"; if (containsNewLine(out)) { out = quote(out); mode = "quoted"; } S line = "done " + $2 + " " + mode + ": " + out; if (sender == null) dm_osChat_postSigned(line); else dm_privateChat_sendSigned(sender, line); } } } } }