# dimio (http://dimio.org) # Simple IRC bot for auto-renew Bshellz shell account # Last update: 2016-09-30 08:50 require 5.008_008; use warnings; use strict; use utf8; use IO::Socket::INET; our $VERSION = '0.02'; local $\ = $/; my $opt = { server_name => 'irc.freenode.net', server_port => '6667', #channels => qw ( bshellz ), channel => 'bshellz', bot_name => 'Beschbot', nickname => 'dimio', bshellz_name => 'dimio', # name of bshellz account verbose => 2, # print irc server responses & debug data print_log => 1, # print Beschbot "!keep" response for cron sending report email }; my $channame_re = qr "$opt->{channel}"; my $bshellz_name_re = qr "$opt->{bshellz_name}"; while (1) { print "CONNECTING to $opt->{server_name}..." if $opt->{verbose}; my $socket = IO::Socket::INET->new( PeerAddr => $opt->{server_name}, PeerPort => $opt->{server_port}, Proto => 'tcp', Type => SOCK_STREAM, Timeout => 60, ); if ( $socket ) { irc_login( $socket, $opt ); while ( my $resp = <$socket> ) { chomp $resp; if ( $resp =~ /^PING \:([\-\.\w]+)/ ) { print $socket 'PONG ' . $1; } elsif ( $resp =~ m~ ^ \:[\.\*\w\s]+ \:(?:Nickname \s is \s already \s in \s use)\. \s* $ ~x ) { $opt->{nickname} .= '_' . int( rand(3_000) + 333 ); irc_login( $socket, $opt ); } elsif ( $resp =~ m~ ^ \:[\w\.\s]+ ( \#$channame_re ) \s \:End \s of \s \/NAMES \s list\. \s* $ ~x ) { print 'JOINED to ' . $1 if $opt->{verbose}; print $socket 'PRIVMSG ' . $opt->{bot_name} . ' :!keep ' . $opt->{bshellz_name}; } elsif ( $resp =~ m~ ^ \:[!\.\@\w\s]+ \:($bshellz_name_re\'s [\w\s]+ hours \s to \s live!) \s* $ ~xi ) { print "$0:\t$&" if $opt->{print_log}; sleep 7; print $socket 'QUIT'; } print $resp if $opt->{verbose} > 1; } } else { warn "Couldn't connect to $opt->{server_name}: $! $/ $@", $/; print "RECONNECTING to $opt->{server_name}..." if $opt->{verbose}; sleep 30; next; } $socket->close; last; } print 'DONE. Exiting.' if $opt->{verbose}; sub irc_login { my $socket = shift; my $opt = shift; print $socket 'NICK ' . $opt->{nickname}; print $socket 'USER ' . $opt->{nickname} . ' 0 * :...'; #print $socket 'JOIN #' . $_ foreach $opt->{channels}; print $socket 'JOIN #' . $opt->{channel}; }