1# CHANGELOG: 2# 3# 2010-08-10 (version 1.3) 4# * new bitlbee server detection 5# 6# 2004-11-28: 7# * adds join message to query 8# 9# /statusbar window add join_notice 10# use Data::Dumper; 11 12use strict; 13use Irssi::TextUI; 14#use Irssi::Themes; 15use Data::Dumper; 16 17use vars qw($VERSION %IRSSI); 18 19$VERSION = '1.3'; 20%IRSSI = ( 21 authors => 'Tijmen "timing" Ruizendaal', 22 contact => 'tijmen.ruizendaal@gmail.com', 23 name => 'BitlBee_join_notice', 24 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+)', 25 sbitems => 'join_notice', 26 license => 'GPLv2', 27 url => 'http://the-timing.nl/stuff/irssi-bitlbee', 28 changed => '2010-08-10' 29); 30my %timers; 31my $bitlbee_server; # server object 32my @control_channels; # mostly: &bitlbee, &facebook etc. 33init(); 34 35sub init { # if script is loaded after connect 36 my @servers = Irssi::servers(); 37 foreach my $server(@servers) { 38 if( $server->isupport('NETWORK') eq 'BitlBee' ){ 39 $bitlbee_server = $server; 40 my @channels = $server->channels(); 41 foreach my $channel(@channels) { 42 if( $channel->{mode} =~ /C/ ){ 43 push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels); 44 } 45 } 46 } 47 } 48} 49# if connect after script is loaded 50Irssi::signal_add_last('event 005' => sub { 51 my( $server ) = @_; 52 if( $server->isupport('NETWORK') eq 'BitlBee' ){ 53 $bitlbee_server = $server; 54 } 55}); 56# if new control channel is synced after script is loaded 57Irssi::signal_add_last('channel sync' => sub { 58 my( $channel ) = @_; 59 if( $channel->{mode} =~ /C/ && $channel->{server}->{tag} eq $bitlbee_server->{tag} ){ 60 push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels); 61 } 62}); 63 64# BEGIN bitlbee_join_notice.pl 65 66my %online; 67 68sub event_join { 69 my ($server, $channel, $nick, $address) = @_; 70 $channel =~ s/^://g; 71 if ( (grep $_ eq $channel, @control_channels) && $server->{tag} eq $bitlbee_server->{tag}){ 72 $online{$nick} = 1; 73 Irssi::timeout_remove($timers{$nick}); 74 delete($timers{$nick}); 75 $timers{$nick} = Irssi::timeout_add_once(7000, 'empty', $nick); 76 Irssi::statusbar_items_redraw('join_notice'); 77 my $window = Irssi::window_find_item($nick); 78 if($window){ 79 $window->printformat(Irssi::MSGLEVEL_JOINS, 'join', $nick, $address, $channel); 80 } 81 } 82} 83sub join_notice { 84 my ($item, $get_size_only) = @_; 85 my $line; 86 foreach my $key (keys(%online) ){ 87 $line = $line." ".$key; 88 } 89 if ($line ne "" ){ 90 $item->default_handler($get_size_only, "{sb joined:$line}", undef, 1); 91 $line = ""; 92 } else { 93 $item->default_handler($get_size_only, "", undef, 1); 94 } 95} 96sub empty { 97 my $nick = shift; 98 delete($online{$nick}); 99 Irssi::timeout_remove($timers{$nick}); 100 delete($timers{$nick}); 101 Irssi::statusbar_items_redraw('join_notice'); 102} 103 104Irssi::signal_add('event join', 'event_join' ); 105Irssi::statusbar_item_register('join_notice', undef, 'join_notice'); 106Irssi::statusbars_recreate_items(); 107Irssi::theme_register([ 'join', '{channick_hilight $0} {chanhost $1} has joined {channel $2}', ]); 108 109# END bitlbee_join_notice.pl 110