!7 sclass AllOnlineComputers extends DynCalculatedList { LS computerIDs, data; transient DialogIO io; L calc() { ret data; } void cleanMeUp { if (io != null) io.close(); } start { connect(); doEvery(30000, r { if (io != null) io.sendLine("") }); } void connect { thread "Connect" { while licensed { try { io = talkTo("smartbot.botcompany.de", 6000); io.getSocket().setSoTimeout(30000+10000); print("Connected."); temp tempAfterwards(r { print("Disconnected.") }); io.sendLine(format("computerID=*", computerID())); io.sendLine(format("sub *", "computerIDs")); print("Sent computer ID: " + computerID()); S line; while ((line = io.readLine()) != null) { if (nempty(line)) print("Have msg: " + line); new Matches m; if (swic(line, "ComputerIDs = ", m)) { computerIDs = safeUnstruct($1); fO computerNames = dm_computerNames_opt(); setField(data := sortedIC(map(computerIDs, func(S id) -> S { S name = dm_callOpt(computerNames, 'nameForID, id); ret (eq(id, computerID()) ? "[this one] " : "") + (nempty(name) ? name + " (" + id + ")" : id); }))); vmBus_send('onlineComputerIDs, computerIDs); setModuleName(n2(computerIDs, "Online Computer")); } } } catch e { // pcall would also do an annoying message box printShortException(e); } io = null; sleepSeconds(5); } } } // API LS onlineComputerIDs() { ret computerIDs; } }