source: trollforge/jacksonbrown/banbot.pl @ 357

Revision 239, 15.1 KB checked in by jacksonbrown, 7 years ago (diff)

added nullo's tools, banbot (lol blogtown) and old, old version of ASIAN

Line 
1#!/usr/bin/perl
2
3use Socket;
4use POSIX;
5use strict;
6use warnings;
7
8#
9# config
10#
11
12my $port = 6667;
13my $server = "irc.homelien.no";
14my $username = "faggotron";
15my $channel = "#lolsup";
16my $mychan = "#gayfagz";
17my $connected = 0;
18
19my $kickmsg = "\2lol welcome to BANTOWN : http://www.encyclopediadramatica.com/index.php/Bantown";
20my $joinmsg = "Kelly from observers.net would like you to know she loves you. join \2#obs\2 4 hugs [BANTOWN FOREVER]\2.";
21#
22# files
23#
24
25my $datafile = 'chanusers';
26my $savefile = 'savestate';
27
28#
29# queues
30#
31
32my $userqueue = {};
33my $chanqueue = {};
34
35my $userdone = {};
36my $chandone = { $mychan => undef };
37
38my $chanusers = {};
39
40my $invited = {};
41my $banned = {};
42my $okppl = {};
43
44my $sd;
45
46my $complete;
47
48#
49# color definitions
50#
51
52my $Cproc = "\33[35m";
53my $Cnone = "\33[0m";
54my $Csend = "\33[33m";
55my $Cerr  = "\33[31m";
56
57if(defined($ARGV[0])) {
58        $server = $ARGV[0];
59}
60
61if(defined($ARGV[1])) {
62        $port = $ARGV[1];
63}
64
65if(defined($ARGV[2])) {
66        $username = $ARGV[2];
67}
68
69if(defined($ARGV[3])) {
70        $channel = $ARGV[3];
71}
72
73$chanqueue->{$channel} = 1;
74
75my $baseinc = 5;
76my $incrementer = $baseinc;
77
78sub procstep {
79
80        my($nick, $channel);
81
82        if(rand() < .1) {
83                print "\33[36msleeping for 3 seconds$Cnone\n";
84                sleep(3);
85        }
86
87        sleep(2);
88
89        print "\33[1muqueue: ", scalar(keys(%{$userqueue})), " ";
90        print "cqueue: ", scalar(keys(%{$chanqueue})), " ";
91        print "udone: ", scalar(keys(%{$userdone})), " ";
92        print "cdone: ", scalar(keys(%{$chandone})), "$Cnone\n";
93
94if($incrementer > 0 && scalar(keys(%{$userqueue})) > 0) {
95
96                #
97                # process the next nickname by whoising it
98                #
99
100                ( $nick ) = keys(%{$userqueue});
101
102                send($sd, "WHOIS $nick\n", 0);
103                print $Csend, "WHOIS $nick$Cnone\n";
104
105                $incrementer--;
106
107        } elsif(scalar(keys(%{$chanqueue})) > 0) {
108
109                #
110                # process the next channel by picking the most common one
111                # and then joining it
112                #
113
114                $incrementer = $baseinc;
115
116                ( $channel ) = sort {
117                                $chanqueue->{$b} <=> $chanqueue->{$a};
118                        } (keys(%{$chanqueue}));
119
120                print $Cproc, "joining $channel:$chanqueue->{$channel}$Cnone\n";
121
122                send($sd, "JOIN $channel\n", 0);
123                print $Csend, "JOIN $channel$Cnone\n";
124       
125        } elsif(scalar(keys(%{$userqueue})) > scalar(keys(%{$chanqueue}))) {
126
127                #
128                # process the next nickname by inviting it
129                #
130
131                ( $nick ) = keys(%{$userqueue});
132                send($sd, "WHOIS $nick\n", 0);
133                print $Csend, "WHOIS $nick$Cnone\n";
134
135                $incrementer--;
136
137        } else {
138                # $complete = 'complete';
139        }
140
141        return undef;
142}
143
144sub user_is_done {
145
146        my $nick = $_[0];
147
148        print $Cproc, "deleting $nick from user queue$Cnone\n";
149
150        delete $userqueue->{$nick};
151        $userdone->{$nick} = undef;
152
153        return undef;
154}
155
156sub channel_is_done {
157
158        my $chan = $_[0];
159
160        print $Cproc, "deleting $chan from channel queue$Cnone\n";
161
162        delete $chanqueue->{$chan};
163        $chandone->{$chan} = undef;
164}
165
166sub save_state {
167
168        my $chan = $_[0];
169
170        open(FD, ">>$datafile")
171                || err("open(): $!");
172
173        print FD "$chan = ", join(' ', keys(%{$chanusers->{$chan}})), "\n";
174
175        close(FD);
176
177        open(FD, ">$savefile")
178                || err("open(): $!");
179
180        print FD "uq = ", join(' ', keys(%{$userqueue})), "\n";
181        print FD "cq = ", join(' ', %{$chanqueue}), "\n";
182        print FD "ud = ", join(' ', keys(%{$userdone})), "\n";
183        print FD "cd = ", join(' ', keys(%{$chandone})), "\n";
184
185        close(FD);
186
187        return undef;
188}
189
190sub load_state {
191
192        open(FD, "<$savefile")
193                || return undef;
194
195        while(my $line = <FD>) {
196
197                my(@array, $target, $right);
198
199                $line =~ /([^\s]+)\s*=\s*/;
200
201                $target = $1;
202
203                $right = $';
204
205                @array = split(/\s+/, $right);
206
207                if($target eq "uq") {
208                        @{%{$userqueue}}{@array} = undef;
209                } elsif($target eq "cq") {
210                        $chanqueue = {@array};
211                } elsif($target eq "ud") {
212                        @{%{$userdone}}{@array} = undef;
213                } elsif($target eq "cd") {
214                        @{%{$chandone}}{@array} = undef;
215                }
216        }
217
218        return undef;
219}
220
221my $op = {
222        "001" => sub {
223
224                # RPL_WELCOME
225
226                my ($src, $param, $msg);
227
228                ( $src, $param ) = @_;
229
230                if($connected == 0) {
231                        $connected = 1;
232                        $server = $src;
233
234                        $param =~ /^([^\s]+)\s*:?(.*)$/;
235                        $username = $1;
236                        $msg = $2;
237
238                        print "\33[1m$username connected to $server$Cnone\n";
239                        print "\33[1m$msg$Cnone\n";
240
241                        send($sd, "JOIN $mychan\n", 0);
242                        print $Csend, "JOIN $mychan$Cnone\n";
243
244                } else {
245                        warn("already connected!!!");
246                }
247        },
248        "301" => sub {
249                # RPL_AWAY
250        },
251        "311" => sub {
252                # RPL_WHOISUSER
253        },
254        "312" => sub {
255                # RPL_WHOISSERVER
256        },
257        "317" => sub {
258                # RPL_WHOISIDLE
259        },
260        "318" => sub {
261
262                # RPL_ENDOFWHOIS
263
264                my ($src, $param, $nick, $msg, $mynick);
265
266                ( $src, $param ) = @_;
267
268                $param =~ /^([^\s]+)\s+([^\s]+)\s*:(.*)$/;
269
270                $mynick = $1;
271
272                $nick = $2;
273                $nick =~ tr/A-Z/a-z/;
274
275                $msg = $3;
276
277                if(exists($userqueue->{$nick})) {
278                        user_is_done($nick);
279                        procstep();
280                }
281        },
282        "319" => sub {
283
284                # RPL_WHOISCHANNELS
285
286                my ($src, $param, $nick, $msg, $mynick);
287
288                my $right;
289
290                ( $src, $param ) = @_;
291
292                $param =~ /^([^\s]+)\s+([^\s]+)\s*:\s*/;
293
294                $mynick = $1;
295
296                $nick = $2;
297                $nick =~ tr/A-Z/a-z/;
298
299                $right = $';
300
301                my $qadd = [];
302
303                while($right =~ /^[+@]*(\#[^\s]*)\s*/) {
304                       
305                        my $chan = $1;
306                        $chan =~ tr/A-Z/a-z/;
307
308                        # add all channels in the list that are not done
309                        # into the processing queue
310
311                        if(!exists($chandone->{$chan})) {
312                                $chanqueue->{$chan}++;
313                                push(@{$qadd}, $chan);
314                        }
315
316                        $right = $';
317                }
318
319                print $Cproc, "adding channels to queue:$Cnone ";
320                print join(', ', @{$qadd}), "\n";
321
322                $qadd = undef;
323        },
324        "320" => sub {
325                # RPL_WHOISIDENTIFIED (non-standard)
326        },
327        "330" => sub {
328                # RPL_LOGGEDIN (non-standard)
329        },
330        "332" => sub {
331                # RPL_TOPIC
332        },
333        "333" => sub {
334                # RPL_RND (non-standard)
335        },
336        "353" => sub {
337
338                # RPL_NAMREPLY
339
340                my ($src, $param, $nick, $msg, $mynick, $chan);
341
342                ( $src, $param ) = @_;
343
344                $param =~ /^([^\s]+)\s+[\*@=]\s+([^\s]+)\s+:\s*/;
345
346                $mynick = $1;
347
348                $chan = $2;
349                $chan =~ tr/A-Z/a-z/;
350
351                # make sure the channel has a users list
352
353                if(!exists($chanusers->{$chan})) {
354                        print $Cproc, "creating a userlist for $chan$Cnone\n";
355                        $chanusers->{$chan} = {};
356                }
357
358                my $right = $';
359
360                my $qadd = [];
361
362                while($right =~ /^[+@]*([^\s]+)\s*/) {
363
364                        $nick = $1;
365                        $nick =~ tr/A-Z/a-z/;
366
367                        if($nick ne $username) {
368                                $chanusers->{$chan}->{$nick} = undef;
369
370                                if(!exists($userdone->{$nick})) {
371                                        $userqueue->{$nick} = undef;
372                                        push(@{$qadd}, $nick);
373                                }
374                        }
375
376                        if($chan eq $mychan) {
377                                $okppl->{$nick} = 1;
378                                print "$Cproc$nick is OOK PPL!!!!!!$Cnone\n";
379                        } else {
380                                $invited->{$nick} = 1;
381                                print "$Cproc$nick is doomed!$Cnone\n";
382
383                        }
384
385                        $right = $';
386                }
387
388                print $Cproc, "adding users to queue:$Cnone ";
389                print join(', ', @{$qadd}), "\n";
390
391                $qadd = undef;
392
393        },     
394        "366" => sub {
395               
396                # RPL_ENDOFNAMES
397
398                my ($src, $param, $nick, $msg, $mynick, $chan);
399
400                ( $src, $param ) = @_;
401
402                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
403
404                $mynick = $1;
405                $mynick =~ tr/A-Z/a-z/;
406
407                $chan = $2;
408                $chan =~ tr/A-Z/a-z/;
409
410                $msg = $3;
411
412                # delete the channel from the queue
413                # save to the channel file
414                # and then part
415
416                if($chan =~ /(linux|abuse|help)/i) {
417                } else {
418                send($sd, "NOTICE $chan :$joinmsg \2$chan SUCKS\2\n", 0);
419print "BBQ CHICKEN\n";
420
421                }
422                if($chan ne $mychan) {
423                channel_is_done($chan);
424                save_state($chan);
425
426                send($sd, "PART $chan\n", 0);
427                print $Csend, "PART $chan$Cnone\n";
428                }
429
430                procstep();
431        },
432        "372" => sub {
433                # RPL_MOTD
434        },
435        "376" => sub {
436                # RPL_ENDOFMOTD
437        },
438        "401" => sub {
439
440                # ERR_NOSUCHNICK
441
442                my ($src, $param, $nick, $msg, $mynick, $chan);
443
444                ( $src, $param ) = @_;
445
446                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
447
448                $mynick = $1;
449                $mynick =~ tr/A-Z/a-z/;
450
451                $nick = $2;
452                $nick =~ tr/A-Z/a-z/;
453
454                $msg = $3;
455
456                print $Cerr, "$nick doesn't exist$Cnone\n";
457
458                user_is_done($nick);
459
460                procstep();
461        },
462        "403" => sub {
463
464                # ERR_NOSUCHCHANNEL
465
466                my ($src, $param, $nick, $msg, $mynick, $chan);
467
468                ( $src, $param ) = @_;
469
470                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
471
472                $mynick = $1;
473                $mynick =~ tr/A-Z/a-z/;
474
475                $chan = $2;
476                $chan =~ tr/A-Z/a-z/;
477
478                $msg = $3;
479
480                print $Cerr, "$chan doesn't exist$Cnone\n";
481
482                channel_is_done($chan);
483
484                procstep();
485        },
486        "433" => sub {
487
488                # ERR_NICKNAMEINUSE
489
490                my ($src, $param, $nick, $msg, $mynick, $chan);
491
492                ( $src, $param ) = @_;
493
494                $param =~ /^([^\s]+)\s*:?(.*)$/;
495
496                $nick = $1;
497                $nick =~ tr/A-Z/a-z/;
498
499                $msg = $2;
500
501                print "\33[31m$msg$Cnone\n";
502
503                $username++;
504
505                send($sd, "NICK $username\n", 0);
506                print $Csend, "NICK $username$Cnone\n";
507        },
508        "437" => sub {
509
510                # ERR_UNAVAILRESOURCE
511
512                print "\33[36msleeping for 2 seconds$Cnone\n";
513                sleep(2);
514
515        },
516        "465" => sub {
517
518                # ERR_YOUREBANNEDCREEP
519
520                my ($src, $param, $nick, $msg, $mynick, $chan);
521
522                ( $src, $param ) = @_;
523
524                $param =~ /^([^\s]+)\s*:?(.*)$/;
525
526                $mynick = $1;
527                $mynick =~ tr/A-Z/a-z/;
528
529                $msg = $2;
530
531                print "\33[31m$msg$Cnone\n";
532        },
533        "471" => sub {
534
535                # ERR_CHANNELISFULL
536
537                my ($src, $param, $nick, $msg, $mynick, $chan);
538
539                ( $src, $param ) = @_;
540
541                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
542
543                $mynick = $1;
544                $mynick =~ tr/A-Z/a-z/;
545
546                $chan = $2;
547                $chan =~ tr/A-Z/a-z/;
548
549                $msg = $3;
550
551                print $Cerr, "$chan is full$Cnone\n";
552
553                channel_is_done($chan);
554
555                procstep();
556        },
557        "473" => sub {
558               
559                # ERR_INVITEONLYCHAN
560
561                my ($src, $param, $nick, $msg, $mynick, $chan);
562
563                ( $src, $param ) = @_;
564
565                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
566
567                $mynick = $1;
568                $mynick =~ tr/A-Z/a-z/;
569
570                $chan = $2;
571                $chan =~ tr/A-Z/a-z/;
572
573                $msg = $3;
574
575                print $Cerr, "$chan is invite only$Cnone\n";
576
577                channel_is_done($chan);
578
579                procstep();
580        }, 
581        "474" => sub {
582
583                # ERR_BANNEDFROMCHAN
584
585                my ($src, $param, $nick, $msg, $mynick, $chan);
586
587                ( $src, $param ) = @_;
588
589                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
590
591                $mynick = $1;
592                $mynick =~ tr/A-Z/a-z/;
593
594                $chan = $2;
595                $chan =~ tr/A-Z/a-z/;
596
597                $msg = $3;
598
599                print $Cerr, "banned from $chan$Cnone\n";
600
601                channel_is_done($chan);
602
603                procstep();
604        },
605        "475" => sub {
606
607                # ERR_BADCHANNELKEY
608
609                my ($src, $param, $nick, $msg, $mynick, $chan);
610
611                ( $src, $param ) = @_;
612
613                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
614
615                $mynick = $1;
616                $mynick =~ tr/A-Z/a-z/;
617
618                $chan = $2;
619                $chan =~ tr/A-Z/a-z/;
620
621                $msg = $3;
622
623                print $Cerr, "bad channel key for $chan$Cnone\n";
624
625                channel_is_done($chan);
626
627                procstep();
628        },
629        "477" => sub {
630
631                # ERR_MUSTREGISTER (non-standard)
632
633                my ($src, $param, $nick, $msg, $mynick, $chan);
634
635                ( $src, $param ) = @_;
636
637                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
638
639                $mynick = $1;
640                $mynick =~ tr/A-Z/a-z/;
641
642                $chan = $2;
643                $chan =~ tr/A-Z/a-z/;
644
645                $msg = $3;
646
647                print $Cerr, "must register to join $chan$Cnone\n";
648
649                channel_is_done($chan);
650
651                procstep();
652        },
653        "479" => sub {
654                # ERR_BADCHARS
655                my ($src, $param, $nick, $msg, $mynick, $chan);
656                ( $src, $param ) = @_;
657                $param =~ /^([^\s]+)\s+([^\s]+)\s*:?(.*)$/;
658                $mynick = $1;
659                $mynick =~ tr/A-Z/a-z/;
660                $chan = $2;
661                $chan =~ tr/A-Z/a-z/;
662                $msg = $3;
663                print $Cerr, "$chan has illegal chars$Cnone\n";
664                channel_is_done($chan);
665                procstep();
666        },
667        "ping" => sub {
668
669                # PING
670
671                my $address = $_[1];
672                $address =~ s/^:?//;
673
674                send($sd, "PONG :$address\n", 0);
675                print "\33[36mPING? PONG!$Cnone\n";
676
677                procstep();
678        },
679        "privmsg" => sub {
680
681                # PRIVMSG
682
683                my ($src, $param, $nick, $msg, $mynick, $chan, $dst);
684
685                ( $src, $param ) = @_;
686
687                $param =~ /([^\s]+)\s*:?(.*)$/;
688
689                $dst = $1;
690                $msg = $2;
691
692                $nick = $src;
693                $nick =~ s/!.*$//;
694
695                if(defined($src)) {
696                        if($dst =~ /^$username$/i) {
697                                print "\33[34;1m($nick)$Cnone $msg\n";
698                        } else {
699                                print "\33[34m($nick:$dst)$Cnone $msg\n";
700                        }
701                } else {
702                        print "\33[32m($dst)$Cnone $msg\n";
703                }
704
705                if($msg eq "get going!") {
706                        procstep();
707                        send($sd, "JOIN $mychan\n", 0);
708                }
709        },
710        "notice" => sub {
711
712                # NOTICE
713
714                my ($src, $param, $nick, $msg, $mynick, $chan, $dst);
715
716                ( $src, $param ) = @_;
717
718                $param =~ /([^\s]+)\s*:?(.*)$/;
719
720                $dst = $1;
721                $msg = $2;
722
723                if(defined($src)) {
724
725                        $nick = $src;
726                        $nick =~ s/!.*$//;
727
728                        if($dst =~ /^$username$/i) {
729                                print "\33[32;1m($nick)$Cnone $msg\n";
730                        } else {
731                                print "\33[32m($nick:$dst)$Cnone $msg\n";
732                        }
733                } else {
734                        print "\33[32m($dst)$Cnone $msg\n";
735                }
736        },
737        "error" => sub {
738
739                my ($src, $param, $nick, $msg, $mynick, $chan);
740
741                ( $src, $param ) = @_;
742
743                $param =~ /^:(.*)$/;
744                $msg = $1;
745
746                print "\33[31m(ERROR) $msg$Cnone\n";
747        },
748        "kick" => sub {
749                print "$Cproc KICK TO PROC$Cnone\n";
750                procstep();
751        }, 
752        "join" => sub {
753
754                my ($src, $param, $nick, $msg, $mynick, $chan, $host);
755
756                ( $src, $param ) = @_;
757
758                $nick = $src;
759                $nick =~ s/!.*$//;
760                $nick =~ tr/A-Z/a-z/;
761
762                if($src =~ /^([^!]+)!([^@])@(.*)$/) {
763                        $nick = $1;
764                        $host = $2;
765                }
766
767                $param =~ /^:?([^\s]+)\s*$/;
768
769                $chan = $1;
770                $chan =~ tr/A-Z/a-z/;
771
772                print "\33[36m$nick joined $chan$Cnone\n";
773
774                if($chan eq $mychan) {
775                        if(defined $invited->{$nick} && !defined $okppl->{$nick}) {
776
777                                # kick invited PPL
778                                #
779
780                                my $ban = "$nick!*@*";
781
782                                print "$Cproc$nick is being banned!!!!$Cnone";
783
784                                send($sd, "MODE $mychan +b $ban\n", 0);
785                                send($sd, "KICK $mychan $nick :$kickmsg\n", 0);
786                                undef $invited->{$nick};
787                                $banned->{$ban} = time() + 60;
788                        }
789                }
790        },
791        "part" => sub {
792
793                my ($src, $param, $nick, $msg, $mynick, $chan);
794
795                ( $src, $param ) = @_;
796
797                $nick = $src;
798                $nick =~ s/!.*$//;
799
800                $param =~ /^([^\s]+)\s*:?(.*)$/;
801
802                $chan = $1;
803                $chan =~ tr/A-Z/a-z/;
804
805                $msg = $2;
806
807                print "\33[36m$nick parted $chan$Cnone\n";
808        },
809        "mode" => sub {
810
811                my ($src, $param, $nick, $msg, $mynick, $chan);
812
813                procstep();
814
815        },
816        "quit" => sub {
817
818                my ($src, $param, $nick, $msg, $mynick, $chan);
819
820                ( $src, $param ) = @_;
821
822                $nick = $src;
823                $nick =~ s/!.*$//;
824
825                $param =~ /^:?(.*)$/;
826                $msg = $1;
827
828                print "\33[36m$nick quit ($msg)$Cnone\n";
829        }
830};
831
832print "connecting to $server:$port as $username and joining $channel\n";
833
834#
835# socket connection
836#
837
838sub connect_to {
839
840        my ( $server, $port ) = @_;
841
842        my ($ipaddr, $sin, $proto);
843
844        my $sd;
845
846        $ipaddr = gethostbyname($server);
847        $sin = pack('S n a4 x8', AF_INET, $port, $ipaddr);
848        $proto = getprotobyname('tcp');
849
850        socket(SD, PF_INET, SOCK_STREAM, $proto) ||
851                err("socket(): $!");
852
853        $sd = *SD;
854
855        connect($sd, $sin) ||
856                err("connect(): $!");
857
858        return $sd;
859}
860
861$sd = connect_to($server, $port);
862
863#
864# login
865#
866
867send($sd, "USER $username 0 \"\" $username\n", 0);
868print $Csend, "USER $username 0 \"\" $username$Cnone\n";
869
870send($sd, "NICK $username\n", 0);
871print $Csend, "NICK $username$Cnone\n"; 
872
873#
874# event loop
875#
876
877load_state();
878
879$complete = undef;
880
881my $itr = 0;
882
883while(my $line = <$sd>) {
884
885        my ( $src, $opname, $param );
886
887        $line =~ s/[\r\n]//g;
888
889        if($line =~ /^:([^\s]+)\s*([a-zA-Z0-9]+)\s*(.*)$/) {
890                $src = $1;
891                $opname = $2;
892                $opname =~ tr/A-Z/a-z/;
893                $param = $3;
894
895                if(defined($op->{$opname})) {
896                        $op->{$opname}($src, $param);
897                } else {
898                        print "undefined opname \33[31m$opname$Cnone\n";
899                        print "\33[30;1m$line$Cnone\n";
900                }
901        } elsif($line =~ /^([a-zA-Z0-9]+)\s*(.*)$/) {
902                $opname = $1;
903                $opname =~ tr/A-Z/a-z/;
904                $param = $2;
905
906                if(defined($op->{$opname})) {
907                        $op->{$opname}(undef, $param);
908                } else {
909                        print "undefined opname \33[31m$opname$Cnone\n";
910                        print "\33[1m$line$Cnone\n";
911                }
912        } else {
913                print "invalid line\n";
914                print "\33[1m$line$Cnone\n";
915        }
916
917        $itr++;
918
919        if($itr == 10) {
920                $itr = 0;
921
922                foreach my $unban (keys(%{$banned})) {
923                        if(defined $banned->{$unban} && $banned->{$unban} < time()) {
924                                # undef $banned->{$unban};
925                        }
926                }
927        }
928
929        if(defined($complete)) {
930                last;
931        }
932}
933
934#
935# close connection
936#
937
938close($sd) ||
939        err("close(): $!");
940
941print "\33[1mgoodbye$Cnone\n";
942
943exit;
944
945#
946# err()
947#
948
949sub warn {
950        print "\33[1m@_$Cnone\n";
951}
952
953sub err {
954        print "\33[1m@_$Cnone\n";
955        exit;
956}
957
Note: See TracBrowser for help on using the repository browser.