!7 sclass MechLists extends DynCalculatedList { SS listToMD5; transient ReliableSingleThread rst = new(r downloadAll); transient bool authed; visualize { JComponent c = super.visualize(); onDoubleClickOrEnter(list, voidfunc(S listName) { showText(listName, mechList_raw_localCopy(listName)) }); if (!authed) ret c; ret withLeftAlignedButtonsOnTop(c, "Create...", r createList); } start { set serverMechList_raw_fresh_verbose; setModuleName("Mech Lists With Text" + trueFalseNull(authed = mech_authedOnServer(), " [Authed]", " [Not Authed]", "")); actualCalc(); doEvery(10000, 5000, rst); bot("Mech Lists Mirror."); } void actualCalc { setField(results := sortedIC(keys(listToMD5))); } L calc() { ret results; } void downloadAll { L l = mechListMD5sAndStatuses_fresh(); new HashMap listToMD5; for (LS x : l) { S name = first(x); listToMD5.put(name, second(x)); saveTextFileIfDifferent(remoteMechListMirrorMetaFile(name), struct(litmap("Name" := name, "Status" := last(x)))); } deleteLocalMechListCopiesOtherThan(keys(listToMD5)); setField(+listToMD5); actualCalc(); mechList_completeLocalCopies(listToMD5); } void createList enter { inputText("List Name", voidfunc(S name) { if (emptyAfterTrim(name)) ret; createMechList(trim(name)); rst.trigger(); }); } }