!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_privateChat(); 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) }) })); print("Remote Control " + (enabled ? "ENABLED" : "DISABLED") + ". Controlling computers: " + or2(controllingComputers, "-")); } 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_refreshTranspilerAndLoadedFunctions(); msg = $1 + " eval: " + m.rest(); } bool realEval = jMatchStart(" eval real", msg, m); if (realEval) 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(trim(indentx("EVAL: " + m.rest()))); O result = dm_javaEvalOrInterpret(m.rest()); print(">> " + result); } } 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(trim(indentx("EVAL from " + author + ": " + m.rest()))); O result; try { result = realEval ? dm_javaEval(m.rest()) : dm_javaEvalOrInterpret(m.rest()); } catch print e { result = e; } S mode = "direct"; S out; if (result != null) { int l = l_opt(result); print(">> " + (l != 0 ? "[l=" + l + "] " : "") + result); } if (result instanceof byte[]) { mode = "base64"; out = base64((byte[]) result); } else { out = str(result); 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); } } } } // API bool addControllingComputer(S computerID) { if (contains(controllingComputers, computerID)) false; setField(controllingComputers := trim(controllingComputers + " " + computerID)); true; } }