diff options
Diffstat (limited to 'scripts/autowho.pl')
| -rw-r--r-- | scripts/autowho.pl | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/scripts/autowho.pl b/scripts/autowho.pl new file mode 100644 index 0000000..35e3795 --- /dev/null +++ b/scripts/autowho.pl @@ -0,0 +1,101 @@ +use strict; +use warnings; + +our $VERSION = '0.1'; # 486977756197d40 +our %IRSSI = ( +    authors     => 'Nei', +    contact     => 'Nei @ anti@conference.jabber.teamidiot.de', +    url         => "http://anti.teamidiot.de/", +    name        => 'autowho', +    description => 'Periodically sends /who on configured channels to update away state.', +    license     => 'ISC', +   ); + +# Options +# ======= +# /set autowho_time <time> +# * time interval for periodic /who +# +# /set autowho_channel net1/#chan1 net2/ +# * space separated list of network/channel entries (network/ for the +#   whole network) +# + +use Irssi; + +my $timer; +my $single_timer; +my $time = 0; +my $max_sync; +my %netchans; +my %who_done; + +sub _want_chan { +    my ($server, $c) = @_; +    return unless $server; +    return unless $c; +    my $tag = lc $server->{tag}; +    my $chan = lc $c->{visible_name}; +    my $netchan = "$tag/$chan"; +    return unless exists $netchans{"$tag/"} || exists $netchans{$netchan} || exists $netchans{"/$chan"}; +    return 1; +} + +sub run_who_single { +    $single_timer = undef; +    for my $server (Irssi::servers) { +	next unless $server->isa('Irssi::Irc::Server'); +	for my $channel ($server->channels) { +	    next if $who_done{ $channel->{_irssi} }; +	    if (_want_chan($server, $channel) && @{[ $channel->nicks ]} <= $max_sync) { +		$server->redirect_event("who", 1, $channel->{name}, -1, '', { +		    "event 352" => "silent event who", +		    # TODO: make end of who trigger the next run instead of timer below +		    "" => "event empty" +		   }); +		$server->send_raw('WHO '.$channel->{name}); +	    } +	    $who_done{ $channel->{_irssi} } = 1; +	    $single_timer = Irssi::timeout_add_once(3_000 + rand 1_000, 'run_who_single', ''); +	    return; +	} +    } +} + +sub run_who { +    unless ($single_timer) { # still running +	%who_done = (); +	run_who_single(); +    } +    $timer = Irssi::timeout_add_once($time + rand 10_000, 'run_who', ''); +} + +sub sig_setup_changed { +    $max_sync = Irssi::settings_get_int('channel_max_who_sync'); +    my @channels = split ' ', lc Irssi::settings_get_str('autowho_channel'); +    %netchans = map { ($_ => 1) } @channels; +    my $new_time = Irssi::settings_get_time('autowho_time'); +    if ($new_time != $time) { +	$time = $new_time; +	if ($timer) { +	    Irssi::timeout_remove($timer); +	    $timer = undef; +	} +	if ($time > 0) { +	    $time = 60_000 if $time < 60_000; # minimum of 1 minute +	    $timer = Irssi::timeout_add_once($time + rand 10_000, 'run_who', ''); +	} +    } +} + +sub init { +    sig_setup_changed(); +} + +Irssi::settings_add_time('autowho', 'autowho_time', '5min'); +Irssi::settings_add_str('autowho', 'autowho_channel', ''); + +Irssi::signal_add('setup changed' => 'sig_setup_changed'); + +init(); + | 
