summaryrefslogtreecommitdiffstats
path: root/modules/classes.pl
diff options
context:
space:
mode:
Diffstat (limited to 'modules/classes.pl')
-rw-r--r--modules/classes.pl38
1 files changed, 38 insertions, 0 deletions
diff --git a/modules/classes.pl b/modules/classes.pl
index 3ccd113..93c5e12 100644
--- a/modules/classes.pl
+++ b/modules/classes.pl
@@ -2,6 +2,8 @@ package ASM::Classes;
use strict;
use warnings;
+use Text::LevenshteinXS qw(distance);
+
my %sf = ();
sub new
@@ -19,6 +21,7 @@ sub new
"host" => \&host,
"gecos" => \&gecos,
"nuhg" => \&nuhg,
+ "levenflood" => \&levenflood,
};
$self->{ftbl} = $tbl;
bless($self);
@@ -31,6 +34,40 @@ sub check {
return $self->{ftbl}->{$item}->(@_);
}
+my %ls = ();
+sub levenflood {
+ my ($xchk, $id, $event, $chan) = @_;
+ my $text;
+ if ($event->{type} =~ /^(public|notice|part|caction)$/) {
+ $text=$event->{args}->[0];
+ }
+ return 0 unless defined($text);
+ return 0 unless length($text) >= 30;
+ if ( ! defined($ls{$chan}) ) {
+ $ls{$chan} = [ $text ];
+ return 0;
+ }
+ my @leven = @{$ls{$chan}};
+ my $ret = 0;
+ if ( $#leven >= 5 ) {
+ my $mx = 0;
+ foreach my $item ( @leven ) {
+ next unless length($text) eq length($item);
+ my $tld = distance($text, $item);
+ if ($tld <= 4) {
+ $mx = $mx + 1;
+ }
+ }
+ if ($mx >= 5) {
+ $ret = 1;
+ }
+ }
+ push(@leven, $text);
+ shift @leven if $#leven > 10;
+ $ls{$chan} = \@leven;
+ return $ret;
+}
+
sub dnsbl {
my ($xchk, $id, $event, $chan, $rev) = @_;
my %chk = %{$xchk};
@@ -177,4 +214,5 @@ sub flood_process {
}
}
+
return 1;