Commit Diff


commit - b19b7985c6eda97bf830d63afc2d72817f14e097
commit + ed5e8478f61205d34eceb440d3fb549d8f2a8850
blob - a12a117b7d3b92a0db75f1693b1afbfbc0e8309a
blob + b6b4e6edebb6899c688e17fae7dbcb838eb78e0a
--- lib/IRCNOW/IO/IRC.pm
+++ lib/IRCNOW/IO/IRC.pm
@@ -1,7 +1,7 @@
 package IRCNOW::IO::IRC;
 use strict;
 use warnings;
-
+use lib qw(./lib);
 use IRCNOW::IO qw(:DEBUG);
 
 use Exporter 'import';
@@ -24,7 +24,63 @@ our @bots;
 our $localnet;
 our @stafflist;
 
+sub new {
+	my $class = shift;
+	my $options = {@_};
+	my $self = {
+		bots => [],
+		call => {},
+		stafflist => [],
+		networks => [],
+	};
+	# verify we have all required params
+	my @required = qw(networks localnet nick host port pass);
+	for my $param (@required) {
+		die "Required param '$param' missing in IRCNOW::IO::IRC::new()" 
+			unless exists $options->{$param};
+		$self->{$param} = $options->{$param};
+	}
+	my @optional = qw{stafflist};
+	for my $param (@optional) {
+		$self->{$param} = $options->{$param};
+	}
+
+	bless $self, $class;
+
+	# Create the sockets
+	$self->{sockets} = createSockets();
+
+	return $self;
+}
+
+
+sub createSockets {
+	my $self=shift;
+	# create sockets
+	my $sel = IO::Select->new( );
+	foreach my $network (@{$self->{networks}}) {
+		my $socket = IO::Socket::INET->new(
+			PeerAddr => $self->{host},
+			PeerPort => $self->{port},
+			Proto => 'tcp',
+			Timeout => '300'
+		) || debug(ERRORS, qq"Failed to establish connection $self->{host}:$self->{port}\n");
+		$sel->add($socket);
+		my $bot = {("sock" => $socket), ("name" => $network)};
+		push(@{$self->{bots}}, $bot);
+		$self->putserv($bot, qq"NICK $self->{nick}");
+		$self->putserv($bot, qq"USER $self->{nick} * * :$self->{nick}");
+	}
+	return $sel;
+}
+
+
 sub putserv {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+	}
 	my( $bot, $text )=@_;
 	my $socket = $bot->{sock};
 	if ($text =~ /^([^:]+):([[:ascii:]]*)$/m) {
@@ -39,10 +95,19 @@ sub putserv {
 }
 
 sub putservlocalnet {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+		$self = {
+			localnet => $localnet,
+		};
+	}
+
 	my( $bot, $text )=@_;
 	my $botlocalnet;
 	foreach my $b (@bots) {
-		if($b->{name} =~ /^$localnet$/i) {
+		if($b->{name} =~ /^$self->{localnet}$/i) {
 			$botlocalnet = $b;
 			last;
 		}
@@ -51,11 +116,23 @@ sub putservlocalnet {
 }
 
 sub whois {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+	}
+
 	my( $socket, $target )=@_;
 	print $socket "WHOIS $target $target\r\n";
 }
 
 sub ctcp {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+	}
+
 	my( $socket, $target )=@_;
 #	print $socket "PRIVMSG $target :".chr(01)."CLIENTINFO".chr(01)."\r\n";
 #	print $socket "PRIVMSG $target :".chr(01)."FINGER".chr(01)."\r\n";
@@ -67,6 +144,12 @@ sub ctcp {
 }
 
 sub cbind {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+	}
+
 	my ($type, $flags, $cmd, $proc) = @_;
 	if ($type eq "pub") {
 		push(@{$call->{pub}}, {cmd => $cmd, proc => $proc});
@@ -88,12 +171,23 @@ sub cbind {
 }
 
 sub isstaff {
+	my $self = shift;
+	# Verify we were called in object mode or return $self to the param list
+	if (not UNIVERSAL::isa($self, 'IRCNOW::IO::IRC')) {
+		unshift @_, $self;
+		$self = {
+			localnet => $localnet,
+			stafflist => \@stafflist,
+		};
+	}
+
 	my( $bot, $nick ) = @_;
+	my $localnet = $self->{localnet};
 	if( !( $bot->{name} =~ /^$localnet$/i ) ) {
 		debug(ALL,qq{isstaff--> $bot->{name} not $localnet});
 		return 0;
 	}
-	foreach( @stafflist ) {
+	foreach( @{$self->{stafflist}} ) {
 		if( $nick eq $_ ) {
 			debug(ALL,qq{isstaff--> $nick not in \@stafflist});
 			return 1;