1use strict;
2
3use vars qw($VERSION %IRSSI);
4$VERSION = "2003020801";
5%IRSSI = (
6    authors     => "Stefan 'tommie' Tomanek",
7    contact     => "stefan\@pico.ruhr.de",
8    name        => "Target",
9    description => "advances IRC warfare to the next level ;)",
10    license     => "GPLv2",
11    url         => "http://scripts.irssi.org",
12    sbitems     => 'target',
13    changed     => "$VERSION",
14    commands	=> "target"
15);
16
17use Irssi 20020324;
18use Irssi::TextUI;
19use vars qw(%target);
20
21sub draw_box ($$$$) {
22    my ($title, $text, $footer, $colour) = @_;
23    my $box = '';
24    $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
25    foreach (split(/\n/, $text)) {
26        $box .= '%R|%n '.$_."\n";
27    }                                                                               $box .= '%R`--<%n'.$footer.'%R>->%n';
28    $box =~ s/%.//g unless $colour;
29    return $box;
30}
31
32sub show_help() {
33    my $help=$IRSSI{name}." ".$VERSION."
34/target lock <nick>
35    Target <nick> for current channel
36/target unlock
37    Unlock current target
38/target kick [reason]
39    Kick the locked target
40/target ban [reason]
41    Knockout the selected target
42";
43    my $text = '';
44    foreach (split(/\n/, $help)) {
45        $_ =~ s/^\/(.*)$/%9\/$1%9/;
46        $text .= $_."\n";
47    }
48    print CLIENTCRAP draw_box($IRSSI{name}." help", $text, "help", 1) ;
49}
50
51
52sub lock_target ($$$) {
53    my ($server, $channel, $nick) = @_;
54    my $witem = $server->window_find_item($channel);
55    $witem->print("%R>>%n Target acquired: +>".$nick."<+", MSGLEVEL_CLIENTCRAP) if (ref $witem && not $target{$server->{tag}}{$channel} eq $nick);
56    $target{$server->{tag}}{$channel} = $nick;
57    Irssi::statusbar_items_redraw('target');
58}
59
60sub unlock_target ($$) {
61    my ($server, $channel) = @_;
62    delete $target{$server->{tag}}{$channel};
63    delete $target{$server->{tag}} unless (keys %{ $target{$server->{tag}} });
64    Irssi::statusbar_items_redraw('target');
65}
66
67sub kick_target ($$$$) {
68    my ($server, $witem, $ban, $reason) = @_;
69    my $nick = $target{$server->{tag}}{$witem->{name}};
70    return unless $nick;
71    #my $reason = 'Target destroyed';
72    my $cmd = 'kick '.$nick.' '.$reason;
73    if ($ban) {
74	$cmd = 'kn '.$nick.' '.$reason;
75    }
76    $witem->command($cmd);
77}
78
79sub sb_target ($$) {
80    my ($item, $get_size_only) = @_;
81    my $line = '';
82    my $witem = Irssi::active_win()->{active};
83    if (ref $witem && $witem->{type} eq 'CHANNEL') {
84	my $tag = $witem->{server}->{tag};
85	if ($target{$tag}{$witem->{name}}) {
86	    $line .= '+>';
87	    if ($witem->nick_find($target{$tag}{$witem->{name}})) {
88		$line .= '%R';
89	    } else {
90		$line .= '%y';
91	    }
92	    $line .= $target{$tag}{$witem->{name}};
93	    $line .= '%n';
94	    $line .= '<+';
95	}
96    }
97    my $format = "{sb ".$line."}";
98    $item->{min_size} = $item->{max_size} = length($line);
99    $item->default_handler($get_size_only, $format, 0, 1);
100}
101
102sub sig_message_kick ($$$$$$) {
103    my ($server, $channel, $nick, $kicker, $address, $reason) = @_;
104    if (Irssi::settings_get_bool('target_lock_only_on_own_kicks')) {
105	return unless ($kicker eq $server->{nick});
106    }
107    lock_target($server, $channel, $nick);
108    Irssi::statusbar_items_redraw('target');
109}
110
111sub cmd_target ($$$) {
112    my ($args, $server, $witem) = @_;
113    my @arg = split(/ +/, $args);
114    if (@arg == 0) {
115	# list targets
116	show_help();
117    } elsif ($arg[0] eq 'lock') {
118	return unless $server;
119	return unless ref $witem;
120	return unless $witem->{type} eq 'CHANNEL';
121	return unless defined $arg[1];
122	lock_target($server, $witem->{name}, $arg[1]);
123    } elsif ($arg[0] eq 'unlock') {
124	return unless $server;
125        return unless ref $witem;
126        return unless $witem->{type} eq 'CHANNEL';
127	unlock_target($server, $witem->{name});
128    } elsif ($arg[0] eq 'kick') {
129	shift @arg;
130	return unless $server;
131	return unless ref $witem;
132	return unless $witem->{type} eq 'CHANNEL';
133        my $reason = @arg ? join(" ", @arg) : 'Target destroyed';;
134	kick_target($server, $witem, 0, $reason);
135    } elsif ($arg[0] eq 'ban') {
136	shift @arg;
137        return unless $server;
138        return unless ref $witem;
139        return unless $witem->{type} eq 'CHANNEL';
140        my $reason = @arg ? join(" ", @arg) : 'Target destroyed';;
141        kick_target($server, $witem, 1, $reason);
142    } elsif ($arg[0] eq 'help') {
143	show_help();
144    }
145}
146
147
148Irssi::signal_add('message join', sub { Irssi::statusbar_items_redraw('target'); });
149Irssi::signal_add('message part', sub { Irssi::statusbar_items_redraw('target'); });
150Irssi::signal_add('window item changed', sub { Irssi::statusbar_items_redraw('target'); });
151Irssi::signal_add('window changed', sub { Irssi::statusbar_items_redraw('target'); });
152Irssi::signal_add('message kick', \&sig_message_kick);
153Irssi::statusbar_item_register('target', 0, 'sb_target');
154
155Irssi::settings_add_bool($IRSSI{name}, 'target_lock_only_on_own_kicks', 0);
156
157Irssi::command_bind('target', \&cmd_target);
158foreach my $cmd ('lock', 'unlock', 'kick', 'ban', 'help') {
159    Irssi::command_bind('target '.$cmd => sub {
160        cmd_openurl("$cmd ".$_[0], $_[1], $_[2]); });
161}
162
163print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /target help for help';
164