diff options
Diffstat (limited to '')
-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); +} ); + |