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