# 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};
}