diff options
| author | Ailin Nemui | 2016-01-08 16:59:55 +0100 |
|---|---|---|
| committer | Ailin Nemui | 2016-01-08 16:59:55 +0100 |
| commit | ff286886edf1b061847833ae5c5f8629d10d829a (patch) | |
| tree | 554d00cf4a88ebd107fc3e47c8f2b535e42116c0 /scripts/bitlbee_typing_notice.pl | |
| parent | 3efcdf844f95149261e304a1c1f0fc4c6c7a2d3c (diff) | |
| download | scripts.irssi.org-ff286886edf1b061847833ae5c5f8629d10d829a.tar.bz2 | |
bitlbee_typing_notice 1.7.2
Diffstat (limited to 'scripts/bitlbee_typing_notice.pl')
| -rw-r--r-- | scripts/bitlbee_typing_notice.pl | 148 |
1 files changed, 89 insertions, 59 deletions
diff --git a/scripts/bitlbee_typing_notice.pl b/scripts/bitlbee_typing_notice.pl index 50fe47c..e1d1186 100644 --- a/scripts/bitlbee_typing_notice.pl +++ b/scripts/bitlbee_typing_notice.pl @@ -14,6 +14,9 @@ # # Changelog: # +# 2016-01-01 (version 1.7.2) +# * Fix crash in Irssi during disconnect +# # 2010-08-09 (version 1.7.1) # * Multiple control channels supported by checking chanmodes # @@ -77,7 +80,7 @@ use Data::Dumper; use vars qw($VERSION %IRSSI); -$VERSION = '1.7.1'; +$VERSION = '1.7.2'; %IRSSI = ( authors => 'Tijmen "timing" Ruizendaal, Matt "f0rked" Sparks', contact => 'tijmen.ruizendaal@gmail.com, root@f0rked.com', @@ -85,22 +88,22 @@ $VERSION = '1.7.1'; description => '1. Adds an item to the status bar wich shows [typing] when someone is typing a message on the supported IM-networks 2. Sends typing notices to the supported IM networks (the other way arround). (For bitlbee 3.0+)', license => 'GPLv2', url => 'http://the-timing.nl/stuff/irssi-bitlbee, http://f0rked.com', - changed => '2010-08-09', ); -my $bitlbee_server; # server object -my @control_channels; # mostly: &bitlbee, &facebook etc. +my %bitlbee_tag; # 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 $T = $server->{tag}; + $bitlbee_tag{$T} = 1; my @channels = $server->channels(); foreach my $channel(@channels) { if( $channel->{mode} =~ /C/ ){ - push @control_channels, $channel->{name} unless (grep $_ eq $channel->{name}, @control_channels); + push @{ $control_channels{$T} }, $channel->{name} unless (grep $_ eq $channel->{name}, @{ $control_channels{$T} // [] }); } } } @@ -110,14 +113,15 @@ sub init { # if script is loaded after connect Irssi::signal_add_last('event 005' => sub { my( $server ) = @_; if( $server->isupport('NETWORK') eq 'BitlBee' ){ - $bitlbee_server = $server; + $bitlbee_tag{ $server->{tag} } = 1; } }); # 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); + my $T = $channel->{server}->{tag}; + if( $channel->{mode} =~ /C/ && $bitlbee_tag{$T} ){ + push @{ $control_channels{$T} }, $channel->{name} unless (grep $_ eq $channel->{name}, @{ $control_channels{$T} // [] }); } }); @@ -140,81 +144,89 @@ my $to_char = Irssi::settings_get_str("completion_char"); # mostly: : sub event_ctcp_msg { my ($server, $msg, $from, $address) = @_; - return if $server->{tag} ne $bitlbee_server->{tag}; + my $tag = $server->{tag}; + return unless $bitlbee_tag{ $tag }; if ( my($type) = $msg =~ "TYPING ([0-9])" ){ Irssi::signal_stop(); if( $type == 0 ){ - unset_typing($from); + unset_typing($tag, $from); } elsif( $type == 1 ){ - $typing{$from}=1; + my $k = "$tag/$from"; + $typing{$k}=1; if( $address !~ /\@login\.oscar\.aol\.com/ and $address !~ /\@YAHOO/ and $address !~ /\@login\.icq\.com/ ){ - Irssi::timeout_remove($tag{$from}); - delete($tag{$from}); - $tag{$from}=Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000,"unset_typing",$from); + Irssi::timeout_remove($tag{$k}); + delete($tag{$k}); + $tag{$k}=Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000,"unset_typing",[$tag,$from]); } - redraw($from); + redraw($tag, $from); } elsif( $type == 2 ){ - stale_typing($from); + stale_typing($tag, $from); } } } sub unset_typing { - my($from,$no_redraw)=@_; - delete $typing{$from} if $typing{$from}; - Irssi::timeout_remove($tag{$from}); - delete($tag{$from}); - redraw($from) if !$no_redraw; + my($tag,$from,$no_redraw)=@_; + my $k = "$tag/$from"; + delete $typing{$k} if $typing{$k}; + Irssi::timeout_remove($tag{$k}); + delete($tag{$k}); + redraw($tag, $from) if !$no_redraw; } sub stale_typing { - my($from)=@_; - $typing{$from}=2; - redraw($from); + my($tag,$from)=@_; + my $k = "$tag/$from"; + $typing{$k}=2; + redraw($tag, $from); } sub redraw { - my($from)=@_; + my($tag,$from)=@_; my $window = Irssi::active_win(); my $name = $window->get_active_name(); # only redraw if current window equals to the typing person, is a control channel or if allwin is set - if( $from eq $name || (grep $_ eq $name, @control_channels) || Irssi::settings_get_bool("bitlbee_typing_allwin") ){ + if( $from eq $name || (grep $_ eq $name, @{ $control_channels{$tag} // [] }) || Irssi::settings_get_bool("bitlbee_typing_allwin") ){ Irssi::statusbar_items_redraw('typing_notice'); } } sub event_msg { my ($server,$data,$from,$address,$target) = @_; - return if $server->{tag} ne $bitlbee_server->{tag}; + my $tag = $server->{tag}; + return unless $bitlbee_tag{ $tag }; my $channel=Irssi::active_win()->get_active_name(); - unset_typing $from, "no redraw"; - unset_typing $channel; + unset_typing $tag, $from, "no redraw"; + unset_typing $tag, $channel; } sub event_quit { my $server = shift; - return if $server->{tag} ne $bitlbee_server->{tag}; + my $tag = $server->{tag}; + return unless $bitlbee_tag{ $tag }; my $nick = shift; - unset_typing $nick; + unset_typing $tag, $nick; } sub typing_notice { my ($item, $get_size_only) = @_; my $window = Irssi::active_win(); + my $tag = Irssi::active_server->{tag}; my $channel = $window->get_active_name(); + my $k = "$tag/$channel"; - if (exists($typing{$channel})) { - my $append=$typing{$channel}==2 ? " (stale)" : ""; + if (exists($typing{$k})) { + my $append=$typing{$k}==2 ? " (stale)" : ""; $item->default_handler($get_size_only, "{sb typing$append}", 0, 1); } else { $item->default_handler($get_size_only, "", 0, 1); - Irssi::timeout_remove($tag{$channel}); - delete($tag{$channel}); + Irssi::timeout_remove($tag{$k}); + delete($tag{$k}); } # we check for correct windows again, because the statusbar item is redrawn after window change too. - if( (grep $_ eq $channel, @control_channels) || Irssi::settings_get_bool("bitlbee_typing_allwin")) { - foreach my $key (keys(%typing)) { + if( (grep $_ eq $channel, @{ $control_channels{$tag} // [] }) || Irssi::settings_get_bool("bitlbee_typing_allwin")) { + foreach my $key (sort keys(%typing)) { $line .= " ".$key; if ($typing{$key}==2) { $line .= " (stale)"; } } @@ -228,7 +240,7 @@ sub typing_notice { sub window_change { Irssi::statusbar_items_redraw('typing_notice'); my $win = !Irssi::active_win() ? undef : Irssi::active_win()->{active}; - if (ref $win && ($win->{server}->{tag} eq $bitlbee_server->{tag})) { + if (ref $win && defined $win->{server}->{tag} && $bitlbee_tag{ $win->{server}->{tag} }) { if (!$keylog_active) { $keylog_active = 1; Irssi::signal_add_last('gui key pressed', 'key_pressed'); @@ -244,24 +256,24 @@ sub window_change { sub key_pressed { return if !Irssi::settings_get_bool("bitlbee_send_typing"); my $key = shift; - if ($key != 9 && $key != 10 && $lastkey != 27 && $key != 27 + if ($key != 9 && $key != 10 && $key != 13 && $lastkey != 27 && $key != 27 && $lastkey != 91 && $key != 126 && $key != 127) { my $server = Irssi::active_server(); my $window = Irssi::active_win(); my $nick = $window->get_active_name(); - - if ($server->{tag} eq $bitlbee_server->{tag} && $nick ne "(status)" && $nick ne "root") { - if( grep $_ eq $nick, @control_channels ){ # send typing if in control channel + my $tag = $server->{tag}; + if (defined $tag && $bitlbee_tag{ $tag } && $nick ne "(status)" && $nick ne "root") { + if( grep $_ eq $nick, @{ $control_channels{$tag} // [] } ){ # send typing if in control channel my $input = Irssi::parse_special("\$L"); my ($first_word) = split(/ /,$input); if ($input !~ /^$command_char.*/ && $first_word =~ s/$to_char$//){ - send_typing($first_word); + send_typing($tag, $first_word); } } else { # or any other channels / query my $input = Irssi::parse_special("\$L"); if ($input !~ /^$command_char.*/ && length($input) > 0){ - send_typing($nick); + send_typing($tag, $nick); } } } @@ -269,35 +281,53 @@ sub key_pressed { $lastkey = $key; } +sub delete_server { + my $tag = shift; + delete $bitlbee_tag{$tag}; + delete $control_channels{$tag}; + undef; +} + sub out_empty { my ($a) = @_; my($nick,$tag)=@{$a}; - delete($out_typing{$nick}); - Irssi::timeout_remove($timer_tag{$nick}); - delete($timer_tag{$nick}); - $bitlbee_server->command("^CTCP $nick TYPING 0"); + my $k = "$tag/$nick"; + delete($out_typing{$k}); + Irssi::timeout_remove($timer_tag{$k}); + delete($timer_tag{$k}); + if (my $bitlbee_server = Irssi::server_find_tag($tag)) { + $bitlbee_server->command("^CTCP $nick TYPING 0"); + } else { + delete_server($tag); + } } sub send_typing { - my $nick = shift; - if (!exists($out_typing{$nick}) || time - $out_typing{$nick} > $KEEP_TYPING_TIMEOUT) { - $bitlbee_server->command("^CTCP $nick TYPING 1"); - $out_typing{$nick} = time; + my ($tag, $nick) = @_; + my $k = "$tag/$nick"; + if (!exists($out_typing{$k}) || time - $out_typing{$k} > $KEEP_TYPING_TIMEOUT) { + if (my $bitlbee_server = Irssi::server_find_tag($tag)) { + $bitlbee_server->command("^CTCP $nick TYPING 1"); + } else { + delete_server($tag); + } + $out_typing{$k} = time; ### Reset 'stop-typing' timer - Irssi::timeout_remove($timer_tag{$nick}); - delete($timer_tag{$nick}); + Irssi::timeout_remove($timer_tag{$k}); + delete($timer_tag{$k}); ### create new timer - $timer_tag{$nick} = Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000, 'out_empty', ["$nick", $bitlbee_server->{tag}]); + $timer_tag{$k} = Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000, 'out_empty', ["$nick", $tag]); } } #README: Delete the old bitlbee_send_typing string from ~/.irssi/config. A boolean is better. -sub db_typing { +sub db_typing { + local $Data::Dumper::Sortkeys = 1; print "Detected channels: "; - print Dumper(@control_channels); - print "Detected server tag: ".$bitlbee_server->{tag}; + print Dumper(%control_channels); + print "Detected server tag: ".join ", ", sort keys %bitlbee_tag; print "Tag: ".Dumper(%tag); print "Timer Tag: ".Dumper(%timer_tag); print "Typing: ".Dumper(%typing); |
