commit ed5e8478f61205d34eceb440d3fb549d8f2a8850 from: Izzy Blacklock date: Wed Aug 02 23:04:46 2023 UTC Added new() and function for socket creation moved socket creation from botnow script added new to create $irc object maintained compatability with calling functions in object mode or function mode as procausion for legacy code. NOTE TO SELF - should add a warning to output to recommend updating to object mode 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;