!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 setFieldAndReturn(data := mapMultiSet(ms, func(S programID, int count) -> S { snippetWithTitle_cached(programID) + ": " + count })); } void start { ownTimer(doEvery(60.0, r uv_refresh)); } // uv = user-visible void uv_refresh() { setField(data := null); } }