html/target.pl
1 use strict;
2
3 use 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
17 use Irssi 20020324;
18 use Irssi::TextUI;
19 use vars qw(%target);
20
21 sub 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
32 sub 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
52 sub 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
60 sub 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
67 sub 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
79 sub 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
102 sub 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
111 sub 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
148 Irssi::signal_add('message join', sub { Irssi::statusbar_items_redraw('target'); });
149 Irssi::signal_add('message part', sub { Irssi::statusbar_items_redraw('target'); });
150 Irssi::signal_add('window item changed', sub { Irssi::statusbar_items_redraw('target'); });
151 Irssi::signal_add('window changed', sub { Irssi::statusbar_items_redraw('target'); });
152 Irssi::signal_add('message kick', \&sig_message_kick);
153 Irssi::statusbar_item_register('target', 0, 'sb_target');
154
155 Irssi::settings_add_bool($IRSSI{name}, 'target_lock_only_on_own_kicks', 0);
156
157 Irssi::command_bind('target', \&cmd_target);
158 foreach my $cmd ('lock', 'unlock', 'kick', 'ban', 'help') {
159 Irssi::command_bind('target '.$cmd => sub {
160 cmd_openurl("$cmd ".$_[0], $_[1], $_[2]); });
161 }
162
163 print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /target help for help';