mirror of
https://github.com/pragma-/pbot.git
synced 2024-11-26 22:09:26 +01:00
Ban timeouts hash converted to DualIndexHashObject to properly group masks by channels
This commit is contained in:
parent
58d45480a5
commit
416115f12f
@ -326,7 +326,7 @@ sub check_flood {
|
||||
}
|
||||
} elsif($mode == $self->{FLOOD_CHAT}) {
|
||||
# don't increment offenses again if already banned
|
||||
return if exists $self->{pbot}->chanops->{unban_timeout}->hash->{"*!$user\@$host"};
|
||||
return if $self->{pbot}->chanops->{unban_timeout}->find_index($channel, "*!$user\@$host");
|
||||
|
||||
$self->message_history->{$account}->{channels}->{$channel}{offenses}++;
|
||||
$self->message_history->{$account}->{channels}->{$channel}{last_offense_timestamp} = gettimeofday;
|
||||
@ -416,26 +416,23 @@ sub prune_message_history {
|
||||
sub unbanme {
|
||||
my ($self, $from, $nick, $user, $host, $arguments) = @_;
|
||||
my $channel = lc $arguments;
|
||||
$host = lc $host;
|
||||
$nick = lc $nick;
|
||||
$user = lc $user;
|
||||
$host = lc $host;
|
||||
|
||||
if(not defined $arguments or not defined $channel) {
|
||||
return "/msg $nick Usage: unbanme <channel>";
|
||||
}
|
||||
|
||||
my $banmask = address_to_mask($host);
|
||||
my $banmask = lc address_to_mask($host);
|
||||
|
||||
my $mask = lc "*!$user\@$banmask\$##stop_join_flood";
|
||||
my $mask = "*!$user\@$banmask\$##stop_join_flood";
|
||||
|
||||
if(not exists $self->{pbot}->{chanops}->{unban_timeout}->hash->{$mask}) {
|
||||
if(not $self->{pbot}->{chanops}->{unban_timeout}->find_index($channel, $mask)) {
|
||||
return "/msg $nick There is no temporary ban set for $mask in channel $channel.";
|
||||
}
|
||||
|
||||
if(not $self->{pbot}->chanops->{unban_timeout}->hash->{$mask}{channel} eq $channel) {
|
||||
return "/msg $nick There is no temporary ban set for $mask in channel $channel.";
|
||||
}
|
||||
|
||||
my $baninfo = $self->{pbot}->bantracker->get_baninfo(lc "$nick!$user\@$host");
|
||||
my $baninfo = $self->{pbot}->bantracker->get_baninfo("$nick!$user\@$host");
|
||||
|
||||
if(defined $baninfo) {
|
||||
if($self->ban_whitelisted($baninfo->{channel}, $baninfo->{banmask})) {
|
||||
@ -455,8 +452,6 @@ sub unbanme {
|
||||
}
|
||||
|
||||
$self->{pbot}->chanops->unban_user($mask, $channel);
|
||||
delete $self->{pbot}->chanops->{unban_timeout}->hash->{$mask};
|
||||
$self->{pbot}->chanops->{unban_timeout}->save_hash();
|
||||
|
||||
return "/msg $nick You have been unbanned from $channel.";
|
||||
}
|
||||
@ -484,6 +479,8 @@ sub address_to_mask {
|
||||
sub check_bans {
|
||||
my ($self, $bans, $mask) = @_;
|
||||
|
||||
$self->{pbot}->logger->log("anti-flood: [check-bans] checking for bans on ($mask)\n");
|
||||
|
||||
my $baninfo = $self->{pbot}->bantracker->get_baninfo($mask);
|
||||
|
||||
if(defined $baninfo) {
|
||||
@ -502,7 +499,7 @@ sub check_bans {
|
||||
$banmask_regex =~ s/\\\?/./g;
|
||||
|
||||
if($baninfo->{type} eq '+q' and $mask =~ /^$banmask_regex$/i) {
|
||||
$self->{pbot}->logger->log("anti-flood: [check-bans] Hostmask matches quiet banmask, disregarding\n");
|
||||
$self->{pbot}->logger->log("anti-flood: [check-bans] Hostmask ($mask) matches quiet banmask ($banmask_regex), disregarding\n");
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
@ -128,8 +128,9 @@ sub track_mode {
|
||||
$self->{pbot}->logger->log("ban-tracker: $target " . ($mode eq '-b' ? 'unbanned' : 'unquieted') . " by $source in $channel.\n");
|
||||
delete $self->{banlist}->{$channel}->{$mode eq "-b" ? "+b" : "+q"}->{$target};
|
||||
|
||||
delete $self->{pbot}->chanops->{unban_timeout}->hash->{$target};
|
||||
$self->{pbot}->chanops->{unban_timeout}->save_hash();
|
||||
if($self->{pbot}->chanops->{unban_timeout}->find_index($channel, $target)) {
|
||||
$self->{pbot}->chanops->{unban_timeout}->remove($channel, $target);
|
||||
}
|
||||
} else {
|
||||
$self->{pbot}->logger->log("BanTracker: Unknown mode '$mode'\n");
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ sub initialize {
|
||||
}
|
||||
|
||||
$self->{pbot} = $pbot;
|
||||
$self->{unban_timeout} = PBot::HashObject->new(pbot => $pbot, name => 'Unban Timeouts', filename => "$pbot->{data_dir}/unban_timeouts");
|
||||
$self->{unban_timeout} = PBot::DualIndexHashObject->new(pbot => $pbot, name => 'Unban Timeouts', filename => "$pbot->{data_dir}/unban_timeouts");
|
||||
$self->{op_commands} = {};
|
||||
$self->{is_opped} = {};
|
||||
|
||||
@ -91,8 +91,10 @@ sub unban_user {
|
||||
my $self = shift;
|
||||
my ($mask, $channel) = @_;
|
||||
$self->{pbot}->logger->log("Unbanning $mask\n");
|
||||
delete $self->{unban_timeout}->hash->{$mask};
|
||||
$self->{unban_timeout}->save_hash();
|
||||
if($self->{unban_timeout}->find_index($channel, $mask)) {
|
||||
$self->{unban_timeout}->hash->{$channel}->{$mask}{timeout} = gettimeofday + 7200; # try again in 2 hours if unban doesn't immediately succeed
|
||||
$self->{unban_timeout}->save;
|
||||
}
|
||||
unshift @{ $self->{op_commands}->{$channel} }, "mode $channel -b $mask";
|
||||
$self->gain_ops($channel);
|
||||
}
|
||||
@ -102,9 +104,8 @@ sub ban_user_timed {
|
||||
my ($mask, $channel, $length) = @_;
|
||||
|
||||
$self->ban_user($mask, $channel);
|
||||
$self->{unban_timeout}->hash->{$mask}{timeout} = gettimeofday + $length;
|
||||
$self->{unban_timeout}->hash->{$mask}{channel} = $channel;
|
||||
$self->{unban_timeout}->save_hash();
|
||||
$self->{unban_timeout}->hash->{$channel}->{$mask}{timeout} = gettimeofday + $length;
|
||||
$self->{unban_timeout}->save;
|
||||
}
|
||||
|
||||
sub check_unban_timeouts {
|
||||
@ -114,12 +115,11 @@ sub check_unban_timeouts {
|
||||
|
||||
my $now = gettimeofday();
|
||||
|
||||
foreach my $mask (keys %{ $self->{unban_timeout}->hash }) {
|
||||
if($self->{unban_timeout}->hash->{$mask}{timeout} < $now) {
|
||||
$self->unban_user($mask, $self->{unban_timeout}->hash->{$mask}{channel});
|
||||
} else {
|
||||
# my $timediff = $self->{unban_timeout}->hash->{$mask}{timeout} - $now;
|
||||
# $self->{pbot}->logger->log("ban: $mask has $timediff seconds remaining\n");
|
||||
foreach my $channel (keys %{ $self->{unban_timeout}->hash }) {
|
||||
foreach my $mask (keys %{ $self->{unban_timeout}->hash->{$channel} }) {
|
||||
if($self->{unban_timeout}->hash->{$channel}->{$mask}{timeout} < $now) {
|
||||
$self->unban_user($mask, $channel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -341,6 +341,12 @@ sub remove {
|
||||
}
|
||||
|
||||
delete $self->hash->{$primary}->{$secondary};
|
||||
|
||||
# remove primary group if no more secondaries
|
||||
if(scalar keys $self->hash->{$primary} == 0) {
|
||||
delete $self->hash->{$primary};
|
||||
}
|
||||
|
||||
$self->save();
|
||||
return "'$secondary' removed from $primary group [$self->{name}].";
|
||||
}
|
||||
|
@ -161,9 +161,8 @@ sub on_mode {
|
||||
else { # bot not targeted
|
||||
if($mode eq "+b") {
|
||||
if($nick eq "ChanServ") {
|
||||
$self->{pbot}->chanops->{unban_timeout}->hash->{$target}{timeout} = gettimeofday + 3600 * 2; # 2 hours
|
||||
$self->{pbot}->chanops->{unban_timeout}->hash->{$target}{channel} = $channel;
|
||||
$self->{pbot}->chanops->{unban_timeout}->save_hash();
|
||||
$self->{pbot}->chanops->{unban_timeout}->hash->{$channel}->{$target}{timeout} = gettimeofday + 3600 * 2; # 2 hours
|
||||
$self->{pbot}->chanops->{unban_timeout}->save;
|
||||
}
|
||||
}
|
||||
elsif($mode eq "+e" && $channel eq $self->{pbot}->botnick) {
|
||||
|
@ -146,7 +146,7 @@ sub initialize {
|
||||
$self->{chanops} = PBot::ChanOps->new(pbot => $self);
|
||||
$self->{chanopcmds} = PBot::ChanOpCommands->new(pbot => $self);
|
||||
|
||||
$self->{chanops}->{unban_timeout}->load_hash();
|
||||
$self->{chanops}->{unban_timeout}->load;
|
||||
|
||||
$self->{quotegrabs} = PBot::Quotegrabs->new(
|
||||
pbot => $self,
|
||||
|
@ -13,7 +13,7 @@ use warnings;
|
||||
# These are set automatically by the build/commit script
|
||||
use constant {
|
||||
BUILD_NAME => "PBot",
|
||||
BUILD_REVISION => 411,
|
||||
BUILD_REVISION => 412,
|
||||
BUILD_DATE => "2013-07-24",
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user