X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=irc.awk;h=d4bb41e1f2dde228e23235a0e13ab57d0f114b01;hb=ca2fedce197db031916fb0107a9263b5fe62ca71;hp=6fc0c468ead2df40d8d3c1dc32d771ab237edf16;hpb=467f232316285956b997d446ca458a9d2eb38c07;p=~andy%2Frhawk diff --git a/irc.awk b/irc.awk index 6fc0c46..d4bb41e 100644 --- a/irc.awk +++ b/irc.awk @@ -19,15 +19,14 @@ # Debugging function send(msg) { - #print " > " msg > "/dev/stderr" + print " > " msg > "/dev/stderr" print msg - #system("sleep 1") fflush() } // { #print "" > "/dev/stderr" - #print " < " $0 > "/dev/stderr" + print " < " $0 > "/dev/stderr" } function debug(msg) { @@ -35,17 +34,20 @@ function debug(msg) { fflush() } -function set() { - debug("CMD: " CMD) - debug("SRC: " SRC) - debug("DST: " DST) - debug("FROM: " FROM) - debug("TO: " TO) - debug("MSG: " MSG) +function set(i) { + debug("CMD: [" CMD "]") + debug("SRC: [" SRC "]") + debug("DST: [" DST "]") + debug("FROM: [" FROM "]") + debug("TO: [" TO "]") + debug("MSG: [" MSG "]") + debug("$0: [" $0 "]") + for (i in ARG) + debug("ARG"i": [" ARG[i] "]") } # Functions -function connect(server, nick, channel) { +function connect(server, nick, channel, auth, pass) { SERVER = server NICK = nick CHANNEL = channel @@ -54,18 +56,36 @@ function connect(server, nick, channel) { "hostname" | getline _host send("USER " _name " " _host " " server " :" nick) send("NICK " nick) + send("CAP REQ :account-notify") + send("CAP REQ :extended-join") + send("CAP END") + say("NickServ", "IDENTIFY " pass) + } else { + send("WHOIS " nick) } } -function privmsg(to, msg) { + +function say(to, msg) { + if (msg == "") { + msg = to + if (DST ~ "^#") + to = DST + else if (DST == NICK && FROM) + to = FROM + else + to = CHANNEL + } send("PRIVMSG " to " :" msg) + if (!DEBUG && NR > 1) + system("sleep 1") } -function say(msg) { - if (DST ~ "^#") - privmsg(DST, msg) - else if (DST == NICK && FROM) - privmsg(FROM, msg) + +function action(to, msg) +{ + if (msg) + say(to, "\001ACTION " msg "\001") else - privmsg(CHANNEL, msg) + say("\001ACTION " to "\001") } function reply(msg) { @@ -74,22 +94,36 @@ function reply(msg) { function join(chan) { send("JOIN " chan) + send("TOPIC " chan) + send("WHO " chan " %uhnar") } function part(chan) { send("PART " chan) } +function topic(chan, msg) { + send("TOPIC " chan " :" msg) +} + # Reloading BEGIN { if (CHILD == "") { debug("Starting server"); - status = system("awk -f rhawk -v CHILD=1 -v FIRST=1"); + cmd = "awk -f rhawk" \ + " -v CHILD=1" \ + " -v START=" systime() \ + " -v DEBUG=" !!DEBUG + status = system(cmd " -v FIRST=1"); while (status) - status = system("awk -f rhawk -v CHILD=1"); + status = system(cmd); exit(0); } else { - debug("Starting child: CHILD=" CHILD " FIRST=" FIRST); + debug("Starting child:" \ + " DEBUG=" DEBUG \ + " CHILD=" CHILD \ + " START=" START \ + " FIRST=" FIRST); } } @@ -103,24 +137,37 @@ function reload() { # Input parsing // { - match($0, /(:([^ ]+) +)?(([A-Z0-9]+) +)(([^ ]+) +)?([^:]*:(.*))/, arr); - gsub(/\s+/, " ", arr[8]) - gsub(/^ | $/, "", arr[8]) - gsub(/\3[0-9]*/, "", arr[8]) + gsub(/\s+/, " ") + gsub(/^ | $/, "") + gsub(/[\2\11\17\23\25\26\37]/, "") + gsub(/[\3\13](1[0-5]|0?[0-9])?(,(1[0-5]|0?[0-9]))?/, "") + match($0, /(:([^ ]+) )?([A-Z0-9]+)(( [^:][^ ]*)*)( :(.*))?/, arr); + sub(/^ /, "", arr[4]) SRC = arr[2] - CMD = arr[4] - DST = arr[6] - MSG = arr[8] + CMD = arr[3] + MSG = arr[7] - match(SRC, /([^! ]+)!/, arr); + split(arr[4], ARG) + DST = ARG[1] + + match(SRC, /([^! ]+)!([^@ ]+)@([^ ]+\/[^ ]+)?/, arr); FROM = arr[1] + USER = arr[2] + HOST = arr[3] match(MSG, /(([^ :,]*)[:,] *)?(.*)/, arr); TO = arr[2] - $0 = TO == NICK ? arr[3] : MSG + $0 = TO ? arr[3] : MSG - if (CMD == "PRIVMSG" && DST == NICK && FROM) + if (CMD == "PRIVMSG" && DST == NICK && FROM && !TO) TO = DST + + if (FROM in USERS) + AUTH = USERS[FROM]["auth"] + else + AUTH = "" + + #set() } # IRC client @@ -131,3 +178,53 @@ CMD == "001" && MSG ~ /Welcome/ { CMD == "PING" { send("PING " MSG) } + +CMD == "332" { + TOPICS[ARG[2]] = MSG +} + +CMD == "TOPIC" { + TOPICS[ARG[1]] = MSG +} + +# Authentication +# todo - netsplits +CMD == "319" { + gsub(/[@+]/, "") + for (i=1; i<=NF; i++) + send("WHO " $i " %uhnar") + for (i=1; i<=NF; i++) + send("TOPIC " $i) +} + +CMD == "ACCOUNT" { + _auth = ARG[1] == "*" ? 0 : ARG[1] + USERS[FROM]["auth"] = _auth +} + +CMD == "354" { + _auth = ARG[5] == "*" ? 0 : ARG[5] + USERS[ARG[4]]["user"] = ARG[2] + USERS[ARG[4]]["host"] = ARG[3] + USERS[ARG[4]]["nick"] = ARG[4] + USERS[ARG[4]]["auth"] = _auth + USERS[ARG[4]]["real"] = MSG +} + +CMD == "JOIN" { + _auth = ARG[2] == "*" ? 0 : ARG[2] + USERS[FROM]["user"] = USER + USERS[FROM]["host"] = HOST + USERS[FROM]["nick"] = FROM + USERS[FROM]["auth"] = _auth + USERS[FROM]["real"] = MSG +} + +CMD == "NICK" { + USERS[MSG]["user"] = USERS[FROM]["user"] + USERS[MSG]["host"] = USERS[FROM]["host"] + USERS[MSG]["nick"] = MSG + USERS[MSG]["auth"] = USERS[FROM]["auth"] + USERS[MSG]["real"] = USERS[FROM]["real"] + delete USERS[FROM] +}