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