#!/usr/bin/awk -f function isleap(year) { return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0) } function mdays(mon, year) { return (mon == 2 ? 28 + isleap(year) : 30 + (mon + (mon > 7)) % 2) } function gmtime(sec, tm) { tm["year"] = 1970 while (sec >= (s = 86400 * (365 + isleap(tm["year"])))) { tm["year"]++ sec -= s } tm["mon"] = 1 while (sec >= (s = 86400 * mdays(tm["mon"], tm["year"]))) { tm["mon"]++ sec -= s } tm["mday"] = 1 while (sec >= (s = 86400)) { tm["mday"]++ sec -= s } tm["hour"] = 0 while (sec >= 3600) { tm["hour"]++ sec -= 3600 } tm["min"] = 0 while (sec >= 60) { tm["min"]++ sec -= 60 } tm["sec"] = sec } function localtime(sec, tm, tz, h, m) { if (!TZOFFSET) { "date +%z" | getline tz close("date +%z") h = substr(tz, 2, 2) m = substr(tz, 4, 2) TZOFFSET = substr(date, 1, 1) (h * 3600 + m * 60) } return gmtime(sec + TZOFFSET, tm) } function fold_line(s, len, head, tail, i) { head = substr(s, 1, len + 1) sub(" *$", "", head) if (length(head) == len + 1) sub(" *[^ ]*$", "", head) if (length(head) == 0) { tail = substr(s, len + 1) head = substr(s, 1, len) if ((i = index(tail, " ")) == 0) return s return head substr(tail, 1, i) } return head } BEGIN { FS = " " } !NF { next } $1 == "==>" { sub(".log$", "", $2) sub("/channels/", " ", $2) sub("/server$", " server", $2) sub(".*/", "", $2) sub(" ", "/", $2) if (prev["nick"]) msg["chan"] = $2 delete prev["nick"] next } NF < 2 { printf("\n%s", $0) fflush() next } { nickend = index($2, ">") localtime($1, tm) msg["type"] = substr($2, nickend + 1) msg["text"] = substr($0, index($0, ">") + 2 + length(msg["type"])) msg["nick"] = substr($2, 2, nickend - 2) msg["date"] = sprintf("%04d/%02d/%02d", tm["year"], tm["mon"], tm["mday"]) msg["time"] = sprintf("%02d:%02d", tm["hour"], tm["min"]) } index(msg["type"], "!") { printf("\a") color = "1;33" } index(msg["type"], "a") { msg["text"] = msg["nick"] " " msg["text"] msg["nick"] = "*" } prev["chan"] != msg["chan"] { printf("\n\n── %s ", msg["chan"]) for (i = length(msg["chan"]) + 4; i < 80; i++) printf("─") fflush() } msg["nick"] == prev["nick"] { nick = "" } msg["nick"] != prev["nick"] { nick = msg["nick"] ":" print "" } msg["nick"] == "-" { nick = "- " } prev["date"] != msg["date"] { printf("\n%s", msg["date"]) } { fold = fold_line(msg["text"], 66) printf("\n\033[%sm%5s\033[m %10s %s", color, msg["time"], nick, fold) color = "" while (msg["text"] = substr(msg["text"], length(fold) + 2)) { fold = fold_line(msg["text"], 66) printf("\n%5s %10s %s", "", "", fold) } fflush() for (i in msg) prev[i] = msg[i] }