]> Pileus Git - ~andy/rhawk/blobdiff - irc.awk
Improve input parsing
[~andy/rhawk] / irc.awk
diff --git a/irc.awk b/irc.awk
index 880f76b2e0c0070718a677696e9d31874bc59375..2f5d220c0934c59e443d89ebe0885b2df306cef3 100644 (file)
--- a/irc.awk
+++ b/irc.awk
@@ -21,7 +21,8 @@
 function send(msg) {
        print "  > " msg > "/dev/stderr"
        print msg
-       system("sleep 1")
+       if (!DEBUG)
+               system("sleep 1")
        fflush()
 }
 
@@ -35,15 +36,16 @@ 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
@@ -101,12 +103,20 @@ function topic(chan, msg) {
 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);
        }
 }
 
@@ -123,21 +133,25 @@ function reload() {
        gsub(/\s+/,     " ")
        gsub(/^ | $/,    "")
        gsub(/\3[0-9]*/, "")
-       match($0, /(:([^ ]+) +)?(([A-Z0-9]+) +)(([^ ]+) +)?(([^: ]+) +)?(:(.*))/, arr);
+       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]
 
-       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
 
        #set()
@@ -154,7 +168,6 @@ CMD == "PING" {
 
 CMD == "332" {
        CMD = "TOPIC"
-       DST = ARG
 }
 
 CMD == "TOPIC" {