The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# $Id: Kick.pm,v 1.5 2000-06-30 23:53:02-04 roderick Exp $
#
# Copyright (c) 1997-2000 Roderick Schertler.  All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.

use strict;

package Sirc::Kick;

use Exporter		();
use Sirc::Chantrack	qw(%Chan_op);
use Sirc::Util		qw(addcmd arg_count_error ban_pattern docommand
			    have_ops optional_channel timer userhost xtell);

use vars qw($VERSION @ISA @EXPORT_OK $Debug);

BEGIN {
    $VERSION  = do{my@r=q$Revision: 1.5 $=~/\d+/g;sprintf '%d.'.'%03d'x$#r,@r};
    $VERSION .= '-l' if q$Locker:  $ =~ /: \S/;

    # ban_pattern() is exportable because it used to live here.
    @ISA		= qw(Exporter);
    @EXPORT_OK		= qw(ban_pattern kb kbtmp);
    $Debug		= 0;
}

sub debug {
    xtell 'kick debug ' . join '', @_
	if $Debug;
}

sub kb {
    debug "kb @_";
    unless (@_ == 2 || @_ == 3) {
	arg_count_error undef, '2 or 3', @_;
	return;
    }
    my ($channel, $n, $reason) = @_;
    have_ops $channel or return;
    userhost $n, sub {
	my $pattern = ban_pattern $::who, $::user, $::host;
	docommand "^alias unban mode $channel -b $pattern";
	docommand "mode $channel -o+b $::who $pattern";
	docommand "kick $channel $::who $reason";
    };
}
docommand "^alias unban /eval Sirc::Util::tell_question 'No previous pattern'";

# kickban, /kb [channel] nick reason

sub main::cmd_kb {
    debug "cmd_kb $::args";
    optional_channel or return;
    kb split ' ', $::args, 3;
}
addcmd 'kb';

# kbtmp channel nick reason

sub kbtmp {
    debug "kbtmp @_";
    unless (@_ == 2 || @_ == 3) {
	arg_count_error undef, '2 or 3', @_;
	return;
    }
    my ($channel, $n, $reason) = @_;
    have_ops $channel or return;
    userhost $n, sub {
	my $pattern = "$n!*\@*";
	my $op = $Chan_op{$channel}{$n};
    	docommand "mode $channel "
	    	    . ($op ? '-o' : '')
		    . '+b'
		    . ($op ? " $n": '')
		    . " $pattern";
    	docommand "kick $channel $n $reason";
	timer 10, sub { docommand "mode $channel -b $pattern" };
    };
}

# /k [channel] nick comment

sub main::cmd_k {
    debug "cmd_k $::args";
    optional_channel or return;
    kbtmp split ' ', $::args, 3;
}
addcmd 'k';

1;