use Irssi; use Irssi::Irc; use strict; use vars qw($VERSION %IRSSI); $VERSION = "1.0.2"; %IRSSI = ( author => "b0nk", contact => "b0nk\@hardchats", name => "rejoin", description => "Continually attempt to rejoin channel until successful", ); my $delay=2; my $tag; my %chantags; my %chandelays; my $krj=0; sub my_rejoin { my ( $data, $server, $witem ) = @_; my ( $channel, $pass ) = split( / +/, $data ); my $checkchan; if(!($channel =~ /#\S+/)) { Irssi::print("\nRejoin by b0nk\@hardchats Usage\n\ /rejoin [pass] - attempt to join until successful\ /lrejoin - list rejoin attempts\ /krejoin - trigger auto rejoin on kick\ /rmrejoin - remove from autorejoin"); return; } if($witem eq "kicked" or !Irssi::channel_find($channel)) { Irssi::print("Attempting to rejoin $channel"); $server->send_raw( "JOIN $channel $pass" ); $tag = Irssi::timeout_add( $delay * 1000, "my_rj", "$server->{tag} $channel $pass"); $chantags{ $channel } = $tag; $chandelays{ $channel } = 0; } else { Irssi::print("Already in $channel, moron"); } } sub my_krejoin { my ( $server, $data ) = @_; my ( $channel, $nick ) = split( / +/, $data ); return if ( $server->{ nick } ne $nick ); my $chanrec = $server->channel_find( $channel ); my $password = $chanrec->{ key } if ( $chanrec ); my $rejoinchan = $chanrec->{ name } if ( $chanrec ); my_rejoin(("$channel $password"),$server,"kicked"); } sub my_rj { my ( $data ) = @_; my ( $servtag, $channel, $pass ) = split( / +/, $data ); my $server = Irssi::server_find_tag( $servtag ); if( $server ) { $server->send_raw( "JOIN $channel $pass" ); } $chandelays{ $channel } += $delay; } sub rm_rjt { my ( $channel ) = @_; my $datestr; if ( $chantags{$channel->{name}} ) { Irssi::timeout_remove( $chantags{$channel->{name}} ); delete $chantags{$channel->{name}}; if ( $chandelays{$channel->{name}} > 2629743 ) { Irssi::print("Rejoined $channel->{name} after over a month"); } elsif ( $chandelays{$channel->{name}} == 0 ) { Irssi::print("Rejoined $channel->{name} immediately"); } else { $datestr=sprintf("%dd%dh%dm%ds",(gmtime $chandelays{$channel->{name}})[7,2,1,0]); Irssi::print("Rejoined $channel->{name} after $datestr"); } delete $chandelays{$channel->{name}}; } } sub no_print_bant { my ( $server, $data, $srvr ) = @_; my ( $nick, $channel, $msg ) = split(/ +/, $data ); if ( exists $chantags{$channel} ) { Irssi::signal_stop_by_name('event 474'); } } Irssi::signal_add( 'channel sync', 'rm_rjt' ); Irssi::signal_add_first( 'event 474' , 'no_print_bant' ); Irssi::command_bind( 'rejoin', 'my_rejoin' ); Irssi::command_bind( krejoin => sub { my $arg = shift; if ( $arg eq "on" && $krj == 0 ) { $krj=1; Irssi::signal_add( 'event kick', 'my_krejoin' ); Irssi::print("Kick Rejoin: ON"); } elsif ( $arg eq "off" && $krj == 1 ) { $krj=0; Irssi::signal_remove( 'event kick', 'my_krejoin' ); Irssi::print("Kick Rejoin: OFF"); } else { if ( $krj == 1 ) { Irssi::print("Kick Rejoin: ON"); } else { Irssi::print("Kick Rejoin: OFF"); } } } ); Irssi::command_bind( rmrejoin => sub { my $arg = shift; if ( $chantags{$arg} ) { Irssi::timeout_remove( $chantags{$arg} ); delete $chantags{$arg}; delete $chandelays{$arg}; Irssi::print("Removed Rejoin for $arg"); } } ); Irssi::command_bind( lrejoin => sub { Irssi::print("Attempting to rejoin:"); while ( my ($chan, $ctag) = each(%chantags) ) { my $datestr=sprintf("%dd%dh%dm%ds",(gmtime $chandelays{$chan})[7,2,1,0]); Irssi::print("$chan ($datestr)"); } } );