mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-20 02:49:49 +01:00
ea198bcab1
chanops: moved flushqueues to inside loop anti-flood/bantracker: now tracks quiets as well as bans anti-flood: should now ban proxied hosts using a banned nickserv account -- untested
116 lines
2.8 KiB
Perl
116 lines
2.8 KiB
Perl
# File: BanTracker.pm
|
|
# Author: pragma_
|
|
#
|
|
# Purpose: Populates and maintains channel banlists by checking mode +b on
|
|
# joining channels and by tracking modes +b and -b in channels.
|
|
#
|
|
# Does NOT do banning or unbanning.
|
|
|
|
package PBot::BanTracker;
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
use vars qw($VERSION);
|
|
$VERSION = $PBot::PBot::VERSION;
|
|
|
|
use Time::HiRes qw/gettimeofday/;
|
|
use Time::Duration;
|
|
use Data::Dumper;
|
|
use Carp ();
|
|
|
|
sub new {
|
|
if(ref($_[1]) eq 'HASH') {
|
|
Carp::croak("Options to BanTracker should be key/value pairs, not hash reference");
|
|
}
|
|
|
|
my ($class, %conf) = @_;
|
|
|
|
my $self = bless {}, $class;
|
|
$self->initialize(%conf);
|
|
return $self;
|
|
}
|
|
|
|
sub initialize {
|
|
my ($self, %conf) = @_;
|
|
|
|
my $pbot = delete $conf{pbot} // Carp::croak("Missing pbot reference to BanTracker");
|
|
$self->{pbot} = $pbot;
|
|
|
|
$self->{banlist} = {};
|
|
|
|
$pbot->commands->register(sub { return $self->dumpbans(@_) }, "dumpbans", 60);
|
|
}
|
|
|
|
sub dumpbans {
|
|
my ($self, $from, $nick, $user, $host, $arguments) = @_;
|
|
|
|
my $bans = Dumper($self->{banlist});
|
|
return $bans;
|
|
}
|
|
|
|
sub get_banlist {
|
|
my ($self, $conn, $event) = @_;
|
|
my $channel = lc $event->{args}[1];
|
|
|
|
delete $self->{banlist}->{$channel};
|
|
|
|
$self->{pbot}->logger->log("Retrieving banlist for $channel.\n");
|
|
$conn->sl("mode $channel +bq");
|
|
}
|
|
|
|
sub get_baninfo {
|
|
my ($self, $mask) = @_;
|
|
|
|
$mask = quotemeta $mask;
|
|
|
|
$mask =~ s/\\\*/.*?/g;
|
|
$mask =~ s/\\\?/./g;
|
|
|
|
$self->{pbot}->logger->log("get-baninfo: mask regex: $mask\n");
|
|
|
|
foreach my $channel (keys %{ $self->{banlist} }) {
|
|
foreach my $banmask (keys %{ $self->{banlist}{$channel} }) {
|
|
if($banmask =~ m/$mask/i) {
|
|
my $baninfo = {};
|
|
$baninfo->{channel} = $channel;
|
|
$baninfo->{owner} = $self->{banlist}{$channel}[0];
|
|
return $baninfo;
|
|
}
|
|
}
|
|
}
|
|
|
|
return undef;
|
|
}
|
|
|
|
sub on_banlistentry {
|
|
my ($self, $conn, $event) = @_;
|
|
my $channel = lc $event->{args}[1];
|
|
my $target = lc $event->{args}[2];
|
|
my $source = lc $event->{args}[3];
|
|
my $timestamp = $event->{args}[4];
|
|
|
|
my $ago = ago(gettimeofday - $timestamp);
|
|
|
|
$self->{pbot}->logger->log("ban-tracker: [banlist entry] $channel: $target banned by $source $ago.\n");
|
|
$self->{banlist}->{$channel}->{$target} = [ $source, $timestamp ];
|
|
}
|
|
|
|
sub track_mode {
|
|
my $self = shift;
|
|
my ($source, $mode, $target, $channel) = @_;
|
|
|
|
if($mode eq "+b" or $mode eq "+q") {
|
|
$self->{pbot}->logger->log("ban-tracker: $target banned by $source in $channel.\n");
|
|
$self->{banlist}->{$channel}->{$target} = [ $source, gettimeofday ];
|
|
}
|
|
elsif($mode eq "-b" or $mode eq "-q") {
|
|
$self->{pbot}->logger->log("ban-tracker: $target unbanned by $source in $channel.\n");
|
|
delete $self->{banlist}->{$channel}->{$target};
|
|
} else {
|
|
$self->{pbot}->logger->log("BanTracker: Unknown mode '$mode'\n");
|
|
}
|
|
}
|
|
|
|
1;
|