in reply to IRC bot in perl

This is a cut down version of the first bot I ever experimented with (with some stuff changed to protect the innocent:

#!/usr/bin/perl -w use strict; use IO::Socket; my ( $server, $port, $my_nick, $channel, ) = ('irc.dal.net', 6667, 'foobot', '#hackerhost', ); my $sock = IO::Socket::INET->new(PeerAddr => $server, PeerPort => $port, Proto => "tcp", ); print $sock "USER $my_nick foo.wherever.com $server :Just another bot\ +n"; print $sock "NICK $my_nick\n"; $SIG{INT} = sub { print $sock "QUIT :Copped signint from owner\n"; close $sock; exit; }; SOCKLOOP: while (<$sock>) { if ( /^[A-Z]/ ) { if ( /^PING\s+:([\w.]+)/ ) { print $sock "PONG $1\n"; } next SOCKLOOP; #probably need to catch some other stuff but hey } else { my ($server,$action,$stuff) = /^:(\S+)\s+(\w+)\s+(.*)/; if ( $action =~ /\d+/ ) # Server response code { if ($action == 376 ) { print $sock "JOIN $channel\n"; } } } }
This works and has been tested. The way I have done it gives you an opportunity to expand its functionality later.

However having shown you that most people now will use Net::IRC or even better POE::Component::IRC because both of those will handle setting up the connection, joining the channel and answering the PINGs leaving you free to add the actual functionality.

Of course all of this moot because if you are intending to run this as a CGI then it isn't going to work because a CGI program is started as the result of a request from a browser and is intended to return some content and then terminate, it will not maintain a permanent connection for you.

/J\

Replies are listed 'Best First'.
Re: Re: IRC bot in perl
by Swordkeeper (Novice) on Mar 10, 2002 at 10:20 UTC
    Well, as a cgi, I was thinking maybe use another cgi to start it using sytem calls, then return html code for a page saying it had been started right.. on error deleting the file or outputing the error codes through redirection of the ERR handle or some such.. mabey on die starting itself again; I still have allot to learn, But at least I admit my lack of perl wisdom and seek to learn more - Thank you for the links to the pm's, there were unknown to me and will provide a interesting study ;)

      I don't think this is so much of a lack of perl wisdom but is more to do with the way all the rest of it works. To do what you want you will need to fork() a child process - there are plenty of nodes like Re: Re: sending bulk emails in a specified time that explain how to do this in a CGI context, however the real issue is that on any properly administered web server the adminstrators are likely to notice your long running process and terminate it without mercy, some free web hosts even go as far as to disable things like fork() altogether as it is a reasonably dangerous thing to allow unknow users to do.

      /J\