summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2007-07-26 00:46:31 +0000
committerLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2007-07-26 00:46:31 +0000
commit3790452619828dc2c5d27c13eeec7b67b3fe6eff (patch)
treead2940dfb841c15843e015cd2f80e8bedb5223e6 /modules
parent2e39d5b2b95c2e705fd962c9752070f816c1dfec (diff)
new commands like ;help, code optimizations, bugfixes, colors in the messages, and more\!
Diffstat (limited to 'modules')
-rw-r--r--modules/actions.pl36
-rw-r--r--modules/classes.pl93
-rw-r--r--modules/event.pl15
-rw-r--r--modules/inspect.pl36
-rw-r--r--modules/util.pl30
5 files changed, 143 insertions, 67 deletions
diff --git a/modules/actions.pl b/modules/actions.pl
index 386e51a..08bf1be 100644
--- a/modules/actions.pl
+++ b/modules/actions.pl
@@ -1,35 +1,57 @@
+package ASM::Actions;
use strict;
use warnings;
-#package Actions;
+sub new
+{
+ my $module = shift;
+ my $self = {};
+ my $tbl = {
+ "ban" => \&ban,
+ "kban" => \&kban,
+ "kick" => \&kick,
+ "none" => \&none,
+ "quiet" => \&quiet,
+ };
+ $self->{ftbl} = $tbl;
+ bless($self);
+ return $self;
+}
+
+sub do
+{
+ my $self = shift;
+ my $item = shift;
+ return $self->{ftbl}->{$item}->(@_);
+}
-sub Actions::ban {
+sub ban {
my ($conn, $event, $chan) = @_;
$::oq->o_send( $conn, "mode $chan +b *!*\@$event->{host}" );
return "mode $chan -b *!*\@$event->{host}";
}
-sub Actions::kban {
+sub kban {
my ($conn, $event, $chan) = @_;
$::oq->o_send($conn, "mode $chan +b *!*\@$event->{host}");
$::oq->o_send($conn, "kick $chan $event->{nick} :Spamming");
return "mode $chan -b *!*\@$event->{host}";
}
-sub Actions::kick {
+sub kick {
my ($conn, $event, $chan) = @_;
$::oq->o_send($conn, "kick $chan $event->{nick} :Spamming");
return "";
}
-sub Actions::none {
+sub none {
return "";
}
-sub Actions::quiet {
+sub quiet {
my ($conn, $event, $chan) = @_;
$::oq->o_send( $conn, "mode $chan +b %*!*\@$event->{host}" );
return "mode $chan -b %*!*\@$event->{host}";
}
-return 1;
+1;
diff --git a/modules/classes.pl b/modules/classes.pl
index b540a9a..4233d88 100644
--- a/modules/classes.pl
+++ b/modules/classes.pl
@@ -29,21 +29,22 @@ sub new
return $self;
}
-sub check {
+sub check
+{
my $self = shift;
my $item = shift;
return $self->{ftbl}->{$item}->(@_);
}
my %ls = ();
-sub levenflood {
- my ($xchk, $id, $event, $chan) = @_;
+sub levenflood
+{
+ my ($chk, $id, $event, $chan) = @_;
my $text;
if ($event->{type} =~ /^(public|notice|part|caction)$/) {
- $text=$event->{args}->[0];
+ $text = $event->{args}->[0];
}
- return 0 unless defined($text);
- return 0 unless length($text) >= 30;
+ return 0 unless ( defined($text) && (length($text) >= 30) );
if ( ! defined($ls{$chan}) ) {
$ls{$chan} = [ $text ];
return 0;
@@ -69,12 +70,12 @@ sub levenflood {
return $ret;
}
-sub dnsbl {
- my ($xchk, $id, $event, $chan, $rev) = @_;
- my %chk = %{$xchk};
+sub dnsbl
+{
+ my ($chk, $id, $event, $chan, $rev) = @_;
return unless index($event->{host}, '/') == -1;
if (defined $rev) {
- my $iaddr = gethostbyname( "$rev$chk{content}" );
+ my $iaddr = gethostbyname( "$rev$chk->{content}" );
my @dnsbl = unpack( 'C4', $iaddr ) if defined $iaddr;
return 1 if (@dnsbl);
}
@@ -82,9 +83,8 @@ sub dnsbl {
}
sub floodqueue {
- my ($xchk, $id, $event, $chan, $rev) = @_;
- my %chk = %{$xchk};
- my @cut = split(/:/, $chk{content});
+ my ($chk, $id, $event, $chan, $rev) = @_;
+ my @cut = split(/:/, $chk->{content});
return 1 if ( flood_add( $chan, $id, $event->{host}, int($cut[1]) ) == int($cut[0]) );
return 0;
}
@@ -102,6 +102,22 @@ sub nickspam {
my %cf=();
my %bs=();
+my $cfc = 0;
+sub process_cf
+{
+ foreach my $nid ( keys %cf ) {
+ foreach my $xchan ( keys %{$cf{$nid}} ) {
+ next if $xchan eq 'timeout';
+ foreach my $host ( keys %{$cf{$nid}{$xchan}} ) {
+ next unless defined $cf{$nid}{$xchan}{$host}[0];
+ while ( time >= $cf{$nid}{$xchan}{$host}[0] + $cf{$nid}{'timeout'} ) {
+ last if ( $#{ $cf{$nid}{$xchan}{$host} } == 0 );
+ shift ( @{$cf{$nid}{$xchan}{$host}} );
+ }
+ }
+ }
+ }
+}
sub splitflood {
my ($chk, $id, $event, $chan) = @_;
@@ -117,19 +133,16 @@ sub splitflood {
return 1;
}
push( @{$cf{$id}{$chan}{$text}}, time );
- foreach my $nid ( keys %cf ) {
- foreach my $xchan ( keys %{$cf{$nid}} ) {
- next if $xchan eq 'timeout';
- foreach my $host ( keys %{$cf{$nid}{$xchan}} ) {
- next unless defined $cf{$nid}{$xchan}{$host}[0];
- while ( time >= $cf{$nid}{$xchan}{$host}[0] + $cf{$nid}{'timeout'} ) {
- last if ( $#{ $cf{$nid}{$xchan}{$host} } == 0 );
- shift ( @{$cf{$nid}{$xchan}{$host}} );
- }
- }
- }
+ while ( time >= $cf{$id}{$chan}{$text}[0] + $cf{$id}{'timeout'} ) {
+ last if ( $#{$cf{$id}{$chan}{$text}} == 0 );
+ shift ( @{$cf{$id}{$chan}{$text}} );
+ }
+ $cfc = $cfc + 1;
+ if ( $cfc >= 100 ) {
+ $cfc = 0;
+ process_cf();
}
- if ( $#{ @{$cf{$id}{$chan}{$text}}}+1 == int($cut[0]) ) {
+ if ( $#{@{$cf{$id}{$chan}{$text}}}+1 == int($cut[0]) ) {
$bs{$id}{$text} = time;
return 1;
}
@@ -140,11 +153,7 @@ sub re {
my ($chk, $id, $event, $chan) = @_;
my $match = $event->{args}->[0];
$match = $event->{nick} if ($event->{type} eq 'join');
- if ( defined($chk->{nocase}) ) {
- return 1 if ($match =~ /$chk->{content}/i);
- } else {
- return 1 if ($match =~ /$chk->{content}/);
- }
+ return 1 if ($match =~ /$chk->{content}/);
return 0;
}
@@ -196,27 +205,34 @@ sub gecos {
sub nuhg {
my ( $chk, $id, $event, $chan) = @_;
my $match = $event->{from} . '!' . $::sn{lc $event->{nick}}->{gecos};
- if ( defined($chk->{nocase}) ) {
- return 1 if ($match =~ /$chk->{content}/i);
- } else {
- return 1 if ($match =~ /$chk->{content}/);
- }
+ return 1 if ($match =~ /$chk->{content}/);
return 0;
}
-sub flood_add {
+my $sfc = 0;
+
+sub flood_add
+{
my ( $chan, $id, $host, $to ) = @_;
push( @{$sf{$id}{$chan}{$host}}, time );
while ( time >= $sf{$id}{$chan}{$host}[0] + $to ) {
last if ( $#{ $sf{$id}{$chan}{$host} } == 0 );
shift( @{$sf{$id}{$chan}{$host}} );
}
+ $sf{$id}{'timeout'} = $to;
+ $sfc = $sfc + 1;
+ if ($sfc > 100) {
+ $sfc = 0;
+ flood_process();
+ }
return $#{ @{$sf{$id}{$chan}{$host}}}+1;
}
-sub flood_process {
+sub flood_process
+{
for my $id ( keys %sf ) {
for my $chan ( keys %{$sf{$id}} ) {
+ next if $chan eq 'timeout';
for my $host ( keys %{$sf{$id}{$chan}} ) {
next unless defined $sf{$id}{$chan}{$host}[0];
while ( time >= $sf{$id}{$chan}{$host}[0] + $sf{$id}{'timeout'} ) {
@@ -228,5 +244,4 @@ sub flood_process {
}
}
-
-return 1;
+1;
diff --git a/modules/event.pl b/modules/event.pl
index 971a542..e7b3a66 100644
--- a/modules/event.pl
+++ b/modules/event.pl
@@ -5,7 +5,6 @@ use strict;
use Data::Dumper;
use Text::LevenshteinXS qw(distance);
use IO::All;
-#require 'modules/inspect.pl';
sub cs {
my ($chan) = @_;
@@ -32,7 +31,7 @@ sub new
$conn->add_default_handler(\&blah);
$conn->add_handler('bannedfromchan', \&on_bannedfromchan);
$conn->add_handler('mode', \&on_mode);
- $conn->add_handler('join', sub { on_join( $self, @_ ) } ); #\&on_join);
+ $conn->add_handler('join', \&on_join);
$conn->add_handler('part', \&on_part);
$conn->add_handler('quit', \&on_quit);
$conn->add_handler('nick', \&on_nick);
@@ -49,7 +48,7 @@ sub new
$conn->add_handler('kick', \&on_kick);
$conn->add_handler('cping', \&on_ctcp);
$conn->add_handler('cversion', \&on_ctcp);
- $conn->add_handler('csource', \&on_ctcp);
+ $conn->add_handler('csource', \&on_ctcp_source);
$conn->add_handler('ctime', \&on_ctcp);
$conn->add_handler('cdcc', \&on_ctcp);
$conn->add_handler('cuserinfo', \&on_ctcp);
@@ -71,7 +70,7 @@ sub on_connect {
#my @leven = ();
sub on_join {
- my ($self, $conn, $event) = @_;
+ my ($conn, $event) = @_;
my %evcopyx = %{$event};
my $evcopy = \%evcopyx;
my $nick = lc $event->{nick};
@@ -349,6 +348,14 @@ sub on_ctcp
$::inspector->inspect($conn, $event);
}
+sub on_ctcp_source
+{
+ my ($conn, $event) = @_;
+ if (lc $event->{args}->[0] eq lc $conn->{_nick}) {
+ $conn->ctcp_reply($event->{nick}, 'SOURCE http://svn.linuxrulz.org/repos/antispammeta/trunk/');
+ }
+}
+
sub whois_identified {
my ($conn, $event2) = @_;
my $who = lc $event2->{args}->[1];
diff --git a/modules/inspect.pl b/modules/inspect.pl
index bed8a46..a995202 100644
--- a/modules/inspect.pl
+++ b/modules/inspect.pl
@@ -2,8 +2,8 @@ package ASM::Inspect;
use warnings;
use strict;
-use Data::Dumper;
-use List::Util qw(first);
+#use Data::Dumper;
+#use List::Util qw(first);
%::ignored = ();
sub new
@@ -27,27 +27,29 @@ sub inspect {
return if (defined($::eline{$nick}) || defined($::eline{lc $event->{user}}) || defined($::eline{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}} : ();
+# %monx = defined($::channels->{channel}->{master}->{event}) ? %{$::channels->{channel}->{master}->{event}} : ();
## NB: isn't there a better way to do this with grep, somehow?
+ %aonx = %{$::channels->{channel}->{master}->{event}};
foreach $chan ( @{$event->{to}} ) {
next unless $chan =~ /^#/;
- %conx = defined($::channels->{channel}->{lc $chan}->{event}) ? %{$::channels->{channel}->{lc $chan}->{event}} : ();
- %aonx = (%monx, %conx);
+# %conx = defined($::channels->{channel}->{lc $chan}->{event}) ? %{$::channels->{channel}->{lc $chan}->{event}} : ();
+# %aonx = (%monx, %conx);
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 ( grep { $event->{type} eq $_ } split(/[,:; ]+/, $aonx{$id}{type}) );
$dct{$id} = $aonx{$id} if $::classes->check($aonx{$id}{class}, $aonx{$id}, $id, $event, $chan, $rev);
}
}
foreach ( keys %dct ) {
- push( @override, split( /[ ,;]+/, $dct{$_}{override} ) ) if ( defined $dct{$_}{override} );
+ if ( defined $dct{$_}{override} ) {
+ push( @override, split( /[ ,;]+/, $dct{$_}{override} ) );
+ }
}
delete $dct{$_} foreach @override;
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 = "\x02$dct{$id}{risk}\x02 risk threat: ".
- "Detected \x02$event->{nick}\x02 $dct{$id}{reason} in $chan ";
+ $txtz = "\x03" . $::RCOLOR{$::RISKS{$dct{$id}{risk}}} . "\u$dct{$id}{risk}\x03 risk threat [\x02$chan\x02]: ".
+ "\x02$event->{nick}\x02 - $dct{$id}{reason}; ping ";
$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
@@ -55,23 +57,23 @@ sub inspect {
$::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 $@;
+# eval '$unmode = Actions::' . $dct{$id}{action} . '($conn, $event, $chan);';
+ $unmode = $::actions->do($dct{$id}{action}, $conn, $event, $chan);
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"; $::oq->o_send($lconn,$lunmode); });
+ $conn->schedule(int($dct{$id}{time}), sub { $::oq->o_send($lconn,$lunmode); });
}
}
- unless (defined($::ignored{lc $event->{nick}}) && ($::ignored{lc $event->{nick}} >= $::RISKS{$dct{$id}{risk}})) {
+ unless (defined($::ignored{$event->{host}}) && ($::ignored{$event->{host}} >= $::RISKS{$dct{$id}{risk}})) {
my @tgts = ASM::Util->getAlert($chan, $dct{$id}{risk}, 'msgs');
foreach my $tgt (@tgts) {
$conn->privmsg($tgt, $txtz);
}
- $::ignored{lc $nick} = $::RISKS{$dct{$id}{risk}};
- $conn->schedule(15, sub { delete($::ignored{lc $nick})});
+ $::ignored{$event->{host}} = $::RISKS{$dct{$id}{risk}};
+ $conn->schedule(60, sub { delete($::ignored{$event->{host}})});
}
}
}
}
-return 1;
+1;
diff --git a/modules/util.pl b/modules/util.pl
index f13c854..a385790 100644
--- a/modules/util.pl
+++ b/modules/util.pl
@@ -14,6 +14,36 @@ my %oq;
'high' => 50,
'opalert'=> 9001 #OVER NINE THOUSAND!!!
);
+
+%::COLORS =
+(
+ 'white' => '00',
+ 'black' => '01',
+ 'blue' => '02',
+ 'green' => '03',
+ 'red' => '04',
+ 'brown' => '05',
+ 'purple' => '06',
+ 'orange' => '07',
+ 'yellow' => '08',
+ 'ltgreen' => '09',
+ 'teal' => '10',
+ 'ltcyan' => '11',
+ 'ltblue' => '12',
+ 'pink' => '13',
+ 'grey' => '14',
+ 'ltgrey' => '15',
+);
+
+%::RCOLOR =
+(
+ $::RISKS{debug} => $::COLORS{purple},
+ $::RISKS{info} => $::COLORS{blue},
+ $::RISKS{low} => $::COLORS{green},
+ $::RISKS{medium} => $::COLORS{orange},
+ $::RISKS{high} => $::COLORS{red},
+);
+
sub new
{
my $module = shift;