html/bitlbee_join_notice.pl


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