use Irssi;
use strict;
use vars qw($VERSION %IRSSI);

$VERSION = "0.0.1";
%IRSSI = (
    authors     => 'Petr Baudis',
    name        => 'autovoice',
    description => 'Artificially intelligent auto-voice script',
    license     => 'BSD',
);

my %dmasks;

sub cmd_autovoice {
        my ($data) = @_;

	foreach my $chan (keys %dmasks) {
		next unless ($dmasks{$chan});
		my $str = "[$chan] ";
		foreach my $mask (@{$dmasks{$chan}}) {
			$str .= $mask . ", ";
		}
		$str .= "...";
		Irssi::print($str);
	}
	Irssi::print("Q.E.D.");
}

sub event_massjoin {
	my ($channel, $nicks_list) = @_;
	my @nicks = @{$nicks_list};

	return unless ($channel->{chanop});

	foreach my $nickrec (@nicks) {
my $n = 1;
		if (defined $dmasks{$channel->{name}}) {
	  	foreach my $mask (@{$dmasks{$channel->{name}}}) {
			if ($channel->{server}->mask_match_address($mask, $nickrec->{nick}, $nickrec->{host})) {
			$n = 0; last; }
		} }
		$channel->command("/voice ".$nickrec->{nick})
			if ($n);
	}
}

sub event_mode {
	my ($server, $data, $nick, $addr) = @_;
	my ($channel, @mmode) = split(/ /, $data);
	my ($mode, @args) = @mmode;
	my $operation;
	my $chanptr = $server->channel_find($channel);

	return if ($nick eq $server->{nick});
	Irssi::print "mode proc [@_] ($channel @mmode) $mode : @args";
	foreach my $mchar (split //, $mode) {
		if ($mchar =~ /[+-]/) { $operation = $mchar; next; }
		if ($mchar =~ /[eIbolk]/) { shift @args; }
		if ($mchar ne 'v') { next; }
		my $victim = $args[0];
		my $victptr = $chanptr->nick_find($victim);
		Irssi::print "MODE coming on.. $operation ! Is ". $dmasks{$channel} ." hmpf!";
		if ($operation eq '+') { if (defined $dmasks{$channel}) {
			my @masks = @{$dmasks{$channel}};
			for (my $i = 0; $i < @masks; $i++) {
				if ($server->mask_match_address($masks[$i], $victim, $victptr->{host})) {
					Irssi::print "Now voicing ".$masks[$i]."..";
					splice(@masks, $i, 1);
					$i--;
				}
			} $dmasks{$channel} = \@masks; }
		} else {
my $n = 1;
			foreach my $mask (@{$dmasks{$channel}}) {
				$n = 0, last
					if ($server->mask_match_address($mask, $victim, $victptr->{host}));
			}
			if ($n) {
				my $vm;
				push(@{$dmasks{$channel}}, $vm = $chanptr->ban_get_mask($victim, 0));
				Irssi::print "Now not voicing ".$vm."..";
			}
		}
	}
}

Irssi::command_bind('autovoice', 'cmd_autovoice');
Irssi::signal_add_last('massjoin', 'event_massjoin');
Irssi::signal_add_last('event mode', 'event_mode');
