]> Pileus Git - ~andy/rhawk/blob - rhawk
Add morse code function
[~andy/rhawk] / rhawk
1 #!awk -f
2
3 @include "irc.awk"
4 @include "json.awk"
5 @include "spades.awk"
6 #@include "email.awk"
7
8 # Initialization
9 BEGIN {
10         json_load("var/login.json", login);
11         json_load("var/plain.json", plain);
12
13         OWNER = login["owner"];
14
15         connect(login["server"],  \
16                 login["nick"],    \
17                 login["channel"], \
18                 login["auth"],    \
19                 login["pass"])
20
21         delete login
22
23         if (FIRST) {
24                 join("#rhnoise")
25                 join("#rhspades")
26                 join("#sfvlug")
27         }
28 }
29
30 # Admin
31 AUTH == OWNER && TO == NICK && /^die in a fire/ {
32         say("Ack, argh, barasdjf..")
33         quit()
34 }
35
36 AUTH == OWNER && TO == NICK && /^reload/ {
37         say("Reloading..")
38         reload()
39 }
40
41 AUTH == OWNER && TO == NICK && /^rejoin/ {
42         reply("joining..")
43         join("#rhnoise")
44         next
45 }
46
47 AUTH == OWNER && TO == NICK && /^(join|part)/ {
48         if (match(MSG, /(join|part) +(#+\w+)/, arr)) {
49                 if (arr[1] == "join") join(arr[2]);
50                 if (arr[1] == "part") part(arr[2]);
51                 next
52         }
53 }
54
55 AUTH == OWNER && TO == NICK && /^\.msg/ {
56         match(MSG, /.*\.msg +(#*\w+) +(.*)/, arr)
57         send("PRIVMSG " arr[1] " :" arr[2])
58 }
59
60 # Kick handling
61 CMD == "KICK" && ARG[2] == NICK {
62         kick_delay = (kick_delay + 2) * 2
63         system("sleep " kick_delay)
64         join(DST)
65         reply("I feel happy!")
66 }
67
68 # Identify bots
69 FROM ~ /bo+t$|rhnoise/ {
70         bots[FROM] = 1
71 }
72
73 CMD == "NICK" && FROM in bots {
74         bots[MSG] = FROM
75 }
76
77
78 # Unicode
79 /[Uu]nicode :-?\(/ {
80         plain[FROM] = 1
81         json_save("var/plain.json", plain);
82 }
83
84 /[Uu]nicode :-?\)/ {
85         delete plain[FROM]
86         json_save("var/plain.json", plain);
87 }
88
89 # SFV Lug
90 function email(to, from, subj, body, sendmail)
91 {
92         from     = NICK "<andy@pileus.org>"
93         subj     = "Update sfvlug.org!"
94         body     = "The next SFVLUG meeting is TBA!"
95         sendmail = "/usr/sbin/sendmail '" to "'"
96         print "To: " to        | sendmail
97         print "From: " from    | sendmail
98         print "Subject: " subj | sendmail
99         print ""               | sendmail
100         print body             | sendmail
101         say("Topic out of date, emailing " to);
102         close(sendmail)
103 }
104
105 BEGIN { pollchan = "#sfvlug" }
106 (CMD == "PING"    && systime()-lastpoll > 60*60*24) ||
107 (CMD == "PRIVMSG" && /^\.poll/) {
108         if (!TOPICS[pollchan]) {
109                 debug("Unknown topic for " pollchan);
110                 send("TOPIC " pollchan)
111                 next
112         }
113         _curl     = "curl -s http://sfvlug.org/"
114         _day      = "(Sun|Mon|Tue|Wed|Thu|Fri|Sat)"
115         _web_tba  = "next meeting is: TBA"
116         _web_ptrn = "next meeting.*" _day "\\w+[, ]+([A-Z]\\w+) +([0-9]+)[, ]+([0-9]+)"
117         _irc_ptrn = _day "\\w*[, ]+([A-Z]\\w+) +([0-9]+)"
118         while (_curl | getline _line) {
119                 #if (match(_line, _web_tba))
120                 #       email("Brian <brian@zimage.com>");
121                 if (match(_line, _web_ptrn, _parts)) {
122                         _date  = _parts[1] " " _parts[2] " " _parts[3]
123                         _topic = TOPICS[pollchan]
124                         sub(_irc_ptrn, _date, _topic)
125                         if (_topic != TOPICS[pollchan])
126                                 topic(pollchan, TOPICS[pollchan] = _topic)
127                         else
128                                 debug("topic is already correct")
129                         break
130                 }
131         }
132         lastpoll = systime()
133         close(_curl)
134 }
135
136 # Versin/Uptime
137 function uptime(time,  fmt) {
138         fmt = "%d:%02d:%02d:%02d"
139         fmt = "%d days %02d:%02d:%02d"
140         return sprintf(fmt,
141                 time / (60*60*24),
142                 time / (60*60   ) % 24,
143                 time / (60      ) % 60,
144                 time / (1       ) % 60)
145 }
146 BEGIN {
147         _cmd = "git describe --always --dirty";
148         _cmd | getline up_version;
149         close(_cmd);
150         up_reload = systime();
151 }
152 /^\.version/ {
153         say("version: " up_version)
154 }
155 /^\.uptime/ {
156         _now = systime();
157         say("uptime: " uptime(_now - START) ", " \
158             "reload: " uptime(_now - up_reload))
159 }
160
161 # Auth info
162 /^\.auth/ {
163         _who = $2 ? $2 : FROM
164         if (_who in USERS)
165                 say("nick=" USERS[_who]["nick"] " " \
166                     "user=" USERS[_who]["user"] " " \
167                     "auth=" USERS[_who]["auth"] " " \
168                     "real=" USERS[_who]["real"] " " \
169                     "host=" USERS[_who]["host"])
170         else
171                 say("no auth info for " _who)
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 # Morse code
190 BEGIN {
191         morse["/"      ] = " "
192         morse[".-.-.-" ] = "."
193         morse["--..--" ] = ","
194         morse["..--.." ] = "?"
195         morse[".----." ] = "'"
196         morse["-.-.--" ] = "!"
197         morse["-..-."  ] = "/"
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[".-"     ] = "a"
211         morse["-..."   ] = "b"
212         morse["-.-."   ] = "c"
213         morse["-.."    ] = "d"
214         morse["."      ] = "e"
215         morse["..-."   ] = "f"
216         morse["--."    ] = "g"
217         morse["...."   ] = "h"
218         morse[".."     ] = "i"
219         morse[".---"   ] = "j"
220         morse["-.-"    ] = "k"
221         morse[".-.."   ] = "l"
222         morse["--"     ] = "m"
223         morse["-."     ] = "n"
224         morse["---"    ] = "o"
225         morse[".--."   ] = "p"
226         morse["--.-"   ] = "q"
227         morse[".-."    ] = "r"
228         morse["..."    ] = "s"
229         morse["-"      ] = "t"
230         morse["..-"    ] = "u"
231         morse["...-"   ] = "v"
232         morse[".--"    ] = "w"
233         morse["-..-"   ] = "x"
234         morse["-.--"   ] = "y"
235         morse["--.."   ] = "z"
236         morse["-----"  ] = "0"
237         morse[".----"  ] = "1"
238         morse["..---"  ] = "2"
239         morse["...--"  ] = "3"
240         morse["....-"  ] = "4"
241         morse["....."  ] = "5"
242         morse["-...."  ] = "6"
243         morse["--..."  ] = "7"
244         morse["---.."  ] = "8"
245         morse["----."  ] = "9"
246 }
247
248 /^\.morse/ {
249         gsub(/[^.\-\/]/, " ")
250         _str = ""
251         for (i=2; i<=NF; i++)
252                 if ($i in morse)
253                         _str = _str morse[$i]
254         if (_str)
255                 reply(_str)
256         else
257                 reply("hush it, you pile of bologna")
258 }
259
260 # Noise
261 AUTH == OWNER && /^go go gadget woop/ {
262         for (i=20; i>0; i--)
263                 say(".delay " i " seconds; .woop " i)
264 }
265
266 function woop(msg) {
267         gsub(/[^Oo]/, "", $1)
268         _len = length($1)
269         if (_len == 2)
270                 _len = 10
271         if ($2)
272                 _len = $2
273         _woop = msg
274         for (i=1; i<_len; i++)
275                 _woop = _woop " " msg
276         say(_woop)
277 }
278
279 TO == NICK && /^[Ww][Oo]+[Pp] *([0-9]*)/ {
280         woop("WOOP")
281 }
282
283 /^~WOOP *([0-9]*)/ {
284         woop("(00/")
285 }
286
287 /^~woop *([0-9]*)/ {
288         woop("^H^P^P^O")
289 }
290
291 TO == NICK && DST ~ /^#/ {
292         #say("Hello, " FROM)
293 }
294
295 #DST != "#sfvlug" &&
296 !(FROM in bots) &&
297 CMD == "PRIVMSG" &&
298 MSG !~ /^\./ &&
299 /awk/ {
300         say("Awk, awk, awk! I'm a bird!")
301 }
302
303 !(FROM in bots) &&
304 ((TO == NICK && /(help|halp)/) ||
305  /^[^.](help|halp)/) {
306         reply("Nothing can help you now..")
307 }
308
309 /(\<[Hh][Oo]\>.*){3}/ {
310         say("\00309Merry \00304Christmas!")
311 }
312
313 !(FROM in bots) &&
314 tolower($0) ~ /\<cloud\>/ {
315         _cmd = "shuf clouds.txt"
316         _cmd | getline _cloud
317         close(_cmd)
318         say(_cloud)
319 }
320
321 /^headshot [Cc]hristmas/ {
322         say(".load Christmas")
323         say(".jingle")
324         say(".unload Christmas")
325 }
326
327 FROM == "rhnoise" && $2 == "slaps" && $3 == NICK {
328         say(".spin")
329 }
330
331 /^[Aa]nd now[.,]/ {
332         say("And now...");
333         say("THE LARCH");
334 }
335
336 # God damn commands
337 FROM == "rhnoise" && load_mod {
338         say(".load " load_mod)
339         say("rhnoise: You slag!")
340 }
341 // {
342         load_mod = ""
343 }
344 (TO  ==  "rhnoise" && /^load \w+/) ||
345 (DST == "#rhniose" && /^\.load [a-z]\w+/) {
346         gsub(/[^a-zA-Z0-9_]/, " ")
347         load_mod = toupper(substr($2,1,1)) substr($2,2);
348 }
349
350 (DST == "#rhnoise" && /^\.line /) {
351         sub(/\./, "!");
352         say($0);
353         say("scalawag: You slag!")
354 }
355
356 (DST == "#rhnoise" && /^\.qdb 268$/) {
357         say(".diediedie");
358         next
359 }
360 (DST == "#rhnoise" && /\.qdb *268/) {
361         say(".slap " FROM);
362         next
363 }
364
365 # Decrementer
366 #BEGIN {
367 #       user_scores[0] = 1
368 #}
369 #
370 #FROM == "rhnoise" && !length(user_scores) {
371 #       if (split(MSG, _parts, /, /)) {
372 #               for (_i=1; _i<=length(_parts); _i++) {
373 #                       split(_parts[_i], _tmp, ": ");
374 #                       user_scores[_i]["user"]  = _tmp[1];
375 #                       user_scores[_i]["score"] = _tmp[2];
376 #               }
377 #       }
378 #}
379 #
380 #FROM == "rhnoise" && /^User Scores:$/ {
381 #       delete user_scores
382 #}
383 #
384 #AUTH == OWNER && length(user_scores) &&
385 #tolower($0) ~ /\<nuclear launch detected\>/ {
386 #       for (_i=1; _i<=length(user_scores); _i++)
387 #               say(user_scores[_i]["user"] "--");
388 #}
389
390 # Misc
391 { fflush("") }
392
393 # vim: ft=awk