]> Pileus Git - ~andy/rhawk/blobdiff - irc.awk
Save game after flipping the table
[~andy/rhawk] / irc.awk
diff --git a/irc.awk b/irc.awk
index 17f0fb44eaa878b8f5e9d087144b85060208c784..d4bb41e1f2dde228e23235a0e13ab57d0f114b01 100644 (file)
--- a/irc.awk
+++ b/irc.awk
@@ -21,8 +21,6 @@
 function send(msg) {
        print "  > " msg > "/dev/stderr"
        print msg
-       if (!DEBUG)
-               system("sleep 1")
        fflush()
 }
 
@@ -36,19 +34,20 @@ function debug(msg) {
        fflush()
 }
 
-function set() {
+function set(i) {
        debug("CMD:  [" CMD  "]")
        debug("SRC:  [" SRC  "]")
        debug("DST:  [" DST  "]")
        debug("FROM: [" FROM "]")
        debug("TO:   [" TO   "]")
-       debug("ARG:  [" ARG  "]")
        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
@@ -57,6 +56,12 @@ 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)
        }
 }
 
@@ -71,6 +76,8 @@ function say(to, msg) {
                        to = CHANNEL
        }
        send("PRIVMSG " to " :" msg)
+       if (!DEBUG && NR > 1)
+               system("sleep 1")
 }
 
 function action(to, msg)
@@ -88,6 +95,7 @@ function reply(msg) {
 function join(chan) {
        send("JOIN " chan)
        send("TOPIC " chan)
+       send("WHO " chan " %uhnar")
 }
 
 function part(chan) {
@@ -129,19 +137,23 @@ function reload() {
 
 # Input parsing
 // {
-       gsub(/\s+/,     " ")
-       gsub(/^ | $/,    "")
-       gsub(/\3[0-9]*/, "")
-       match($0, /(:([^ ]+) +)?(([A-Z0-9]+) +)(([^ ]+) +)?(([^: ]+) +)?(:(.*))/, arr);
+       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]
-       ARG = arr[8]
-       MSG = arr[10]
+       CMD = arr[3]
+       MSG = arr[7]
+
+       split(arr[4], ARG)
+       DST = ARG[1]
 
        match(SRC, /([^! ]+)!([^@ ]+)@([^ ]+\/[^ ]+)?/, arr);
        FROM = arr[1]
-       AUTH = arr[3]
+       USER = arr[2]
+       HOST = arr[3]
 
        match(MSG, /(([^ :,]*)[:,] *)?(.*)/, arr);
        TO  = arr[2]
@@ -150,6 +162,11 @@ function reload() {
        if (CMD == "PRIVMSG" && DST == NICK && FROM && !TO)
                TO = DST
 
+       if (FROM in USERS)
+               AUTH = USERS[FROM]["auth"]
+       else
+               AUTH = ""
+
        #set()
 }
 
@@ -163,10 +180,51 @@ CMD == "PING" {
 }
 
 CMD == "332" {
-       CMD = "TOPIC"
-       DST = ARG
+       TOPICS[ARG[2]] = MSG
 }
 
 CMD == "TOPIC" {
-       topics[DST] = MSG
+       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]
 }