diff options
Diffstat (limited to 'scripts/bitlbee_join_notice.pl')
-rw-r--r-- | scripts/bitlbee_join_notice.pl | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/scripts/bitlbee_join_notice.pl b/scripts/bitlbee_join_notice.pl new file mode 100644 index 0000000..53bfdfc --- /dev/null +++ b/scripts/bitlbee_join_notice.pl @@ -0,0 +1,109 @@ +# CHANGELOG: +# +# 2010-08-10 (version 1.3) +# * new bitlbee server detection +# +# 2004-11-28: +# * adds join message to query +# +# /statusbar window add join_notice +# use Data::Dumper; + +use strict; +use Irssi::TextUI; +#use Irssi::Themes; +use Data::Dumper; + +use vars qw($VERSION %IRSSI); + +$VERSION = '1.3'; +%IRSSI = ( + authors => 'Tijmen "timing" Ruizendaal', + contact => 'tijmen.ruizendaal@gmail.com', + name => 'BitlBee_join_notice', + description => '1. Adds an item to the status bar wich shows [joined: <nicks>] when someone is joining &bitlbee. 2. Shows join messages in the query. (For bitlbee v3.0+)', + sbitems => 'join_notice', + license => 'GPLv2', + url => 'http://the-timing.nl/stuff/irssi-bitlbee', + changed => '2010-08-10' +); +my %timers; +my $bitlbee_server; # server object +my @control_channels; # mostly: &bitlbee, &facebook etc. +init(); + +sub init { # if script is loaded after connect + my @servers = Irssi::servers(); + foreach my $server(@servers) { + if( $server->isupport('NETWORK') eq 'BitlBee' ){ + $bitlbee_server = $server; + my @channels = $server->channels(); + foreach my $channel(@channels) { + if( $channel->{mode} =~ /C/ ){ + push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels); + } + } + } + } +} +# if connect after script is loaded +Irssi::signal_add_last('event 005' => sub { + my( $server ) = @_; + if( $server->isupport('NETWORK') eq 'BitlBee' ){ + $bitlbee_server = $server; + } +}); +# if new control channel is synced after script is loaded +Irssi::signal_add_last('channel sync' => sub { + my( $channel ) = @_; + if( $channel->{mode} =~ /C/ && $channel->{server}->{tag} eq $bitlbee_server->{tag} ){ + push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels); + } +}); + +# BEGIN bitlbee_join_notice.pl + +my %online; + +sub event_join { + my ($server, $channel, $nick, $address) = @_; + $channel =~ s/^://g; + if ( (grep $_ eq $channel, @control_channels) && $server->{tag} eq $bitlbee_server->{tag}){ + $online{$nick} = 1; + Irssi::timeout_remove($timers{$nick}); + delete($timers{$nick}); + $timers{$nick} = Irssi::timeout_add_once(7000, 'empty', $nick); + Irssi::statusbar_items_redraw('join_notice'); + my $window = Irssi::window_find_item($nick); + if($window){ + $window->printformat(Irssi::MSGLEVEL_JOINS, 'join', $nick, $address, $channel); + } + } +} +sub join_notice { + my ($item, $get_size_only) = @_; + my $line; + foreach my $key (keys(%online) ){ + $line = $line." ".$key; + } + if ($line ne "" ){ + $item->default_handler($get_size_only, "{sb joined:$line}", undef, 1); + $line = ""; + } else { + $item->default_handler($get_size_only, "", undef, 1); + } +} +sub empty { + my $nick = shift; + delete($online{$nick}); + Irssi::timeout_remove($timers{$nick}); + delete($timers{$nick}); + Irssi::statusbar_items_redraw('join_notice'); +} + +Irssi::signal_add('event join', 'event_join' ); +Irssi::statusbar_item_register('join_notice', undef, 'join_notice'); +Irssi::statusbars_recreate_items(); +Irssi::theme_register([ 'join', '{channick_hilight $0} {chanhost $1} has joined {channel $2}', ]); + +# END bitlbee_join_notice.pl |