]> Pileus Git - ~andy/rhawk/blob - rhawk
Add at daemon
[~andy/rhawk] / rhawk
1 #!awk -f
2
3 @include "irc.awk"
4 @include "json.awk"
5 @include "spades.awk"
6 @include "email.awk"
7 @include "remind.awk"
8 @include "sfvlug.awk"
9
10 # Initialization
11 BEGIN {
12         json_load("var/login.json",     login);
13         json_load("var/nounicode.json", nounicode);
14         json_load("var/nocolor.json",   nocolor);
15
16         OWNER = login["owner"];
17
18         connect(login["server"],  \
19                 login["nick"],    \
20                 login["channel"], \
21                 login["auth"],    \
22                 login["pass"])
23
24         delete login
25
26         if (FIRST) {
27                 join("#rhtest")
28                 join("#rhspades")
29                 join("#sfvlug")
30         }
31 }
32
33 # Admin
34 AUTH == OWNER && TO == NICK && /^die in a fire/ {
35         say("Ack, argh, barasdjf..")
36         quit()
37 }
38
39 AUTH == OWNER && TO == NICK && /^reload/ {
40         say("Reloading..")
41         reload()
42 }
43
44 AUTH == OWNER && TO == NICK && /^rejoin/ {
45         reply("joining..")
46         join("#rhnoise")
47         next
48 }
49
50 AUTH == OWNER && TO == NICK && /^(join|part)/ {
51         if (match(MSG, /(join|part) +(#+\w+)/, arr)) {
52                 if (arr[1] == "join") join(arr[2]);
53                 if (arr[1] == "part") part(arr[2]);
54                 next
55         }
56 }
57
58 AUTH == OWNER && TO == NICK && /^\.msg/ {
59         match(MSG, /.*\.msg +(#*\w+) +(.*)/, arr)
60         send("PRIVMSG " arr[1] " :" arr[2])
61 }
62
63 # Kick handling
64 CMD == "KICK" && ARG[2] == NICK {
65         kick_delay = (kick_delay + 2) * 2
66         system("sleep " kick_delay)
67         join(DST)
68         reply("I feel happy!")
69 }
70
71 # Identify bots
72 FROM ~ /bo+t$|rhnoise/ {
73         bots[FROM] = 1
74 }
75
76 CMD == "NICK" && FROM in bots {
77         bots[MSG] = FROM
78 }
79
80
81 # Fancy output
82 /[Uu]nicode :-?\(/ {
83         nounicode[FROM] = 1
84         json_save("var/nounicode.json", nounicode);
85 }
86
87 /[Uu]nicode :-?\)/ {
88         delete nounicode[FROM]
89         json_save("var/nounicode.json", nounicode);
90 }
91
92 /[Cc]olors :-?\(/ {
93         nocolor[FROM] = 1
94         json_save("var/nocolor.json", nocolor);
95 }
96
97 /[Cc]olors :-?\)/ {
98         delete nocolor[FROM]
99         json_save("var/nocolor.json", nocolor);
100 }
101
102 # Versin/Uptime
103 function head(cmd, var) {
104         cmd | getline var
105         close(cmd)
106         return var
107 }
108 function uptime(time,  fmt) {
109         fmt = "%d:%02d:%02d:%02d"
110         fmt = "%d days %02d:%02d:%02d"
111         return sprintf(fmt,
112                 time / (60*60*24),
113                 time / (60*60   ) % 24,
114                 time / (60      ) % 60,
115                 time / (1       ) % 60)
116 }
117 BEGIN {
118         up_version = head("git describe --always")
119         up_dirty   = head("git describe --always --dirty")
120         up_author  = head("git log -n1 --format=format:%an")
121         up_message = head("git log -n1 --format=format:%s")
122         up_reload  = systime();
123 }
124 /^\.(version|rev)/ {
125         say("version: " up_dirty " - " up_author " - " up_message)
126         say("http://pileus.org/git/?p=~andy/rhawk;h=" up_version)
127 }
128 /^\.uptime/ {
129         _now = systime();
130         say("uptime: " uptime(_now - START) ", " \
131             "reload: " uptime(_now - up_reload))
132 }
133
134 # Auth info
135 /^\.auth/ {
136         _who = $2 ? $2 : FROM
137         if (_who in USERS)
138                 say("nick=" USERS[_who]["nick"] " " \
139                     "user=" USERS[_who]["user"] " " \
140                     "auth=" USERS[_who]["auth"] " " \
141                     "real=" USERS[_who]["real"] " " \
142                     "host=" USERS[_who]["host"])
143         else
144                 say("no auth info for " _who)
145 }
146
147 # GeoIP Lookup
148 function geoip(ip,  dat, cmd, line, parts) {
149         dat = "/usr/share/GeoIP/GeoIPCity.dat"
150
151         cmd = "geoiplookup -f " dat " " ip
152         cmd | getline line
153         close(cmd)
154
155         if (split(line, parts, /[:,] /) >= 9)
156                 return parts[8] ","  parts[9] " -- " \
157                        parts[6] ", " parts[4] ", " parts[3]
158         else
159                 return "not found"
160 }
161
162 /^\.geoip (([0-9a-zA-Z_.-]+) *)*$/ {
163         for (_i=2; _i<=NF; _i++) {
164                 if ($_i in USERS)
165                         say(geoip(USERS[$_i]["host"]) " -- " \
166                             $_i " -> " USERS[$_i]["host"])
167                 else
168                         say(geoip($_i) " -- " $_i)
169         }
170 }
171
172 # Fortune
173 TO == NICK && /^/               { extra = ""   }
174 TO == NICK && /^\.?fortune.*-o/ { extra = "-o" }
175 TO == NICK && /^\.?fortune/     {
176         gsub(/.*\.?fortune *|-[a-z]* *|[^a-zA-Z0-9 ]/, "", MSG)
177         cmd = "fortune " extra " " (MSG ? "-m '" MSG "'" : "-s")
178         _lines = 0
179         while (cmd | getline _fortune && _lines < 5) {
180                 say(_fortune)
181                 _lines++
182         }
183         close(cmd)
184         next
185 }
186
187 /\<[Bb][Oo][Ff][Hh]\>/ {
188         _cmd = "fortune bofh-excuses"
189         _cmd | getline _fortune
190         _cmd | getline _fortune
191         _cmd | getline _fortune
192         close(_cmd)
193         say(_fortune)
194         next
195 }
196
197 # Morse code
198 BEGIN {
199         morse["/"      ] = " "
200         morse[".-.-.-" ] = "."
201         morse["--..--" ] = ","
202         morse["..--.." ] = "?"
203         morse[".----." ] = "'"
204         morse["-.-.--" ] = "!"
205         morse["-..-."  ] = "/"
206         morse["-.--."  ] = "("
207         morse["-.--.-" ] = ")"
208         morse[".-..."  ] = "&"
209         morse["---..." ] = ":"
210         morse["-.-.-." ] = ";"
211         morse["-...-"  ] = "="
212         morse[".-.-."  ] = "+"
213         morse["-....-" ] = "-"
214         morse["..--.-" ] = "_"
215         morse[".-..-." ] = "\""
216         morse["...-..-"] = "$"
217         morse[".--.-." ] = "@"
218         morse[".-"     ] = "a"
219         morse["-..."   ] = "b"
220         morse["-.-."   ] = "c"
221         morse["-.."    ] = "d"
222         morse["."      ] = "e"
223         morse["..-."   ] = "f"
224         morse["--."    ] = "g"
225         morse["...."   ] = "h"
226         morse[".."     ] = "i"
227         morse[".---"   ] = "j"
228         morse["-.-"    ] = "k"
229         morse[".-.."   ] = "l"
230         morse["--"     ] = "m"
231         morse["-."     ] = "n"
232         morse["---"    ] = "o"
233         morse[".--."   ] = "p"
234         morse["--.-"   ] = "q"
235         morse[".-."    ] = "r"
236         morse["..."    ] = "s"
237         morse["-"      ] = "t"
238         morse["..-"    ] = "u"
239         morse["...-"   ] = "v"
240         morse[".--"    ] = "w"
241         morse["-..-"   ] = "x"
242         morse["-.--"   ] = "y"
243         morse["--.."   ] = "z"
244         morse["-----"  ] = "0"
245         morse[".----"  ] = "1"
246         morse["..---"  ] = "2"
247         morse["...--"  ] = "3"
248         morse["....-"  ] = "4"
249         morse["....."  ] = "5"
250         morse["-...."  ] = "6"
251         morse["--..."  ] = "7"
252         morse["---.."  ] = "8"
253         morse["----."  ] = "9"
254 }
255
256 /^\.morse/ {
257         gsub(/[^.\-\/]/, " ")
258         _str = ""
259         for (i=2; i<=NF; i++)
260                 if ($i in morse)
261                         _str = _str morse[$i]
262         if (_str)
263                 reply(_str)
264         else
265                 reply("hush it, you pile of bologna")
266 }
267
268 # Noise
269 AUTH == OWNER && /^go go gadget woop/ {
270         for (i=20; i>0; i--)
271                 say(".delay " i " seconds; .woop " i)
272 }
273
274 function woop(msg) {
275         gsub(/[^Oo]/, "", $1)
276         _len = length($1)
277         if (_len == 2)
278                 _len = 10
279         if ($2)
280                 _len = $2
281         _woop = msg
282         for (i=1; i<_len; i++)
283                 _woop = _woop " " msg
284         say(_woop)
285 }
286
287 TO == NICK && /^[Ww][Oo]+[Pp] *([0-9]*)/ {
288         woop("WOOP")
289 }
290
291 /^~WOOP *([0-9]*)/ {
292         woop("(00/")
293 }
294
295 /^~woop *([0-9]*)/ {
296         woop("^H^P^P^O")
297 }
298
299 TO == NICK && DST ~ /^#/ {
300         #say("Hello, " FROM)
301 }
302
303 /^\.nestroyeti/ {
304         say(sprintf("Temperature: %4.1f F Humidity: %2d%%",
305                 rand()*20+65, rand()*20+40))
306 }
307
308 #DST != "#sfvlug" &&
309 !(FROM in bots) &&
310 CMD == "PRIVMSG" &&
311 MSG !~ /^\./ &&
312 /awk/ {
313         say("Awk, awk, awk! I'm a bird!")
314 }
315
316 /(\<[Hh][Oo]\>.*){3}/ {
317         say("\00309Merry \00304Christmas!")
318 }
319
320 !(FROM in bots) &&
321 tolower($0) ~ /\<cloud\>/ {
322         _cmd = "shuf clouds.txt"
323         _cmd | getline _cloud
324         close(_cmd)
325         say(_cloud)
326 }
327
328 /^headshot [Cc]hristmas/ {
329         say(".load Christmas")
330         say(".jingle")
331         say(".unload Christmas")
332 }
333
334 FROM == "rhnoise" && $2 == "slaps" && $3 == NICK {
335         say(".spin")
336 }
337
338 /^[Aa]nd now[.,]/ {
339         say("And now...");
340         say("THE LARCH");
341 }
342
343 /(for what|that for)\?$/ {
344         say("For great justice!");
345 }
346
347 /\<nazi/ {
348         say("And now it's...");
349         say("Springtime for Hitler and Germany!");
350 }
351
352 /^.drank mauchter/ {
353         if (!drank) {
354                 system("sleep " 2)
355                 say("\x02MD 20/20\x0f - \x02Morgen David\x0f - \x02Under an overpass\x0f - ***** (3 minutes ago)");
356         }
357         drank=1
358 }
359
360 # God damn commands
361 FROM == "rhnoise" && load_mod {
362         say(".load " load_mod)
363         say("rhnoise: You slag!")
364 }
365 // {
366         load_mod = ""
367 }
368 (TO  ==  "rhnoise" && /^load \w+/) ||
369 (DST == "#rhniose" && /^\.load [a-z]\w+/) {
370         gsub(/[^a-zA-Z0-9_]/, " ")
371         load_mod = toupper(substr($2,1,1)) substr($2,2);
372 }
373
374 (DST == "#rhnoise" && /^\.line /) {
375         sub(/\./, "!");
376         say($0);
377         say("scalawag: You slag!")
378 }
379
380 (DST == "#rhnoise" && /^\.qdb 268$/) {
381         say(".diediedie");
382         next
383 }
384 (DST == "#rhnoise" && /\.qdb *268/) {
385         say(".slap " FROM);
386         next
387 }
388
389 # Decrementer
390 BEGIN {
391         user_scores[0] = 1;
392         delete user_scores
393 }
394
395 /^\.(scores|scoreboard)$/ {
396         delete user_scores
397 }
398
399 FROM == "rhnoise" && !length(user_scores) {
400         if (split(MSG, _parts, /, /)) {
401                 for (_i=1; _i<=length(_parts); _i++) {
402                         split(_parts[_i], _tmp, ": ");
403                         user_scores[_i]["user"]  = _tmp[1];
404                         user_scores[_i]["score"] = _tmp[2];
405                 }
406         }
407 }
408
409 length(user_scores) &&
410 tolower($0) ~ /\<nuclear launch detected\>/ {
411         _count = 0;
412         for (_i=1; _i<=length(user_scores); _i++) {
413                 _user  = user_scores[_i]["user"];
414                 _score = user_scores[_i]["score"];
415                 if (_user in USERS) continue
416                 if (_score ==  1) { say(_user "--"); _count++; }
417                 if (_score == -1) { say(_user "++"); _count++; }
418         }
419         if (_count) {
420                 delete user_scores;
421                 say(".scores");
422         } else {
423                 say("looks like you're safe.. for now..");
424         }
425 }
426
427 # Vote relay
428 DST != "#rhnoise" && DST != NICK &&
429 /\<[a-zA-Z0-9_]{3,16}(\+\+|--)/ {
430         say("#rhnoise", "(" DST ") " FROM ": " MSG);
431 }
432
433 # Fun operators
434 function bang(a, b) {
435         if (a=="nan") return "nan";
436         if (b=="nan") return "nan";
437         if (a==b)     return "nan";
438         if (a==0)     return "+0";
439         if (b==0)     return "-0";
440         return 1/(1/a - 1/b);
441 }
442
443 /^ *[+-]?[0-9]*\.?[0-9]+( *\? *[+-]?[0-9]*\.?[0-9]+)+ *$/ {
444         gsub(/?/, " ");
445         _num = $1+0;
446         for (_i=2; _i<=NF; _i++)
447                 _num = bang(_num, $_i+0);
448         reply(_num);
449 }
450
451 # Misc
452 { fflush("") }
453
454 # vim: ft=awk