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