diff options
| author | 2007-07-26 00:46:31 +0000 | |
|---|---|---|
| committer | 2007-07-26 00:46:31 +0000 | |
| commit | 3790452619828dc2c5d27c13eeec7b67b3fe6eff (patch) | |
| tree | ad2940dfb841c15843e015cd2f80e8bedb5223e6 /modules | |
| parent | 2e39d5b2b95c2e705fd962c9752070f816c1dfec (diff) | |
new commands like ;help, code optimizations, bugfixes, colors in the messages, and more\!
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/actions.pl | 36 | ||||
| -rw-r--r-- | modules/classes.pl | 93 | ||||
| -rw-r--r-- | modules/event.pl | 15 | ||||
| -rw-r--r-- | modules/inspect.pl | 36 | ||||
| -rw-r--r-- | modules/util.pl | 30 |
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; |
