summaryrefslogtreecommitdiffstats
path: root/scripts/target.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/target.pl')
-rw-r--r--scripts/target.pl163
1 files changed, 163 insertions, 0 deletions
diff --git a/scripts/target.pl b/scripts/target.pl
new file mode 100644
index 0000000..b049cb9
--- /dev/null
+++ b/scripts/target.pl
@@ -0,0 +1,163 @@
+use strict;
+
+use vars qw($VERSION %IRSSI);
+$VERSION = "2003020801";
+%IRSSI = (
+ authors => "Stefan 'tommie' Tomanek",
+ contact => "stefan\@pico.ruhr.de",
+ name => "Target",
+ description => "advances IRC warfare to the next level ;)",
+ license => "GPLv2",
+ url => "http://scripts.irssi.org",
+ sbitems => 'target',
+ changed => "$VERSION",
+ commands => "target"
+);
+
+use Irssi 20020324;
+use Irssi::TextUI;
+use vars qw(%target);
+
+sub draw_box ($$$$) {
+ my ($title, $text, $footer, $colour) = @_;
+ my $box = '';
+ $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
+ foreach (split(/\n/, $text)) {
+ $box .= '%R|%n '.$_."\n";
+ } $box .= '%R`--<%n'.$footer.'%R>->%n';
+ $box =~ s/%.//g unless $colour;
+ return $box;
+}
+
+sub show_help() {
+ my $help=$IRSSI{name}." ".$VERSION."
+/target lock <nick>
+ Target <nick> for current channel
+/target unlock
+ Unlock current target
+/target kick [reason]
+ Kick the locked target
+/target ban [reason]
+ Knockout the selected target
+";
+ my $text = '';
+ foreach (split(/\n/, $help)) {
+ $_ =~ s/^\/(.*)$/%9\/$1%9/;
+ $text .= $_."\n";
+ }
+ print CLIENTCRAP draw_box($IRSSI{name}." help", $text, "help", 1) ;
+}
+
+
+sub lock_target ($$$) {
+ my ($server, $channel, $nick) = @_;
+ my $witem = $server->window_find_item($channel);
+ $witem->print("%R>>%n Target acquired: +>".$nick."<+", MSGLEVEL_CLIENTCRAP) if (ref $witem && not $target{$server->{tag}}{$channel} eq $nick);
+ $target{$server->{tag}}{$channel} = $nick;
+ Irssi::statusbar_items_redraw('target');
+}
+
+sub unlock_target ($$) {
+ my ($server, $channel) = @_;
+ delete $target{$server->{tag}}{$channel};
+ delete $target{$server->{tag}} unless (keys %{ $target{$server->{tag}} });
+ Irssi::statusbar_items_redraw('target');
+}
+
+sub kick_target ($$$$) {
+ my ($server, $witem, $ban, $reason) = @_;
+ my $nick = $target{$server->{tag}}{$witem->{name}};
+ return unless $nick;
+ #my $reason = 'Target destroyed';
+ my $cmd = 'kick '.$nick.' '.$reason;
+ if ($ban) {
+ $cmd = 'kn '.$nick.' '.$reason;
+ }
+ $witem->command($cmd);
+}
+
+sub sb_target ($$) {
+ my ($item, $get_size_only) = @_;
+ my $line = '';
+ my $witem = Irssi::active_win()->{active};
+ if (ref $witem && $witem->{type} eq 'CHANNEL') {
+ my $tag = $witem->{server}->{tag};
+ if ($target{$tag}{$witem->{name}}) {
+ $line .= '+>';
+ if ($witem->nick_find($target{$tag}{$witem->{name}})) {
+ $line .= '%R';
+ } else {
+ $line .= '%y';
+ }
+ $line .= $target{$tag}{$witem->{name}};
+ $line .= '%n';
+ $line .= '<+';
+ }
+ }
+ my $format = "{sb ".$line."}";
+ $item->{min_size} = $item->{max_size} = length($line);
+ $item->default_handler($get_size_only, $format, 0, 1);
+}
+
+sub sig_message_kick ($$$$$$) {
+ my ($server, $channel, $nick, $kicker, $address, $reason) = @_;
+ if (Irssi::settings_get_bool('target_lock_only_on_own_kicks')) {
+ return unless ($kicker eq $server->{nick});
+ }
+ lock_target($server, $channel, $nick);
+ Irssi::statusbar_items_redraw('target');
+}
+
+sub cmd_target ($$$) {
+ my ($args, $server, $witem) = @_;
+ my @arg = split(/ +/, $args);
+ if (@arg == 0) {
+ # list targets
+ show_help();
+ } elsif ($arg[0] eq 'lock') {
+ return unless $server;
+ return unless ref $witem;
+ return unless $witem->{type} eq 'CHANNEL';
+ return unless defined $arg[1];
+ lock_target($server, $witem->{name}, $arg[1]);
+ } elsif ($arg[0] eq 'unlock') {
+ return unless $server;
+ return unless ref $witem;
+ return unless $witem->{type} eq 'CHANNEL';
+ unlock_target($server, $witem->{name});
+ } elsif ($arg[0] eq 'kick') {
+ shift @arg;
+ return unless $server;
+ return unless ref $witem;
+ return unless $witem->{type} eq 'CHANNEL';
+ my $reason = @arg ? join(" ", @arg) : 'Target destroyed';;
+ kick_target($server, $witem, 0, $reason);
+ } elsif ($arg[0] eq 'ban') {
+ shift @arg;
+ return unless $server;
+ return unless ref $witem;
+ return unless $witem->{type} eq 'CHANNEL';
+ my $reason = @arg ? join(" ", @arg) : 'Target destroyed';;
+ kick_target($server, $witem, 1, $reason);
+ } elsif ($arg[0] eq 'help') {
+ show_help();
+ }
+}
+
+
+Irssi::signal_add('message join', sub { Irssi::statusbar_items_redraw('target'); });
+Irssi::signal_add('message part', sub { Irssi::statusbar_items_redraw('target'); });
+Irssi::signal_add('window item changed', sub { Irssi::statusbar_items_redraw('target'); });
+Irssi::signal_add('window changed', sub { Irssi::statusbar_items_redraw('target'); });
+Irssi::signal_add('message kick', \&sig_message_kick);
+Irssi::statusbar_item_register('target', 0, 'sb_target');
+
+Irssi::settings_add_bool($IRSSI{name}, 'target_lock_only_on_own_kicks', 0);
+
+Irssi::command_bind('target', \&cmd_target);
+foreach my $cmd ('lock', 'unlock', 'kick', 'ban', 'help') {
+ Irssi::command_bind('target '.$cmd => sub {
+ cmd_openurl("$cmd ".$_[0], $_[1], $_[2]); });
+}
+
+print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /target help for help';