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