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';