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