initial commit (added files)
[hans.git] / hans
1 #!/usr/bin/env perl
2 # required debian packages: libproc-daemon-perl libio-socket-ssl-perl libnet-irc-perl libconfig-auto-perl libdbd-sqlite3-perl
3 # IMPORTANT: /usr/share/perl5/Net/IRC/Connection.pm line 842: s/read/sysread/
4 # TODO: Umlaute bei "people" gehen nicht
5 # !leave/join solle bei bilbo_b_ gehen (bilbo_b)
6
7 use warnings;
8 use strict;
9 use Config::Auto;
10 use DBI;
11 use English;
12 use Net::IRC;
13 #use Proc::Daemon;
14 use Data::Dumper;
15 use Encode;
16 use utf8;
17 binmode STDOUT, ':utf8';
18 use open ':encoding(UTF-8)';
19
20
21 $PROGRAM_NAME = 'hans';
22
23 my $config = Config::Auto::parse();
24 my $debug = $config->{debug} || 0;
25
26 autoflush STDOUT if ($debug);
27 #Proc::Daemon::Init() unless ($debug);
28
29 # OPEN IRC CONNECTION
30 my $irc = new Net::IRC;
31
32 my $conn = $irc->newconn(
33         Nick    => $config->{nick} || 'hans',
34         Server  => $config->{server} || 'irc.hackint.org',
35         Port    => $config->{port} || 9999,
36         SSL     => 1
37 ) or die;
38
39 # OPEN DATABASE CONNECTION
40 my $dbargs = { AutoCommit => 1, PrintError => 1, sqlite_unicode => 1 };
41 my $dbh = DBI->connect('dbi:SQLite:dbname=/home/hans/hans.db', '', '', $dbargs);
42
43 # INITIALIZE DATABASE WITH DEFAULTS (IF EMPTY)
44 $dbh->do("
45 CREATE TABLE IF NOT EXISTS data (
46   key       varchar(200) NOT NULL DEFAULT '',
47   value     mediumtext   NOT NULL DEFAULT '',
48   PRIMARY KEY (key)
49 )
50 ");
51
52 $dbh->do("INSERT OR IGNORE INTO data (key, value) VALUES ('keys', '?\n?\n?');");
53 $dbh->do("INSERT OR IGNORE INTO data (key, value) VALUES ('hq', 'closed');");
54 $dbh->do("INSERT OR IGNORE INTO data (key, value) VALUES ('people', '');");
55 # END INITIALIZE
56
57
58
59 # STORAGE FUNCTIONS
60 sub store_get_value {
61         my $key = shift;
62         my $row = $dbh->selectrow_arrayref("SELECT value FROM data WHERE key='$key';");
63         my ($value) = @$row;
64         return $value;
65 }
66
67 sub store_get_array {
68         my $value = store_get_value(@_);
69         return split(/\n/, $value);
70 }
71
72 sub store_set_value {
73         my ($key, $value) = @_;
74         my $sth = $dbh->prepare('UPDATE data SET value = ? WHERE key = ?');
75         $sth->execute($value, $key); 
76 }
77
78 sub store_set_array {
79         my $key = shift;
80         my @values = @_;
81         my $sth = $dbh->prepare("UPDATE data SET value = ? WHERE key = '$key'");
82         store_set_value($key, join("\n", @values)); 
83 }
84
85 sub store_add_to_array {
86         my $key = shift;
87         my @values = @_;
88         my @oldvalues = store_get_array($key);
89         @values = array_unique(@oldvalues, @values);
90         store_set_array($key, @values); 
91 }
92
93 sub store_remove_from_array {
94         my $key = shift;
95         my @values = @_;
96         my @oldvalues = store_get_array($key);
97         # filter array
98         my %h; undef @h{@values};
99         @values = grep !exists $h{$_}, @oldvalues;
100         store_set_array($key, @values); 
101 }
102
103
104 # STORAGE FUNCTIONS
105
106 sub array_unique {
107         my %all = ();
108         @all{@_} = 1;
109         return (keys %all);
110 }
111
112
113
114
115 sub filter_nickname {
116         my $nickname = shift;
117         $nickname = 'balu'         if ($nickname =~ /^b[a]+[h]*lu$/i || $nickname =~ /^bär$/i);
118         $nickname = 'telegnom'     if ($nickname =~ /^gnom$/i        || $nickname =~ /^gnömchen$/i);
119         $nickname = 'salgar'       if ($nickname =~ /^elfe$/i        || $nickname =~ /^elf$/i);
120         $nickname = 'evilyves'     if ($nickname =~ /^press$/i       || $nickname =~ /^mr.press$/i   || $nickname =~ /^yves$/i);
121         $nickname = 'schMA'        if ($nickname =~ /^schma$/i);
122         $nickname = 'mrm2m'        if ($nickname =~ /^mrmcd$/i);
123         $nickname = 'bilbo_b'      if ($nickname =~ /^hobbit$/i      || $nickname =~ /^bilbo$/i      || $nickname =~ /^halbling$/i);
124         $nickname = 'dachdecker2'  if ($nickname =~ /^dd[2]{0,1}$/i  || $nickname =~ /^dachdecker$/i);
125         $nickname = 'neuernick'    if ($nickname =~ /^volki$/i);
126         $nickname = 'bongo'        if ($nickname =~ /^b[o0]{1,1}ng[o0]{1,1}$/i);
127         return $nickname;
128 }
129 sub filter_nicknames {
130         my @nicknames = @_;
131         for my $i (0 .. $#nicknames) {
132                 $nicknames[$i] = filter_nickname($nicknames[$i]);
133         }
134         return @nicknames;
135 }
136
137 sub hq_change_key {
138         my ($old, $new) = @_;
139         my $old2 = filter_nickname($old);
140         $new = filter_nickname($new);
141
142         my @keys = store_get_array('keys');
143         for my $i (0 .. $#keys) {
144                 if ($keys[$i] eq $old) {
145                         $keys[$i] = $new;
146                         last;
147                 }
148                 if ($keys[$i] eq $old2) {
149                         $keys[$i] = $new;
150                         last;
151                 }
152         }
153         store_set_array('keys', @keys);
154 }
155
156 sub query_help {
157         my ($conn, $nick, $all) = @_;
158         $conn->privmsg($nick, '!key nick1 nick2     - Schlüssel von nick1 an nick2 übergeben');
159         $conn->privmsg($nick, '!keys                - Schlüsselbesitzer anzeigen');
160         $conn->privmsg($nick, '!close               - HQ auf geschloßen setzen (und alle Leute rausschmeißen)');
161         $conn->privmsg($nick, '!open [nick1 nick2]  - HQ auf geöffnet setzen');
162         $conn->privmsg($nick, '!join [nick1 nick2]  - HQ betreten (und öffnen falls geschloßen)');
163         $conn->privmsg($nick, '!leave [nick1 nick2] - HQ verlassen (alias: !part)');
164         if ($all) {
165                 $conn->privmsg($nick, '/![b]+[a]+[h]*[l]+[u]+/i, !press, !raspel, !darkwingduck');
166         }
167 }
168
169 sub hq_set_topic {
170         my $conn = shift;
171         my $people = join(', ', store_get_array('people'));
172         $people .= ' - ' if ($people ne '');
173         $conn->topic('#ccc-ffm-intern', sprintf('HQ %s - %sKeys: %s', store_get_value('hq'), $people, join(', ', store_get_array('keys'))));
174 }
175
176
177 sub on_connect {
178         my $conn = shift;
179         my $password = $config->{password} || 'geheim';
180         print "Connected. Identifying...\n" if ($debug);
181         $conn->privmsg('nickserv', "identify $password");
182 }
183
184 sub on_disconnect {
185         my ($conn, $event) = @_;
186         #$conn->connect();
187         die();
188 }
189
190 sub on_kick {
191         my ($conn, $event) = @_;
192         my ($user) = ($event->to);
193         my ($channel) = ($event->args);
194         return if ($channel eq '#ccc-ffm');
195         $conn->privmsg($user, "Hallo, der Channel $channel kann nur betreten werden, wenn man auf der Access-Liste steht und eingeloggt ist. Falls du auf der Access-Liste stehst, logge dich bitte ein und versuche es erneut.");
196 }
197
198 sub on_mode {
199         my ($conn, $event) = @_;
200         my ($arg1, $arg2, $arg3) = ($event->args);
201         if ($arg1 eq '+b' && defined($arg2)) {
202                 my ($channel) = ($event->to);
203                 return if ($channel eq '#ccc-ffm');
204                 $conn->mode($channel, '-b', $arg2);
205                 return;
206         }
207         print Dumper($event), "\n" if ($debug);
208 }
209
210 sub on_notice {
211         my ($conn, $event) = @_;
212         my ($arg) = ($event->args);
213         if ($event->nick =~ /^NickServ$/i && $arg =~ /You are now identified for /i) {
214                 print "Identified...\n" if ($debug);
215                 $conn->join('#ccc-ffm-intern');
216                 $conn->join('#ccc-ffm-vorstand');
217                 $conn->join('#ccc-ffm');
218                 return;
219         }
220         print Dumper($event), "\n" if ($debug);
221 }
222
223 sub on_public {
224         my ($conn, $event) = @_;
225         my ($arg) = ($event->args);
226         my ($to) = ($event->to);
227
228         $arg = decode('UTF-8', $arg);
229
230         if ($arg =~ /^!raspel/i) {
231                 $conn->privmsg($to, 'http://www.picpaste.de/-2.jpg');
232                 return;
233         }
234         if ($arg =~ /!press/i) {
235                 $conn->privmsg($to, 'http://www.picpaste.de/press.jpg');
236                 return;
237         }
238         if ($arg =~ /^![b]+[a]+[h]*[l]+[u]+/i) {
239                 my @lines = (
240                         'Hahahahaha - Balu! Bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm! Und seine Crew! Bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm!',
241                         'O-i-e - Balu! O-i-o - Balu! Freunde sein durch dick und dünn - Balu und seine Crew!',
242                         'O-i-e - Balu!  O-i-o - Balu!  Vogelfrei ein Phänomen - Balu und seine Crew!',
243                         'Bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm bumm!  ...unser Käpt\'n, Freunde!  O-i-e, o-i-e, o-i-o, o-i-o...',
244                         'O-i-e, o-i-e, o-i-o, o-i-o... Sie fliegen um zu siegen, fliegen Fracht und fliegen Ziegen, fliegen bis die Fetzen fliegen, sie sind Sieger wenn sie fliegen! Hahahaha... Unser Käpt\'n Balu'
245                 );
246                 
247                 $conn->privmsg($to, $lines[rand @lines]);
248                 return;
249         }
250
251         if ($arg =~ /^!darkwingduck/i) {
252                 my $start = 'Ich bin der Schrecken der die Nacht durchflattert, ... ';
253                 my $end   = ' ... Ich bin Darkwing Duck!';
254                 my @lines = (
255                         'ich bin der Einkaufswagen, der euch den Autolack zerkratzt.',
256                         'ich bin das Abschlusszeugnis, in dem du eine "Sechs" hast.',
257                         'ich bin das Fast Food, dass nachts zurückkehrt, um bei dir zu spuken.',
258                         'ich bin der Wasserballon, der direkt auf deinem Kopf zerplatzt.',
259                         'ich bin die unvorhersehbare Wendung in einem Film.',
260                         'ich bin der Floh, den du nicht erschlagen kannst.',
261                         'ich bin die 10 Dollar Gebühr, die du für einen geplatzten Scheck bezahlen musst.',
262                         'ich bin der eingewachsene Zehenagel im Fuße des Verbrechens.',
263                         'ich bin das Collisterin, dass dir deine Aterien verstopft.',
264                         'ich bin die Motte, die in dein Verandalicht fliegt.',
265                         'ich bin der Spinat, der zwischen deinen Zähnen hängenbleibt.',
266                         'ich bin die Nacktschnecke, die deine Begonien einschleimt.',
267                         'ich bin der Held, den jede Kultur in aller Welt benötigt.',
268                         'ich bin die Weiche, die deinen Zug zum Entgleisen bringt.',
269                         'ich bin der Gefängniswärter, der deinen Zellenschlüssel wegwirft.',
270                         'ich bin die Überraschung in deiner Kelloggs-Packung.',
271                         'ich bin der kalte Schauer, der dir den Rücken herunterläuft.',
272                         'ich bin der Kaugummi, der dir unter dem Schuh kleben bleibt.',
273                         'ich bin der Fleck, den du nicht wegwischen kannst.',
274                         'ich bin die Batterie, die im Preis nicht inbegriffen ist.',
275                         'ich bin der Scheck, der dein Konto überzieht.',
276                         'ich bin der Karrieremann, mit dem alle Frauen unbedingt ein Date wollen.',
277                         'ich bin der Hund, der deine Petunien ausbuddelt.',
278                         'ich bin der Schmutzstiefel, der über das Linolium des Verbrechens schreitet.',
279                         'ich bin die Katze, die jemand aus dem Sack gelassen hat.',
280                         'ich bin das Gold am Ende des Regenbogens.',
281                         'ich bin die Supernova im Mittelpunkt des Universums.',
282                         'ich bin das Scheuerpulver gegen kriminellen Grind.',
283                         'ich bin der Unkrautjäter im Garten des Bösen.',
284                         'ich bin die niedrige Einschaltquote, die deiner Sendung den Garaus macht.',
285                         'ich bin der Buchprüfer, der deine Finanzen durchleuchten wird.',
286                         'ich bin der Hauch einer Chance die du nicht hast.',
287                         'ich bin der Bullterrier, der am Knöchel des Verbrechens knabbert.',
288                         'ich bin der Virus, der deinen Computer zum Abstürzen bringt.',
289                         'ich bin das Adrealin, das dein Blut zum Kochen bringt.',
290                         'ich bin die akribische Pediküre am Fußpilz des Verbrechens.',
291                         'ich bin der Dosenöffner an der Sadinenbüchse der Gerechtigkeit.',
292                         'ich bin der eingewachsene Zehennagel in deinen zu engen Ausgehstiefeln.',
293                         'ich bin die Elster, die dir deinen Goldschmuck stibitzt.',
294                         'ich bin das fettige Fischstäbchen, das dir den Magen umstülpt.',
295                         'ich bin der Gärtner, der deine Hecken schief schnibbelt.',
296                         'ich bin das Haar auf dem Objektiv deiner Filmkamera.',
297                         'ich bin der Haarpfropf, der deinen Abfluß verstopft.',
298                         'ich bin die holländische Bedienungsanleitung zu deinem japanischen Videorecorder.',
299                         'ich bin die Kakerlake, die dir deine Nylonstrümpfe hochkrabbelt.',
300                         'ich bin der Kalk, der dir durchs Großhirn rieselt.',
301                         'ich bin die kleine Maus, die dir deinen Käse klaut.',
302                         'ich bin das Leck in eurem Atomkraftwerk.',
303                         'ich bin die Parkuhr, die abläuft, während du beim Einkaufen bist.',
304                         'ich bin der Plastikhubschrauber in deinem Überraschungsei.',
305                         'ich bin der Pyranja in deinem Zierfisch-Aquarium.',
306                         'ich bin der Radiergummi, der die Rechtschreibfehler des Verbrechens ausradiert.',
307                         'ich bin der Rollsplitt in deinem Schuh der Schande.',
308                         'ich bin der Rostfleck auf eurer Verbrechensrüstung.',
309                         'ich bin der Schakal, der eure Knochen abnagt.',
310                         'ich bin die Schreibmaschine, an der du dir die Fingernägel abbrichst.',
311                         'ich bin der Schuldirektor, der dir einen Verweiß erteilt.',
312                         'ich bin die Spinne, die dir ins Genick springt.',
313                         'ich bin der Taxometer an der Droschke der Gerechtigkeit.',
314                         'ich bin die Termite in deinem Holzbein.',
315                         'ich bin die Wespe auf deinem Marmeladenbrot.',
316                         'ich bin der Wackelkontakt an deiner Lieblingsgitarre.',
317                         'ich bin die Tube Kobaltblau, deren Verschluß eingetrocknet ist.',
318                         'ich bin das Zahlenschloss am Tresor der Gerechtigkeit.',
319                         'ich bin die Stelle auf deinem Rücken, die du nicht kratzen kannst.',
320                         'ich bin das Motorrad, daß die Kanalisation durchknattert. ',
321                         'ich bin der Kratzer auf deiner teflonbeschichteten Bratpfanne.',
322                         'ich bin der Zuschlag, der Deinen Fahrpreis verdreifacht. ',
323                         'ich bin der Sonnenbrand, der dich aussehen lässt, wie ein Dutzent roter Ostereier.',
324                         'ich bin die Migräne, die in deinem Verbrecherschädel tobt. ',
325                         'ich bin der wassergefüllte Luftballon, der auf deinem Kopf zerplatzt.',
326                         'ich bin der Held, der jede Jogurtkultur zum Leben erweckt.',
327                         'ich bin das Schicksal, dass dich unerwartet trifft.',
328                         'ich bin die Nacktschnecke, die deine Salatblätter anknabbert.',
329                         'ich bin der Rauch, der dir den Räucherlachs verräuchert.',
330                         'ich bin der anonyme Anrufer, der dich um 3 Uhr morgens wachklingelt!',
331                         'ich bin die aufgeplatzte Blutblase in deinen neuen Wanderstiefeln!',
332                         'ich bin die Elster, die dir deinen Goldschmuck stibitzt!',
333                         'ich bin die Fünf, die deine Versetzung gefährdet!',
334                         'ich bin der Kugelschreiber, der vom vielen Autogramme schreiben verglüht!',
335                         'ich bin die Motte, die dem Licht deiner Taschenlampe folgt!',
336                         'ich bin der Irre, der sich in einem leeren Bus neben dich setzt.',
337                         'ich bin das Stinktier, das deine Atemluft verpestet.',
338                         'ich bin das Fieberblässchen auf deiner Oberlippe.',
339                         'ich bin der Dietrich zu deinem Geldtransporter.',
340                         'ich bin die Flut der Rache, die durch deinen Abwasserkanal gurgelt.',
341                         'ich bin der hässliche Fleck, der deine Tapete verunziert.',
342                         'ich bin das schwarze Licht an dem du dir die Finger verbrennst.',
343                         'ich bin der Jojo, der dich immer abrollt.',
344                         'ich bin der Kalkfleck in deiner Badewanne, den du nicht abkriegst.',
345                         'ich bin der alte Kaugummi, der am Stiefelabsatz des Verbrechens klebt.',
346                         'ich bin der Glitter auf dem Glitteranzug der Gerechtigkeit.',
347                         'ich bin der Fleck, der sich in deine Seidenkrawatte frisst.',
348                         'ich bin der Kurzschluss in deiner elektrischen Zahnbürste.',
349                         'ich bin der sinnvolle Gestalter der dir die Zeit zum Spielen versaut.',
350                         'ich bin der Terrier, der dir Schnürsenkel abknabbert.',
351                         'ich bin der ledige Erfolgstyp, auf den alle Frauen fliegen.',
352                         'ich bin der selbstsüchtige Narr, der unsere Stadt zu einem Spottpreis verschachert hat.',
353                         'ich bin der Cutter, der deine Szene aus dem Film schnipselt und in den Müll wirft.',
354                         'ich bin der Glockenklöppel, der euch die Ohren malträtiert.',
355                         'ich bin der Himbeerkern, der zwischen deinen Zähnen sitzt.',
356                         'ich bin der gefiederte Quälgeist, der in euren Alpträumen herumgeistert.',
357                         'ich bin der Rauch, der dir den Räucherlachs verräuchert.',
358                         'ich bin der Mückenschwarm, der euch die Windschutzscheibe versaut.',
359                         'ich bin die Schmeißfliege, die in eurer Suppe badet.',
360                         'ich bin der gepfefferte Überziehungskreditzins, der dir das Geldabheben austreibt.',
361                         'ich bin die Bittermandel im Süßmüsli des Guten.',
362                         'ich bin der Amateurfunker, der euch den Empfang verbrezelt.',
363                         'ich bin der Pickel, der sprießt, wenn du mit deinem Liebling ein Rondezvous hast.',
364                         'ich bin die durchgebrannte Sicherung, die dich total lahm legt.',
365                         'ich bin der Mechaniker, der dir sagt, dass deine Garantie abgelaufen ist.',
366                         'ich bin das Backrohr, das deinen Weihnachtsbraten zu Holzkohle verschmurgelt.',
367                         'ich bin die Handlung, die dir den Atem stocken lässt.',
368                         'ich bin die Weltraummotte an deiner UFO-Weltraumscheibe.',
369                         'ich bin die Nacktschnecke, die dir deine Blätter wegspachtelt.',
370                         'ich bin das Jucken das du nicht kratzen kannst.',
371                         'ich bin der anonyme Anrufer, der dich um drei Uhr morgens wach klingelt.',
372                         'ich bin die Zwiebel, die dir die Augen Tränen lässt.',
373                         'ich bin der Griffel, der auf der Schiefertafel deiner Seele quietscht.',
374                         'ich bin der ohrenbetaübende Fingernagelkratzer auf der Schiefertafel der Gerechtigkeit.',
375                         'ich bin der Kaugummi, der dir in den Haaren klebt.',
376                         'ich bin die Kralle , die dir in den Augen hängt.',
377                         'ich bin der Kalkfleck in deiner Badewanne den du nicht abkriegst.',
378                         'ich bin... total am schwitzen!',
379                         'ich bin... ein Straßengrafitty.',
380                         'ich bin die Neurose wegen der du zum Psychiater musst, der 500 Mate-Taler die Stunde kostet.',
381                 );
382                 
383                 $conn->privmsg($to, $start . $lines[rand @lines] . $end);
384                 return;
385         }
386                 
387         if ($to eq '#ccc-ffm-intern') {
388                 if ($arg =~ /^!help\sall/i) {
389                         query_help($conn, $event->nick, 1);
390                         return;
391                 }
392                 if ($arg =~ /^!help/i) {
393                         query_help($conn, $event->nick, 0);
394                         return;
395                 }
396                 if ($arg =~ /^!key\s+([\p{Nd}\p{L}?.-_]+)\s+([\p{Nd}\p{L}?.-_]+)/i) {
397                         hq_change_key($1, $2);
398                         hq_set_topic($conn);
399                         return;
400                 }
401
402                 if ($arg =~ /^!keys/i) {
403                         $conn->privmsg($to, "Keys: " . join(", ", store_get_array('keys')));
404                         return;
405                 }
406                 if ($arg =~ /^!open\s*$/i) {
407                         store_set_value('hq', 'open');
408                         hq_set_topic($conn);
409                         return;
410                 }
411                 if ($arg =~ /^!open\s+([\p{Nd}\p{L}?.-_ ]+)/i) {
412                         my @nicks = filter_nicknames(split(/[, ]/, $1));
413                         store_set_value('hq', 'open');
414                         store_add_to_array('people', @nicks);
415                         hq_set_topic($conn);
416                         return;
417                 }
418                 if ($arg =~ /^!close/i) {
419                         store_set_value('hq', 'closed');
420                         store_set_value('people', '');
421                         hq_set_topic($conn);
422                         return;
423                 }
424                 if ($arg =~ /^!join\s*$/i) {
425                         store_set_value('hq', 'open');
426                         store_add_to_array('people', filter_nickname($event->nick));
427                         hq_set_topic($conn);
428                         return;
429                 }
430                 if ($arg =~ /^!leave$/i || $arg =~ /^!part$/i) {
431                         store_remove_from_array('people', filter_nickname($event->nick));
432                         hq_set_topic($conn);
433                         return;
434                 }
435                 if ($arg =~ /^!join\s+([\p{Nd}\p{L}?.-_ ]+)/i) {
436                         my @nicks = filter_nicknames(split(/[, ]/, $1));
437                         store_set_value('hq', 'open');
438                         store_add_to_array('people', @nicks);
439                         hq_set_topic($conn);
440                         return;
441                 }
442                 if ($arg =~ /^!leave\s+([\p{Nd}\p{L}?.-_ ]+)/i || $arg =~ /^!part\s+([\p{Nd}\p{L}?.-_ ]+)/i) {
443                         my @nicks = filter_nicknames(split(/[, ]/, $1));
444                         store_remove_from_array('people', @nicks);
445                         hq_set_topic($conn);
446                         return;
447                 }
448         }
449     print Dumper($event), "\n" if ($debug);
450 }
451
452 sub on_msg {
453         my ($conn, $event) = @_;
454         my ($arg) = ($event->args);
455         my ($to) = ($event->to);
456         my $nick = $config->{nick} || 'hans';
457
458         $arg = decode('UTF-8', $arg);
459
460         if ($to eq $nick) {
461                 if ($arg =~ /^!help\sall/i) {
462                         query_help($conn, $event->nick, 1);
463                         return;
464                 }
465                 if ($arg =~ /^!help/i) {
466                         query_help($conn, $event->nick, 0);
467                         return;
468                 }
469         }
470     print Dumper($event), "\n" if ($debug);
471 }
472
473 sub on_nicknameinuse {
474         my $conn = shift;
475         my $nick = $config->{nick} || 'hans';
476         my $password = $config->{password} || 'geheim';
477         print "Nickname $nick is already in use. Sending GHOST command...\n" if ($debug);
478         $conn->privmsg('nickserv', "GHOST $nick $password");
479         $conn->add_default_handler(\&default) if ($debug);
480 }
481
482
483
484 # DEBUG
485 #sub default {
486 #        my ($conn, $event) = @_;
487 #       print Dumper($event), "\n";
488 #}
489
490 $conn->add_global_handler('376',                \&on_connect);
491 $conn->add_global_handler('disconnect', \&on_disconnect);
492 $conn->add_global_handler('kick',               \&on_kick);
493 $conn->add_global_handler('mode',               \&on_mode);
494 $conn->add_global_handler('notice',             \&on_notice);
495 $conn->add_global_handler('msg',                \&on_msg);
496 $conn->add_global_handler('public',             \&on_public);
497 $conn->add_global_handler('nicknameinuse',      \&on_nicknameinuse);
498
499 $irc->start;