summaryrefslogtreecommitdiff
path: root/scripts/autorejoin.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/autorejoin.pl')
-rw-r--r--scripts/autorejoin.pl71
1 files changed, 38 insertions, 33 deletions
diff --git a/scripts/autorejoin.pl b/scripts/autorejoin.pl
index 2d23449f..42c97da7 100644
--- a/scripts/autorejoin.pl
+++ b/scripts/autorejoin.pl
@@ -1,6 +1,5 @@
-# automatically rejoin to channel after kicked
-
-# /SET autorejoin_channels #channel1 #channel2 ...
+# automatically rejoin to channel after kick
+# delayed rejoin: Lam 28.10.2001 (lam@lac.pl)
# NOTE: I personally don't like this feature, in most channels I'm in it
# will just result as ban. You've probably misunderstood the idea of /KICK
@@ -10,43 +9,49 @@ use Irssi;
use Irssi::Irc;
use strict;
use vars qw($VERSION %IRSSI);
-
-$VERSION = "1.00";
+$VERSION = "1.0.0";
%IRSSI = (
- authors => 'Timo Sirainen',
- name => 'autorejoin',
- description => 'Automatically rejoin to channel after kicked',
- license => 'Public Domain',
- changed => 'Sun Mar 10 23:18 EET 2002'
+ authors => "Timo 'cras' Sirainen, Leszek Matok",
+ contact => "lam\@lac.pl",
+ name => "autorejoin",
+ description => "Automatically rejoin to channel after being kick, after a (short) user-defined delay",
+ license => "GPLv2",
+ changed => "10.3.2002 14:00"
);
-sub channel_rejoin {
- my ($server, $channel) = @_;
- # check if channel has password
- my $chanrec = $server->channel_find($channel);
- my $password = $chanrec->{key} if ($chanrec);
+# How many seconds to wait before the rejoin?
+# TODO: make this a /setting
+my $delay = 5;
+
+my @tags;
+my $acttag = 0;
+
+sub rejoin {
+ my ( $data ) = @_;
+ my ( $tag, $servtag, $channel, $pass ) = split( / +/, $data );
- # We have to use send_raw() because the channel record still
- # exists and irssi won't even try to join to it with command()
- $server->send_raw("JOIN $channel $password");
+ my $server = Irssi::server_find_tag( $servtag );
+ $server->send_raw( "JOIN $channel $pass" ) if ( $server );
+ Irssi::timeout_remove( $tags[$tag] );
}
sub event_rejoin_kick {
- my ($server, $data) = @_;
- my ($channel, $nick) = split(/ +/, $data);
-
- return if ($server->{nick} ne $nick);
-
- # check if we want to autorejoin this channel
- my @chans = split(/[ ,]+/, Irssi::settings_get_str('autorejoin_channels'));
- foreach my $chan (@chans) {
- if (lc($chan) eq lc($channel)) {
- channel_rejoin($server, $channel);
- last;
- }
- }
+ my ( $server, $data ) = @_;
+ my ( $channel, $nick ) = split( / +/, $data );
+
+ return if ( $server->{ nick } ne $nick );
+
+ # check if channel has password
+ my $chanrec = $server->channel_find( $channel );
+ my $password = $chanrec->{ key } if ( $chanrec );
+ my $rejoinchan = $chanrec->{ name } if ( $chanrec );
+ my $servtag = $server->{ tag };
+
+ Irssi::print "Rejoining $rejoinchan in $delay seconds.";
+ $tags[$acttag] = Irssi::timeout_add( $delay * 1000, "rejoin", "$acttag $servtag $rejoinchan $password" );
+ $acttag++;
+ $acttag = 0 if ( $acttag > 60 );
}
-Irssi::settings_add_str('misc', 'autorejoin_channels', '');
-Irssi::signal_add('event kick', 'event_rejoin_kick');
+Irssi::signal_add( 'event kick', 'event_rejoin_kick' );