summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2007-07-03 23:26:43 +0000
committerLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2007-07-03 23:26:43 +0000
commit6fe4d3ecbdc3196c7c62b9b7e00d5063bd0dbee9 (patch)
tree2804867a892bf9d6bb3c231b02938896accb5b91 /modules
parentf52c9bd6e6e018ff0c45f1dea4ded2aeb4ae1427 (diff)
code optimizations, rehash bugfix, lots of cleanup, new hilights, removed some old rules, added and improved some new rules
Diffstat (limited to 'modules')
-rw-r--r--modules/classes.pl38
-rw-r--r--modules/command.pl2
-rw-r--r--modules/event.pl48
-rw-r--r--modules/inspect.pl24
-rw-r--r--modules/log.pl32
-rw-r--r--modules/mysql.pl3
-rw-r--r--modules/xml.pl9
7 files changed, 95 insertions, 61 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;
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 {