!7 cmodule2 FollowSkypeBot > DynPrintLog { switchable bool uploadEnabled; switchable double answerInterval = 3.0; transient Q uploadQ; File logFile() { ret userDir("dev/skype-bot/skype.log"); } start-thread { uploadQ = dm_startQ(); printFileInfo(logFile()); tailFileLinewise(logFile(), 1000, voidfunc(S line) { handleLine(line); }); print("Listening to log " + stringIf(uploadEnabled, " with upload")); dm_startThread(r postAnswers); } void postAnswers { while true { sleepSeconds(answerInterval); S file = "/root/dev/skype-bot/msgs-to-send.json"; pcall { L msgs = loadJSONPage("https://bea.gazelle.rocks/beaHTML/127493?markSent=1"); if (nempty(msgs)) { print("Waiting for file to disappear: " + file); while (fileExists(file)) sleepSeconds(1); saveTextFile(file, jsonEncode(msgs)); print("Sent msgs to bot."); } } } } 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 displayName = cast mapGet(resource, "imdisplayname"); 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", "at")) { // 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 { S info = "Skype"; if (nempty(displayName)) info += " (User " + displayName + ")"; gazelleBEA_uploadInput(str(out), info); }); } } } }