sub chan_check {
my $now = time;
Xchat::print("$logo\tCalling chan_check at $now","[JUNK]");
for( Xchat::get_list("channels") ) {
if ( !$_->{'network'} && $_->{'channel'} ne "[RAW]" && $_->{'channel'} ne "[JUNK]" && $_->{'channel'} ne "[NOTICES]" && $_->{'channel'} ne "[SERVER]" && $_->{'channel'} ne "[DCC]" ) {
Xchat::set_context( $_->{'context'} );
Xchat::command( "close" );
Xchat::set_context(Xchat::get_context());
Xchat::print("$logo\tClosing Tab $_->{'channel'} because no network was assigned","[JUNK]");
}
}
foreach my $key ( sort(keys %CHANS) ) {
# if no server context found && channel is set -auto then...
if (!Xchat::find_context("","$CHANS{$key}{net}") && $CHANS{$key}{auto} eq "yes" ) {
Xchat::print("$logo\t$CHANS{$key}{net} not found","[JUNK]");
# if we have not already issued a newserver command for this server this interval then do so now
# here we make sure that we didnt already recently try to connect before trying it again. 60 second delay
if ( !$SERVS{$CHANS{$key}{net}}{lastconnect} ) { $SERVS{$CHANS{$key}{net}}{lastconnect} = 0; }
if ( $now - $SERVS{$CHANS{$key}{net}}{lastconnect} > $SETTINGS{connect_time} ) {
Xchat::print( "$logo\tNot connected to $CHANS{$key}{net} required by $CHANS{$key}{chan}. Attempting connection","[JUNK]" );
Xchat::command( "newserver $CHANS{$key}{net}" );
$SERVS{$CHANS{$key}{net}}{lastconnect} = $now;
}
else { Xchat::print( "$logo\tNot connected to $CHANS{$key}{net} required by $CHANS{$key}{chan} and last connection attempt was $now - $SERVS{$CHANS{$key}{net}}{lastconnect} seconds ago.","[JUNK]" ); }
last; # staggers the connections to different networks
}
# if server context exists but no channel is found and channel is set to -auto then...
elsif ( !Xchat::find_context($CHANS{$key}{chan},$CHANS{$key}{net}) && $CHANS{$key}{auto} eq "yes" ) {
my $servstate;
for ( Xchat::get_list("channels") ) {
# find server connect status
if ( lc($_->{'network'}) eq lc($CHANS{$key}{net}) ) {
$servstate = "$_->{'flags'}";
last;
}
}
# if server state over 8 then we have the motd and then ok to try and join channel
if ( !$CHANS{$key}{lastjoin} ) { $CHANS{$key}{lastjoin} = 0; }
if ( !$SERVS{$CHANS{$key}{net}}{lastjoin} ) { $SERVS{$CHANS{$key}{net}}{lastjoin} = 0; }
if ( $servstate >= 8 && $now - $SERVS{$CHANS{$key}{net}}{lastjoin} > $SETTINGS{join_time} && $now - $CHANS{$key}{lastjoin} > $SETTINGS{join_time} ) {
Xchat::print("$logo\tNot in $CHANS{$key}{chan} on $CHANS{$key}{net}. Attempting to join","[JUNK]");
Xchat::print("$logo\t'join $CHANS{$key}{chan} $CHANS{$key}{key}','','$CHANS{$key}{net}'","[JUNK]");
Xchat::command("join $CHANS{$key}{chan} $CHANS{$key}{key}","","$CHANS{$key}{net}");
if ( $SERVS{$CHANS{$key}{net}}{status} && $SERVS{$CHANS{$key}{net}}{status} ne "Problem" ) { $SERVS{$CHANS{$key}{net}}{lastjoin} = $now; }
}
else { Xchat::print( "$logo\tNot in $CHANS{$key}{chan} and last connection attempt was $now - $SERVS{$CHANS{$key}{net}}{lastjoin} seconds ago on $CHANS{$key}{net}. Server flags are $servstate","[JUNK]"); }
}
# if both server and channel context are found then then check for channel status and user modes...
else {
my $context = Xchat::find_context($CHANS{$key}{chan},$CHANS{$key}{net});
if ( $context ) {
Xchat::set_context($context);
my $user = Xchat::user_info();
Xchat::print("$logo\tDEBUG if ( ( $user->{prefix} eq '@' && $CHANS{$key}{expect} > 3 ) || ( $user->{prefix} eq '%' && $CHANS{$key}{expect} > 2 ) || ( $user->{prefix} eq '+' && $CHANS{$key}{expect} > 1 ) || ( !$user->{prefix} && $CHANS{$key}{expect} > 0 ) )","[JUNK]");
if ( ( $user->{prefix} eq '@' && $CHANS{$key}{expect} > 3 ) || ( $user->{prefix} eq '%' && $CHANS{$key}{expect} > 2 ) || ( $user->{prefix} eq '+' && $CHANS{$key}{expect} > 1 ) || ( !$user->{prefix} && $CHANS{$key}{expect} > 0 ) ) {
if ( !$CHANS{$key}{lastcmd} ) { $CHANS{$key}{lastcmd} = 0; }
if ( $CHANS{$key}{botcmd} && $BOTS{$CHANS{$key}{botcmd}} && $now - $CHANS{$key}{lastcmd} > 30 ) {
my $nick = Xchat::get_info("nick");
my $cmd = $BOTS{$CHANS{$key}{botcmd}};
$cmd =~ s/\%chan/$CHANS{$key}{chan}/g;
$cmd =~ s/\%user/$nick/g;
Xchat::command($cmd);
Xchat::print("$logo\tYou are expecting $CHANS{$key}{expect} but only have $user->{prefix} in $CHANS{$key}{chan} on $CHANS{$key}{net}. Need to fix that by using $cmd","[JUNK]");
$CHANS{$key}{lastcmd} = $now;
}
elsif ( $CHANS{$key}{botcmd} && !$BOTS{$CHANS{$key}{botcmd}} ) { Xchat::print("$logo\tERROR: You are expecting $CHANS{$key}{expect} but only have $user->{prefix} in $CHANS{$key}{chan} on $CHANS{$key}{net} but the configured botcmd named $CHANS{$key}{botcmd} is not defined.","[JUNK]" ); }
elsif ( !$CHANS{$key}{botcmd} ) { Xchat::print("$logo\tYou are expecting $CHANS{$key}{expect} but only have $user->{prefix} in $CHANS{$key}{chan} on $CHANS{$key}{net} and no botcmd was defined.","[JUNK]" ); }
else { Xchat::print("$logo\tRetry for botcmd $CHANS{$key}{botcmd} in $CHANS{$key}{chan} on $CHANS{$key}{net} not yet expired.","[JUNK]" ); }
}
}
}
}
Xchat::unhook( $chantimer );
$chantimer = Xchat::hook_timer( $SETTINGS{chan_check}*1000,"$INFO{name}::chan_check" );
}