diff options
Diffstat (limited to 'scripts/servercomplete.pl')
| -rw-r--r-- | scripts/servercomplete.pl | 85 | 
1 files changed, 85 insertions, 0 deletions
| diff --git a/scripts/servercomplete.pl b/scripts/servercomplete.pl new file mode 100644 index 0000000..4d92f96 --- /dev/null +++ b/scripts/servercomplete.pl @@ -0,0 +1,85 @@ +use Irssi 20020101.0250 (); +$VERSION = "2"; +%IRSSI = ( +    authors     => 'David Leadbeater', +    contact     => 'dgl@dgl.cx', +    name        => 'servercomplete', +    description => 'Tab complete servers and userhosts (irc. -> irc server, user@ -> user@host). Useful for lazy ircops for /squit and so on :)', +    license     => 'GNU GPLv2 or later', +    url         => 'http://irssi.dgl.yi.org/', +); + +use strict; +my %servers; + +sub sig_complete { +  my ($complist, $window, $word, $linestart, $want_space) = @_; +  my $tag = $window->{active_server}->{tag}; + +  if($word =~ /[!*@]/) { +	 my $wi = Irssi::active_win()->{active}; +	 return unless ref $wi and $wi->{type} eq 'CHANNEL'; +	 my $server = $wi->{server}; +	 return unless ref $server; + +	 my($nick,$ident,$host) = ('','',''); + +	 $nick = $1 if $word =~ /([^!]+)!/ && $1; +	 $ident = $1 if $word !~ /!$/ && $word =~ /!?([^@]+)(@|$)/ && $1; +	 $host = $1 if $word =~ /@(.*)$/ && $1; + +	 for my $n ($wi->nicks()) { +		next if not_wild($nick) and $n->{nick} !~ /^\Q$nick\E/i; + +		my($user,$addr) = split(/@/, $n->{host}); + +		next if not_wild($ident) and $user !~ /^\Q$ident\E/i; +		next if not_wild($host) and $addr !~ /^\Q$host\E/i; + +		if($word =~ /!/) { +		   push @$complist, get_match($n->{nick}, $nick) . '!' . get_match($user, $ident) . '@' . get_match($addr,$host); +		}else{ +		   push @$complist, get_match($user, $ident) . '@' . get_match($addr,$host); +		} +	 } +  } +   +  return unless $servers{$tag}; +  for (keys %{$servers{$tag}}) { +	 push @$complist, $_ if /^\Q$word\E/; +  } +} + +sub get_match { +   my($match, $thing) = @_; +   return $thing eq '*' ? '*' : $match; +} + +sub not_wild { +   return 0 if($_[0] eq '*' || $_[0] eq ''); +   1; +} + +sub add_server { +   my($tag,$data,$offset) = @_; +   $servers{$tag}{(split(/ /,$data))[$offset]} = 1; +} + +Irssi::signal_add_last('complete word', 'sig_complete'); + +Irssi::signal_add('event 352', sub { +   my($server,$data) = @_; +   add_server($server->{tag}, $data, 4); +} ); + +Irssi::signal_add('event 312', sub {  +   my($server,$data) = @_; +   add_server($server->{tag}, $data, 2); +} ); + +Irssi::signal_add('event 364', sub {  +   my($server,$data) = @_; +   add_server($server->{tag}, $data, 1); +   add_server($server->{tag}, $data, 2); +} ); + | 
