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 | |
| parent | 3efcdf844f95149261e304a1c1f0fc4c6c7a2d3c (diff) | |
| download | scripts.irssi.org-ff286886edf1b061847833ae5c5f8629d10d829a.tar.bz2 | |
bitlbee_typing_notice 1.7.2
| -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);	 | 
