summaryrefslogtreecommitdiffstats
path: root/scripts/bitlbee_join_notice.pl
blob: 53bfdfcc2c39d4041b2df265cc9faf1f4980f52f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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