function send(msg) {
print " > " msg > "/dev/stderr"
print msg
- system("sleep 1")
fflush()
}
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
"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) {
function join(chan) {
send("JOIN " chan)
send("TOPIC " chan)
+ send("WHO " chan " %uhnar")
}
function part(chan) {
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);
}
}
# 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);
+ 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()
+ if (FROM in USERS)
+ AUTH = USERS[FROM]["auth"]
+ else
+ AUTH = ""
+
+ #set()
}
# IRC client
}
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]
}