!752 static class Event { long startTime, duration; S question, answer; S botID; } static PersistentLog data; p { data = new PersistentLog("data.log"); } synchronized answer { if "avg processing time" { if (empty(data)) ret "No data yet"; long avg = round(getAverage(data, "duration")); ret avg + " ms per question (" + l(data) + " requests counted)"; } if (match("clear avg processing time", s) && getUserName() != null) { data.clear(); ret "OK, log cleared."; } } static synchronized S answerPriv(S s) { new Matches m; if (match("log timing *", s, m)) { new Event e; copyFields(safeUnstructure(m.unq(0)), e); // mandatory fields assertTrue(e.startTime != 0); assertTrue(e.duration >= 0); assertTrue(!empty(e.question)); data.add(e); ret "OK, logged as item " + l(data); } ret null; }