!7 cmodule2 FollowSkypeBot > DynPrintLog { switchable bool uploadEnabled; transient Q uploadQ = dm_startQ(this); File logFile() { ret userDir("dev/skype-bot/skype.log"); } start-thread { printFileInfo(logFile()); tailFileLinewise(logFile(), voidfunc(S line) { handleLine(line); }); print("Listening to log " + stringIf(uploadEnabled, " with upload")); } void processWholeLog { for (S line : linesFromFile(logFile())) handleLine(line); } void handleLine(S line) pcall { new Matches m; if (startsWith(line, "Message: ", m)) { //print(m.rest()); Map map = jsonDecodeMap(m.rest()); //pnl(map); Map resource = cast mapGet(map, "resource"); //pnl(resource); S content = cast mapGet(resource, "content"); if (nempty(content)) { print("Content: " + /*htmlDecode*/(content)); LS tok = htmlTok(content); new StringBuilder out; for (int i = 0; i < l(tok); i++) { if (odd(i)) { S tag = getTag(tok.get(i)); if (!eqicOneOf(tag, "b", "i")) { // skip any other tags if (eqic(tag, "ss")) out.append(":" + tagParam(tok.get(i), "type") + ":"); int j = findEndOfContainerTag(tok, i); i = j < 0 ? l(tok) : j-1; } } else out.append(htmlDecode(tok.get(i)); } print("Cleaned: " + out); if (uploadEnabled) uploadQ.add(r { gazelleBEA_uploadInput(str(out)); }); } } } }