From 6fe4d3ecbdc3196c7c62b9b7e00d5063bd0dbee9 Mon Sep 17 00:00:00 2001 From: William Heimbigner Date: Tue, 3 Jul 2007 23:26:43 +0000 Subject: code optimizations, rehash bugfix, lots of cleanup, new hilights, removed some old rules, added and improved some new rules --- modules/classes.pl | 38 ++++++++++++++++++++++++++++++++++++++ modules/command.pl | 2 +- modules/event.pl | 48 +++++++++++++++++++++++++----------------------- modules/inspect.pl | 24 ++++++------------------ modules/log.pl | 32 ++++++++++++++++++-------------- modules/mysql.pl | 3 +++ modules/xml.pl | 9 ++++----- 7 files changed, 95 insertions(+), 61 deletions(-) (limited to 'modules') 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; diff --git a/modules/command.pl b/modules/command.pl index 80cda19..b0523c4 100644 --- a/modules/command.pl +++ b/modules/command.pl @@ -25,7 +25,7 @@ sub command next unless defined($::users->{person}->{$nick}->{flags}); next unless (grep {$_ eq $command->{flag}} split('', $::users->{person}->{$nick}->{flags})); if ($::users->{person}->{$nick}->{host} ne 'IDENTIFY') { - next unless leq($::users->{person}->{$nick}->{host}, $event->{host}); + next unless (lc $::users->{person}->{$nick}->{host} eq lc $event->{host}); } else { if ( $cmd =~ /$command->{cmd}/ ){ diff --git a/modules/event.pl b/modules/event.pl index d644b20..ede0efd 100644 --- a/modules/event.pl +++ b/modules/event.pl @@ -67,7 +67,7 @@ sub on_connect { $conn->privmsg( 'NickServ', "ghost $::settings->{nick} $::settings->{pass}" ) if lc $event->{args}->[0] ne lc $::settings->{nick}; } -my @leven = (); +#my @leven = (); sub on_join { my ($self, $conn, $event) = @_; @@ -103,21 +103,21 @@ sub on_join { } } $::log->logg( $event ); - if ( $#leven ne -1 ) { - my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) ); - my $mx = $leven[0]; - foreach my $item ( @leven ) { - next if $nick eq $item; # avoid dups - my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) ); - if ($tld > $ld) { - $ld = $tld; - $mx = $item; - } - } - print "Best match for $nick was $mx with $ld\n" - } - push(@leven, $nick); - shift @leven if $#leven > 5; +# if ( $#leven ne -1 ) { +# my $ld = ( ( maxlen($nick, $leven[0]) - distance($nick, $leven[0]) ) / maxlen($nick, $leven[0]) ); +# my $mx = $leven[0]; +# foreach my $item ( @leven ) { +# next if $nick eq $item; # avoid dups +# my $tld = ( ( maxlen($nick, $item) - distance($nick, $item) ) / maxlen($nick, $item) ); +# if ($tld > $ld) { +# $ld = $tld; +# $mx = $item; +# } +# } +# print "Best match for $nick was $mx with $ld\n" +# } +# push(@leven, $nick); +# shift @leven if $#leven > 5; } sub on_part @@ -265,14 +265,16 @@ sub on_kick { } my $nick = lc $event->{to}->[0]; $::log->logg( $event ); - my @mship = @{$::sn{$nick}->{mship}}; - @mship = grep { lc $_ ne lc $event->{args}->[0] } @mship; - if ( @mship ) { - $::sn{$nick}->{mship} = \@mship; - } else { - delete($::sn{$nick}); + if (defined($::sn{$nick}) && defined($::sn{$nick}->{mship})) { + my @mship = @{$::sn{$nick}->{mship}}; + @mship = grep { lc $_ ne lc $event->{to}->[0] } @mship; + if ( @mship ) { + $::sn{$nick}->{mship} = \@mship; + } else { + delete($::sn{$nick}); + } } - if ( leq( $conn->{_nick}, $nick ) ) + if ( lc $conn->{_nick} eq lc $nick ) { delete( $::sc{lc $event->{args}->[0]} ); } diff --git a/modules/inspect.pl b/modules/inspect.pl index 9b03ca1..a5fd732 100644 --- a/modules/inspect.pl +++ b/modules/inspect.pl @@ -2,7 +2,6 @@ package ASM::Inspect; use warnings; use strict; -use List::Util qw(first); use Data::Dumper; %::ignored = (); @@ -24,16 +23,11 @@ sub inspect { my @override = []; our $unmode=''; my $nick = lc $event->{nick}; - return if (defined(first { ( lc $event->{nick} eq lc $_ ) } @::eline)); - return if (defined(first { ( lc $event->{user} eq lc $_ ) } @::eline)); - return if (defined(first { ( lc $event->{host} eq lc $_ ) } @::eline)); + return if (defined($::eline{$nick}) || defined($::eline{lc $event->{user}}) || defined(lc $event->{host})); $iaddr = gethostbyname($event->{host}); $rev = join('.', reverse(unpack('C4', $iaddr))).'.' if (defined $iaddr); %monx = defined($::channels->{channel}->{master}->{event}) ? %{$::channels->{channel}->{master}->{event}} : (); ## NB: isn't there a better way to do this with grep, somehow? -# foreach ( @::ignored ) { -# return if (lc $event->{nick} eq $_); -# } foreach $chan ( @{$event->{to}} ) { next unless $chan =~ /^#/; %conx = defined($::channels->{channel}->{lc $chan}->{event}) ? %{$::channels->{channel}->{lc $chan}->{event}} : (); @@ -41,11 +35,7 @@ sub inspect { foreach $id (keys %aonx) { next unless ( defined(first { lc $_ eq $event->{type} } split(/[,:; ]+/, $aonx{$id}{type}) ) ) || ( lc $event->{type} eq lc $aonx{$id}{type} ); -# next unless ( defined($::classes->{class}->{$aonx{$id}{class}})); $dct{$id} = $aonx{$id} if $::classes->check($aonx{$id}{class}, $aonx{$id}, $id, $event, $chan, $rev); -# my ($chk, $id, $event, $chan) = @_; -# eval "Classes::" . $aonx{$id}{class} . "();"; -# warn $@ if $@; } } foreach ( keys %dct ) { @@ -55,26 +45,24 @@ sub inspect { foreach $chan (@{$event->{to}}) { foreach $id ( keys %dct ) { $::db->record($chan, $event->{nick}, $event->{user}, $event->{host}, $::sn{lc $event->{nick}}->{gecos}, $dct{$id}{risk}, $id, $dct{$id}{reason}); - $txtz = "$dct{$id}{risk} risk threat: ". - "Detected $event->{nick} $dct{$id}{reason} in $chan "; + $txtz = "\x02$dct{$id}{risk}\x02 risk threat: ". + "Detected \x02$event->{nick}\x02 $dct{$id}{reason} in $chan "; $txtz = $txtz . ASM::Util->commaAndify(ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights')) if (ASM::Util->getAlert(lc $chan, $dct{$id}{risk}, 'hilights')); if (ASM::Util->cs(lc $chan)->{op} ne 'no') { if ($event->{type} eq 'topic') { #restore old topic my $oldtopic = $::sc{lc $event->{to}->[0]}{topic}{text}; - o_send( $conn, "topic $chan :$oldtopic"); - o_send( $conn, "mode $chan +t"); + $::oq->o_send( $conn, "topic $chan :$oldtopic"); + $::oq->o_send( $conn, "mode $chan +t"); } eval '$unmode = Actions::' . $dct{$id}{action} . '($conn, $event, $chan);'; warn $@ if $@; my $lconn=$conn; my $lunmode = $unmode; if ((int($dct{$id}{time}) ne 0) && ($unmode ne '')) { - $conn->schedule(int($dct{$id}{time}), sub { print "Timer called!\n"; o_send($lconn,$lunmode); }); + $conn->schedule(int($dct{$id}{time}), sub { print "Timer called!\n"; $::oq->o_send($lconn,$lunmode); }); } } unless (defined($::ignored{lc $event->{nick}}) && ($::ignored{lc $event->{nick}} >= $::RISKS{$dct{$id}{risk}})) { - print "alerting!\n"; my @tgts = ASM::Util->getAlert($chan, $dct{$id}{risk}, 'msgs'); - print Dumper(\@tgts); foreach my $tgt (@tgts) { $conn->privmsg($tgt, $txtz); } diff --git a/modules/log.pl b/modules/log.pl index 19b44b3..759a3ea 100644 --- a/modules/log.pl +++ b/modules/log.pl @@ -3,7 +3,7 @@ use strict; package ASM::Log; -use String::Interpolate qw(interpolate); +#use String::Interpolate qw(interpolate); use IO::All; use POSIX qw(strftime); use Data::Dumper; @@ -14,6 +14,7 @@ sub new my $config = shift; my $self = {}; $self->{CONFIG} = $config; + $self->{MD} = {}; bless($self); return $self; } @@ -29,21 +30,24 @@ sub logg foreach my $chan ( @chans ) { $chan = lc $chan; - io(interpolate($cfg->{dir}))->mkpath; + unless (defined($self->{MD}->{$chan}) && ($self->{MD}->{$chan} == 1)) { + io($cfg->{dir} . $chan)->mkpath; + $self->{MD}->{$chan} = 1; + } $_=''; - $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public'; - $_ = "*** $event->{nick} has joined $chan" if $event->{type} eq 'join'; - $_ = "*** $event->{nick} has left $chan" if $event->{type} eq 'part'; - $_ = "* $event->{nick} $event->{args}->[0]" if $event->{type} eq 'caction'; - $_ = "*** $event->{nick} is now known as $event->{args}->[0]" if $event->{type} eq 'nick'; - $_ = "*** $event->{nick} has quit IRC" if $event->{type} eq 'quit'; - $_ = "*** $event->{to}->[0] was kicked by $event->{nick}" if $event->{type} eq 'kick'; - $_ = "-$event->{nick}- $event->{args}->[0]" if $event->{type} eq 'notice'; - $_ = "*** $event->{nick} sets mode: ".join(" ",@{$event->{args}}) if $event->{type} eq 'mode'; - $_ = "*** $event->{nick} changes topic to \"$event->{args}->[0]\"" if $event->{type} eq 'topic'; + $_ = "<$event->{nick}> $event->{args}->[0]" if $event->{type} eq 'public'; + $_ = "*** $event->{nick} has joined $chan" if $event->{type} eq 'join'; + $_ = "*** $event->{nick} has left $chan" if $event->{type} eq 'part'; + $_ = "* $event->{nick} $event->{args}->[0]" if $event->{type} eq 'caction'; + $_ = "*** $event->{nick} is now known as $event->{args}->[0]" if $event->{type} eq 'nick'; + $_ = "*** $event->{nick} has quit IRC" if $event->{type} eq 'quit'; + $_ = "*** $event->{to}->[0] was kicked by $event->{nick}" if $event->{type} eq 'kick'; + $_ = "-$event->{nick}- $event->{args}->[0]" if $event->{type} eq 'notice'; + $_ = "*** $event->{nick} sets mode: " . join(" ",@{$event->{args}}) if $event->{type} eq 'mode'; + $_ = "*** $event->{nick} changes topic to \"$event->{args}->[0]\"" if $event->{type} eq 'topic'; print Dumper($event) if ($_ eq ''); - $_ = interpolate(strftime($cfg->{timefmt}, @time)) . $_ . "\n" unless $_ eq ''; - $_ >> io(interpolate($cfg->{dir}).'/'.interpolate(strftime($cfg->{filefmt}, @time))) unless ($_ eq ''); + $_ = strftime($cfg->{timefmt}, @time) . $_ . "\n" unless $_ eq ''; + $_ >> io($cfg->{dir} . $chan . '/' . $chan . strftime($cfg->{filefmt}, @time)) unless ($_ eq ''); } } diff --git a/modules/mysql.pl b/modules/mysql.pl index 2f96410..998c647 100644 --- a/modules/mysql.pl +++ b/modules/mysql.pl @@ -26,6 +26,9 @@ sub record { my $self = shift; my ($channel, $nick, $user, $host, $gecos, $level, $id, $reason) = @_; + if (! defined($gecos)) { + $gecos = "NOT_DEFINED"; + } my $dbh = $self->{DBH}; $dbh->do("INSERT INTO $self->{TABLE} (channel, nick, user, host, gecos, level, id, reason) VALUES (" . $dbh->quote($channel) . ", " . $dbh->quote($nick) . ", " . $dbh->quote($user) . diff --git a/modules/xml.pl b/modules/xml.pl index c497ffc..c3da924 100644 --- a/modules/xml.pl +++ b/modules/xml.pl @@ -11,12 +11,11 @@ sub readXML { my ( $p ) = $::cset; #@_; $p = 'default' if $p eq ''; $p = "config-$p"; - $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => [qw/host/], - GroupTags => { altnicks => 'altnick', server => 'host', autojoins=> 'autojoin' }); - $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/] ); - $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person' ); + $::settings = $::xs1->XMLin( "$p/settings.xml", ForceArray => ['host'], 'GroupTags' => { altnicks => 'altnick', server => 'host', autojoins => 'autojoin' }); + $::channels = $::xs1->XMLin( "$p/channels.xml", ForceArray => [qw/event debug info low medium high/]); + $::users = $::xs1->XMLin( "$p/users.xml", ForceArray => 'person'); $::commands = $::xs1->XMLin( "$p/commands.xml", ForceArray => [qw/command/]); - $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => [] ); + $::mysql = $::xs1->XMLin( "$p/mysql.xml", ForceArray => []); } sub writeXML { -- cgit v1.2.3