!7 sclass CentralRestartBotLog extends DynCalculatedList { L data; // We are locked already. L calc() { if (data != null) ret data; new MultiSet ms; for (S s : tlft(centralRestartLogSince_raw(unixTime_startOfToday()*1000))) { SS map = parseEqualParameters(s); ms.add(map.get('programID)); } ret data = mapMultiSet(ms, func(S programID, int count) -> S { snippetWithTitle_cached(programID) + ": " + count }); } void start { ownTimer(doEvery(60.0, r refresh)); } void refresh() { setField(data := null); } }