diff options
Diffstat (limited to 'modules/classes.pl')
| -rw-r--r-- | modules/classes.pl | 38 |
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; |
