X-Git-Url: http://pileus.org/git/?p=~andy%2Frhawk;a=blobdiff_plain;f=rhawk;h=0bc31a3ceadaf1512ed2ac9837a26ef77773f8b9;hp=282fa0efd2858182e964b32fb986d973b90df1a3;hb=HEAD;hpb=56225780f4e066ca1a93e953205c9aaf59329489 diff --git a/rhawk b/rhawk index 282fa0e..0bc31a3 100755 --- a/rhawk +++ b/rhawk @@ -1,46 +1,69 @@ #!awk -f @include "irc.awk" +@include "json.awk" @include "spades.awk" +@include "email.awk" +@include "remind.awk" +@include "sfvlug.awk" # Initialization BEGIN { - OWNER = "andy753421" - connect("localhost", "rhawk", "#rhtest"); + json_load("var/login.json", login); + json_load("var/nounicode.json", nounicode); + json_load("var/nocolor.json", nocolor); + + OWNER = login["owner"]; + + connect(login["server"], \ + login["nick"], \ + login["channel"], \ + login["auth"], \ + login["pass"]) + + delete login + + if (FIRST) { + join("#rhtest") + join("#rhspades") + join("#sfvlug") + } + + PROCINFO["sorted_in"] = "@ind_str_asc"; } # Admin -FROM == OWNER && TO == NICK && /^die in a fire/ { +AUTH == OWNER && TO == NICK && /^die in a fire/ { say("Ack, argh, barasdjf..") quit() } -FROM == OWNER && TO == NICK && /^reload/ { +AUTH == OWNER && TO == NICK && /^reload/ { say("Reloading..") reload() } -FROM == OWNER && TO == NICK && /^rejoin/ { +AUTH == OWNER && TO == NICK && /^rejoin/ { reply("joining..") join("#rhnoise") next } -FROM == OWNER && TO == NICK && /^(join|part)/ { - match(MSG, /(join|part) +(#+\w+)/, arr) - if (arr[1] && arr[2]) { - send(toupper(arr[1]) " " arr[2]); +AUTH == OWNER && TO == NICK && /^(join|part)/ { + if (match(MSG, /(join|part) +(#+\w+)/, arr)) { + if (arr[1] == "join") join(arr[2]); + if (arr[1] == "part") part(arr[2]); next } } -FROM == OWNER && TO == NICK && /^\.msg/ { +AUTH == OWNER && TO == NICK && /^\.msg/ { match(MSG, /.*\.msg +(#*\w+) +(.*)/, arr) send("PRIVMSG " arr[1] " :" arr[2]) } # Kick handling -CMD == "KICK" && ARG == NICK { +CMD == "KICK" && ARG[2] == NICK { kick_delay = (kick_delay + 2) * 2 system("sleep " kick_delay) join(DST) @@ -57,77 +80,377 @@ CMD == "NICK" && FROM in bots { } -# Unicode +# Fancy output /[Uu]nicode :-?\(/ { - plain[FROM] = 1 + nounicode[FROM] = 1 + json_save("var/nounicode.json", nounicode); } /[Uu]nicode :-?\)/ { - plain[FROM] = 0 + delete nounicode[FROM] + json_save("var/nounicode.json", nounicode); } -# SFV Lug -BEGIN { pollchan = "#sfvlug" } -(CMD == "PING" && systime()-lastpoll > 60*60*24) || -(CMD == "PRIVMSG" && DST == pollchan && /^\.poll/) { - if (!topics[pollchan]) { - debug("Unknown topic for " pollchan); - next - } - cmd = "curl -s http://sfvlug.org/" - day = "(Sun|Mon|Tue|Wed|Thu|Fri|Sat)" - web = "next meeting.*" day "\\w+[, ]+([A-Z]\\w+) +([0-9]+)[, ]+([0-9]+)" - irc = day "\\w*[, ]+([A-Z]\\w+) +([0-9]+)" - while (cmd | getline line) { - if (match(line, web, arr)) { - new = arr[1] " " arr[2] " " arr[3] - sub(irc, new, topics[pollchan]) - topic(pollchan, topics[pollchan]) - break - } - } - lastpoll = systime() +/[Cc]olors :-?\(/ { + nocolor[FROM] = 1 + json_save("var/nocolor.json", nocolor); +} + +/[Cc]olors :-?\)/ { + delete nocolor[FROM] + json_save("var/nocolor.json", nocolor); +} + +# Versin/Uptime +function head(cmd, var) { + cmd | getline var close(cmd) + return var +} +function uptime(time, fmt) { + fmt = "%d:%02d:%02d:%02d" + fmt = "%d days %02d:%02d:%02d" + return sprintf(fmt, + time / (60*60*24), + time / (60*60 ) % 24, + time / (60 ) % 60, + time / (1 ) % 60) +} +BEGIN { + up_version = head("git describe --always") + up_dirty = head("git describe --always --dirty") + up_author = head("git log -n1 --format=format:%an") + up_message = head("git log -n1 --format=format:%s") + up_reload = systime(); +} +/^\.(version|rev)/ { + say("version: " up_dirty " - " up_author " - " up_message) + say("http://pileus.org/git/?p=~andy/rhawk;h=" up_version) +} +/^\.uptime/ { + _now = systime(); + say("uptime: " uptime(_now - START) ", " \ + "reload: " uptime(_now - up_reload)) +} + +# Auth info +/^\.auth/ { + _who = $2 ? $2 : FROM + if (_who in USERS) + say("nick=" USERS[_who]["nick"] " " \ + "user=" USERS[_who]["user"] " " \ + "auth=" USERS[_who]["auth"] " " \ + "real=" USERS[_who]["real"] " " \ + "host=" USERS[_who]["host"]) + else + say("no auth info for " _who) +} + +# GeoIP Lookup +function geoip(ip, dat, cmd, line, parts) { + dat = "/usr/share/GeoIP/GeoIPCity.dat" + + cmd = "geoiplookup -f " dat " " ip + cmd | getline line + close(cmd) + + if (split(line, parts, /[:,] /) >= 9) + return parts[8] "," parts[9] " -- " \ + parts[6] ", " parts[4] ", " parts[3] + else + return "not found" +} + +/^\.geoip (([0-9a-zA-Z_.-]+) *)*$/ { + for (_i=2; _i<=NF; _i++) { + if ($_i in USERS) + say(geoip(USERS[$_i]["host"]) " -- " \ + $_i " -> " USERS[$_i]["host"]) + else + say(geoip($_i) " -- " $_i) + } } # Fortune -TO == NICK && /^/ { extra = "" } -TO == NICK && /^.fortune.*-o/ { extra = "-o" } -TO == NICK && /^.fortune/ { - gsub(/.*\.fortune *|-[a-z]* *|[^a-zA-Z0-9 ]/, "", MSG) +TO == NICK && /^/ { extra = "" } +TO == NICK && /^\.?fortune.*-o/ { extra = "-o" } +TO == NICK && /^\.?fortune/ { + gsub(/.*\.?fortune *|-[a-z]* *|[^a-zA-Z0-9 ]/, "", MSG) cmd = "fortune " extra " " (MSG ? "-m '" MSG "'" : "-s") - while (cmd | getline _fortune && lines < 5) { + _lines = 0 + while (cmd | getline _fortune && _lines < 5) { say(_fortune) - lines++ + _lines++ } close(cmd) next } +/\<[Bb][Oo][Ff][Hh]\>/ { + _cmd = "fortune bofh-excuses" + _cmd | getline _fortune + _cmd | getline _fortune + _cmd | getline _fortune + close(_cmd) + say(_fortune) + next +} + +# Morse code +BEGIN { + morse["/" ] = " " + morse[".-.-.-" ] = "." + morse["--..--" ] = "," + morse["..--.." ] = "?" + morse[".----." ] = "'" + morse["-.-.--" ] = "!" + morse["-..-." ] = "/" + morse["-.--." ] = "(" + morse["-.--.-" ] = ")" + morse[".-..." ] = "&" + morse["---..." ] = ":" + morse["-.-.-." ] = ";" + morse["-...-" ] = "=" + morse[".-.-." ] = "+" + morse["-....-" ] = "-" + morse["..--.-" ] = "_" + morse[".-..-." ] = "\"" + morse["...-..-"] = "$" + morse[".--.-." ] = "@" + morse[".-" ] = "a" + morse["-..." ] = "b" + morse["-.-." ] = "c" + morse["-.." ] = "d" + morse["." ] = "e" + morse["..-." ] = "f" + morse["--." ] = "g" + morse["...." ] = "h" + morse[".." ] = "i" + morse[".---" ] = "j" + morse["-.-" ] = "k" + morse[".-.." ] = "l" + morse["--" ] = "m" + morse["-." ] = "n" + morse["---" ] = "o" + morse[".--." ] = "p" + morse["--.-" ] = "q" + morse[".-." ] = "r" + morse["..." ] = "s" + morse["-" ] = "t" + morse["..-" ] = "u" + morse["...-" ] = "v" + morse[".--" ] = "w" + morse["-..-" ] = "x" + morse["-.--" ] = "y" + morse["--.." ] = "z" + morse["-----" ] = "0" + morse[".----" ] = "1" + morse["..---" ] = "2" + morse["...--" ] = "3" + morse["....-" ] = "4" + morse["....." ] = "5" + morse["-...." ] = "6" + morse["--..." ] = "7" + morse["---.." ] = "8" + morse["----." ] = "9" +} + +/^\.morse/ { + gsub(/[^.\-\/]/, " ") + _str = "" + for (i=2; i<=NF; i++) + if ($i in morse) + _str = _str morse[$i] + if (_str) + reply(_str) + else + reply("hush it, you pile of bologna") +} + # Noise -FROM ~ OWNER && /^go go gadget woop/ { +AUTH == OWNER && /^go go gadget woop/ { for (i=20; i>0; i--) say(".delay " i " seconds; .woop " i) } +function woop(msg) { + gsub(/[^Oo]/, "", $1) + _len = length($1) + if (_len == 2) + _len = 10 + if ($2) + _len = $2 + _woop = msg + for (i=1; i<_len; i++) + _woop = _woop " " msg + say(_woop) +} + +TO == NICK && /^[Ww][Oo]+[Pp] *([0-9]*)/ { + woop("WOOP") +} + +/^~WOOP *([0-9]*)/ { + woop("(00/") +} + +/^~woop *([0-9]*)/ { + woop("^H^P^P^O") +} + TO == NICK && DST ~ /^#/ { #say("Hello, " FROM) } +/^\.nestroyeti/ { + say(sprintf("Temperature: %4.1f F Humidity: %2d%%", + rand()*20+65, rand()*20+40)) +} + +#DST != "#sfvlug" && !(FROM in bots) && +CMD == "PRIVMSG" && MSG !~ /^\./ && /awk/ { say("Awk, awk, awk! I'm a bird!") } -/^\.help/ { - reply("Nothing can help you now..") +/(\<[Hh][Oo]\>.*){3}/ { + say("\00309Merry \00304Christmas!") } -/Ho.*Ho.*Ho/ { - say("\00309Merry \00304Christmas!") +!(FROM in bots) && +tolower($0) ~ /\/ { + _cmd = "shuf clouds.txt" + _cmd | getline _cloud + close(_cmd) + say(_cloud) +} + +/^headshot [Cc]hristmas/ { + say(".load Christmas") + say(".jingle") + say(".unload Christmas") +} + +FROM == "rhnoise" && $2 == "slaps" && $3 == NICK { + say(".spin") +} + +/^[Aa]nd now[.,]/ { + say("And now..."); + say("THE LARCH"); +} + +/(for what|that for)\?$/ { + say("For great justice!"); +} + +/\/ { + _count = 0; + for (_i=1; _i<=length(user_scores); _i++) { + _user = user_scores[_i]["user"]; + _score = user_scores[_i]["score"]; + if (_user in USERS) continue + if (_score == 1) { say(_user "--"); _count++; } + if (_score == -1) { say(_user "++"); _count++; } + } + if (_count) { + delete user_scores; + say(".scores"); + } else { + say("looks like you're safe.. for now.."); + } +} + +# Vote relay +DST != "#rhnoise" && DST != NICK && +/\<[a-zA-Z0-9_]{3,16}(\+\+|--)/ { + say("#rhnoise", "(" DST ") " FROM ": " MSG); +} + +# Fun operators +function bang(a, b) { + if (a=="nan") return "nan"; + if (b=="nan") return "nan"; + if (a==b) return "nan"; + if (a==0) return "+0"; + if (b==0) return "-0"; + return 1/(1/a - 1/b); +} + +/^ *[+-]?[0-9]*\.?[0-9]+( *\? *[+-]?[0-9]*\.?[0-9]+)+ *$/ { + gsub(/?/, " "); + _num = $1+0; + for (_i=2; _i<=NF; _i++) + _num = bang(_num, $_i+0); + reply(_num); } +# Misc { fflush("") } # vim: ft=awk