html/servercomplete.pl
1 use Irssi 20020101.0250 ();
2 $VERSION = "2";
3 %IRSSI = (
4 authors => 'David Leadbeater',
5 contact => 'dgl@dgl.cx',
6 name => 'servercomplete',
7 description => 'Tab complete servers and userhosts (irc. -> irc server, user@ -> user@host). Useful for lazy ircops for /squit and so on :)',
8 license => 'GNU GPLv2 or later',
9 url => 'http://irssi.dgl.yi.org/',
10 );
11
12 use strict;
13 my %servers;
14
15 sub sig_complete {
16 my ($complist, $window, $word, $linestart, $want_space) = @_;
17 my $tag = $window->{active_server}->{tag};
18
19 if($word =~ /[!*@]/) {
20 my $wi = Irssi::active_win()->{active};
21 return unless ref $wi and $wi->{type} eq 'CHANNEL';
22 my $server = $wi->{server};
23 return unless ref $server;
24
25 my($nick,$ident,$host) = ('','','');
26
27 $nick = $1 if $word =~ /([^!]+)!/ && $1;
28 $ident = $1 if $word !~ /!$/ && $word =~ /!?([^@]+)(@|$)/ && $1;
29 $host = $1 if $word =~ /@(.*)$/ && $1;
30
31 for my $n ($wi->nicks()) {
32 next if not_wild($nick) and $n->{nick} !~ /^\Q$nick\E/i;
33
34 my($user,$addr) = split(/@/, $n->{host});
35
36 next if not_wild($ident) and $user !~ /^\Q$ident\E/i;
37 next if not_wild($host) and $addr !~ /^\Q$host\E/i;
38
39 if($word =~ /!/) {
40 push @$complist, get_match($n->{nick}, $nick) . '!' . get_match($user, $ident) . '@' . get_match($addr,$host);
41 }else{
42 push @$complist, get_match($user, $ident) . '@' . get_match($addr,$host);
43 }
44 }
45 }
46
47 return unless $servers{$tag};
48 for (keys %{$servers{$tag}}) {
49 push @$complist, $_ if /^\Q$word\E/;
50 }
51 }
52
53 sub get_match {
54 my($match, $thing) = @_;
55 return $thing eq '*' ? '*' : $match;
56 }
57
58 sub not_wild {
59 return 0 if($_[0] eq '*' || $_[0] eq '');
60 1;
61 }
62
63 sub add_server {
64 my($tag,$data,$offset) = @_;
65 $servers{$tag}{(split(/ /,$data))[$offset]} = 1;
66 }
67
68 Irssi::signal_add_last('complete word', 'sig_complete');
69
70 Irssi::signal_add('event 352', sub {
71 my($server,$data) = @_;
72 add_server($server->{tag}, $data, 4);
73 } );
74
75 Irssi::signal_add('event 312', sub {
76 my($server,$data) = @_;
77 add_server($server->{tag}, $data, 2);
78 } );
79
80 Irssi::signal_add('event 364', sub {
81 my($server,$data) = @_;
82 add_server($server->{tag}, $data, 1);
83 add_server($server->{tag}, $data, 2);
84 } );
85